scan.c (935ab8509ccb277c536c9fad96b1a90d3bed98fc) scan.c (eb50aaf960e3bedfef79063411ffd670da94b84b)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * scan.c - support for transforming the ACPI namespace into individual objects
4 */
5
6#include <linux/module.h>
7#include <linux/init.h>
8#include <linux/slab.h>

--- 465 unchanged lines hidden (view full) ---

474
475 mutex_lock(&acpi_device_lock);
476 if (device->parent)
477 list_del(&device->node);
478
479 list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node)
480 if (!strcmp(acpi_device_bus_id->bus_id,
481 acpi_device_hid(device))) {
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * scan.c - support for transforming the ACPI namespace into individual objects
4 */
5
6#include <linux/module.h>
7#include <linux/init.h>
8#include <linux/slab.h>

--- 465 unchanged lines hidden (view full) ---

474
475 mutex_lock(&acpi_device_lock);
476 if (device->parent)
477 list_del(&device->node);
478
479 list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node)
480 if (!strcmp(acpi_device_bus_id->bus_id,
481 acpi_device_hid(device))) {
482 if (acpi_device_bus_id->instance_no > 0)
483 acpi_device_bus_id->instance_no--;
484 else {
482 ida_simple_remove(&acpi_device_bus_id->instance_ida, device->pnp.instance_no);
483 if (ida_is_empty(&acpi_device_bus_id->instance_ida)) {
485 list_del(&acpi_device_bus_id->node);
486 kfree_const(acpi_device_bus_id->bus_id);
487 kfree(acpi_device_bus_id);
488 }
489 break;
490 }
491
492 list_del(&device->wakeup_list);

--- 63 unchanged lines hidden (view full) ---

556 mutex_lock(&acpi_device_del_lock);
557
558 /*
559 * Use the ACPI hotplug workqueue which is ordered, so this work item
560 * won't run after any hotplug work items submitted subsequently. That
561 * prevents attempts to register device objects identical to those being
562 * deleted from happening concurrently (such attempts result from
563 * hotplug events handled via the ACPI hotplug workqueue). It also will
484 list_del(&acpi_device_bus_id->node);
485 kfree_const(acpi_device_bus_id->bus_id);
486 kfree(acpi_device_bus_id);
487 }
488 break;
489 }
490
491 list_del(&device->wakeup_list);

--- 63 unchanged lines hidden (view full) ---

555 mutex_lock(&acpi_device_del_lock);
556
557 /*
558 * Use the ACPI hotplug workqueue which is ordered, so this work item
559 * won't run after any hotplug work items submitted subsequently. That
560 * prevents attempts to register device objects identical to those being
561 * deleted from happening concurrently (such attempts result from
562 * hotplug events handled via the ACPI hotplug workqueue). It also will
564 * run after all of the work items submitted previously, which helps
563 * run after all of the work items submitted previosuly, which helps
565 * those work items to ensure that they are not accessing stale device
566 * objects.
567 */
568 if (list_empty(&acpi_device_del_list))
569 acpi_queue_hotplug_work(&work);
570
571 list_add_tail(&adev->del_list, &acpi_device_del_list);
572 /* Make acpi_ns_validate_handle() return NULL for this handle. */

--- 53 unchanged lines hidden (view full) ---

626 /* Find suitable bus_id and instance number in acpi_bus_id_list. */
627 list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) {
628 if (!strcmp(acpi_device_bus_id->bus_id, dev_id))
629 return acpi_device_bus_id;
630 }
631 return NULL;
632}
633
564 * those work items to ensure that they are not accessing stale device
565 * objects.
566 */
567 if (list_empty(&acpi_device_del_list))
568 acpi_queue_hotplug_work(&work);
569
570 list_add_tail(&adev->del_list, &acpi_device_del_list);
571 /* Make acpi_ns_validate_handle() return NULL for this handle. */

--- 53 unchanged lines hidden (view full) ---

