mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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