diff options
| author | Thierry Chatard <tchatard@gmail.com> | 2026-10-02 09:33:42 -0700 |
|---|---|---|
| committer | Lee Jones <lee@kernel.org> | 2026-10-15 16:37:54 +0100 |
| commit | 194da454d5e204e8bb995359e995fac232fb6da5 (patch) | |
| tree | a188265578e7a1718fffb1f3cfb2854b41e9b816 /drivers | |
| parent | cffd44d2d89524e2dda6adc7b0dd59363be1c8e6 (diff) | |
mfd: intel-lpss: Add resource conflict quirk for Dell Latitude 5285
The Dell Latitude 5285 2-in-1 has a BIOS bug where the ACPI GEXP device
and the I2C4 controller (INT3446) both claim the same MMIO region via the
shared SB04 variable. This causes intel_lpss_acpi to fail binding to I2C4
with -EBUSY, preventing the front camera (OV5670) sensor from being
registered.
Match the affected machine by DMI and the affected device by ACPI ID,
carrying QUIRK_IGNORE_RESOURCE_CONFLICTS in the ACPI match data and
applying it to the per-device info in probe. This follows the quirk
organisation used by the PCI counterpart.
Assisted-by: LLM
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Thierry Chatard <tchatard@gmail.com>
Link: https://patch.msgid.link/20261002163350.1248431-2-tchatard@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/mfd/intel-lpss-acpi.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/mfd/intel-lpss-acpi.c b/drivers/mfd/intel-lpss-acpi.c index d4b24a717848..3f90942f3b36 100644 --- a/drivers/mfd/intel-lpss-acpi.c +++ b/drivers/mfd/intel-lpss-acpi.c @@ -8,7 +8,9 @@ * Mika Westerberg <mika.westerberg@linux.intel.com> */ +#include <linux/acpi.h> #include <linux/device.h> +#include <linux/dmi.h> #include <linux/gfp_types.h> #include <linux/ioport.h> #include <linux/module.h> @@ -171,6 +173,27 @@ static const struct acpi_device_id intel_lpss_acpi_ids[] = { }; MODULE_DEVICE_TABLE(acpi, intel_lpss_acpi_ids); +/* + * Devices that need a quirk applied only on the machines matched by + * intel_lpss_quirk_dmi[] below. The quirk to apply is carried in the + * matching entry's driver_data. + */ +static const struct acpi_device_id intel_lpss_acpi_quirk_ids[] = { + /* Dell Latitude 5285: ACPI GEXP device conflicts with I2C4 (INT3446) */ + { .id = "INT3446", .driver_data = QUIRK_IGNORE_RESOURCE_CONFLICTS }, + { } +}; + +static const struct dmi_system_id intel_lpss_quirk_dmi[] = { + { + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Latitude 5285"), + }, + }, + { } +}; + static int intel_lpss_acpi_probe(struct platform_device *pdev) { const struct intel_lpss_platform_info *data; @@ -185,6 +208,15 @@ static int intel_lpss_acpi_probe(struct platform_device *pdev) if (!info) return -ENOMEM; + /* Apply per-device quirks that are only needed on certain machines */ + if (dmi_check_system(intel_lpss_quirk_dmi)) { + const struct acpi_device_id *id; + + id = acpi_match_device(intel_lpss_acpi_quirk_ids, &pdev->dev); + if (id) + info->quirks |= id->driver_data; + } + /* No need to check mem and irq here as intel_lpss_probe() does it for us */ info->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); info->irq = platform_get_irq(pdev, 0); |