625 /* Find suitable bus_id and instance number in acpi_bus_id_list. */
626 list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) {
627 if (!strcmp(acpi_device_bus_id->bus_id, dev_id))
628 return acpi_device_bus_id;
629 }
630 return NULL;
631}
632
633static int acpi_device_set_name(struct acpi_device *device,
634 struct acpi_device_bus_id *acpi_device_bus_id)
635{
636 struct ida *instance_ida = &acpi_device_bus_id->instance_ida;
637 int result;
638
639 result = ida_simple_get(instance_ida, 0, ACPI_MAX_DEVICE_INSTANCES, GFP_KERNEL);
640 if (result < 0)
641 return result;
642
643 device->pnp.instance_no = result;
644 dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, result);
645 return 0;
646}
647
634int acpi_device_add(struct acpi_device *device,
635 void (*release)(struct device *))
636{
637 struct acpi_device_bus_id *acpi_device_bus_id;
638 int result;
639
640 if (device->handle) {
641 acpi_status status;

--- 18 unchanged lines hidden (view full) ---

660 INIT_LIST_HEAD(&device->physical_node_list);
661 INIT_LIST_HEAD(&device->del_list);
662 mutex_init(&device->physical_node_lock);
663
664 mutex_lock(&acpi_device_lock);
665
666 acpi_device_bus_id = acpi_device_bus_id_match(acpi_device_hid(device));
667 if (acpi_device_bus_id) {
648int acpi_device_add(struct acpi_device *device,
649 void (*release)(struct device *))
650{
651 struct acpi_device_bus_id *acpi_device_bus_id;
652 int result;
653
654 if (device->handle) {
655 acpi_status status;

--- 18 unchanged lines hidden (view full) ---

674 INIT_LIST_HEAD(&device->physical_node_list);
675 INIT_LIST_HEAD(&device->del_list);
676 mutex_init(&device->physical_node_lock);
677
678 mutex_lock(&acpi_device_lock);
679
680 acpi_device_bus_id = acpi_device_bus_id_match(acpi_device_hid(device));
681 if (acpi_device_bus_id) {
668 acpi_device_bus_id->instance_no++;
682 result = acpi_device_set_name(device, acpi_device_bus_id);
683 if (result)
684 goto err_unlock;
669 } else {
670 acpi_device_bus_id = kzalloc(sizeof(*acpi_device_bus_id),
671 GFP_KERNEL);
672 if (!acpi_device_bus_id) {
673 result = -ENOMEM;
674 goto err_unlock;
675 }
676 acpi_device_bus_id->bus_id =
677 kstrdup_const(acpi_device_hid(device), GFP_KERNEL);
678 if (!acpi_device_bus_id->bus_id) {
679 kfree(acpi_device_bus_id);
680 result = -ENOMEM;
681 goto err_unlock;
682 }
683
685 } else {
686 acpi_device_bus_id = kzalloc(sizeof(*acpi_device_bus_id),
687 GFP_KERNEL);
688 if (!acpi_device_bus_id) {
689 result = -ENOMEM;
690 goto err_unlock;
691 }
692 acpi_device_bus_id->bus_id =
693 kstrdup_const(acpi_device_hid(device), GFP_KERNEL);
694 if (!acpi_device_bus_id->bus_id) {
695 kfree(acpi_device_bus_id);
696 result = -ENOMEM;
697 goto err_unlock;
698 }
699
700 ida_init(&acpi_device_bus_id->instance_ida);
701
702 result = acpi_device_set_name(device, acpi_device_bus_id);
703 if (result) {
704 kfree(acpi_device_bus_id);
705 goto err_unlock;
706 }
707
684 list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
685 }
708 list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
709 }
686 dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no);
687
688 if (device->parent)
689 list_add_tail(&device->node, &device->parent->children);
690
691 if (device->wakeup.flags.valid)
692 list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
693
694 mutex_unlock(&acpi_device_lock);

--- 1767 unchanged lines hidden ---
710
711 if (device->parent)
712 list_add_tail(&device->node, &device->parent->children);
713
714 if (device->wakeup.flags.valid)
715 list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
716
717 mutex_unlock(&acpi_device_lock);

--- 1767 unchanged lines hidden ---