Lines Matching refs:device
28 #define ACPI_IS_ROOT_DEVICE(device) (!(device)->parent) argument
145 struct acpi_device *device = NULL; in acpi_bus_offline() local
150 if (acpi_bus_get_device(handle, &device)) in acpi_bus_offline()
153 if (device->handler && !device->handler->hotplug.enabled) { in acpi_bus_offline()
154 *ret_p = &device->dev; in acpi_bus_offline()
158 mutex_lock(&device->physical_node_lock); in acpi_bus_offline()
160 list_for_each_entry(pn, &device->physical_node_list, node) { in acpi_bus_offline()
185 mutex_unlock(&device->physical_node_lock); in acpi_bus_offline()
193 struct acpi_device *device = NULL; in acpi_bus_online() local
196 if (acpi_bus_get_device(handle, &device)) in acpi_bus_online()
199 mutex_lock(&device->physical_node_lock); in acpi_bus_online()
201 list_for_each_entry(pn, &device->physical_node_list, node) in acpi_bus_online()
207 mutex_unlock(&device->physical_node_lock); in acpi_bus_online()
212 static int acpi_scan_try_to_offline(struct acpi_device *device) in acpi_scan_try_to_offline() argument
214 acpi_handle handle = device->handle; in acpi_scan_try_to_offline()
215 struct device *errdev = NULL; in acpi_scan_try_to_offline()
258 static int acpi_scan_hot_remove(struct acpi_device *device) in acpi_scan_hot_remove() argument
260 acpi_handle handle = device->handle; in acpi_scan_hot_remove()
264 if (device->handler && device->handler->hotplug.demand_offline in acpi_scan_hot_remove()
266 if (!acpi_scan_is_offline(device, true)) in acpi_scan_hot_remove()
269 int error = acpi_scan_try_to_offline(device); in acpi_scan_hot_remove()
275 "Hot-removing device %s...\n", dev_name(&device->dev))); in acpi_scan_hot_remove()
277 acpi_bus_trim(device); in acpi_scan_hot_remove()
446 static void acpi_free_power_resources_lists(struct acpi_device *device) in acpi_free_power_resources_lists() argument
450 if (device->wakeup.flags.valid) in acpi_free_power_resources_lists()
451 acpi_power_resources_list_free(&device->wakeup.resources); in acpi_free_power_resources_lists()
453 if (!device->power.flags.power_resources) in acpi_free_power_resources_lists()
457 struct acpi_device_power_state *ps = &device->power.states[i]; in acpi_free_power_resources_lists()
462 static void acpi_device_release(struct device *dev) in acpi_device_release()
472 static void acpi_device_del(struct acpi_device *device) in acpi_device_del() argument
475 if (device->parent) in acpi_device_del()
476 list_del(&device->node); in acpi_device_del()
478 list_del(&device->wakeup_list); in acpi_device_del()
481 acpi_power_add_remove_device(device, false); in acpi_device_del()
482 acpi_device_remove_files(device); in acpi_device_del()
483 if (device->remove) in acpi_device_del()
484 device->remove(device); in acpi_device_del()
486 device_del(&device->dev); in acpi_device_del()
559 static int acpi_get_device_data(acpi_handle handle, struct acpi_device **device, in acpi_get_device_data() argument
564 if (!device) in acpi_get_device_data()
568 (void **)device, callback); in acpi_get_device_data()
569 if (ACPI_FAILURE(status) || !*device) { in acpi_get_device_data()
577 int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device) in acpi_bus_get_device() argument
579 return acpi_get_device_data(handle, device, NULL); in acpi_bus_get_device()
602 int acpi_device_add(struct acpi_device *device, in acpi_device_add() argument
603 void (*release)(struct device *)) in acpi_device_add() argument
609 if (device->handle) { in acpi_device_add()
612 status = acpi_attach_data(device->handle, acpi_scan_drop_device, in acpi_device_add()
613 device); in acpi_device_add()
615 acpi_handle_err(device->handle, in acpi_device_add()
626 INIT_LIST_HEAD(&device->children); in acpi_device_add()
627 INIT_LIST_HEAD(&device->node); in acpi_device_add()
628 INIT_LIST_HEAD(&device->wakeup_list); in acpi_device_add()
629 INIT_LIST_HEAD(&device->physical_node_list); in acpi_device_add()
630 INIT_LIST_HEAD(&device->del_list); in acpi_device_add()
631 mutex_init(&device->physical_node_lock); in acpi_device_add()
647 acpi_device_hid(device))) { in acpi_device_add()
656 strcpy(acpi_device_bus_id->bus_id, acpi_device_hid(device)); in acpi_device_add()
660 dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no); in acpi_device_add()
662 if (device->parent) in acpi_device_add()
663 list_add_tail(&device->node, &device->parent->children); in acpi_device_add()
665 if (device->wakeup.flags.valid) in acpi_device_add()
666 list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list); in acpi_device_add()
669 if (device->parent) in acpi_device_add()
670 device->dev.parent = &device->parent->dev; in acpi_device_add()
671 device->dev.bus = &acpi_bus_type; in acpi_device_add()
672 device->dev.release = release; in acpi_device_add()
673 result = device_add(&device->dev); in acpi_device_add()
675 dev_err(&device->dev, "Error registering device\n"); in acpi_device_add()
679 result = acpi_device_setup_files(device); in acpi_device_add()
682 dev_name(&device->dev)); in acpi_device_add()
688 if (device->parent) in acpi_device_add()
689 list_del(&device->node); in acpi_device_add()
690 list_del(&device->wakeup_list); in acpi_device_add()
694 acpi_detach_data(device->handle, acpi_scan_drop_device); in acpi_device_add()
703 struct acpi_device *device = NULL; in acpi_bus_get_parent() local
718 } while (acpi_bus_get_device(handle, &device)); in acpi_bus_get_parent()
719 return device; in acpi_bus_get_parent()
827 static void acpi_wakeup_gpe_init(struct acpi_device *device) in acpi_wakeup_gpe_init() argument
835 struct acpi_device_wakeup *wakeup = &device->wakeup; in acpi_wakeup_gpe_init()
842 if (!acpi_match_device_ids(device, button_device_ids)) { in acpi_wakeup_gpe_init()
844 if (!acpi_match_device_ids(device, &button_device_ids[1])) { in acpi_wakeup_gpe_init()
850 device_set_wakeup_capable(&device->dev, true); in acpi_wakeup_gpe_init()
854 acpi_setup_gpe_for_wake(device->handle, wakeup->gpe_device, in acpi_wakeup_gpe_init()
864 static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device) in acpi_bus_get_wakeup_device_flags() argument
869 if (!acpi_has_method(device->handle, "_PRW")) in acpi_bus_get_wakeup_device_flags()
872 err = acpi_bus_extract_wakeup_device_power_package(device->handle, in acpi_bus_get_wakeup_device_flags()
873 &device->wakeup); in acpi_bus_get_wakeup_device_flags()
875 dev_err(&device->dev, "_PRW evaluation error: %d\n", err); in acpi_bus_get_wakeup_device_flags()
879 device->wakeup.flags.valid = 1; in acpi_bus_get_wakeup_device_flags()
880 device->wakeup.prepare_count = 0; in acpi_bus_get_wakeup_device_flags()
881 acpi_wakeup_gpe_init(device); in acpi_bus_get_wakeup_device_flags()
888 err = acpi_device_sleep_wake(device, 0, 0, 0); in acpi_bus_get_wakeup_device_flags()
894 static void acpi_bus_init_power_state(struct acpi_device *device, int state) in acpi_bus_init_power_state() argument
896 struct acpi_device_power_state *ps = &device->power.states[state]; in acpi_bus_init_power_state()
904 status = acpi_evaluate_object(device->handle, pathname, NULL, &buffer); in acpi_bus_init_power_state()
914 device->power.flags.power_resources = 1; in acpi_bus_init_power_state()
921 if (acpi_has_method(device->handle, pathname)) in acpi_bus_init_power_state()
932 static void acpi_bus_get_power_flags(struct acpi_device *device) in acpi_bus_get_power_flags() argument
937 if (!acpi_has_method(device->handle, "_PS0") && in acpi_bus_get_power_flags()
938 !acpi_has_method(device->handle, "_PR0")) in acpi_bus_get_power_flags()
941 device->flags.power_manageable = 1; in acpi_bus_get_power_flags()
946 if (acpi_has_method(device->handle, "_PSC")) in acpi_bus_get_power_flags()
947 device->power.flags.explicit_get = 1; in acpi_bus_get_power_flags()
949 if (acpi_has_method(device->handle, "_IRC")) in acpi_bus_get_power_flags()
950 device->power.flags.inrush_current = 1; in acpi_bus_get_power_flags()
952 if (acpi_has_method(device->handle, "_DSW")) in acpi_bus_get_power_flags()
953 device->power.flags.dsw_present = 1; in acpi_bus_get_power_flags()
959 acpi_bus_init_power_state(device, i); in acpi_bus_get_power_flags()
961 INIT_LIST_HEAD(&device->power.states[ACPI_STATE_D3_COLD].resources); in acpi_bus_get_power_flags()
962 if (!list_empty(&device->power.states[ACPI_STATE_D3_HOT].resources)) in acpi_bus_get_power_flags()
963 device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1; in acpi_bus_get_power_flags()
966 device->power.states[ACPI_STATE_D0].flags.valid = 1; in acpi_bus_get_power_flags()
967 device->power.states[ACPI_STATE_D0].power = 100; in acpi_bus_get_power_flags()
968 device->power.states[ACPI_STATE_D3_HOT].flags.valid = 1; in acpi_bus_get_power_flags()
970 if (acpi_bus_init_power(device)) in acpi_bus_get_power_flags()
971 device->flags.power_manageable = 0; in acpi_bus_get_power_flags()
974 static void acpi_bus_get_flags(struct acpi_device *device) in acpi_bus_get_flags() argument
977 if (acpi_has_method(device->handle, "_STA")) in acpi_bus_get_flags()
978 device->flags.dynamic_status = 1; in acpi_bus_get_flags()
981 if (acpi_has_method(device->handle, "_RMV")) in acpi_bus_get_flags()
982 device->flags.removable = 1; in acpi_bus_get_flags()
985 if (acpi_has_method(device->handle, "_EJD") || in acpi_bus_get_flags()
986 acpi_has_method(device->handle, "_EJ0")) in acpi_bus_get_flags()
987 device->flags.ejectable = 1; in acpi_bus_get_flags()
990 static void acpi_device_get_busid(struct acpi_device *device) in acpi_device_get_busid() argument
1002 if (ACPI_IS_ROOT_DEVICE(device)) { in acpi_device_get_busid()
1003 strcpy(device->pnp.bus_id, "ACPI"); in acpi_device_get_busid()
1007 switch (device->device_type) { in acpi_device_get_busid()
1009 strcpy(device->pnp.bus_id, "PWRF"); in acpi_device_get_busid()
1012 strcpy(device->pnp.bus_id, "SLPF"); in acpi_device_get_busid()
1015 acpi_get_name(device->handle, ACPI_SINGLE_NAME, &buffer); in acpi_device_get_busid()
1023 strcpy(device->pnp.bus_id, bus_id); in acpi_device_get_busid()
1147 const char *acpi_device_hid(struct acpi_device *device) in acpi_device_hid() argument
1151 if (list_empty(&device->pnp.ids)) in acpi_device_hid()
1154 hid = list_first_entry(&device->pnp.ids, struct acpi_hardware_id, list); in acpi_device_hid()
1386 void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, in acpi_init_device_object() argument
1389 INIT_LIST_HEAD(&device->pnp.ids); in acpi_init_device_object()
1390 device->device_type = type; in acpi_init_device_object()
1391 device->handle = handle; in acpi_init_device_object()
1392 device->parent = acpi_bus_get_parent(handle); in acpi_init_device_object()
1393 device->fwnode.type = FWNODE_ACPI; in acpi_init_device_object()
1394 acpi_set_device_status(device, sta); in acpi_init_device_object()
1395 acpi_device_get_busid(device); in acpi_init_device_object()
1396 acpi_set_pnp_ids(handle, &device->pnp, type); in acpi_init_device_object()
1397 acpi_init_properties(device); in acpi_init_device_object()
1398 acpi_bus_get_flags(device); in acpi_init_device_object()
1399 device->flags.match_driver = false; in acpi_init_device_object()
1400 device->flags.initialized = true; in acpi_init_device_object()
1401 device->flags.visited = false; in acpi_init_device_object()
1402 device_initialize(&device->dev); in acpi_init_device_object()
1403 dev_set_uevent_suppress(&device->dev, true); in acpi_init_device_object()
1404 acpi_init_coherency(device); in acpi_init_device_object()
1407 void acpi_device_add_finalize(struct acpi_device *device) in acpi_device_add_finalize() argument
1409 dev_set_uevent_suppress(&device->dev, false); in acpi_device_add_finalize()
1410 kobject_uevent(&device->dev.kobj, KOBJ_ADD); in acpi_device_add_finalize()
1418 struct acpi_device *device; in acpi_add_single_object() local
1421 device = kzalloc(sizeof(struct acpi_device), GFP_KERNEL); in acpi_add_single_object()
1422 if (!device) { in acpi_add_single_object()
1427 acpi_init_device_object(device, handle, type, sta); in acpi_add_single_object()
1428 acpi_bus_get_power_flags(device); in acpi_add_single_object()
1429 acpi_bus_get_wakeup_device_flags(device); in acpi_add_single_object()
1431 result = acpi_device_add(device, acpi_device_release); in acpi_add_single_object()
1433 acpi_device_release(&device->dev); in acpi_add_single_object()
1437 acpi_power_add_remove_device(device, true); in acpi_add_single_object()
1438 acpi_device_add_finalize(device); in acpi_add_single_object()
1441 dev_name(&device->dev), (char *) buffer.pointer, in acpi_add_single_object()
1442 device->parent ? dev_name(&device->parent->dev) : "(null)")); in acpi_add_single_object()
1444 *child = device; in acpi_add_single_object()
1615 struct acpi_device *device = NULL; in acpi_bus_check_add() local
1620 acpi_bus_get_device(handle, &device); in acpi_bus_check_add()
1621 if (device) in acpi_bus_check_add()
1633 acpi_add_single_object(&device, handle, type, sta); in acpi_bus_check_add()
1634 if (!device) in acpi_bus_check_add()
1637 acpi_scan_init_hotplug(device); in acpi_bus_check_add()
1638 acpi_device_dep_initialize(device); in acpi_bus_check_add()
1642 *return_value = device; in acpi_bus_check_add()
1665 static void acpi_default_enumeration(struct acpi_device *device) in acpi_default_enumeration() argument
1675 acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave, in acpi_default_enumeration()
1679 acpi_create_platform_device(device); in acpi_default_enumeration()
1705 static int acpi_scan_attach_handler(struct acpi_device *device) in acpi_scan_attach_handler() argument
1710 list_for_each_entry(hwid, &device->pnp.ids, list) { in acpi_scan_attach_handler()
1717 device->pnp.type.platform_id = 0; in acpi_scan_attach_handler()
1720 device->handler = handler; in acpi_scan_attach_handler()
1721 ret = handler->attach(device, devid); in acpi_scan_attach_handler()
1725 device->handler = NULL; in acpi_scan_attach_handler()
1734 static void acpi_bus_attach(struct acpi_device *device) in acpi_bus_attach() argument
1740 if (ACPI_SUCCESS(acpi_bus_get_ejd(device->handle, &ejd))) in acpi_bus_attach()
1741 register_dock_dependent_device(device, ejd); in acpi_bus_attach()
1743 acpi_bus_get_status(device); in acpi_bus_attach()
1745 if (!acpi_device_is_present(device)) { in acpi_bus_attach()
1746 device->flags.visited = false; in acpi_bus_attach()
1747 device->flags.power_manageable = 0; in acpi_bus_attach()
1750 if (device->handler) in acpi_bus_attach()
1753 if (!device->flags.initialized) { in acpi_bus_attach()
1754 device->flags.power_manageable = in acpi_bus_attach()
1755 device->power.states[ACPI_STATE_D0].flags.valid; in acpi_bus_attach()
1756 if (acpi_bus_init_power(device)) in acpi_bus_attach()
1757 device->flags.power_manageable = 0; in acpi_bus_attach()
1759 device->flags.initialized = true; in acpi_bus_attach()
1761 device->flags.visited = false; in acpi_bus_attach()
1762 ret = acpi_scan_attach_handler(device); in acpi_bus_attach()
1766 device->flags.match_driver = true; in acpi_bus_attach()
1768 ret = device_attach(&device->dev); in acpi_bus_attach()
1772 if (!ret && device->pnp.type.platform_id) in acpi_bus_attach()
1773 acpi_default_enumeration(device); in acpi_bus_attach()
1775 device->flags.visited = true; in acpi_bus_attach()
1778 list_for_each_entry(child, &device->children, node) in acpi_bus_attach()
1781 if (device->handler && device->handler->hotplug.notify_online) in acpi_bus_attach()
1782 device->handler->hotplug.notify_online(device); in acpi_bus_attach()
1824 void *device = NULL; in acpi_bus_scan() local
1826 if (ACPI_SUCCESS(acpi_bus_check_add(handle, 0, NULL, &device))) in acpi_bus_scan()
1828 acpi_bus_check_add, NULL, NULL, &device); in acpi_bus_scan()
1830 if (device) { in acpi_bus_scan()
1831 acpi_bus_attach(device); in acpi_bus_scan()
1879 struct acpi_device *device = NULL; in acpi_bus_scan_fixed() local
1881 result = acpi_add_single_object(&device, NULL, in acpi_bus_scan_fixed()
1887 device->flags.match_driver = true; in acpi_bus_scan_fixed()
1888 result = device_attach(&device->dev); in acpi_bus_scan_fixed()
1892 device_init_wakeup(&device->dev, true); in acpi_bus_scan_fixed()
1896 struct acpi_device *device = NULL; in acpi_bus_scan_fixed() local
1898 result = acpi_add_single_object(&device, NULL, in acpi_bus_scan_fixed()
1904 device->flags.match_driver = true; in acpi_bus_scan_fixed()
1905 result = device_attach(&device->dev); in acpi_bus_scan_fixed()