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 { | struct irq_override_cmp { | ||||||
| 	const struct dmi_system_id *system; | 	const struct dmi_system_id *system; | ||||||
| 	unsigned char irq; | 	unsigned char irq; | ||||||
| 	unsigned char triggering; | 	unsigned char triggering; | ||||||
| 	unsigned char polarity; | 	unsigned char polarity; | ||||||
| 	unsigned char shareable; | 	unsigned char shareable; | ||||||
|  | 	bool override; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const struct irq_override_cmp skip_override_table[] = { | static const struct irq_override_cmp override_table[] = { | ||||||
| 	{ medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0 }, | 	{ medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false }, | ||||||
| 	{ asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0 }, | 	{ 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, | 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; | 	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 | #ifdef CONFIG_X86 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * IRQ override isn't needed on modern AMD Zen systems and | 	 * 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; | 		return false; | ||||||
| #endif | #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; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jiri Slaby (SUSE)
						Jiri Slaby (SUSE)