tangled
alpha
login
or
join now
tjh.dev
/
kernel
1
fork
atom
Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1
fork
atom
overview
issues
pulls
pipelines
Merge back 'acpi-scan' changes for v5.12.
Rafael J. Wysocki
5 years ago
4fca9de2
0f347aa0
+49
-50
1 changed file
expand all
collapse all
unified
split
drivers
acpi
scan.c
+49
-50
drivers/acpi/scan.c
reviewed
···
578
578
mutex_unlock(&acpi_device_del_lock);
579
579
}
580
580
581
581
-
static int acpi_get_device_data(acpi_handle handle, struct acpi_device **device,
582
582
-
void (*callback)(void *))
581
581
+
static struct acpi_device *handle_to_device(acpi_handle handle,
582
582
+
void (*callback)(void *))
583
583
{
584
584
+
struct acpi_device *adev = NULL;
584
585
acpi_status status;
585
586
586
586
-
if (!device)
587
587
-
return -EINVAL;
588
588
-
589
589
-
*device = NULL;
590
590
-
591
587
status = acpi_get_data_full(handle, acpi_scan_drop_device,
592
592
-
(void **)device, callback);
593
593
-
if (ACPI_FAILURE(status) || !*device) {
594
594
-
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No context for object [%p]\n",
595
595
-
handle));
596
596
-
return -ENODEV;
588
588
+
(void **)&adev, callback);
589
589
+
if (ACPI_FAILURE(status) || !adev) {
590
590
+
acpi_handle_debug(handle, "No context!\n");
591
591
+
return NULL;
597
592
}
598
598
-
return 0;
593
593
+
return adev;
599
594
}
600
595
601
596
int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device)
602
597
{
603
603
-
return acpi_get_device_data(handle, device, NULL);
598
598
+
if (!device)
599
599
+
return -EINVAL;
600
600
+
601
601
+
*device = handle_to_device(handle, NULL);
602
602
+
if (!*device)
603
603
+
return -ENODEV;
604
604
+
605
605
+
return 0;
604
606
}
605
607
EXPORT_SYMBOL(acpi_bus_get_device);
606
608
···
614
612
615
613
struct acpi_device *acpi_bus_get_acpi_device(acpi_handle handle)
616
614
{
617
617
-
struct acpi_device *adev = NULL;
618
618
-
619
619
-
acpi_get_device_data(handle, &adev, get_acpi_device);
620
620
-
return adev;
615
615
+
return handle_to_device(handle, get_acpi_device);
621
616
}
622
617
623
618
void acpi_bus_put_acpi_device(struct acpi_device *adev)
···
622
623
put_device(&adev->dev);
623
624
}
624
625
626
626
+
static struct acpi_device_bus_id *acpi_device_bus_id_match(const char *dev_id)
627
627
+
{
628
628
+
struct acpi_device_bus_id *acpi_device_bus_id;
629
629
+
630
630
+
/* Find suitable bus_id and instance number in acpi_bus_id_list. */
631
631
+
list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) {
632
632
+
if (!strcmp(acpi_device_bus_id->bus_id, dev_id))
633
633
+
return acpi_device_bus_id;
634
634
+
}
635
635
+
return NULL;
636
636
+
}
637
637
+
625
638
int acpi_device_add(struct acpi_device *device,
626
639
void (*release)(struct device *))
627
640
{
641
641
+
struct acpi_device_bus_id *acpi_device_bus_id;
628
642
int result;
629
629
-
struct acpi_device_bus_id *acpi_device_bus_id, *new_bus_id;
630
630
-
int found = 0;
631
643
632
644
if (device->handle) {
633
645
acpi_status status;
···
664
654
INIT_LIST_HEAD(&device->del_list);
665
655
mutex_init(&device->physical_node_lock);
666
656
667
667
-
new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL);
668
668
-
if (!new_bus_id) {
669
669
-
pr_err(PREFIX "Memory allocation error\n");
670
670
-
result = -ENOMEM;
671
671
-
goto err_detach;
672
672
-
}
673
673
-
674
657
mutex_lock(&acpi_device_lock);
675
675
-
/*
676
676
-
* Find suitable bus_id and instance number in acpi_bus_id_list
677
677
-
* If failed, create one and link it into acpi_bus_id_list
678
678
-
*/
679
679
-
list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) {
680
680
-
if (!strcmp(acpi_device_bus_id->bus_id,
681
681
-
acpi_device_hid(device))) {
682
682
-
acpi_device_bus_id->instance_no++;
683
683
-
found = 1;
684
684
-
kfree(new_bus_id);
685
685
-
break;
658
658
+
659
659
+
acpi_device_bus_id = acpi_device_bus_id_match(acpi_device_hid(device));
660
660
+
if (acpi_device_bus_id) {
661
661
+
acpi_device_bus_id->instance_no++;
662
662
+
} else {
663
663
+
acpi_device_bus_id = kzalloc(sizeof(*acpi_device_bus_id),
664
664
+
GFP_KERNEL);
665
665
+
if (!acpi_device_bus_id) {
666
666
+
result = -ENOMEM;
667
667
+
goto err_unlock;
686
668
}
687
687
-
}
688
688
-
if (!found) {
689
689
-
acpi_device_bus_id = new_bus_id;
690
669
acpi_device_bus_id->bus_id =
691
670
kstrdup_const(acpi_device_hid(device), GFP_KERNEL);
692
671
if (!acpi_device_bus_id->bus_id) {
693
693
-
pr_err(PREFIX "Memory allocation error for bus id\n");
672
672
+
kfree(acpi_device_bus_id);
694
673
result = -ENOMEM;
695
695
-
goto err_free_new_bus_id;
674
674
+
goto err_unlock;
696
675
}
697
676
698
698
-
acpi_device_bus_id->instance_no = 0;
699
677
list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
700
678
}
701
679
dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no);
···
693
695
694
696
if (device->wakeup.flags.valid)
695
697
list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
698
698
+
696
699
mutex_unlock(&acpi_device_lock);
697
700
698
701
if (device->parent)
699
702
device->dev.parent = &device->parent->dev;
703
703
+
700
704
device->dev.bus = &acpi_bus_type;
701
705
device->dev.release = release;
702
706
result = device_add(&device->dev);
···
714
714
715
715
return 0;
716
716
717
717
-
err:
717
717
+
err:
718
718
mutex_lock(&acpi_device_lock);
719
719
+
719
720
if (device->parent)
720
721
list_del(&device->node);
722
722
+
721
723
list_del(&device->wakeup_list);
722
724
723
723
-
err_free_new_bus_id:
724
724
-
if (!found)
725
725
-
kfree(new_bus_id);
726
726
-
725
725
+
err_unlock:
727
726
mutex_unlock(&acpi_device_lock);
728
727
729
729
-
err_detach:
730
728
acpi_detach_data(device->handle, acpi_scan_drop_device);
729
729
+
731
730
return result;
732
731
}
733
732