Lines Matching refs:ec

184 static int acpi_ec_query(struct acpi_ec *ec, u8 *data);
185 static void advance_transaction(struct acpi_ec *ec);
239 #define ec_dbg_ref(ec, fmt, ...) \ argument
240 ec_dbg_raw("%lu: " fmt, ec->reference_count, ## __VA_ARGS__)
246 static bool acpi_ec_started(struct acpi_ec *ec) in acpi_ec_started() argument
248 return test_bit(EC_FLAGS_STARTED, &ec->flags) && in acpi_ec_started()
249 !test_bit(EC_FLAGS_STOPPED, &ec->flags); in acpi_ec_started()
252 static bool acpi_ec_event_enabled(struct acpi_ec *ec) in acpi_ec_event_enabled() argument
259 if (!test_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags)) in acpi_ec_event_enabled()
271 return acpi_ec_started(ec); in acpi_ec_event_enabled()
273 return test_bit(EC_FLAGS_STARTED, &ec->flags); in acpi_ec_event_enabled()
276 static bool acpi_ec_flushed(struct acpi_ec *ec) in acpi_ec_flushed() argument
278 return ec->reference_count == 1; in acpi_ec_flushed()
285 static inline u8 acpi_ec_read_status(struct acpi_ec *ec) in acpi_ec_read_status() argument
287 u8 x = inb(ec->command_addr); in acpi_ec_read_status()
300 static inline u8 acpi_ec_read_data(struct acpi_ec *ec) in acpi_ec_read_data() argument
302 u8 x = inb(ec->data_addr); in acpi_ec_read_data()
304 ec->timestamp = jiffies; in acpi_ec_read_data()
309 static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command) in acpi_ec_write_cmd() argument
312 outb(command, ec->command_addr); in acpi_ec_write_cmd()
313 ec->timestamp = jiffies; in acpi_ec_write_cmd()
316 static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) in acpi_ec_write_data() argument
319 outb(data, ec->data_addr); in acpi_ec_write_data()
320 ec->timestamp = jiffies; in acpi_ec_write_data()
348 static inline bool acpi_ec_is_gpe_raised(struct acpi_ec *ec) in acpi_ec_is_gpe_raised() argument
352 (void)acpi_get_gpe_status(NULL, ec->gpe, &gpe_status); in acpi_ec_is_gpe_raised()
356 static inline void acpi_ec_enable_gpe(struct acpi_ec *ec, bool open) in acpi_ec_enable_gpe() argument
359 acpi_enable_gpe(NULL, ec->gpe); in acpi_ec_enable_gpe()
361 BUG_ON(ec->reference_count < 1); in acpi_ec_enable_gpe()
362 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE); in acpi_ec_enable_gpe()
364 if (acpi_ec_is_gpe_raised(ec)) { in acpi_ec_enable_gpe()
371 advance_transaction(ec); in acpi_ec_enable_gpe()
375 static inline void acpi_ec_disable_gpe(struct acpi_ec *ec, bool close) in acpi_ec_disable_gpe() argument
378 acpi_disable_gpe(NULL, ec->gpe); in acpi_ec_disable_gpe()
380 BUG_ON(ec->reference_count < 1); in acpi_ec_disable_gpe()
381 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE); in acpi_ec_disable_gpe()
385 static inline void acpi_ec_clear_gpe(struct acpi_ec *ec) in acpi_ec_clear_gpe() argument
397 if (!acpi_ec_is_gpe_raised(ec)) in acpi_ec_clear_gpe()
399 acpi_clear_gpe(NULL, ec->gpe); in acpi_ec_clear_gpe()
406 static void acpi_ec_submit_request(struct acpi_ec *ec) in acpi_ec_submit_request() argument
408 ec->reference_count++; in acpi_ec_submit_request()
409 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags) && in acpi_ec_submit_request()
410 ec->reference_count == 1) in acpi_ec_submit_request()
411 acpi_ec_enable_gpe(ec, true); in acpi_ec_submit_request()
414 static void acpi_ec_complete_request(struct acpi_ec *ec) in acpi_ec_complete_request() argument
418 ec->reference_count--; in acpi_ec_complete_request()
419 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags) && in acpi_ec_complete_request()
420 ec->reference_count == 0) in acpi_ec_complete_request()
421 acpi_ec_disable_gpe(ec, true); in acpi_ec_complete_request()
422 flushed = acpi_ec_flushed(ec); in acpi_ec_complete_request()
424 wake_up(&ec->wait); in acpi_ec_complete_request()
427 static void acpi_ec_mask_gpe(struct acpi_ec *ec) in acpi_ec_mask_gpe() argument
429 if (!test_bit(EC_FLAGS_GPE_MASKED, &ec->flags)) { in acpi_ec_mask_gpe()
430 acpi_ec_disable_gpe(ec, false); in acpi_ec_mask_gpe()
432 set_bit(EC_FLAGS_GPE_MASKED, &ec->flags); in acpi_ec_mask_gpe()
436 static void acpi_ec_unmask_gpe(struct acpi_ec *ec) in acpi_ec_unmask_gpe() argument
438 if (test_bit(EC_FLAGS_GPE_MASKED, &ec->flags)) { in acpi_ec_unmask_gpe()
439 clear_bit(EC_FLAGS_GPE_MASKED, &ec->flags); in acpi_ec_unmask_gpe()
440 acpi_ec_enable_gpe(ec, false); in acpi_ec_unmask_gpe()
456 static bool acpi_ec_submit_flushable_request(struct acpi_ec *ec) in acpi_ec_submit_flushable_request() argument
458 if (!acpi_ec_started(ec)) in acpi_ec_submit_flushable_request()
460 acpi_ec_submit_request(ec); in acpi_ec_submit_flushable_request()
464 static void acpi_ec_submit_query(struct acpi_ec *ec) in acpi_ec_submit_query() argument
466 acpi_ec_mask_gpe(ec); in acpi_ec_submit_query()
467 if (!acpi_ec_event_enabled(ec)) in acpi_ec_submit_query()
469 if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) { in acpi_ec_submit_query()
472 ec->nr_pending_queries++; in acpi_ec_submit_query()
473 schedule_work(&ec->work); in acpi_ec_submit_query()
477 static void acpi_ec_complete_query(struct acpi_ec *ec) in acpi_ec_complete_query() argument
479 if (test_and_clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) in acpi_ec_complete_query()
482 acpi_ec_unmask_gpe(ec); in acpi_ec_complete_query()
485 static inline void __acpi_ec_enable_event(struct acpi_ec *ec) in __acpi_ec_enable_event() argument
487 if (!test_and_set_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags)) in __acpi_ec_enable_event()
493 advance_transaction(ec); in __acpi_ec_enable_event()
496 static inline void __acpi_ec_disable_event(struct acpi_ec *ec) in __acpi_ec_disable_event() argument
498 if (test_and_clear_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags)) in __acpi_ec_disable_event()
502 static void acpi_ec_enable_event(struct acpi_ec *ec) in acpi_ec_enable_event() argument
506 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_enable_event()
507 if (acpi_ec_started(ec)) in acpi_ec_enable_event()
508 __acpi_ec_enable_event(ec); in acpi_ec_enable_event()
509 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_enable_event()
513 static bool acpi_ec_query_flushed(struct acpi_ec *ec) in acpi_ec_query_flushed() argument
518 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_query_flushed()
519 flushed = !ec->nr_pending_queries; in acpi_ec_query_flushed()
520 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_query_flushed()
524 static void __acpi_ec_flush_event(struct acpi_ec *ec) in __acpi_ec_flush_event() argument
530 wait_event(ec->wait, acpi_ec_query_flushed(ec)); in __acpi_ec_flush_event()
535 static void acpi_ec_disable_event(struct acpi_ec *ec) in acpi_ec_disable_event() argument
539 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_disable_event()
540 __acpi_ec_disable_event(ec); in acpi_ec_disable_event()
541 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_disable_event()
542 __acpi_ec_flush_event(ec); in acpi_ec_disable_event()
554 static bool acpi_ec_guard_event(struct acpi_ec *ec) in acpi_ec_guard_event() argument
559 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_guard_event()
576 !test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags) || in acpi_ec_guard_event()
577 (ec->curr && ec->curr->command == ACPI_EC_COMMAND_QUERY)) in acpi_ec_guard_event()
579 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_guard_event()
583 static int ec_transaction_polled(struct acpi_ec *ec) in ec_transaction_polled() argument
588 spin_lock_irqsave(&ec->lock, flags); in ec_transaction_polled()
589 if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_POLL)) in ec_transaction_polled()
591 spin_unlock_irqrestore(&ec->lock, flags); in ec_transaction_polled()
595 static int ec_transaction_completed(struct acpi_ec *ec) in ec_transaction_completed() argument
600 spin_lock_irqsave(&ec->lock, flags); in ec_transaction_completed()
601 if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_COMPLETE)) in ec_transaction_completed()
603 spin_unlock_irqrestore(&ec->lock, flags); in ec_transaction_completed()
607 static inline void ec_transaction_transition(struct acpi_ec *ec, unsigned long flag) in ec_transaction_transition() argument
609 ec->curr->flags |= flag; in ec_transaction_transition()
610 if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { in ec_transaction_transition()
613 acpi_ec_complete_query(ec); in ec_transaction_transition()
616 acpi_ec_complete_query(ec); in ec_transaction_transition()
619 set_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags); in ec_transaction_transition()
623 static void advance_transaction(struct acpi_ec *ec) in advance_transaction() argument
636 acpi_ec_clear_gpe(ec); in advance_transaction()
637 status = acpi_ec_read_status(ec); in advance_transaction()
638 t = ec->curr; in advance_transaction()
645 (!ec->nr_pending_queries || in advance_transaction()
646 test_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags))) { in advance_transaction()
647 clear_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags); in advance_transaction()
648 acpi_ec_complete_query(ec); in advance_transaction()
656 acpi_ec_write_data(ec, t->wdata[t->wi++]); in advance_transaction()
661 t->rdata[t->ri++] = acpi_ec_read_data(ec); in advance_transaction()
663 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); in advance_transaction()
673 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); in advance_transaction()
681 ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL); in advance_transaction()
683 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE); in advance_transaction()
688 acpi_ec_write_cmd(ec, t->command); in advance_transaction()
689 ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL); in advance_transaction()
705 acpi_ec_mask_gpe(ec); in advance_transaction()
710 acpi_ec_submit_query(ec); in advance_transaction()
712 wake_up(&ec->wait); in advance_transaction()
715 static void start_transaction(struct acpi_ec *ec) in start_transaction() argument
717 ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0; in start_transaction()
718 ec->curr->flags = 0; in start_transaction()
721 static int ec_guard(struct acpi_ec *ec) in ec_guard() argument
723 unsigned long guard = usecs_to_jiffies(ec->polling_guard); in ec_guard()
724 unsigned long timeout = ec->timestamp + guard; in ec_guard()
728 if (ec->busy_polling) { in ec_guard()
730 if (ec_transaction_completed(ec)) in ec_guard()
744 if (!ec_transaction_polled(ec) && in ec_guard()
745 !acpi_ec_guard_event(ec)) in ec_guard()
747 if (wait_event_timeout(ec->wait, in ec_guard()
748 ec_transaction_completed(ec), in ec_guard()
756 static int ec_poll(struct acpi_ec *ec) in ec_poll() argument
765 if (!ec_guard(ec)) in ec_poll()
767 spin_lock_irqsave(&ec->lock, flags); in ec_poll()
768 advance_transaction(ec); in ec_poll()
769 spin_unlock_irqrestore(&ec->lock, flags); in ec_poll()
772 spin_lock_irqsave(&ec->lock, flags); in ec_poll()
773 start_transaction(ec); in ec_poll()
774 spin_unlock_irqrestore(&ec->lock, flags); in ec_poll()
779 static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, in acpi_ec_transaction_unlocked() argument
786 spin_lock_irqsave(&ec->lock, tmp); in acpi_ec_transaction_unlocked()
788 if (!acpi_ec_submit_flushable_request(ec)) { in acpi_ec_transaction_unlocked()
792 ec_dbg_ref(ec, "Increase command"); in acpi_ec_transaction_unlocked()
794 ec->curr = t; in acpi_ec_transaction_unlocked()
796 start_transaction(ec); in acpi_ec_transaction_unlocked()
797 spin_unlock_irqrestore(&ec->lock, tmp); in acpi_ec_transaction_unlocked()
799 ret = ec_poll(ec); in acpi_ec_transaction_unlocked()
801 spin_lock_irqsave(&ec->lock, tmp); in acpi_ec_transaction_unlocked()
803 acpi_ec_unmask_gpe(ec); in acpi_ec_transaction_unlocked()
805 ec->curr = NULL; in acpi_ec_transaction_unlocked()
807 acpi_ec_complete_request(ec); in acpi_ec_transaction_unlocked()
808 ec_dbg_ref(ec, "Decrease command"); in acpi_ec_transaction_unlocked()
810 spin_unlock_irqrestore(&ec->lock, tmp); in acpi_ec_transaction_unlocked()
814 static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) in acpi_ec_transaction() argument
819 if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata)) in acpi_ec_transaction()
824 mutex_lock(&ec->mutex); in acpi_ec_transaction()
825 if (ec->global_lock) { in acpi_ec_transaction()
833 status = acpi_ec_transaction_unlocked(ec, t); in acpi_ec_transaction()
835 if (ec->global_lock) in acpi_ec_transaction()
838 mutex_unlock(&ec->mutex); in acpi_ec_transaction()
842 static int acpi_ec_burst_enable(struct acpi_ec *ec) in acpi_ec_burst_enable() argument
849 return acpi_ec_transaction(ec, &t); in acpi_ec_burst_enable()
852 static int acpi_ec_burst_disable(struct acpi_ec *ec) in acpi_ec_burst_disable() argument
858 return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ? in acpi_ec_burst_disable()
859 acpi_ec_transaction(ec, &t) : 0; in acpi_ec_burst_disable()
862 static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data) in acpi_ec_read() argument
870 result = acpi_ec_transaction(ec, &t); in acpi_ec_read()
875 static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data) in acpi_ec_write() argument
882 return acpi_ec_transaction(ec, &t); in acpi_ec_write()
940 static void acpi_ec_start(struct acpi_ec *ec, bool resuming) in acpi_ec_start() argument
944 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_start()
945 if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) { in acpi_ec_start()
949 acpi_ec_submit_request(ec); in acpi_ec_start()
950 ec_dbg_ref(ec, "Increase driver"); in acpi_ec_start()
954 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_start()
957 static bool acpi_ec_stopped(struct acpi_ec *ec) in acpi_ec_stopped() argument
962 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_stopped()
963 flushed = acpi_ec_flushed(ec); in acpi_ec_stopped()
964 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_stopped()
968 static void acpi_ec_stop(struct acpi_ec *ec, bool suspending) in acpi_ec_stop() argument
972 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_stop()
973 if (acpi_ec_started(ec)) { in acpi_ec_stop()
975 set_bit(EC_FLAGS_STOPPED, &ec->flags); in acpi_ec_stop()
976 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_stop()
977 wait_event(ec->wait, acpi_ec_stopped(ec)); in acpi_ec_stop()
978 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_stop()
981 acpi_ec_complete_request(ec); in acpi_ec_stop()
982 ec_dbg_ref(ec, "Decrease driver"); in acpi_ec_stop()
984 __acpi_ec_disable_event(ec); in acpi_ec_stop()
985 clear_bit(EC_FLAGS_STARTED, &ec->flags); in acpi_ec_stop()
986 clear_bit(EC_FLAGS_STOPPED, &ec->flags); in acpi_ec_stop()
989 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_stop()
992 static void acpi_ec_enter_noirq(struct acpi_ec *ec) in acpi_ec_enter_noirq() argument
996 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_enter_noirq()
997 ec->busy_polling = true; in acpi_ec_enter_noirq()
998 ec->polling_guard = 0; in acpi_ec_enter_noirq()
1000 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_enter_noirq()
1003 static void acpi_ec_leave_noirq(struct acpi_ec *ec) in acpi_ec_leave_noirq() argument
1007 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_leave_noirq()
1008 ec->busy_polling = ec_busy_polling; in acpi_ec_leave_noirq()
1009 ec->polling_guard = ec_polling_guard; in acpi_ec_leave_noirq()
1011 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_leave_noirq()
1016 struct acpi_ec *ec = first_ec; in acpi_ec_block_transactions() local
1018 if (!ec) in acpi_ec_block_transactions()
1021 mutex_lock(&ec->mutex); in acpi_ec_block_transactions()
1023 acpi_ec_stop(ec, true); in acpi_ec_block_transactions()
1024 mutex_unlock(&ec->mutex); in acpi_ec_block_transactions()
1055 acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value) in acpi_ec_get_query_handler_by_value() argument
1060 mutex_lock(&ec->mutex); in acpi_ec_get_query_handler_by_value()
1061 list_for_each_entry(handler, &ec->list, node) { in acpi_ec_get_query_handler_by_value()
1067 mutex_unlock(&ec->mutex); in acpi_ec_get_query_handler_by_value()
1084 int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, in acpi_ec_add_query_handler() argument
1098 mutex_lock(&ec->mutex); in acpi_ec_add_query_handler()
1100 list_add(&handler->node, &ec->list); in acpi_ec_add_query_handler()
1101 mutex_unlock(&ec->mutex); in acpi_ec_add_query_handler()
1106 static void acpi_ec_remove_query_handlers(struct acpi_ec *ec, in acpi_ec_remove_query_handlers() argument
1112 mutex_lock(&ec->mutex); in acpi_ec_remove_query_handlers()
1113 list_for_each_entry_safe(handler, tmp, &ec->list, node) { in acpi_ec_remove_query_handlers()
1119 mutex_unlock(&ec->mutex); in acpi_ec_remove_query_handlers()
1124 void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit) in acpi_ec_remove_query_handler() argument
1126 acpi_ec_remove_query_handlers(ec, false, query_bit); in acpi_ec_remove_query_handler()
1169 static int acpi_ec_query(struct acpi_ec *ec, u8 *data) in acpi_ec_query() argument
1184 result = acpi_ec_transaction(ec, &q->transaction); in acpi_ec_query()
1190 q->handler = acpi_ec_get_query_handler_by_value(ec, value); in acpi_ec_query()
1219 static void acpi_ec_check_event(struct acpi_ec *ec) in acpi_ec_check_event() argument
1224 if (ec_guard(ec)) { in acpi_ec_check_event()
1225 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_check_event()
1230 if (!ec->curr) in acpi_ec_check_event()
1231 advance_transaction(ec); in acpi_ec_check_event()
1232 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_check_event()
1240 struct acpi_ec *ec = container_of(work, struct acpi_ec, work); in acpi_ec_event_handler() local
1244 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_event_handler()
1245 while (ec->nr_pending_queries) { in acpi_ec_event_handler()
1246 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_event_handler()
1247 (void)acpi_ec_query(ec, NULL); in acpi_ec_event_handler()
1248 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_event_handler()
1249 ec->nr_pending_queries--; in acpi_ec_event_handler()
1256 if (!ec->nr_pending_queries) { in acpi_ec_event_handler()
1259 acpi_ec_complete_query(ec); in acpi_ec_event_handler()
1262 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_event_handler()
1266 acpi_ec_check_event(ec); in acpi_ec_event_handler()
1273 struct acpi_ec *ec = data; in acpi_ec_gpe_handler() local
1275 spin_lock_irqsave(&ec->lock, flags); in acpi_ec_gpe_handler()
1276 advance_transaction(ec); in acpi_ec_gpe_handler()
1277 spin_unlock_irqrestore(&ec->lock, flags); in acpi_ec_gpe_handler()
1290 struct acpi_ec *ec = handler_context; in acpi_ec_space_handler() local
1300 if (ec->busy_polling || bits > 8) in acpi_ec_space_handler()
1301 acpi_ec_burst_enable(ec); in acpi_ec_space_handler()
1305 acpi_ec_read(ec, address, value) : in acpi_ec_space_handler()
1306 acpi_ec_write(ec, address, *value); in acpi_ec_space_handler()
1308 if (ec->busy_polling || bits > 8) in acpi_ec_space_handler()
1309 acpi_ec_burst_disable(ec); in acpi_ec_space_handler()
1330 static void acpi_ec_free(struct acpi_ec *ec) in acpi_ec_free() argument
1332 if (first_ec == ec) in acpi_ec_free()
1334 if (boot_ec == ec) in acpi_ec_free()
1336 kfree(ec); in acpi_ec_free()
1341 struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL); in acpi_ec_alloc() local
1343 if (!ec) in acpi_ec_alloc()
1345 mutex_init(&ec->mutex); in acpi_ec_alloc()
1346 init_waitqueue_head(&ec->wait); in acpi_ec_alloc()
1347 INIT_LIST_HEAD(&ec->list); in acpi_ec_alloc()
1348 spin_lock_init(&ec->lock); in acpi_ec_alloc()
1349 INIT_WORK(&ec->work, acpi_ec_event_handler); in acpi_ec_alloc()
1350 ec->timestamp = jiffies; in acpi_ec_alloc()
1351 ec->busy_polling = true; in acpi_ec_alloc()
1352 ec->polling_guard = 0; in acpi_ec_alloc()
1353 return ec; in acpi_ec_alloc()
1362 struct acpi_ec *ec = context; in acpi_ec_register_query_methods() local
1369 acpi_ec_add_query_handler(ec, value, handle, NULL, NULL); in acpi_ec_register_query_methods()
1378 struct acpi_ec *ec = context; in ec_parse_device() local
1381 ec->command_addr = ec->data_addr = 0; in ec_parse_device()
1384 ec_parse_io_ports, ec); in ec_parse_device()
1387 if (ec->data_addr == 0 || ec->command_addr == 0) in ec_parse_device()
1395 ec->gpe = boot_ec->gpe; in ec_parse_device()
1402 ec->gpe = tmp; in ec_parse_device()
1407 ec->global_lock = tmp; in ec_parse_device()
1408 ec->handle = handle; in ec_parse_device()
1417 static int ec_install_handlers(struct acpi_ec *ec, bool handle_events) in ec_install_handlers() argument
1421 acpi_ec_start(ec, false); in ec_install_handlers()
1423 if (!test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) { in ec_install_handlers()
1424 acpi_ec_enter_noirq(ec); in ec_install_handlers()
1425 status = acpi_install_address_space_handler(ec->handle, in ec_install_handlers()
1428 NULL, ec); in ec_install_handlers()
1440 acpi_ec_stop(ec, false); in ec_install_handlers()
1444 set_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags); in ec_install_handlers()
1450 if (!test_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags)) { in ec_install_handlers()
1452 acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1, in ec_install_handlers()
1454 NULL, ec, NULL); in ec_install_handlers()
1455 set_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags); in ec_install_handlers()
1457 if (!test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) { in ec_install_handlers()
1458 status = acpi_install_gpe_raw_handler(NULL, ec->gpe, in ec_install_handlers()
1460 &acpi_ec_gpe_handler, ec); in ec_install_handlers()
1463 set_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags); in ec_install_handlers()
1464 acpi_ec_leave_noirq(ec); in ec_install_handlers()
1465 if (test_bit(EC_FLAGS_STARTED, &ec->flags) && in ec_install_handlers()
1466 ec->reference_count >= 1) in ec_install_handlers()
1467 acpi_ec_enable_gpe(ec, true); in ec_install_handlers()
1471 acpi_ec_enable_event(ec); in ec_install_handlers()
1476 static void ec_remove_handlers(struct acpi_ec *ec) in ec_remove_handlers() argument
1478 if (test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) { in ec_remove_handlers()
1479 if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle, in ec_remove_handlers()
1482 clear_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags); in ec_remove_handlers()
1496 acpi_ec_stop(ec, false); in ec_remove_handlers()
1498 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) { in ec_remove_handlers()
1499 if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe, in ec_remove_handlers()
1502 clear_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags); in ec_remove_handlers()
1504 if (test_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags)) { in ec_remove_handlers()
1505 acpi_ec_remove_query_handlers(ec, true, 0); in ec_remove_handlers()
1506 clear_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags); in ec_remove_handlers()
1510 static int acpi_ec_setup(struct acpi_ec *ec, bool handle_events) in acpi_ec_setup() argument
1514 ret = ec_install_handlers(ec, handle_events); in acpi_ec_setup()
1520 first_ec = ec; in acpi_ec_setup()
1524 acpi_handle_info(ec->handle, in acpi_ec_setup()
1526 ec->gpe, ec->command_addr, ec->data_addr); in acpi_ec_setup()
1530 static int acpi_config_boot_ec(struct acpi_ec *ec, acpi_handle handle, in acpi_config_boot_ec() argument
1544 if (boot_ec != ec) in acpi_config_boot_ec()
1553 if (ec->handle != handle) in acpi_config_boot_ec()
1554 ec->handle = handle; in acpi_config_boot_ec()
1556 ret = acpi_ec_setup(ec, handle_events); in acpi_config_boot_ec()
1562 boot_ec = ec; in acpi_config_boot_ec()
1592 static bool acpi_is_boot_ec(struct acpi_ec *ec) in acpi_is_boot_ec() argument
1596 if (ec->command_addr == boot_ec->command_addr && in acpi_is_boot_ec()
1597 ec->data_addr == boot_ec->data_addr) in acpi_is_boot_ec()
1604 struct acpi_ec *ec = NULL; in acpi_ec_add() local
1614 ec = boot_ec; in acpi_ec_add()
1616 ec = acpi_ec_alloc(); in acpi_ec_add()
1617 if (!ec) in acpi_ec_add()
1619 status = ec_parse_device(device->handle, 0, ec, NULL); in acpi_ec_add()
1626 if (acpi_is_boot_ec(ec)) { in acpi_ec_add()
1635 boot_ec->handle = ec->handle; in acpi_ec_add()
1636 acpi_handle_debug(ec->handle, "duplicated.\n"); in acpi_ec_add()
1637 acpi_ec_free(ec); in acpi_ec_add()
1638 ec = boot_ec; in acpi_ec_add()
1640 ret = acpi_config_boot_ec(ec, ec->handle, true, is_ecdt); in acpi_ec_add()
1642 ret = acpi_ec_setup(ec, true); in acpi_ec_add()
1646 device->driver_data = ec; in acpi_ec_add()
1648 ret = !!request_region(ec->data_addr, 1, "EC data"); in acpi_ec_add()
1649 WARN(!ret, "Could not request EC data io port 0x%lx", ec->data_addr); in acpi_ec_add()
1650 ret = !!request_region(ec->command_addr, 1, "EC cmd"); in acpi_ec_add()
1651 WARN(!ret, "Could not request EC cmd io port 0x%lx", ec->command_addr); in acpi_ec_add()
1655 acpi_walk_dep_device_list(ec->handle); in acpi_ec_add()
1657 acpi_handle_debug(ec->handle, "enumerated.\n"); in acpi_ec_add()
1661 if (ec != boot_ec) in acpi_ec_add()
1662 acpi_ec_remove_query_handlers(ec, true, 0); in acpi_ec_add()
1664 if (ec != boot_ec) in acpi_ec_add()
1665 acpi_ec_free(ec); in acpi_ec_add()
1671 struct acpi_ec *ec; in acpi_ec_remove() local
1676 ec = acpi_driver_data(device); in acpi_ec_remove()
1677 release_region(ec->data_addr, 1); in acpi_ec_remove()
1678 release_region(ec->command_addr, 1); in acpi_ec_remove()
1680 if (ec != boot_ec) { in acpi_ec_remove()
1681 ec_remove_handlers(ec); in acpi_ec_remove()
1682 acpi_ec_free(ec); in acpi_ec_remove()
1690 struct acpi_ec *ec = context; in ec_parse_io_ports() local
1700 if (ec->data_addr == 0) in ec_parse_io_ports()
1701 ec->data_addr = resource->data.io.minimum; in ec_parse_io_ports()
1702 else if (ec->command_addr == 0) in ec_parse_io_ports()
1703 ec->command_addr = resource->data.io.minimum; in ec_parse_io_ports()
1724 struct acpi_ec *ec; in acpi_ec_dsdt_probe() local
1736 ec = acpi_ec_alloc(); in acpi_ec_dsdt_probe()
1737 if (!ec) in acpi_ec_dsdt_probe()
1744 ec_parse_device, ec, NULL); in acpi_ec_dsdt_probe()
1745 if (ACPI_FAILURE(status) || !ec->handle) { in acpi_ec_dsdt_probe()
1756 ret = acpi_config_boot_ec(ec, ec->handle, false, false); in acpi_ec_dsdt_probe()
1759 acpi_ec_free(ec); in acpi_ec_dsdt_probe()
1868 struct acpi_ec *ec; in acpi_ec_ecdt_probe() local
1870 ec = acpi_ec_alloc(); in acpi_ec_ecdt_probe()
1871 if (!ec) in acpi_ec_ecdt_probe()
1894 ec->command_addr = ecdt_ptr->data.address; in acpi_ec_ecdt_probe()
1895 ec->data_addr = ecdt_ptr->control.address; in acpi_ec_ecdt_probe()
1897 ec->command_addr = ecdt_ptr->control.address; in acpi_ec_ecdt_probe()
1898 ec->data_addr = ecdt_ptr->data.address; in acpi_ec_ecdt_probe()
1900 ec->gpe = ecdt_ptr->gpe; in acpi_ec_ecdt_probe()
1906 ret = acpi_config_boot_ec(ec, ACPI_ROOT_OBJECT, false, true); in acpi_ec_ecdt_probe()
1909 acpi_ec_free(ec); in acpi_ec_ecdt_probe()
1916 struct acpi_ec *ec = in acpi_ec_suspend() local
1920 acpi_ec_disable_event(ec); in acpi_ec_suspend()
1926 struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev)); in acpi_ec_suspend_noirq() local
1932 if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) && in acpi_ec_suspend_noirq()
1933 ec->reference_count >= 1) in acpi_ec_suspend_noirq()
1934 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE); in acpi_ec_suspend_noirq()
1937 acpi_ec_enter_noirq(ec); in acpi_ec_suspend_noirq()
1944 struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev)); in acpi_ec_resume_noirq() local
1947 acpi_ec_leave_noirq(ec); in acpi_ec_resume_noirq()
1949 if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) && in acpi_ec_resume_noirq()
1950 ec->reference_count >= 1) in acpi_ec_resume_noirq()
1951 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE); in acpi_ec_resume_noirq()
1958 struct acpi_ec *ec = in acpi_ec_resume() local
1961 acpi_ec_enable_event(ec); in acpi_ec_resume()