Lines Matching refs:ec

172 static int acpi_ec_query(struct acpi_ec *ec, u8 *data);
173 static void advance_transaction(struct acpi_ec *ec);
230 #define ec_dbg_ref(ec, fmt, ...) \ argument
231 ec_dbg_raw("%lu: " fmt, ec->reference_count, ## __VA_ARGS__)
237 static bool acpi_ec_started(struct acpi_ec *ec) in acpi_ec_started() argument
239 return test_bit(EC_FLAGS_STARTED, &ec->flags) && in acpi_ec_started()
240 !test_bit(EC_FLAGS_STOPPED, &ec->flags); in acpi_ec_started()
243 static bool acpi_ec_event_enabled(struct acpi_ec *ec) in acpi_ec_event_enabled() argument
250 if (!test_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags)) in acpi_ec_event_enabled()
262 return acpi_ec_started(ec); in acpi_ec_event_enabled()
264 return test_bit(EC_FLAGS_STARTED, &ec->flags); in acpi_ec_event_enabled()
267 static bool acpi_ec_flushed(struct acpi_ec *ec) in acpi_ec_flushed() argument
269 return ec->reference_count == 1; in acpi_ec_flushed()
276 static inline u8 acpi_ec_read_status(struct acpi_ec *ec) in acpi_ec_read_status() argument
278 u8 x = inb(ec->command_addr); in acpi_ec_read_status()
291 static inline u8 acpi_ec_read_data(struct acpi_ec *ec) in acpi_ec_read_data() argument
293 u8 x = inb(ec->data_addr); in acpi_ec_read_data()
295 ec->timestamp = jiffies; in acpi_ec_read_data()
300 static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command) in acpi_ec_write_cmd() argument
303 outb(command, ec->command_addr); in acpi_ec_write_cmd()
304 ec->timestamp = jiffies; in acpi_ec_write_cmd()
307 static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) in acpi_ec_write_data() argument
310 outb(data, ec->data_addr); in acpi_ec_write_data()
311 ec->timestamp = jiffies; in acpi_ec_write_data()
339 static inline bool acpi_ec_is_gpe_raised(struct acpi_ec *ec) in acpi_ec_is_gpe_raised() argument
343 (void)acpi_get_gpe_status(NULL, ec->gpe, &gpe_status); in acpi_ec_is_gpe_raised()
347 static inline void acpi_ec_enable_gpe(struct acpi_ec *ec, bool open) in acpi_ec_enable_gpe() argument
350 acpi_enable_gpe(NULL, ec->gpe); in acpi_ec_enable_gpe()
352 BUG_ON(ec->reference_count < 1); in acpi_ec_enable_gpe()
353 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE); in acpi_ec_enable_gpe()
355 if (acpi_ec_is_gpe_raised(ec)) { in acpi_ec_enable_gpe()
362 advance_transaction(ec); in acpi_ec_enable_gpe()
366 static inline void acpi_ec_disable_gpe(struct acpi_ec *ec, bool close) in acpi_ec_disable_gpe() argument
369 acpi_disable_gpe(NULL, ec->gpe); in acpi_ec_disable_gpe()
371 BUG_ON(ec->reference_count < 1); in acpi_ec_disable_gpe()
372 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE); in acpi_ec_disable_gpe()
376 static inline void acpi_ec_clear_gpe(struct acpi_ec *ec) in acpi_ec_clear_gpe() argument
388 if (!acpi_ec_is_gpe_raised(ec)) in acpi_ec_clear_gpe()
390 acpi_clear_gpe(NULL, ec->gpe); in acpi_ec_clear_gpe()
397 static void acpi_ec_submit_request(struct acpi_ec *ec) in acpi_ec_submit_request() argument
399 ec->reference_count++; in acpi_ec_submit_request()
400 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags) && in acpi_ec_submit_request()
401 ec->reference_count == 1) in acpi_ec_submit_request()
402 acpi_ec_enable_gpe(ec, true); in acpi_ec_submit_request()
405 static void acpi_ec_complete_request(struct acpi_ec *ec) in acpi_ec_complete_request() argument
409 ec->reference_count--; in acpi_ec_complete_request()
410 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags) && in acpi_ec_complete_request()
411 ec->reference_count == 0) in acpi_ec_complete_request()
412 acpi_ec_disable_gpe(ec, true); in acpi_ec_complete_request()
413 flushed = acpi_ec_flushed(ec); in acpi_ec_complete_request()
415 wake_up(&ec->wait); in acpi_ec_complete_request()
418 static void acpi_ec_mask_gpe(struct acpi_ec *ec) in acpi_ec_mask_gpe() argument
420 if (!test_bit(EC_FLAGS_GPE_MASKED, &ec->flags)) { in acpi_ec_mask_gpe()
421 acpi_ec_disable_gpe(ec, false); in acpi_ec_mask_gpe()
423 set_bit(EC_FLAGS_GPE_MASKED, &ec->flags); in acpi_ec_mask_gpe()
427 static void acpi_ec_unmask_gpe(struct acpi_ec *ec) in acpi_ec_unmask_gpe() argument
429 if (test_bit(EC_FLAGS_GPE_MASKED, &ec->flags)) { in acpi_ec_unmask_gpe()
430 clear_bit(EC_FLAGS_GPE_MASKED, &ec->flags); in acpi_ec_unmask_gpe()
431 acpi_ec_enable_gpe(ec, false); in acpi_ec_unmask_gpe()
447 static bool acpi_ec_submit_flushable_request(struct acpi_ec *ec) in acpi_ec_submit_flushable_request() argument
449 if (!acpi_ec_started(ec)) in acpi_ec_submit_flushable_request()
451 acpi_ec_submit_request(ec); in acpi_ec_submit_flushable_request()
455 static void acpi_ec_submit_query(struct acpi_ec *ec) in acpi_ec_submit_query() argument
457 acpi_ec_mask_gpe(ec); in acpi_ec_submit_query()
458 if (!acpi_ec_event_enabled(ec)) in acpi_ec_submit_query()
460 if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) { in acpi_ec_submit_query()
463 ec->nr_pending_queries++; in acpi_ec_submit_query()
464 schedule_work(&ec->work); in acpi_ec_submit_query()
468 static void acpi_ec_complete_query(struct acpi_ec *ec) in acpi_ec_complete_query() argument
470 if (test_and_clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) in acpi_ec_complete_query()
473 acpi_ec_unmask_gpe(ec); in acpi_ec_complete_query()
476 static inline void __acpi_ec_enable_event(struct acpi_ec *ec) in __acpi_ec_enable_event() argument
478 if (!test_and_set_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags)) in __acpi_ec_enable_event()
484 advance_transaction(ec); in __acpi_ec_enable_event()
487 static inline void __acpi_ec_disable_event(struct acpi_ec *ec) in __acpi_ec_disable_event() argument
489 if (test_and_clear_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags)) in __acpi_ec_disable_event()
497 static void acpi_ec_clear(struct acpi_ec *ec) in acpi_ec_clear() argument
503 status = acpi_ec_query(ec, &value); in acpi_ec_clear()
513 static void acpi_ec_enable_event(struct acpi_ec *ec) in acpi_ec_enable_event() argument
517 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_enable_event()
518 if (acpi_ec_started(ec)) in acpi_ec_enable_event()
519 __acpi_ec_enable_event(ec); in acpi_ec_enable_event()
520 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_enable_event()
524 acpi_ec_clear(ec); in acpi_ec_enable_event()
528 static bool acpi_ec_query_flushed(struct acpi_ec *ec) in acpi_ec_query_flushed() argument
533 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_query_flushed()
534 flushed = !ec->nr_pending_queries; in acpi_ec_query_flushed()
535 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_query_flushed()
539 static void __acpi_ec_flush_event(struct acpi_ec *ec) in __acpi_ec_flush_event() argument
545 wait_event(ec->wait, acpi_ec_query_flushed(ec)); in __acpi_ec_flush_event()
550 static void acpi_ec_disable_event(struct acpi_ec *ec) in acpi_ec_disable_event() argument
554 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_disable_event()
555 __acpi_ec_disable_event(ec); in acpi_ec_disable_event()
556 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_disable_event()
557 __acpi_ec_flush_event(ec); in acpi_ec_disable_event()
569 static bool acpi_ec_guard_event(struct acpi_ec *ec) in acpi_ec_guard_event() argument
574 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_guard_event()
591 !test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags) || in acpi_ec_guard_event()
592 (ec->curr && ec->curr->command == ACPI_EC_COMMAND_QUERY)) in acpi_ec_guard_event()
594 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_guard_event()
598 static int ec_transaction_polled(struct acpi_ec *ec) in ec_transaction_polled() argument
603 spin_lock_irqsave(&ec->lock, flags); in ec_transaction_polled()
604 if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_POLL)) in ec_transaction_polled()
606 spin_unlock_irqrestore(&ec->lock, flags); in ec_transaction_polled()
610 static int ec_transaction_completed(struct acpi_ec *ec) in ec_transaction_completed() argument
615 spin_lock_irqsave(&ec->lock, flags); in ec_transaction_completed()
616 if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_COMPLETE)) in ec_transaction_completed()
618 spin_unlock_irqrestore(&ec->lock, flags); in ec_transaction_completed()
622 static inline void ec_transaction_transition(struct acpi_ec *ec, unsigned long flag) in ec_transaction_transition() argument
624 ec->curr->flags |= flag; in ec_transaction_transition()
625 if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { in ec_transaction_transition()
628 acpi_ec_complete_query(ec); in ec_transaction_transition()
631 acpi_ec_complete_query(ec); in ec_transaction_transition()
634 set_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags); in ec_transaction_transition()
638 static void advance_transaction(struct acpi_ec *ec) in advance_transaction() argument
651 acpi_ec_clear_gpe(ec); in advance_transaction()
652 status = acpi_ec_read_status(ec); in advance_transaction()
653 t = ec->curr; in advance_transaction()
660 (!ec->nr_pending_queries || in advance_transaction()
661 test_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags))) { in advance_transaction()
662 clear_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags); in advance_transaction()
663 acpi_ec_complete_query(ec); in advance_transaction()
671 acpi_ec_write_data(ec, t->wdata[t->wi++]); in advance_transaction()
676 t->rdata[t->ri++] = acpi_ec_read_data(ec); in advance_transaction()
678 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); in advance_transaction()
688 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); in advance_transaction()
696 ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL); in advance_transaction()
698 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); in advance_transaction()
703 acpi_ec_write_cmd(ec, t->command); in advance_transaction()
704 ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL); in advance_transaction()
720 acpi_ec_mask_gpe(ec); in advance_transaction()
725 acpi_ec_submit_query(ec); in advance_transaction()
727 wake_up(&ec->wait); in advance_transaction()
730 static void start_transaction(struct acpi_ec *ec) in start_transaction() argument
732 ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0; in start_transaction()
733 ec->curr->flags = 0; in start_transaction()
736 static int ec_guard(struct acpi_ec *ec) in ec_guard() argument
738 unsigned long guard = usecs_to_jiffies(ec->polling_guard); in ec_guard()
739 unsigned long timeout = ec->timestamp + guard; in ec_guard()
743 if (ec->busy_polling) { in ec_guard()
745 if (ec_transaction_completed(ec)) in ec_guard()
759 if (!ec_transaction_polled(ec) && in ec_guard()
760 !acpi_ec_guard_event(ec)) in ec_guard()
762 if (wait_event_timeout(ec->wait, in ec_guard()
763 ec_transaction_completed(ec), in ec_guard()
771 static int ec_poll(struct acpi_ec *ec) in ec_poll() argument
780 if (!ec_guard(ec)) in ec_poll()
782 spin_lock_irqsave(&ec->lock, flags); in ec_poll()
783 advance_transaction(ec); in ec_poll()
784 spin_unlock_irqrestore(&ec->lock, flags); in ec_poll()
787 spin_lock_irqsave(&ec->lock, flags); in ec_poll()
788 start_transaction(ec); in ec_poll()
789 spin_unlock_irqrestore(&ec->lock, flags); in ec_poll()
794 static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, in acpi_ec_transaction_unlocked() argument
801 spin_lock_irqsave(&ec->lock, tmp); in acpi_ec_transaction_unlocked()
803 if (!acpi_ec_submit_flushable_request(ec)) { in acpi_ec_transaction_unlocked()
807 ec_dbg_ref(ec, "Increase command"); in acpi_ec_transaction_unlocked()
809 ec->curr = t; in acpi_ec_transaction_unlocked()
811 start_transaction(ec); in acpi_ec_transaction_unlocked()
812 spin_unlock_irqrestore(&ec->lock, tmp); in acpi_ec_transaction_unlocked()
814 ret = ec_poll(ec); in acpi_ec_transaction_unlocked()
816 spin_lock_irqsave(&ec->lock, tmp); in acpi_ec_transaction_unlocked()
818 acpi_ec_unmask_gpe(ec); in acpi_ec_transaction_unlocked()
820 ec->curr = NULL; in acpi_ec_transaction_unlocked()
822 acpi_ec_complete_request(ec); in acpi_ec_transaction_unlocked()
823 ec_dbg_ref(ec, "Decrease command"); in acpi_ec_transaction_unlocked()
825 spin_unlock_irqrestore(&ec->lock, tmp); in acpi_ec_transaction_unlocked()
829 static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) in acpi_ec_transaction() argument
834 if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata)) in acpi_ec_transaction()
839 mutex_lock(&ec->mutex); in acpi_ec_transaction()
840 if (ec->global_lock) { in acpi_ec_transaction()
848 status = acpi_ec_transaction_unlocked(ec, t); in acpi_ec_transaction()
850 if (ec->global_lock) in acpi_ec_transaction()
853 mutex_unlock(&ec->mutex); in acpi_ec_transaction()
857 static int acpi_ec_burst_enable(struct acpi_ec *ec) in acpi_ec_burst_enable() argument
864 return acpi_ec_transaction(ec, &t); in acpi_ec_burst_enable()
867 static int acpi_ec_burst_disable(struct acpi_ec *ec) in acpi_ec_burst_disable() argument
873 return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ? in acpi_ec_burst_disable()
874 acpi_ec_transaction(ec, &t) : 0; in acpi_ec_burst_disable()
877 static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data) in acpi_ec_read() argument
885 result = acpi_ec_transaction(ec, &t); in acpi_ec_read()
890 static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data) in acpi_ec_write() argument
897 return acpi_ec_transaction(ec, &t); in acpi_ec_write()
955 static void acpi_ec_start(struct acpi_ec *ec, bool resuming) in acpi_ec_start() argument
959 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_start()
960 if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) { in acpi_ec_start()
964 acpi_ec_submit_request(ec); in acpi_ec_start()
965 ec_dbg_ref(ec, "Increase driver"); in acpi_ec_start()
969 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_start()
972 static bool acpi_ec_stopped(struct acpi_ec *ec) in acpi_ec_stopped() argument
977 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_stopped()
978 flushed = acpi_ec_flushed(ec); in acpi_ec_stopped()
979 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_stopped()
983 static void acpi_ec_stop(struct acpi_ec *ec, bool suspending) in acpi_ec_stop() argument
987 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_stop()
988 if (acpi_ec_started(ec)) { in acpi_ec_stop()
990 set_bit(EC_FLAGS_STOPPED, &ec->flags); in acpi_ec_stop()
991 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_stop()
992 wait_event(ec->wait, acpi_ec_stopped(ec)); in acpi_ec_stop()
993 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_stop()
996 acpi_ec_complete_request(ec); in acpi_ec_stop()
997 ec_dbg_ref(ec, "Decrease driver"); in acpi_ec_stop()
999 __acpi_ec_disable_event(ec); in acpi_ec_stop()
1000 clear_bit(EC_FLAGS_STARTED, &ec->flags); in acpi_ec_stop()
1001 clear_bit(EC_FLAGS_STOPPED, &ec->flags); in acpi_ec_stop()
1004 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_stop()
1007 static void acpi_ec_enter_noirq(struct acpi_ec *ec) in acpi_ec_enter_noirq() argument
1011 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_enter_noirq()
1012 ec->busy_polling = true; in acpi_ec_enter_noirq()
1013 ec->polling_guard = 0; in acpi_ec_enter_noirq()
1015 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_enter_noirq()
1018 static void acpi_ec_leave_noirq(struct acpi_ec *ec) in acpi_ec_leave_noirq() argument
1022 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_leave_noirq()
1023 ec->busy_polling = ec_busy_polling; in acpi_ec_leave_noirq()
1024 ec->polling_guard = ec_polling_guard; in acpi_ec_leave_noirq()
1026 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_leave_noirq()
1031 struct acpi_ec *ec = first_ec; in acpi_ec_block_transactions() local
1033 if (!ec) in acpi_ec_block_transactions()
1036 mutex_lock(&ec->mutex); in acpi_ec_block_transactions()
1038 acpi_ec_stop(ec, true); in acpi_ec_block_transactions()
1039 mutex_unlock(&ec->mutex); in acpi_ec_block_transactions()
1064 acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value) in acpi_ec_get_query_handler_by_value() argument
1069 mutex_lock(&ec->mutex); in acpi_ec_get_query_handler_by_value()
1070 list_for_each_entry(handler, &ec->list, node) { in acpi_ec_get_query_handler_by_value()
1076 mutex_unlock(&ec->mutex); in acpi_ec_get_query_handler_by_value()
1093 int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, in acpi_ec_add_query_handler() argument
1107 mutex_lock(&ec->mutex); in acpi_ec_add_query_handler()
1109 list_add(&handler->node, &ec->list); in acpi_ec_add_query_handler()
1110 mutex_unlock(&ec->mutex); in acpi_ec_add_query_handler()
1115 static void acpi_ec_remove_query_handlers(struct acpi_ec *ec, in acpi_ec_remove_query_handlers() argument
1121 mutex_lock(&ec->mutex); in acpi_ec_remove_query_handlers()
1122 list_for_each_entry_safe(handler, tmp, &ec->list, node) { in acpi_ec_remove_query_handlers()
1128 mutex_unlock(&ec->mutex); in acpi_ec_remove_query_handlers()
1133 void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit) in acpi_ec_remove_query_handler() argument
1135 acpi_ec_remove_query_handlers(ec, false, query_bit); in acpi_ec_remove_query_handler()
1178 static int acpi_ec_query(struct acpi_ec *ec, u8 *data) in acpi_ec_query() argument
1193 result = acpi_ec_transaction(ec, &q->transaction); in acpi_ec_query()
1199 q->handler = acpi_ec_get_query_handler_by_value(ec, value); in acpi_ec_query()
1228 static void acpi_ec_check_event(struct acpi_ec *ec) in acpi_ec_check_event() argument
1233 if (ec_guard(ec)) { in acpi_ec_check_event()
1234 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_check_event()
1239 if (!ec->curr) in acpi_ec_check_event()
1240 advance_transaction(ec); in acpi_ec_check_event()
1241 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_check_event()
1249 struct acpi_ec *ec = container_of(work, struct acpi_ec, work); in acpi_ec_event_handler() local
1253 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_event_handler()
1254 while (ec->nr_pending_queries) { in acpi_ec_event_handler()
1255 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_event_handler()
1256 (void)acpi_ec_query(ec, NULL); in acpi_ec_event_handler()
1257 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_event_handler()
1258 ec->nr_pending_queries--; in acpi_ec_event_handler()
1265 if (!ec->nr_pending_queries) { in acpi_ec_event_handler()
1268 acpi_ec_complete_query(ec); in acpi_ec_event_handler()
1271 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_event_handler()
1275 acpi_ec_check_event(ec); in acpi_ec_event_handler()
1282 struct acpi_ec *ec = data; in acpi_ec_gpe_handler() local
1284 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_gpe_handler()
1285 advance_transaction(ec); in acpi_ec_gpe_handler()
1286 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_gpe_handler()
1299 struct acpi_ec *ec = handler_context; in acpi_ec_space_handler() local
1309 if (ec->busy_polling || bits > 8) in acpi_ec_space_handler()
1310 acpi_ec_burst_enable(ec); in acpi_ec_space_handler()
1314 acpi_ec_read(ec, address, value) : in acpi_ec_space_handler()
1315 acpi_ec_write(ec, address, *value); in acpi_ec_space_handler()
1317 if (ec->busy_polling || bits > 8) in acpi_ec_space_handler()
1318 acpi_ec_burst_disable(ec); in acpi_ec_space_handler()
1339 static void acpi_ec_free(struct acpi_ec *ec) in acpi_ec_free() argument
1341 if (first_ec == ec) in acpi_ec_free()
1343 if (boot_ec == ec) in acpi_ec_free()
1345 kfree(ec); in acpi_ec_free()
1350 struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL); in acpi_ec_alloc() local
1352 if (!ec) in acpi_ec_alloc()
1354 mutex_init(&ec->mutex); in acpi_ec_alloc()
1355 init_waitqueue_head(&ec->wait); in acpi_ec_alloc()
1356 INIT_LIST_HEAD(&ec->list); in acpi_ec_alloc()
1357 spin_lock_init(&ec->lock); in acpi_ec_alloc()
1358 INIT_WORK(&ec->work, acpi_ec_event_handler); in acpi_ec_alloc()
1359 ec->timestamp = jiffies; in acpi_ec_alloc()
1360 ec->busy_polling = true; in acpi_ec_alloc()
1361 ec->polling_guard = 0; in acpi_ec_alloc()
1362 return ec; in acpi_ec_alloc()
1371 struct acpi_ec *ec = context; in acpi_ec_register_query_methods() local
1378 acpi_ec_add_query_handler(ec, value, handle, NULL, NULL); in acpi_ec_register_query_methods()
1387 struct acpi_ec *ec = context; in ec_parse_device() local
1390 ec->command_addr = ec->data_addr = 0; in ec_parse_device()
1393 ec_parse_io_ports, ec); in ec_parse_device()
1396 if (ec->data_addr == 0 || ec->command_addr == 0) in ec_parse_device()
1404 ec->gpe = boot_ec->gpe; in ec_parse_device()
1411 ec->gpe = tmp; in ec_parse_device()
1416 ec->global_lock = tmp; in ec_parse_device()
1417 ec->handle = handle; in ec_parse_device()
1426 static int ec_install_handlers(struct acpi_ec *ec, bool handle_events) in ec_install_handlers() argument
1430 acpi_ec_start(ec, false); in ec_install_handlers()
1432 if (!test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) { in ec_install_handlers()
1433 acpi_ec_enter_noirq(ec); in ec_install_handlers()
1434 status = acpi_install_address_space_handler(ec->handle, in ec_install_handlers()
1437 NULL, ec); in ec_install_handlers()
1449 acpi_ec_stop(ec, false); in ec_install_handlers()
1453 set_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags); in ec_install_handlers()
1459 if (!test_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags)) { in ec_install_handlers()
1461 acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1, in ec_install_handlers()
1463 NULL, ec, NULL); in ec_install_handlers()
1464 set_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags); in ec_install_handlers()
1466 if (!test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) { in ec_install_handlers()
1467 status = acpi_install_gpe_raw_handler(NULL, ec->gpe, in ec_install_handlers()
1469 &acpi_ec_gpe_handler, ec); in ec_install_handlers()
1472 set_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags); in ec_install_handlers()
1473 acpi_ec_leave_noirq(ec); in ec_install_handlers()
1474 if (test_bit(EC_FLAGS_STARTED, &ec->flags) && in ec_install_handlers()
1475 ec->reference_count >= 1) in ec_install_handlers()
1476 acpi_ec_enable_gpe(ec, true); in ec_install_handlers()
1480 acpi_ec_enable_event(ec); in ec_install_handlers()
1485 static void ec_remove_handlers(struct acpi_ec *ec) in ec_remove_handlers() argument
1487 if (test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) { in ec_remove_handlers()
1488 if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle, in ec_remove_handlers()
1491 clear_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags); in ec_remove_handlers()
1505 acpi_ec_stop(ec, false); in ec_remove_handlers()
1507 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) { in ec_remove_handlers()
1508 if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe, in ec_remove_handlers()
1511 clear_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags); in ec_remove_handlers()
1513 if (test_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags)) { in ec_remove_handlers()
1514 acpi_ec_remove_query_handlers(ec, true, 0); in ec_remove_handlers()
1515 clear_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags); in ec_remove_handlers()
1519 static int acpi_ec_setup(struct acpi_ec *ec, bool handle_events) in acpi_ec_setup() argument
1523 ret = ec_install_handlers(ec, handle_events); in acpi_ec_setup()
1529 first_ec = ec; in acpi_ec_setup()
1533 acpi_handle_info(ec->handle, in acpi_ec_setup()
1535 ec->gpe, ec->command_addr, ec->data_addr); in acpi_ec_setup()
1560 struct acpi_ec *ec = NULL; in acpi_ec_add() local
1570 ec = boot_ec; in acpi_ec_add()
1573 ec = acpi_ec_alloc(); in acpi_ec_add()
1574 if (!ec) in acpi_ec_add()
1577 status = ec_parse_device(device->handle, 0, ec, NULL); in acpi_ec_add()
1583 if (boot_ec && ec->command_addr == boot_ec->command_addr && in acpi_ec_add()
1584 ec->data_addr == boot_ec->data_addr) { in acpi_ec_add()
1592 boot_ec->handle = ec->handle; in acpi_ec_add()
1593 acpi_handle_debug(ec->handle, "duplicated.\n"); in acpi_ec_add()
1594 acpi_ec_free(ec); in acpi_ec_add()
1595 ec = boot_ec; in acpi_ec_add()
1599 ret = acpi_ec_setup(ec, true); in acpi_ec_add()
1603 if (ec == boot_ec) in acpi_ec_add()
1608 device->driver_data = ec; in acpi_ec_add()
1610 ret = !!request_region(ec->data_addr, 1, "EC data"); in acpi_ec_add()
1611 WARN(!ret, "Could not request EC data io port 0x%lx", ec->data_addr); in acpi_ec_add()
1612 ret = !!request_region(ec->command_addr, 1, "EC cmd"); in acpi_ec_add()
1613 WARN(!ret, "Could not request EC cmd io port 0x%lx", ec->command_addr); in acpi_ec_add()
1617 acpi_walk_dep_device_list(ec->handle); in acpi_ec_add()
1619 acpi_handle_debug(ec->handle, "enumerated.\n"); in acpi_ec_add()
1623 if (ec != boot_ec) in acpi_ec_add()
1624 acpi_ec_remove_query_handlers(ec, true, 0); in acpi_ec_add()
1626 if (ec != boot_ec) in acpi_ec_add()
1627 acpi_ec_free(ec); in acpi_ec_add()
1633 struct acpi_ec *ec; in acpi_ec_remove() local
1638 ec = acpi_driver_data(device); in acpi_ec_remove()
1639 release_region(ec->data_addr, 1); in acpi_ec_remove()
1640 release_region(ec->command_addr, 1); in acpi_ec_remove()
1642 if (ec != boot_ec) { in acpi_ec_remove()
1643 ec_remove_handlers(ec); in acpi_ec_remove()
1644 acpi_ec_free(ec); in acpi_ec_remove()
1652 struct acpi_ec *ec = context; in ec_parse_io_ports() local
1662 if (ec->data_addr == 0) in ec_parse_io_ports()
1663 ec->data_addr = resource->data.io.minimum; in ec_parse_io_ports()
1664 else if (ec->command_addr == 0) in ec_parse_io_ports()
1665 ec->command_addr = resource->data.io.minimum; in ec_parse_io_ports()
1685 struct acpi_ec *ec; in acpi_ec_dsdt_probe() local
1698 ec = acpi_ec_alloc(); in acpi_ec_dsdt_probe()
1699 if (!ec) in acpi_ec_dsdt_probe()
1706 status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device, ec, NULL); in acpi_ec_dsdt_probe()
1707 if (ACPI_FAILURE(status) || !ec->handle) { in acpi_ec_dsdt_probe()
1708 acpi_ec_free(ec); in acpi_ec_dsdt_probe()
1719 ret = acpi_ec_setup(ec, false); in acpi_ec_dsdt_probe()
1721 acpi_ec_free(ec); in acpi_ec_dsdt_probe()
1725 boot_ec = ec; in acpi_ec_dsdt_probe()
1727 acpi_handle_info(ec->handle, in acpi_ec_dsdt_probe()
1862 struct acpi_ec *ec; in acpi_ec_ecdt_probe() local
1881 ec = acpi_ec_alloc(); in acpi_ec_ecdt_probe()
1882 if (!ec) in acpi_ec_ecdt_probe()
1886 ec->command_addr = ecdt_ptr->data.address; in acpi_ec_ecdt_probe()
1887 ec->data_addr = ecdt_ptr->control.address; in acpi_ec_ecdt_probe()
1889 ec->command_addr = ecdt_ptr->control.address; in acpi_ec_ecdt_probe()
1890 ec->data_addr = ecdt_ptr->data.address; in acpi_ec_ecdt_probe()
1892 ec->gpe = ecdt_ptr->gpe; in acpi_ec_ecdt_probe()
1893 ec->handle = ACPI_ROOT_OBJECT; in acpi_ec_ecdt_probe()
1899 ret = acpi_ec_setup(ec, false); in acpi_ec_ecdt_probe()
1901 acpi_ec_free(ec); in acpi_ec_ecdt_probe()
1905 boot_ec = ec; in acpi_ec_ecdt_probe()
1914 struct acpi_ec *ec = in acpi_ec_suspend() local
1918 acpi_ec_disable_event(ec); in acpi_ec_suspend()
1924 struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev)); in acpi_ec_suspend_noirq() local
1930 if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) && in acpi_ec_suspend_noirq()
1931 ec->reference_count >= 1) in acpi_ec_suspend_noirq()
1932 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE); in acpi_ec_suspend_noirq()
1934 acpi_ec_enter_noirq(ec); in acpi_ec_suspend_noirq()
1941 struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev)); in acpi_ec_resume_noirq() local
1943 acpi_ec_leave_noirq(ec); in acpi_ec_resume_noirq()
1945 if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) && in acpi_ec_resume_noirq()
1946 ec->reference_count >= 1) in acpi_ec_resume_noirq()
1947 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE); in acpi_ec_resume_noirq()
1954 struct acpi_ec *ec = in acpi_ec_resume() local
1957 acpi_ec_enable_event(ec); in acpi_ec_resume()