forked from mirrors/linux
		
	ACPI / hotplug: Move container-specific code out of the core
Move container-specific uevents from the core hotplug code to the container scan handler's .attach() and .detach() callbacks. This way the core will not have to special-case containers and the uevents will be guaranteed to happen every time a container is either scanned or trimmed as appropriate. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
This commit is contained in:
		
							parent
							
								
									3338db0057
								
							
						
					
					
						commit
						46394fd017
					
				
					 3 changed files with 9 additions and 17 deletions
				
			
		|  | @ -44,19 +44,24 @@ static const struct acpi_device_id container_device_ids[] = { | |||
| 	{"", 0}, | ||||
| }; | ||||
| 
 | ||||
| static int container_device_attach(struct acpi_device *device, | ||||
| static int container_device_attach(struct acpi_device *adev, | ||||
| 				   const struct acpi_device_id *not_used) | ||||
| { | ||||
| 	/* This is necessary for container hotplug to work. */ | ||||
| 	kobject_uevent(&adev->dev.kobj, KOBJ_ONLINE); | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| static void container_device_detach(struct acpi_device *adev) | ||||
| { | ||||
| 	kobject_uevent(&adev->dev.kobj, KOBJ_OFFLINE); | ||||
| } | ||||
| 
 | ||||
| static struct acpi_scan_handler container_handler = { | ||||
| 	.ids = container_device_ids, | ||||
| 	.attach = container_device_attach, | ||||
| 	.detach = container_device_detach, | ||||
| 	.hotplug = { | ||||
| 		.enabled = true, | ||||
| 		.mode = AHM_CONTAINER, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -206,9 +206,6 @@ static int acpi_scan_hot_remove(struct acpi_device *device) | |||
| 	acpi_status status; | ||||
| 	unsigned long long sta; | ||||
| 
 | ||||
| 	if (device->handler && device->handler->hotplug.mode == AHM_CONTAINER) | ||||
| 		kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Carry out two passes here and ignore errors in the first pass, | ||||
| 	 * because if the devices in question are memory blocks and | ||||
|  | @ -288,10 +285,7 @@ static int acpi_scan_device_check(struct acpi_device *adev) | |||
| 		dev_warn(&adev->dev, "Namespace scan failure\n"); | ||||
| 		return error; | ||||
| 	} | ||||
| 	if (adev->handler) { | ||||
| 		if (adev->handler->hotplug.mode == AHM_CONTAINER) | ||||
| 			kobject_uevent(&adev->dev.kobj, KOBJ_ONLINE); | ||||
| 	} else { | ||||
| 	if (!adev->handler) { | ||||
| 		dev_warn(&adev->dev, "Enumeration failure\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
|  |  | |||
|  | @ -91,16 +91,9 @@ struct acpi_device; | |||
|  * ----------------- | ||||
|  */ | ||||
| 
 | ||||
| enum acpi_hotplug_mode { | ||||
| 	AHM_GENERIC = 0, | ||||
| 	AHM_CONTAINER, | ||||
| 	AHM_COUNT | ||||
| }; | ||||
| 
 | ||||
| struct acpi_hotplug_profile { | ||||
| 	struct kobject kobj; | ||||
| 	bool enabled:1; | ||||
| 	enum acpi_hotplug_mode mode; | ||||
| 	int (*scan_dependent)(struct acpi_device *adev); | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Rafael J. Wysocki
						Rafael J. Wysocki