@@ -479,9 +479,8 @@ static void acpi_device_del(struct acpi_device *device)
479479 list_for_each_entry (acpi_device_bus_id , & acpi_bus_id_list , node )
480480 if (!strcmp (acpi_device_bus_id -> bus_id ,
481481 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 )) {
485484 list_del (& acpi_device_bus_id -> node );
486485 kfree_const (acpi_device_bus_id -> bus_id );
487486 kfree (acpi_device_bus_id );
@@ -631,6 +630,21 @@ static struct acpi_device_bus_id *acpi_device_bus_id_match(const char *dev_id)
631630 return NULL ;
632631}
633632
633+ static 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+
634648int acpi_device_add (struct acpi_device * device ,
635649 void (* release )(struct device * ))
636650{
@@ -665,7 +679,9 @@ int acpi_device_add(struct acpi_device *device,
665679
666680 acpi_device_bus_id = acpi_device_bus_id_match (acpi_device_hid (device ));
667681 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 ;
669685 } else {
670686 acpi_device_bus_id = kzalloc (sizeof (* acpi_device_bus_id ),
671687 GFP_KERNEL );
@@ -681,9 +697,16 @@ int acpi_device_add(struct acpi_device *device,
681697 goto err_unlock ;
682698 }
683699
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+
684708 list_add_tail (& acpi_device_bus_id -> node , & acpi_bus_id_list );
685709 }
686- dev_set_name (& device -> dev , "%s:%02x" , acpi_device_bus_id -> bus_id , acpi_device_bus_id -> instance_no );
687710
688711 if (device -> parent )
689712 list_add_tail (& device -> node , & device -> parent -> children );
0 commit comments