diff options
Diffstat (limited to 'drivers/acpi/scan.c')
| -rw-r--r-- | drivers/acpi/scan.c | 33 | 
1 files changed, 28 insertions, 5 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index a184529d8fa4..84bb7c1929f1 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -479,9 +479,8 @@ static void acpi_device_del(struct acpi_device *device)  	list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node)  		if (!strcmp(acpi_device_bus_id->bus_id,  			    acpi_device_hid(device))) { -			if (acpi_device_bus_id->instance_no > 0) -				acpi_device_bus_id->instance_no--; -			else { +			ida_simple_remove(&acpi_device_bus_id->instance_ida, device->pnp.instance_no); +			if (ida_is_empty(&acpi_device_bus_id->instance_ida)) {  				list_del(&acpi_device_bus_id->node);  				kfree_const(acpi_device_bus_id->bus_id);  				kfree(acpi_device_bus_id); @@ -631,6 +630,21 @@ static struct acpi_device_bus_id *acpi_device_bus_id_match(const char *dev_id)  	return NULL;  } +static int acpi_device_set_name(struct acpi_device *device, +				struct acpi_device_bus_id *acpi_device_bus_id) +{ +	struct ida *instance_ida = &acpi_device_bus_id->instance_ida; +	int result; + +	result = ida_simple_get(instance_ida, 0, ACPI_MAX_DEVICE_INSTANCES, GFP_KERNEL); +	if (result < 0) +		return result; + +	device->pnp.instance_no = result; +	dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, result); +	return 0; +} +  int acpi_device_add(struct acpi_device *device,  		    void (*release)(struct device *))  { @@ -665,7 +679,9 @@ int acpi_device_add(struct acpi_device *device,  	acpi_device_bus_id = acpi_device_bus_id_match(acpi_device_hid(device));  	if (acpi_device_bus_id) { -		acpi_device_bus_id->instance_no++; +		result = acpi_device_set_name(device, acpi_device_bus_id); +		if (result) +			goto err_unlock;  	} else {  		acpi_device_bus_id = kzalloc(sizeof(*acpi_device_bus_id),  					     GFP_KERNEL); @@ -681,9 +697,16 @@ int acpi_device_add(struct acpi_device *device,  			goto err_unlock;  		} +		ida_init(&acpi_device_bus_id->instance_ida); + +		result = acpi_device_set_name(device, acpi_device_bus_id); +		if (result) { +			kfree(acpi_device_bus_id); +			goto err_unlock; +		} +  		list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);  	} -	dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no);  	if (device->parent)  		list_add_tail(&device->node, &device->parent->children);  | 
