mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ACPI: PM: Avoid attaching ACPI PM domain to certain devices
Certain ACPI-enumerated devices represented as platform devices in
Linux, like fans, require special low-level power management handling
implemented by their drivers that is not in agreement with the ACPI
PM domain behavior.  That leads to problems with managing ACPI fans
during system-wide suspend and resume.
For this reason, make acpi_dev_pm_attach() skip the affected devices
by adding a list of device IDs to avoid to it and putting the IDs of
the affected devices into that list.
Fixes: e5cc8ef312 (ACPI / PM: Provide ACPI PM callback routines for subsystems)
Reported-by: Zhang Rui <rui.zhang@intel.com>
Tested-by: Todd Brandt <todd.e.brandt@linux.intel.com>
Cc: 3.10+ <stable@vger.kernel.org> # 3.10+
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									e42617b825
								
							
						
					
					
						commit
						b9ea0bae26
					
				
					 1 changed files with 11 additions and 1 deletions
				
			
		| 
						 | 
					@ -1314,9 +1314,19 @@ static void acpi_dev_pm_detach(struct device *dev, bool power_off)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int acpi_dev_pm_attach(struct device *dev, bool power_on)
 | 
					int acpi_dev_pm_attach(struct device *dev, bool power_on)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Skip devices whose ACPI companions match the device IDs below,
 | 
				
			||||||
 | 
						 * because they require special power management handling incompatible
 | 
				
			||||||
 | 
						 * with the generic ACPI PM domain.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						static const struct acpi_device_id special_pm_ids[] = {
 | 
				
			||||||
 | 
							{"PNP0C0B", }, /* Generic ACPI fan */
 | 
				
			||||||
 | 
							{"INT3404", }, /* Fan */
 | 
				
			||||||
 | 
							{}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
	struct acpi_device *adev = ACPI_COMPANION(dev);
 | 
						struct acpi_device *adev = ACPI_COMPANION(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!adev)
 | 
						if (!adev || !acpi_match_device_ids(adev, special_pm_ids))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue