Lines Matching +full:device +full:- +full:handle
1 // SPDX-License-Identifier: GPL-2.0-only
3 * drivers/acpi/device_sysfs.c - ACPI device sysfs attributes and modalias.
15 #include <linux/device.h>
21 static ssize_t acpi_object_path(acpi_handle handle, char *buf) in acpi_object_path() argument
26 result = acpi_get_name(handle, ACPI_FULL_PATHNAME, &path); in acpi_object_path()
47 return dn->handle ? acpi_object_path(dn->handle, buf) : 0; in data_node_show_path()
67 return dn_attr->show ? dn_attr->show(dn, buf) : -ENXIO; in acpi_data_node_attr_show()
78 complete(&dn->kobj_done); in acpi_data_node_release()
90 struct list_head *list = &data->subnodes; in acpi_expose_nondev_subnodes()
99 init_completion(&dn->kobj_done); in acpi_expose_nondev_subnodes()
100 ret = kobject_init_and_add(&dn->kobj, &acpi_data_node_ktype, in acpi_expose_nondev_subnodes()
101 kobj, "%s", dn->name); in acpi_expose_nondev_subnodes()
103 acpi_expose_nondev_subnodes(&dn->kobj, &dn->data); in acpi_expose_nondev_subnodes()
104 else if (dn->handle) in acpi_expose_nondev_subnodes()
105 acpi_handle_err(dn->handle, "Failed to expose (%d)\n", ret); in acpi_expose_nondev_subnodes()
111 struct list_head *list = &data->subnodes; in acpi_hide_nondev_subnodes()
118 acpi_hide_nondev_subnodes(&dn->data); in acpi_hide_nondev_subnodes()
119 kobject_put(&dn->kobj); in acpi_hide_nondev_subnodes()
124 * create_pnp_modalias - Create hid/cid(s) string for modalias and uevent
125 * @acpi_dev: ACPI device object.
130 * e.g. on a device with hid:IBM0001 and cid:ACPI0001 you get:
133 * -EINVAL: output error
134 * -ENOMEM: output is truncated
150 * device's list. in create_pnp_modalias()
153 list_for_each_entry(id, &acpi_dev->pnp.ids, list) in create_pnp_modalias()
154 if (strcmp(id->id, ACPI_DT_NAMESPACE_HID)) in create_pnp_modalias()
162 return -ENOMEM; in create_pnp_modalias()
164 size -= len; in create_pnp_modalias()
166 list_for_each_entry(id, &acpi_dev->pnp.ids, list) { in create_pnp_modalias()
167 if (!strcmp(id->id, ACPI_DT_NAMESPACE_HID)) in create_pnp_modalias()
170 count = snprintf(&modalias[len], size, "%s:", id->id); in create_pnp_modalias()
173 return -ENOMEM; in create_pnp_modalias()
176 size -= count; in create_pnp_modalias()
183 * create_of_modalias - Creates DT compatible string for modalias and uevent
184 * @acpi_dev: ACPI device object.
202 status = acpi_get_name(acpi_dev->handle, ACPI_SINGLE_NAME, &buf); in create_of_modalias()
204 return -ENODEV; in create_of_modalias()
214 return -ENOMEM; in create_of_modalias()
216 size -= len; in create_of_modalias()
218 of_compatible = acpi_dev->data.of_compatible; in create_of_modalias()
219 if (of_compatible->type == ACPI_TYPE_PACKAGE) { in create_of_modalias()
220 nval = of_compatible->package.count; in create_of_modalias()
221 obj = of_compatible->package.elements; in create_of_modalias()
228 obj->string.pointer); in create_of_modalias()
231 return -ENOMEM; in create_of_modalias()
234 size -= count; in create_of_modalias()
246 return -ENODEV; in __acpi_device_uevent_modalias()
248 if (list_empty(&adev->pnp.ids)) in __acpi_device_uevent_modalias()
252 return -ENOMEM; in __acpi_device_uevent_modalias()
254 if (adev->data.of_compatible) in __acpi_device_uevent_modalias()
255 len = create_of_modalias(adev, &env->buf[env->buflen - 1], in __acpi_device_uevent_modalias()
256 sizeof(env->buf) - env->buflen); in __acpi_device_uevent_modalias()
258 len = create_pnp_modalias(adev, &env->buf[env->buflen - 1], in __acpi_device_uevent_modalias()
259 sizeof(env->buf) - env->buflen); in __acpi_device_uevent_modalias()
263 env->buflen += len; in __acpi_device_uevent_modalias()
269 * acpi_device_uevent_modalias - uevent modalias for ACPI-enumerated devices.
270 * @dev: Struct device to get ACPI device node.
273 * Create the uevent modalias field for ACPI-enumerated devices.
275 * Because other buses do not support ACPI HIDs & CIDs, e.g. for a device with
278 int acpi_device_uevent_modalias(const struct device *dev, struct kobj_uevent_env *env) in acpi_device_uevent_modalias()
289 return -ENODEV; in __acpi_device_modalias()
291 if (list_empty(&adev->pnp.ids)) in __acpi_device_modalias()
294 len = create_pnp_modalias(adev, buf, size - 1); in __acpi_device_modalias()
299 size -= len; in __acpi_device_modalias()
301 if (!adev->data.of_compatible) in __acpi_device_modalias()
304 count = create_of_modalias(adev, buf + len, size - 1); in __acpi_device_modalias()
316 * acpi_device_modalias - modalias sysfs attribute for ACPI-enumerated devices.
317 * @dev: Struct device to get ACPI device node.
321 * Create the modalias sysfs attribute for ACPI-enumerated devices.
323 * Because other buses do not support ACPI HIDs & CIDs, e.g. for a device with
326 int acpi_device_modalias(struct device *dev, char *buf, int size) in acpi_device_modalias()
333 modalias_show(struct device *dev, struct device_attribute *attr, char *buf) in modalias_show()
339 static ssize_t real_power_state_show(struct device *dev, in real_power_state_show()
355 static ssize_t power_state_show(struct device *dev, in power_state_show()
360 return sprintf(buf, "%s\n", acpi_power_state_string(adev->power.state)); in power_state_show()
366 eject_store(struct device *d, struct device_attribute *attr, in eject_store()
374 return -EINVAL; in eject_store()
376 if ((!acpi_device->handler || !acpi_device->handler->hotplug.enabled) in eject_store()
377 && !d->driver) in eject_store()
378 return -ENODEV; in eject_store()
380 status = acpi_get_type(acpi_device->handle, ¬_used); in eject_store()
381 if (ACPI_FAILURE(status) || !acpi_device->flags.ejectable) in eject_store()
382 return -ENODEV; in eject_store()
390 acpi_evaluate_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT, in eject_store()
392 return status == AE_NO_MEMORY ? -ENOMEM : -EAGAIN; in eject_store()
398 hid_show(struct device *dev, struct device_attribute *attr, char *buf) in hid_show()
406 static ssize_t uid_show(struct device *dev, in uid_show()
415 static ssize_t adr_show(struct device *dev, in adr_show()
420 if (acpi_dev->pnp.bus_address > U32_MAX) in adr_show()
421 return sprintf(buf, "0x%016llx\n", acpi_dev->pnp.bus_address); in adr_show()
423 return sprintf(buf, "0x%08llx\n", acpi_dev->pnp.bus_address); in adr_show()
427 static ssize_t path_show(struct device *dev, in path_show()
432 return acpi_object_path(acpi_dev->handle, buf); in path_show()
437 static ssize_t description_show(struct device *dev, in description_show()
447 status = acpi_evaluate_object_typed(acpi_dev->handle, "_STR", in description_show()
451 return -EIO; in description_show()
456 * The _STR object contains a Unicode identifier for a device. in description_show()
457 * We need to convert to utf-8 so it can be displayed. in description_show()
460 (wchar_t *)str_obj->buffer.pointer, in description_show()
461 str_obj->buffer.length, in description_show()
463 PAGE_SIZE - 1); in description_show()
474 sun_show(struct device *dev, struct device_attribute *attr, in sun_show()
481 status = acpi_evaluate_integer(acpi_dev->handle, "_SUN", NULL, &sun); in sun_show()
483 return -EIO; in sun_show()
490 hrv_show(struct device *dev, struct device_attribute *attr, in hrv_show()
497 status = acpi_evaluate_integer(acpi_dev->handle, "_HRV", NULL, &hrv); in hrv_show()
499 return -EIO; in hrv_show()
505 static ssize_t status_show(struct device *dev, struct device_attribute *attr, in status_show()
512 status = acpi_evaluate_integer(acpi_dev->handle, "_STA", NULL, &sta); in status_show()
514 return -EIO; in status_show()
542 return dev->handle; in acpi_show_attr()
545 return !list_empty(&dev->pnp.ids); in acpi_show_attr()
548 return acpi_has_method(dev->handle, "_STR"); in acpi_show_attr()
551 return dev->pnp.type.bus_address; in acpi_show_attr()
557 return acpi_has_method(dev->handle, "_SUN"); in acpi_show_attr()
560 return acpi_has_method(dev->handle, "_HRV"); in acpi_show_attr()
563 return acpi_has_method(dev->handle, "_STA"); in acpi_show_attr()
566 * If device has _EJ0, 'eject' file is created that is used to trigger in acpi_show_attr()
567 * hot-removal function from userland. in acpi_show_attr()
570 return acpi_has_method(dev->handle, "_EJ0"); in acpi_show_attr()
573 return dev->flags.power_manageable; in acpi_show_attr()
576 return dev->flags.power_manageable && dev->power.flags.power_resources; in acpi_show_attr()
578 dev_warn_once(&dev->dev, "Unexpected attribute: %s\n", attr->attr.name); in acpi_show_attr()
589 return attr->mode; in acpi_attr_is_visible()
605 * acpi_device_setup_files - Create sysfs attributes of an ACPI device.
606 * @dev: ACPI device object.
610 acpi_expose_nondev_subnodes(&dev->dev.kobj, &dev->data); in acpi_device_setup_files()
614 * acpi_device_remove_files - Remove sysfs attributes of an ACPI device.
615 * @dev: ACPI device object.
619 acpi_hide_nondev_subnodes(&dev->data); in acpi_device_remove_files()