Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge back 'acpi-scan' changes for v5.12.

+49 -50
+49 -50
drivers/acpi/scan.c
··· 578 578 mutex_unlock(&acpi_device_del_lock); 579 579 } 580 580 581 - static int acpi_get_device_data(acpi_handle handle, struct acpi_device **device, 582 - void (*callback)(void *)) 581 + static struct acpi_device *handle_to_device(acpi_handle handle, 582 + void (*callback)(void *)) 583 583 { 584 + struct acpi_device *adev = NULL; 584 585 acpi_status status; 585 586 586 - if (!device) 587 - return -EINVAL; 588 - 589 - *device = NULL; 590 - 591 587 status = acpi_get_data_full(handle, acpi_scan_drop_device, 592 - (void **)device, callback); 593 - if (ACPI_FAILURE(status) || !*device) { 594 - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No context for object [%p]\n", 595 - handle)); 596 - return -ENODEV; 588 + (void **)&adev, callback); 589 + if (ACPI_FAILURE(status) || !adev) { 590 + acpi_handle_debug(handle, "No context!\n"); 591 + return NULL; 597 592 } 598 - return 0; 593 + return adev; 599 594 } 600 595 601 596 int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device) 602 597 { 603 - return acpi_get_device_data(handle, device, NULL); 598 + if (!device) 599 + return -EINVAL; 600 + 601 + *device = handle_to_device(handle, NULL); 602 + if (!*device) 603 + return -ENODEV; 604 + 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 - struct acpi_device *adev = NULL; 618 - 619 - acpi_get_device_data(handle, &adev, get_acpi_device); 620 - return adev; 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 + static struct acpi_device_bus_id *acpi_device_bus_id_match(const char *dev_id) 627 + { 628 + struct acpi_device_bus_id *acpi_device_bus_id; 629 + 630 + /* Find suitable bus_id and instance number in acpi_bus_id_list. */ 631 + list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) { 632 + if (!strcmp(acpi_device_bus_id->bus_id, dev_id)) 633 + return acpi_device_bus_id; 634 + } 635 + return NULL; 636 + } 637 + 625 638 int acpi_device_add(struct acpi_device *device, 626 639 void (*release)(struct device *)) 627 640 { 641 + struct acpi_device_bus_id *acpi_device_bus_id; 628 642 int result; 629 - struct acpi_device_bus_id *acpi_device_bus_id, *new_bus_id; 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 - new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL); 668 - if (!new_bus_id) { 669 - pr_err(PREFIX "Memory allocation error\n"); 670 - result = -ENOMEM; 671 - goto err_detach; 672 - } 673 - 674 657 mutex_lock(&acpi_device_lock); 675 - /* 676 - * Find suitable bus_id and instance number in acpi_bus_id_list 677 - * If failed, create one and link it into acpi_bus_id_list 678 - */ 679 - list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) { 680 - if (!strcmp(acpi_device_bus_id->bus_id, 681 - acpi_device_hid(device))) { 682 - acpi_device_bus_id->instance_no++; 683 - found = 1; 684 - kfree(new_bus_id); 685 - break; 658 + 659 + acpi_device_bus_id = acpi_device_bus_id_match(acpi_device_hid(device)); 660 + if (acpi_device_bus_id) { 661 + acpi_device_bus_id->instance_no++; 662 + } else { 663 + acpi_device_bus_id = kzalloc(sizeof(*acpi_device_bus_id), 664 + GFP_KERNEL); 665 + if (!acpi_device_bus_id) { 666 + result = -ENOMEM; 667 + goto err_unlock; 686 668 } 687 - } 688 - if (!found) { 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 - pr_err(PREFIX "Memory allocation error for bus id\n"); 672 + kfree(acpi_device_bus_id); 694 673 result = -ENOMEM; 695 - goto err_free_new_bus_id; 674 + goto err_unlock; 696 675 } 697 676 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 + 696 699 mutex_unlock(&acpi_device_lock); 697 700 698 701 if (device->parent) 699 702 device->dev.parent = &device->parent->dev; 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 - err: 717 + err: 718 718 mutex_lock(&acpi_device_lock); 719 + 719 720 if (device->parent) 720 721 list_del(&device->node); 722 + 721 723 list_del(&device->wakeup_list); 722 724 723 - err_free_new_bus_id: 724 - if (!found) 725 - kfree(new_bus_id); 726 - 725 + err_unlock: 727 726 mutex_unlock(&acpi_device_lock); 728 727 729 - err_detach: 730 728 acpi_detach_data(device->handle, acpi_scan_drop_device); 729 + 731 730 return result; 732 731 } 733 732