* [PATCH v8 1/6] platform/x86: intel_lpss: add resource conflict quirk for Dell Latitude 5285
2026-08-26 11:24 [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Thierry Chatard
@ 2026-08-26 11:24 ` Thierry Chatard
2026-08-27 7:13 ` Andy Shevchenko
2026-08-26 11:24 ` [PATCH v8 2/6] platform/x86: int3472: tps68470: use unsigned int for GPIO lookup loop counters Thierry Chatard
` (5 subsequent siblings)
6 siblings, 1 reply; 13+ messages in thread
From: Thierry Chatard @ 2026-08-26 11:24 UTC (permalink / raw)
To: linux-kernel
Cc: hansg, lee, platform-driver-x86, ilpo.jarvinen, djrscally,
linux-media, mchehab, sakari.ailus, jacopo.mondi, nicholas,
andriy.shevchenko, v.vitovt, Thierry Chatard
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.
Signed-off-by: Thierry Chatard <tchatard@gmail.com>
---
drivers/mfd/intel-lpss-acpi.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/drivers/mfd/intel-lpss-acpi.c b/drivers/mfd/intel-lpss-acpi.c
index 63406026d..1ac1dcc41 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/mod_devicetable.h>
@@ -172,6 +174,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) */
+ { "INT3446", 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;
@@ -186,6 +209,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);
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v8 1/6] platform/x86: intel_lpss: add resource conflict quirk for Dell Latitude 5285
2026-08-26 11:24 ` [PATCH v8 1/6] platform/x86: intel_lpss: add resource conflict quirk for Dell Latitude 5285 Thierry Chatard
@ 2026-08-27 7:13 ` Andy Shevchenko
2026-08-27 7:15 ` Andy Shevchenko
0 siblings, 1 reply; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 7:13 UTC (permalink / raw)
To: Thierry Chatard
Cc: linux-kernel, hansg, lee, platform-driver-x86, ilpo.jarvinen,
djrscally, linux-media, mchehab, sakari.ailus, jacopo.mondi,
nicholas, v.vitovt
Again, there is an in-thread new version, DO NOT DO this!
If you send a new version, start a *new* email thread.
With that, the v8 has no cover letter...
Note, using `b4` tool will help you in preparing patch series properly.
On Wed, Aug 26, 2026 at 01:24:46PM +0200, Thierry Chatard wrote:
> 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.
It's okay now,
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v8 1/6] platform/x86: intel_lpss: add resource conflict quirk for Dell Latitude 5285
2026-08-27 7:13 ` Andy Shevchenko
@ 2026-08-27 7:15 ` Andy Shevchenko
0 siblings, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 7:15 UTC (permalink / raw)
To: Thierry Chatard
Cc: linux-kernel, hansg, lee, platform-driver-x86, ilpo.jarvinen,
djrscally, linux-media, mchehab, sakari.ailus, jacopo.mondi,
nicholas, v.vitovt
On Thu, Aug 27, 2026 at 10:13:58AM +0300, Andy Shevchenko wrote:
> Again, there is an in-thread new version, DO NOT DO this!
> If you send a new version, start a *new* email thread.
> With that, the v8 has no cover letter...
>
> Note, using `b4` tool will help you in preparing patch series properly.
>
> On Wed, Aug 26, 2026 at 01:24:46PM +0200, Thierry Chatard wrote:
>
> > 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.
>
> It's okay now,
Ah, actually not. The subject prefix must be "mfd: intel-lpss: ..."
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
So, this tag only applies if the above is being addressed.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v8 2/6] platform/x86: int3472: tps68470: use unsigned int for GPIO lookup loop counters
2026-08-26 11:24 [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Thierry Chatard
2026-08-26 11:24 ` [PATCH v8 1/6] platform/x86: intel_lpss: add resource conflict quirk for Dell Latitude 5285 Thierry Chatard
@ 2026-08-26 11:24 ` Thierry Chatard
2026-08-27 7:17 ` Andy Shevchenko
2026-08-26 11:24 ` [PATCH v8 3/6] platform/x86: int3472: tps68470: fix clock consumer registration for Dell Latitude 5285 Thierry Chatard
` (4 subsequent siblings)
6 siblings, 1 reply; 13+ messages in thread
From: Thierry Chatard @ 2026-08-26 11:24 UTC (permalink / raw)
To: linux-kernel
Cc: hansg, lee, platform-driver-x86, ilpo.jarvinen, djrscally,
linux-media, mchehab, sakari.ailus, jacopo.mondi, nicholas,
andriy.shevchenko, v.vitovt, Thierry Chatard, Andy Shevchenko
The GPIO lookup table loops in the probe and remove paths iterate up to
board_data->n_gpiod_lookups, which is unsigned int. Use unsigned int for
the loop counters to match and avoid a signed/unsigned comparison.
No functional change.
Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Thierry Chatard <tchatard@gmail.com>
---
drivers/platform/x86/intel/int3472/tps68470.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/platform/x86/intel/int3472/tps68470.c b/drivers/platform/x86/intel/int3472/tps68470.c
index a496075c0..828ae208e 100644
--- a/drivers/platform/x86/intel/int3472/tps68470.c
+++ b/drivers/platform/x86/intel/int3472/tps68470.c
@@ -150,7 +150,7 @@ static int skl_int3472_tps68470_probe(struct i2c_client *client)
int n_consumers;
int device_type;
int ret;
- int i;
+ unsigned int i;
if (!adev)
return -ENODEV;
@@ -233,7 +233,7 @@ static int skl_int3472_tps68470_probe(struct i2c_client *client)
static void skl_int3472_tps68470_remove(struct i2c_client *client)
{
const struct int3472_tps68470_board_data *board_data;
- int i;
+ unsigned int i;
board_data = int3472_tps68470_get_board_data(dev_name(&client->dev));
if (board_data) {
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v8 2/6] platform/x86: int3472: tps68470: use unsigned int for GPIO lookup loop counters
2026-08-26 11:24 ` [PATCH v8 2/6] platform/x86: int3472: tps68470: use unsigned int for GPIO lookup loop counters Thierry Chatard
@ 2026-08-27 7:17 ` Andy Shevchenko
0 siblings, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 7:17 UTC (permalink / raw)
To: Thierry Chatard
Cc: linux-kernel, hansg, lee, platform-driver-x86, ilpo.jarvinen,
djrscally, linux-media, mchehab, sakari.ailus, jacopo.mondi,
nicholas, v.vitovt
On Wed, Aug 26, 2026 at 01:24:47PM +0200, Thierry Chatard wrote:
> The GPIO lookup table loops in the probe and remove paths iterate up to
> board_data->n_gpiod_lookups, which is unsigned int. Use unsigned int for
> the loop counters to match and avoid a signed/unsigned comparison.
>
> No functional change.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
See one nit-pick below.
...
> static int skl_int3472_tps68470_probe(struct i2c_client *client)
> int n_consumers;
> int device_type;
> int ret;
> - int i;
> + unsigned int i;
Please, preserve reversed xmas tree order
int n_consumers;
int device_type;
unsigned int i;
int ret;
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v8 3/6] platform/x86: int3472: tps68470: fix clock consumer registration for Dell Latitude 5285
2026-08-26 11:24 [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Thierry Chatard
2026-08-26 11:24 ` [PATCH v8 1/6] platform/x86: intel_lpss: add resource conflict quirk for Dell Latitude 5285 Thierry Chatard
2026-08-26 11:24 ` [PATCH v8 2/6] platform/x86: int3472: tps68470: use unsigned int for GPIO lookup loop counters Thierry Chatard
@ 2026-08-26 11:24 ` Thierry Chatard
2026-08-27 7:22 ` Andy Shevchenko
2026-08-26 11:24 ` [PATCH v8 4/6] platform/x86: int3472: tps68470: add board data " Thierry Chatard
` (3 subsequent siblings)
6 siblings, 1 reply; 13+ messages in thread
From: Thierry Chatard @ 2026-08-26 11:24 UTC (permalink / raw)
To: linux-kernel
Cc: hansg, lee, platform-driver-x86, ilpo.jarvinen, djrscally,
linux-media, mchehab, sakari.ailus, jacopo.mondi, nicholas,
andriy.shevchenko, v.vitovt, Thierry Chatard
The BIOS on the Dell Latitude 5285 leaves GNVS field C0TP at zero.
With C0TP=0 the ACPI _DEP method on INT3479 (OV5670, front camera)
resolves to PCI0 instead of the INT3472 (TPS68470 PMIC) device.
Because for_each_acpi_consumer_dev() walks the _DEP reverse-mapping,
INT3479 is invisible to it: the clock consumer lookup entry for the
front camera is never registered with the tps68470-clk driver, and the
OV5670 sensor driver cannot acquire its MCLK.
Add optional static clock consumer fields to the board data so probe can
register the consumers directly, bypassing the broken _DEP traversal.
Platforms that do not set these fields keep using the existing ACPI
traversal path unchanged.
Signed-off-by: Thierry Chatard <tchatard@gmail.com>
---
drivers/platform/x86/intel/int3472/tps68470.c | 104 ++++++++++--------
drivers/platform/x86/intel/int3472/tps68470.h | 10 ++
2 files changed, 70 insertions(+), 44 deletions(-)
diff --git a/drivers/platform/x86/intel/int3472/tps68470.c b/drivers/platform/x86/intel/int3472/tps68470.c
index 828ae208e..9b98c5a15 100644
--- a/drivers/platform/x86/intel/int3472/tps68470.c
+++ b/drivers/platform/x86/intel/int3472/tps68470.c
@@ -145,20 +145,17 @@ static int skl_int3472_tps68470_probe(struct i2c_client *client)
struct acpi_device *adev = ACPI_COMPANION(&client->dev);
const struct int3472_tps68470_board_data *board_data;
struct tps68470_clk_platform_data *clk_pdata;
+ struct gpiod_lookup_table * const *tables;
struct mfd_cell *cells;
struct regmap *regmap;
int n_consumers;
int device_type;
- int ret;
unsigned int i;
+ int ret;
if (!adev)
return -ENODEV;
- n_consumers = skl_int3472_fill_clk_pdata(&client->dev, &clk_pdata);
- if (n_consumers < 0)
- return n_consumers;
-
regmap = devm_regmap_init_i2c(client, &tps68470_regmap_config);
if (IS_ERR(regmap)) {
dev_err(&client->dev, "Failed to create regmap: %ld\n", PTR_ERR(regmap));
@@ -176,52 +173,71 @@ static int skl_int3472_tps68470_probe(struct i2c_client *client)
device_type = skl_int3472_tps68470_calc_type(adev);
switch (device_type) {
case DESIGNED_FOR_WINDOWS:
- board_data = int3472_tps68470_get_board_data(dev_name(&client->dev));
- if (!board_data)
- return dev_err_probe(&client->dev, -ENODEV, "No board-data found for this model\n");
-
- cells = kzalloc_objs(*cells, TPS68470_WIN_MFD_CELL_COUNT);
- if (!cells)
- return -ENOMEM;
-
- /*
- * The order of the cells matters here! The clk must be first
- * because the regulator depends on it. The gpios must be last,
- * acpi_gpiochip_add() calls acpi_dev_clear_dependencies() and
- * the clk + regulators must be ready when this happens.
- */
- cells[0].name = "tps68470-clk";
- cells[0].platform_data = clk_pdata;
- cells[0].pdata_size = struct_size(clk_pdata, consumers, n_consumers);
- cells[1].name = "tps68470-regulator";
- cells[1].platform_data = (void *)board_data->tps68470_regulator_pdata;
- cells[1].pdata_size = sizeof(struct tps68470_regulator_platform_data);
- cells[2].name = "tps68470-gpio";
-
- for (i = 0; i < board_data->n_gpiod_lookups; i++)
- gpiod_add_lookup_table(board_data->tps68470_gpio_lookup_tables[i]);
-
- ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
- cells, TPS68470_WIN_MFD_CELL_COUNT,
- NULL, 0, NULL);
- kfree(cells);
-
- if (ret) {
- for (i = 0; i < board_data->n_gpiod_lookups; i++)
- gpiod_remove_lookup_table(board_data->tps68470_gpio_lookup_tables[i]);
- }
-
break;
case DESIGNED_FOR_CHROMEOS:
- ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
- tps68470_cros, ARRAY_SIZE(tps68470_cros),
- NULL, 0, NULL);
- break;
+ return devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
+ tps68470_cros,
+ ARRAY_SIZE(tps68470_cros),
+ NULL, 0, NULL);
default:
dev_err(&client->dev, "Failed to add MFD devices\n");
return device_type;
}
+ board_data = int3472_tps68470_get_board_data(dev_name(&client->dev));
+ if (!board_data)
+ return dev_err_probe(&client->dev, -ENODEV,
+ "No board-data found for this model\n");
+
+ if (board_data->n_clk_consumers) {
+ clk_pdata = devm_kzalloc(&client->dev,
+ struct_size(clk_pdata, consumers,
+ board_data->n_clk_consumers),
+ GFP_KERNEL);
+ if (!clk_pdata)
+ return -ENOMEM;
+ clk_pdata->n_consumers = board_data->n_clk_consumers;
+ for (i = 0; i < board_data->n_clk_consumers; i++)
+ clk_pdata->consumers[i] = board_data->clk_consumers[i];
+ n_consumers = board_data->n_clk_consumers;
+ } else {
+ n_consumers = skl_int3472_fill_clk_pdata(&client->dev, &clk_pdata);
+ if (n_consumers < 0)
+ return n_consumers;
+ }
+
+ cells = kzalloc_objs(*cells, TPS68470_WIN_MFD_CELL_COUNT);
+ if (!cells)
+ return -ENOMEM;
+
+ /*
+ * The order of the cells matters here! The clk must be first
+ * because the regulator depends on it. The gpios must be last,
+ * acpi_gpiochip_add() calls acpi_dev_clear_dependencies() and
+ * the clk + regulators must be ready when this happens.
+ */
+ cells[0].name = "tps68470-clk";
+ cells[0].platform_data = clk_pdata;
+ cells[0].pdata_size = struct_size(clk_pdata, consumers, n_consumers);
+ cells[1].name = "tps68470-regulator";
+ cells[1].platform_data = (void *)board_data->tps68470_regulator_pdata;
+ cells[1].pdata_size = sizeof(struct tps68470_regulator_platform_data);
+ cells[2].name = "tps68470-gpio";
+
+ tables = board_data->tps68470_gpio_lookup_tables;
+ for (i = 0; i < board_data->n_gpiod_lookups; i++)
+ gpiod_add_lookup_table(tables[i]);
+
+ ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
+ cells, TPS68470_WIN_MFD_CELL_COUNT,
+ NULL, 0, NULL);
+ kfree(cells);
+
+ if (ret) {
+ for (i = 0; i < board_data->n_gpiod_lookups; i++)
+ gpiod_remove_lookup_table(tables[i]);
+ }
+
/*
* No acpi_dev_clear_dependencies() here, since the acpi_gpiochip_add()
* for the GPIO cell already does this.
diff --git a/drivers/platform/x86/intel/int3472/tps68470.h b/drivers/platform/x86/intel/int3472/tps68470.h
index 35915e701..1d3d67459 100644
--- a/drivers/platform/x86/intel/int3472/tps68470.h
+++ b/drivers/platform/x86/intel/int3472/tps68470.h
@@ -12,11 +12,21 @@
#define _INTEL_SKL_INT3472_TPS68470_H
struct gpiod_lookup_table;
+struct tps68470_clk_consumer;
struct tps68470_regulator_platform_data;
struct int3472_tps68470_board_data {
const char *dev_name;
const struct tps68470_regulator_platform_data *tps68470_regulator_pdata;
+ /*
+ * Static clock consumers. When n_clk_consumers is non-zero these
+ * are used in place of for_each_acpi_consumer_dev() to build the
+ * tps68470-clk platform data. Needed on platforms where a sensor's
+ * ACPI _DEP does not list the INT3472 device, causing that sensor
+ * to be missed by the ACPI dependency traversal.
+ */
+ unsigned int n_clk_consumers;
+ const struct tps68470_clk_consumer *clk_consumers;
unsigned int n_gpiod_lookups;
struct gpiod_lookup_table *tps68470_gpio_lookup_tables[];
};
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v8 3/6] platform/x86: int3472: tps68470: fix clock consumer registration for Dell Latitude 5285
2026-08-26 11:24 ` [PATCH v8 3/6] platform/x86: int3472: tps68470: fix clock consumer registration for Dell Latitude 5285 Thierry Chatard
@ 2026-08-27 7:22 ` Andy Shevchenko
0 siblings, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 7:22 UTC (permalink / raw)
To: Thierry Chatard
Cc: linux-kernel, hansg, lee, platform-driver-x86, ilpo.jarvinen,
djrscally, linux-media, mchehab, sakari.ailus, jacopo.mondi,
nicholas, v.vitovt
On Wed, Aug 26, 2026 at 01:24:48PM +0200, Thierry Chatard wrote:
> The BIOS on the Dell Latitude 5285 leaves GNVS field C0TP at zero.
> With C0TP=0 the ACPI _DEP method on INT3479 (OV5670, front camera)
> resolves to PCI0 instead of the INT3472 (TPS68470 PMIC) device.
>
> Because for_each_acpi_consumer_dev() walks the _DEP reverse-mapping,
> INT3479 is invisible to it: the clock consumer lookup entry for the
> front camera is never registered with the tps68470-clk driver, and the
> OV5670 sensor driver cannot acquire its MCLK.
>
> Add optional static clock consumer fields to the board data so probe can
> register the consumers directly, bypassing the broken _DEP traversal.
> Platforms that do not set these fields keep using the existing ACPI
> traversal path unchanged.
...
> struct mfd_cell *cells;
> struct regmap *regmap;
> int n_consumers;
> int device_type;
> - int ret;
> unsigned int i;
> + int ret;
Yep, this is leftover which needs to be folded into the previous patch.
...
> + board_data = int3472_tps68470_get_board_data(dev_name(&client->dev));
> + if (!board_data)
> + return dev_err_probe(&client->dev, -ENODEV,
> + "No board-data found for this model\n");
Define
struct device *dev = &client->dev;
at the top and make these lines better looking
board_data = int3472_tps68470_get_board_data(dev_name(dev));
if (!board_data)
return dev_err_probe(dev, -ENODATA, "No board-data found for this model\n");
(note that switching to -ENODATA helps to distinguish the case).
...
> + ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
> + cells, TPS68470_WIN_MFD_CELL_COUNT,
> + NULL, 0, NULL);
> + kfree(cells);
Looks like we can switch to use __free() at some point.
> + if (ret) {
> + for (i = 0; i < board_data->n_gpiod_lookups; i++)
> + gpiod_remove_lookup_table(tables[i]);
> + }
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v8 4/6] platform/x86: int3472: tps68470: add board data for Dell Latitude 5285
2026-08-26 11:24 [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Thierry Chatard
` (2 preceding siblings ...)
2026-08-26 11:24 ` [PATCH v8 3/6] platform/x86: int3472: tps68470: fix clock consumer registration for Dell Latitude 5285 Thierry Chatard
@ 2026-08-26 11:24 ` Thierry Chatard
2026-08-26 11:24 ` [PATCH v8 5/6] media: ipu-bridge: add sensor configuration for OV8858 (INT3477) Thierry Chatard
` (2 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Thierry Chatard @ 2026-08-26 11:24 UTC (permalink / raw)
To: linux-kernel
Cc: hansg, lee, platform-driver-x86, ilpo.jarvinen, djrscally,
linux-media, mchehab, sakari.ailus, jacopo.mondi, nicholas,
andriy.shevchenko, v.vitovt, Thierry Chatard
The Dell Latitude 5285 2-in-1 has two cameras connected through a TPS68470
PMIC/clock/GPIO hub:
Front: OV5670 (ACPI INT3479) on I2C4
Back: OV8858 (ACPI INT3477) on I2C2, daisy-chained behind TPS68470
S_I2C port (controlled by reg 0x43 S_I2C_CTL)
GPIO mapping (TPS68470):
INT3479 (OV5670): GPIO3 = reset, GPIO4 = powerdown (both active-low)
INT3477 (OV8858): GPIO9 = s_resetn, GPIO7 = s_enable (both active-low)
GPIO9 and GPIO7 are the TPS68470 secondary-port GPIOs (SGPO reg 0x22
bits 2 and 0), not regular GPDO outputs.
Regulator mapping:
CORE -> dvdd / INT3477
ANA -> avdd / INT3477
VIO -> generic (kept always_on; no direct consumers)
VSIO -> dovdd / INT3477: enabling VSIO sets S_I2C_CTL (reg 0x43),
opening the I2C passthrough to OV8858; the ov8858 driver
enables dovdd at probe time, which naturally activates the
passthrough before any I2C transaction to the sensor.
AUX1 -> dvdd / INT3479
AUX2 -> dovdd / INT3479
A static clock consumer list is provided for both sensors (INT3477 and
INT3479) to work around the broken ACPI _DEP on INT3479 described in the
previous patch.
Signed-off-by: Thierry Chatard <tchatard@gmail.com>
---
.../x86/intel/int3472/tps68470_board_data.c | 170 +++++++++++++++++-
1 file changed, 167 insertions(+), 3 deletions(-)
diff --git a/drivers/platform/x86/intel/int3472/tps68470_board_data.c b/drivers/platform/x86/intel/int3472/tps68470_board_data.c
index 71357a036..6961e2926 100644
--- a/drivers/platform/x86/intel/int3472/tps68470_board_data.c
+++ b/drivers/platform/x86/intel/int3472/tps68470_board_data.c
@@ -74,8 +74,12 @@ static const struct regulator_init_data surface_go_tps68470_vcm_reg_init_data =
.consumer_supplies = int347a_vcm_consumer_supplies,
};
-/* Ensure the always-on VIO regulator has the same voltage as VSIO */
-static const struct regulator_init_data surface_go_tps68470_vio_reg_init_data = {
+/*
+ * Keep VIO always_on. Its voltage must exactly match VSIO on any board
+ * using the TPS68470 I2C pass-through, and must never have direct consumers
+ * (all I2C-path outputs are gated through VSIO).
+ */
+static const struct regulator_init_data generic_tps68470_vio_reg_init_data = {
.constraints = {
.min_uV = 1800600,
.max_uV = 1800600,
@@ -122,7 +126,7 @@ static const struct tps68470_regulator_platform_data surface_go_tps68470_pdata =
[TPS68470_CORE] = &surface_go_tps68470_core_reg_init_data,
[TPS68470_ANA] = &surface_go_tps68470_ana_reg_init_data,
[TPS68470_VCM] = &surface_go_tps68470_vcm_reg_init_data,
- [TPS68470_VIO] = &surface_go_tps68470_vio_reg_init_data,
+ [TPS68470_VIO] = &generic_tps68470_vio_reg_init_data,
[TPS68470_VSIO] = &surface_go_tps68470_vsio_reg_init_data,
[TPS68470_AUX1] = &surface_go_tps68470_aux1_reg_init_data,
[TPS68470_AUX2] = &surface_go_tps68470_aux2_reg_init_data,
@@ -287,6 +291,159 @@ static const struct int3472_tps68470_board_data dell_7212_tps68470_board_data =
},
};
+/* Settings for Dell Latitude 5285 2-in-1 */
+
+/*
+ * The BIOS leaves GNVS field C0TP at zero, which causes INT3479's _DEP to
+ * resolve to PCI0 instead of the INT3472 device. Provide a static clock
+ * consumer list so probe registers MCLK lookups for both sensors regardless
+ * of the broken _DEP traversal.
+ */
+static const struct tps68470_clk_consumer dell_5285_clk_consumers[] = {
+ { .consumer_dev_name = "i2c-INT3477:00" }, /* OV8858 rear camera */
+ { .consumer_dev_name = "i2c-INT3479:00" }, /* OV5670 front camera */
+};
+
+static struct regulator_consumer_supply dell_5285_int3477_ana_consumer_supplies[] = {
+ REGULATOR_SUPPLY("avdd", "i2c-INT3477:00"),
+};
+
+static struct regulator_consumer_supply dell_5285_int3477_core_consumer_supplies[] = {
+ REGULATOR_SUPPLY("dvdd", "i2c-INT3477:00"),
+};
+
+/*
+ * VSIO controls the S_I2C_CTL passthrough; its voltage must match VIO
+ * (both 1800600 uV). dovdd/INT3477 enables the passthrough when OV8858
+ * opens its I2C path. avdd/INT3479 provides the OV5670 analog supply.
+ */
+static struct regulator_consumer_supply dell_5285_int3477_vsio_consumer_supplies[] = {
+ REGULATOR_SUPPLY("dovdd", "i2c-INT3477:00"),
+ REGULATOR_SUPPLY("avdd", "i2c-INT3479:00"),
+};
+
+static struct regulator_consumer_supply dell_5285_int3479_aux1_consumer_supplies[] = {
+ REGULATOR_SUPPLY("dvdd", "i2c-INT3479:00"),
+};
+
+static struct regulator_consumer_supply dell_5285_int3479_aux2_consumer_supplies[] = {
+ REGULATOR_SUPPLY("dovdd", "i2c-INT3479:00"),
+};
+
+static const struct regulator_init_data dell_5285_tps68470_core_reg_init_data = {
+ .constraints = {
+ .min_uV = 1200000,
+ .max_uV = 1200000,
+ .apply_uV = 1,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(dell_5285_int3477_core_consumer_supplies),
+ .consumer_supplies = dell_5285_int3477_core_consumer_supplies,
+};
+
+static const struct regulator_init_data dell_5285_tps68470_ana_reg_init_data = {
+ .constraints = {
+ .min_uV = 2815200,
+ .max_uV = 2815200,
+ .apply_uV = 1,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(dell_5285_int3477_ana_consumer_supplies),
+ .consumer_supplies = dell_5285_int3477_ana_consumer_supplies,
+};
+
+static const struct regulator_init_data dell_5285_tps68470_vcm_reg_init_data = {
+ .constraints = {
+ .min_uV = 2815200,
+ .max_uV = 2815200,
+ .apply_uV = 1,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = 0,
+ .consumer_supplies = NULL,
+};
+
+static const struct regulator_init_data dell_5285_tps68470_vsio_reg_init_data = {
+ .constraints = {
+ .min_uV = 1800600,
+ .max_uV = 1800600,
+ .apply_uV = 1,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(dell_5285_int3477_vsio_consumer_supplies),
+ .consumer_supplies = dell_5285_int3477_vsio_consumer_supplies,
+};
+
+static const struct regulator_init_data dell_5285_tps68470_aux1_reg_init_data = {
+ .constraints = {
+ .min_uV = 1213200,
+ .max_uV = 1213200,
+ .apply_uV = 1,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(dell_5285_int3479_aux1_consumer_supplies),
+ .consumer_supplies = dell_5285_int3479_aux1_consumer_supplies,
+};
+
+static const struct regulator_init_data dell_5285_tps68470_aux2_reg_init_data = {
+ .constraints = {
+ .min_uV = 1800600,
+ .max_uV = 1800600,
+ .apply_uV = 1,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(dell_5285_int3479_aux2_consumer_supplies),
+ .consumer_supplies = dell_5285_int3479_aux2_consumer_supplies,
+};
+
+static const struct tps68470_regulator_platform_data dell_5285_tps68470_pdata = {
+ .reg_init_data = {
+ [TPS68470_CORE] = &dell_5285_tps68470_core_reg_init_data,
+ [TPS68470_ANA] = &dell_5285_tps68470_ana_reg_init_data,
+ [TPS68470_VCM] = &dell_5285_tps68470_vcm_reg_init_data,
+ [TPS68470_VIO] = &generic_tps68470_vio_reg_init_data,
+ [TPS68470_VSIO] = &dell_5285_tps68470_vsio_reg_init_data,
+ [TPS68470_AUX1] = &dell_5285_tps68470_aux1_reg_init_data,
+ [TPS68470_AUX2] = &dell_5285_tps68470_aux2_reg_init_data,
+ },
+};
+
+static struct gpiod_lookup_table dell_5285_int3477_gpios = {
+ .dev_id = "i2c-INT3477:00",
+ .table = {
+ /*
+ * TPS68470 GPIO9 = s_resetn (secondary camera reset, active-low)
+ * TPS68470 GPIO7 = s_enable (secondary camera enable/powerdown)
+ * These logic outputs are specifically designed for secondary
+ * camera control on the TPS68470. Matches Surface Go pattern.
+ */
+ GPIO_LOOKUP("tps68470-gpio", 9, "reset", GPIO_ACTIVE_LOW),
+ GPIO_LOOKUP("tps68470-gpio", 7, "powerdown", GPIO_ACTIVE_LOW),
+ { }
+ }
+};
+
+static struct gpiod_lookup_table dell_5285_int3479_gpios = {
+ .dev_id = "i2c-INT3479:00",
+ .table = {
+ GPIO_LOOKUP("tps68470-gpio", 3, "reset", GPIO_ACTIVE_LOW),
+ GPIO_LOOKUP("tps68470-gpio", 4, "powerdown", GPIO_ACTIVE_LOW),
+ { }
+ }
+};
+
+static const struct int3472_tps68470_board_data dell_5285_tps68470_board_data = {
+ .dev_name = "i2c-INT3472:05",
+ .tps68470_regulator_pdata = &dell_5285_tps68470_pdata,
+ .n_clk_consumers = ARRAY_SIZE(dell_5285_clk_consumers),
+ .clk_consumers = dell_5285_clk_consumers,
+ .n_gpiod_lookups = 2,
+ .tps68470_gpio_lookup_tables = {
+ &dell_5285_int3477_gpios,
+ &dell_5285_int3479_gpios,
+ },
+};
+
static const struct dmi_system_id int3472_tps68470_board_data_table[] = {
{
.matches = {
@@ -316,6 +473,13 @@ static const struct dmi_system_id int3472_tps68470_board_data_table[] = {
},
.driver_data = (void *)&dell_7212_tps68470_board_data,
},
+ {
+ .matches = {
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Latitude 5285"),
+ },
+ .driver_data = (void *)&dell_5285_tps68470_board_data,
+ },
{ }
};
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v8 5/6] media: ipu-bridge: add sensor configuration for OV8858 (INT3477)
2026-08-26 11:24 [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Thierry Chatard
` (3 preceding siblings ...)
2026-08-26 11:24 ` [PATCH v8 4/6] platform/x86: int3472: tps68470: add board data " Thierry Chatard
@ 2026-08-26 11:24 ` Thierry Chatard
2026-08-26 11:24 ` [PATCH v8 6/6] media: ov8858: add ACPI device ID INT3477 Thierry Chatard
2026-08-27 12:49 ` [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Lee Jones
6 siblings, 0 replies; 13+ messages in thread
From: Thierry Chatard @ 2026-08-26 11:24 UTC (permalink / raw)
To: linux-kernel
Cc: hansg, lee, platform-driver-x86, ilpo.jarvinen, djrscally,
linux-media, mchehab, sakari.ailus, jacopo.mondi, nicholas,
andriy.shevchenko, v.vitovt, Thierry Chatard
The Omnivision OV8858 is used as the rear camera in several Intel
IPU3-based devices (e.g. Dell Latitude 5285 2-in-1). Its ACPI HID is
INT3477. Add a sensor configuration entry with a link frequency of
360 MHz to allow ipu_bridge to create the firmware node for this sensor.
Signed-off-by: Thierry Chatard <tchatard@gmail.com>
---
drivers/media/pci/intel/ipu-bridge.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/media/pci/intel/ipu-bridge.c b/drivers/media/pci/intel/ipu-bridge.c
index fc6608e33..f51749d0f 100644
--- a/drivers/media/pci/intel/ipu-bridge.c
+++ b/drivers/media/pci/intel/ipu-bridge.c
@@ -63,6 +63,8 @@ static const struct ipu_sensor_config ipu_supported_sensors[] = {
IPU_SENSOR_CONFIG("INT33F0", 1, 384000000),
/* Omnivision OV2740 */
IPU_SENSOR_CONFIG("INT3474", 1, 180000000),
+ /* Omnivision OV8858 */
+ IPU_SENSOR_CONFIG("INT3477", 1, 360000000),
/* Omnivision OV5670 */
IPU_SENSOR_CONFIG("INT3479", 1, 422400000),
/* Omnivision OV8865 */
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v8 6/6] media: ov8858: add ACPI device ID INT3477
2026-08-26 11:24 [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Thierry Chatard
` (4 preceding siblings ...)
2026-08-26 11:24 ` [PATCH v8 5/6] media: ipu-bridge: add sensor configuration for OV8858 (INT3477) Thierry Chatard
@ 2026-08-26 11:24 ` Thierry Chatard
2026-08-27 8:32 ` Andy Shevchenko
2026-08-27 12:49 ` [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Lee Jones
6 siblings, 1 reply; 13+ messages in thread
From: Thierry Chatard @ 2026-08-26 11:24 UTC (permalink / raw)
To: linux-kernel
Cc: hansg, lee, platform-driver-x86, ilpo.jarvinen, djrscally,
linux-media, mchehab, sakari.ailus, jacopo.mondi, nicholas,
andriy.shevchenko, v.vitovt, Thierry Chatard
The Omnivision OV8858 appears in ACPI firmware under the HID INT3477 on
Intel IPU3-based platforms such as the Dell Latitude 5285 2-in-1. Add
INT3477 to the ACPI match table so the driver binds when instantiated by
ipu_bridge.
Signed-off-by: Thierry Chatard <tchatard@gmail.com>
---
drivers/media/i2c/ov8858.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c
index 3f45f7fab..f0148c1f2 100644
--- a/drivers/media/i2c/ov8858.c
+++ b/drivers/media/i2c/ov8858.c
@@ -1981,11 +1981,18 @@ static const struct of_device_id ov8858_of_match[] = {
};
MODULE_DEVICE_TABLE(of, ov8858_of_match);
+static const struct acpi_device_id ov8858_acpi_ids[] = {
+ { .id = "INT3477" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(acpi, ov8858_acpi_ids);
+
static struct i2c_driver ov8858_i2c_driver = {
.driver = {
.name = "ov8858",
.pm = &ov8858_pm_ops,
.of_match_table = ov8858_of_match,
+ .acpi_match_table = ov8858_acpi_ids,
},
.probe = ov8858_probe,
.remove = ov8858_remove,
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v8 6/6] media: ov8858: add ACPI device ID INT3477
2026-08-26 11:24 ` [PATCH v8 6/6] media: ov8858: add ACPI device ID INT3477 Thierry Chatard
@ 2026-08-27 8:32 ` Andy Shevchenko
0 siblings, 0 replies; 13+ messages in thread
From: Andy Shevchenko @ 2026-08-27 8:32 UTC (permalink / raw)
To: Thierry Chatard
Cc: linux-kernel, hansg, lee, platform-driver-x86, ilpo.jarvinen,
djrscally, linux-media, mchehab, sakari.ailus, jacopo.mondi,
nicholas, v.vitovt
On Wed, Aug 26, 2026 at 01:24:51PM +0200, Thierry Chatard wrote:
> The Omnivision OV8858 appears in ACPI firmware under the HID INT3477 on
> Intel IPU3-based platforms such as the Dell Latitude 5285 2-in-1. Add
> INT3477 to the ACPI match table so the driver binds when instantiated by
> ipu_bridge.
This version looks pretty much okay to me, with the exceptions of some
nit-picks here and there and the main issue is the process related, id est how
the email thread is formed and absence of the cover letter.
Thanks for this work!
So, since there is no cover letter, there is no clearness how this all is
supposed to be merged. I assume either media tree or PDx86 with the immutable
branch for others (MFD, and PDx86 or media). I'm not sure that MFD is a good
choice to take it, so, Lee, please, ack the respective patch if you agree
on the contents and the merge approach.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1
2026-08-26 11:24 [PATCH v8 0/6] Enable cameras on Dell Latitude 5285 2-in-1 Thierry Chatard
` (5 preceding siblings ...)
2026-08-26 11:24 ` [PATCH v8 6/6] media: ov8858: add ACPI device ID INT3477 Thierry Chatard
@ 2026-08-27 12:49 ` Lee Jones
6 siblings, 0 replies; 13+ messages in thread
From: Lee Jones @ 2026-08-27 12:49 UTC (permalink / raw)
To: Thierry Chatard
Cc: linux-kernel, hansg, platform-driver-x86, ilpo.jarvinen,
djrscally, linux-media, mchehab, sakari.ailus, jacopo.mondi,
nicholas, andriy.shevchenko, v.vitovt
On Wed, 26 Aug 2026, Thierry Chatard wrote:
> This series enables the front (OV5670/INT3479) and rear (OV8858/INT3477)
> cameras on the Dell Latitude 5285 2-in-1 under Linux.
>
> Per Documentation/process/coding-assistants.rst: this work was developed
> with significant help from an AI coding assistant (Claude Code, by
> Anthropic). I used it to help reverse-engineer the ACPI/TPS68470 bring-up,
> iterate on the board data, and draft these patches. I have reviewed and
> tested all of it on the actual hardware and take full responsibility for
> the result.
>
> The series spans two trees: patches 1-4 target platform-drivers-x86 and
> patches 5-6 target linux-media. All six are needed for a working system.
>
> Changes since v7 (addressing Andy Shevchenko's review):
> - Patch 1 (intel_lpss): rework the quirk to be data-driven. Match the
> machine by DMI and the device (INT3446) by ACPI ID, carry
> QUIRK_IGNORE_RESOURCE_CONFLICTS in the ACPI match data, and apply it to
> the per-device info in probe, mirroring the PCI counterpart. Drop the
> duplicate spt_i2c_info_ignore_conflicts struct and the machine-specific
> dev_info(). Fix the include ordering.
> - New patch 2 (int3472: tps68470): split the int -> unsigned int loop
> counter change out of the clock-consumer patch into its own cleanup.
> - Patch 3 (int3472: tps68470, was patch 2): trim the commit message; no
> code change beyond the counter split above.
> - Patch 6 (ov8858, was patch 5): use a C99 initialiser for the ACPI match
> entry and drop the comma after the sentinel.
>
> On the open question from the review: I kept the per-table
> gpiod_add_lookup_table() loop rather than switching to
> gpiod_add_lookup_tables(). There is no gpiod_remove_lookup_tables()
> counterpart for the error-unwind path, the board data uses a counted (not
> NULL-terminated) array, and the singular form is what the rest of the tree
> uses, including int3472/discrete.c.
>
> Earlier changelogs (v2-v7) are in the v7 posting:
> https://lore.kernel.org/all/20260819140107.1329091-1-tchatard@gmail.com/
>
> Tested on Ubuntu 25.10 (kernel 6.17.0-22-generic) and Ubuntu 26.04
> (kernel 7.0.0-30-generic). Both cameras working in Zoom, Chrome, and GNOME
> Camera via PipeWire. Also independently tested on the closely-related Dell
> Latitude 5290 2-in-1 (same IPU3/TPS68470/OV5670/OV8858/DW9714 stack) by
> Vitalii Tytskyi:
> https://github.com/vitovt/dell-5290-camera-kernel/tree/master/patches
>
> Thierry Chatard (6):
> platform/x86: intel_lpss: add resource conflict quirk for Dell Latitude 5285
> platform/x86: int3472: tps68470: use unsigned int for GPIO lookup loop counters
> platform/x86: int3472: tps68470: fix clock consumer registration for Dell Latitude 5285
> platform/x86: int3472: tps68470: add board data for Dell Latitude 5285
> media: ipu-bridge: add sensor configuration for OV8858 (INT3477)
> media: ov8858: add ACPI device ID INT3477
What command did you use to create this set?
Where is the diff? Walking through each patch to see if there is
anything I should look at is suboptimal.
--
Lee Jones
^ permalink raw reply [flat|nested] 13+ messages in thread