forked from mirrors/linux
		
	ACPI: resource: do IRQ override on LENOVO IdeaPad
LENOVO IdeaPad Flex 5 is ryzen-5 based and the commit below removed IRQ overriding for those. This broke touchscreen and trackpad: i2c_designware AMDI0010:00: controller timed out i2c_designware AMDI0010:03: controller timed out i2c_hid_acpi i2c-MSFT0001:00: failed to reset device: -61 i2c_designware AMDI0010:03: controller timed out ... i2c_hid_acpi i2c-MSFT0001:00: can't add hid device: -61 i2c_hid_acpi: probe of i2c-MSFT0001:00 failed with error -61 White-list this specific model in the override_table. For this to work, the ZEN test needs to be put below the table walk. Fixes: 37c81d9f1d1b (ACPI: resource: skip IRQ override on AMD Zen platforms) Link: https://bugzilla.suse.com/show_bug.cgi?id=1203794 Signed-off-by: Jiri Slaby (SUSE) <jirislaby@kernel.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									3a1e24fa70
								
							
						
					
					
						commit
						bfcdf58380
					
				
					 1 changed files with 28 additions and 14 deletions
				
			
		|  | @ -428,17 +428,31 @@ static const struct dmi_system_id asus_laptop[] = { | |||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static const struct dmi_system_id lenovo_82ra[] = { | ||||
| 	{ | ||||
| 		.ident = "LENOVO IdeaPad Flex 5 16ALC7", | ||||
| 		.matches = { | ||||
| 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||||
| 			DMI_MATCH(DMI_PRODUCT_NAME, "82RA"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| struct irq_override_cmp { | ||||
| 	const struct dmi_system_id *system; | ||||
| 	unsigned char irq; | ||||
| 	unsigned char triggering; | ||||
| 	unsigned char polarity; | ||||
| 	unsigned char shareable; | ||||
| 	bool override; | ||||
| }; | ||||
| 
 | ||||
| static const struct irq_override_cmp skip_override_table[] = { | ||||
| 	{ medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0 }, | ||||
| 	{ asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0 }, | ||||
| static const struct irq_override_cmp override_table[] = { | ||||
| 	{ medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false }, | ||||
| 	{ asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false }, | ||||
| 	{ lenovo_82ra, 6, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true }, | ||||
| 	{ lenovo_82ra, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true }, | ||||
| }; | ||||
| 
 | ||||
| static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity, | ||||
|  | @ -446,6 +460,17 @@ static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity, | |||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < ARRAY_SIZE(override_table); i++) { | ||||
| 		const struct irq_override_cmp *entry = &override_table[i]; | ||||
| 
 | ||||
| 		if (dmi_check_system(entry->system) && | ||||
| 		    entry->irq == gsi && | ||||
| 		    entry->triggering == triggering && | ||||
| 		    entry->polarity == polarity && | ||||
| 		    entry->shareable == shareable) | ||||
| 			return entry->override; | ||||
| 	} | ||||
| 
 | ||||
| #ifdef CONFIG_X86 | ||||
| 	/*
 | ||||
| 	 * IRQ override isn't needed on modern AMD Zen systems and | ||||
|  | @ -456,17 +481,6 @@ static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity, | |||
| 		return false; | ||||
| #endif | ||||
| 
 | ||||
| 	for (i = 0; i < ARRAY_SIZE(skip_override_table); i++) { | ||||
| 		const struct irq_override_cmp *entry = &skip_override_table[i]; | ||||
| 
 | ||||
| 		if (dmi_check_system(entry->system) && | ||||
| 		    entry->irq == gsi && | ||||
| 		    entry->triggering == triggering && | ||||
| 		    entry->polarity == polarity && | ||||
| 		    entry->shareable == shareable) | ||||
| 			return false; | ||||
| 	} | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Jiri Slaby (SUSE)
						Jiri Slaby (SUSE)