* [PATCH v10 1/2] platform/x86: int3472: Add TPS68470 board data for Intel nvl
2026-04-08 10:45 [PATCH v10 0/2] Add TPS68470 power supply support for ov13b10 sensor Arun T
@ 2026-04-08 10:45 ` Arun T
2026-04-08 10:45 ` [PATCH v10 2/2] media: ov13b10: Support multiple regulators Arun T
1 sibling, 0 replies; 3+ messages in thread
From: Arun T @ 2026-04-08 10:45 UTC (permalink / raw)
To: arun.t, johannes.goede
Cc: sakari.ailus, arec.kao, ilpo.jarvinen, dan.scally,
platform-driver-x86, linux-media, linux-kernel, mehdi.djait
The Intel NVL platform uses IPU8 is powered by a TPS68470 PMIC,requiring board
data to configure the GPIOs and regulators for proper camera sensor operation.
Signed-off-by: Arun T <arun.t@intel.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Hans de Goede <johannes.goede@oss.qualcomm.com>
---
.../x86/intel/int3472/tps68470_board_data.c | 116 ++++++++++++++++++
1 file changed, 116 insertions(+)
diff --git a/drivers/platform/x86/intel/int3472/tps68470_board_data.c b/drivers/platform/x86/intel/int3472/tps68470_board_data.c
index 6bec5a910396..9e4257f98661 100644
--- a/drivers/platform/x86/intel/int3472/tps68470_board_data.c
+++ b/drivers/platform/x86/intel/int3472/tps68470_board_data.c
@@ -144,6 +144,24 @@ static struct regulator_consumer_supply int3479_aux2_consumer_supplies[] = {
REGULATOR_SUPPLY("dovdd", "i2c-INT3479:00"),
};
+/* Settings for Intel NVL platform */
+
+static struct regulator_consumer_supply ovti13b1_core_consumer_supplies[] = {
+ REGULATOR_SUPPLY("dvdd", "i2c-OVTI13B1:01"),
+};
+
+static struct regulator_consumer_supply ovti13b1_ana_consumer_supplies[] = {
+ REGULATOR_SUPPLY("avdd", "i2c-OVTI13B1:01"),
+};
+
+static struct regulator_consumer_supply ovti13b1_vcm_consumer_supplies[] = {
+ REGULATOR_SUPPLY("vcc", "i2c-OVTI13B1:01-VCM"),
+};
+
+static struct regulator_consumer_supply ovti13b1_vsio_consumer_supplies[] = {
+ REGULATOR_SUPPLY("dovdd", "i2c-OVTI13B1:01"),
+};
+
static const struct regulator_init_data dell_7212_tps68470_core_reg_init_data = {
.constraints = {
.min_uV = 1200000,
@@ -221,6 +239,60 @@ static const struct regulator_init_data dell_7212_tps68470_aux2_reg_init_data =
.consumer_supplies = int3479_aux2_consumer_supplies,
};
+static const struct regulator_init_data intel_nvl_tps68470_core_reg_init_data = {
+ .constraints = {
+ .min_uV = 1200000,
+ .max_uV = 1200000,
+ .apply_uV = true,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ovti13b1_core_consumer_supplies),
+ .consumer_supplies = ovti13b1_core_consumer_supplies,
+};
+
+static const struct regulator_init_data intel_nvl_tps68470_ana_reg_init_data = {
+ .constraints = {
+ .min_uV = 2815200,
+ .max_uV = 2815200,
+ .apply_uV = true,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ovti13b1_ana_consumer_supplies),
+ .consumer_supplies = ovti13b1_ana_consumer_supplies,
+};
+
+static const struct regulator_init_data intel_nvl_tps68470_vcm_reg_init_data = {
+ .constraints = {
+ .min_uV = 2815200,
+ .max_uV = 2815200,
+ .apply_uV = true,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ovti13b1_vcm_consumer_supplies),
+ .consumer_supplies = ovti13b1_vcm_consumer_supplies,
+};
+
+/* Ensure the always-on VIO regulator has the same voltage as VSIO */
+static const struct regulator_init_data intel_nvl_tps68470_vio_reg_init_data = {
+ .constraints = {
+ .min_uV = 1800600,
+ .max_uV = 1800600,
+ .apply_uV = true,
+ .always_on = true,
+ },
+};
+
+static const struct regulator_init_data intel_nvl_tps68470_vsio_reg_init_data = {
+ .constraints = {
+ .min_uV = 1800600,
+ .max_uV = 1800600,
+ .apply_uV = true,
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ovti13b1_vsio_consumer_supplies),
+ .consumer_supplies = ovti13b1_vsio_consumer_supplies,
+};
+
static const struct tps68470_regulator_platform_data dell_7212_tps68470_pdata = {
.reg_init_data = {
[TPS68470_CORE] = &dell_7212_tps68470_core_reg_init_data,
@@ -297,6 +369,16 @@ static const struct tps68470_regulator_platform_data msi_p14_ai_evo_tps68470_pda
},
};
+static const struct tps68470_regulator_platform_data intel_nvl_tps68470_pdata = {
+ .reg_init_data = {
+ [TPS68470_CORE] = &intel_nvl_tps68470_core_reg_init_data,
+ [TPS68470_ANA] = &intel_nvl_tps68470_ana_reg_init_data,
+ [TPS68470_VCM] = &intel_nvl_tps68470_vcm_reg_init_data,
+ [TPS68470_VIO] = &intel_nvl_tps68470_vio_reg_init_data,
+ [TPS68470_VSIO] = &intel_nvl_tps68470_vsio_reg_init_data,
+ },
+};
+
static struct gpiod_lookup_table surface_go_int347a_gpios = {
.dev_id = "i2c-INT347A:00",
.table = {
@@ -336,10 +418,27 @@ static const struct property_entry msi_p14_ai_evo_gpio_props[] = {
{ }
};
+static const struct property_entry intel_nvl_gpio_props[] = {
+ PROPERTY_ENTRY_BOOL("daisy-chain-enable"),
+ { }
+};
+
static const struct software_node msi_p14_ai_evo_tps68470_gpio_swnode = {
.properties = msi_p14_ai_evo_gpio_props,
};
+static const struct software_node intel_nvl_tps68470_gpio_swnode = {
+ .properties = intel_nvl_gpio_props,
+};
+
+static struct gpiod_lookup_table intel_nvl_tps68470_gpios = {
+ .dev_id = "i2c-OVTI13B1:01",
+ .table = {
+ GPIO_LOOKUP("tps68470-gpio", 9, "reset", GPIO_ACTIVE_LOW),
+ { }
+ }
+};
+
static const struct int3472_tps68470_board_data surface_go_tps68470_board_data = {
.dev_name = "i2c-INT3472:05",
.tps68470_regulator_pdata = &surface_go_tps68470_pdata,
@@ -379,6 +478,16 @@ static const struct int3472_tps68470_board_data msi_p14_ai_evo_tps68470_board_da
},
};
+static const struct int3472_tps68470_board_data intel_nvl_tps68470_board_data = {
+ .dev_name = "i2c-INT3472:04",
+ .tps68470_regulator_pdata = &intel_nvl_tps68470_pdata,
+ .tps68470_gpio_swnode = &intel_nvl_tps68470_gpio_swnode,
+ .n_gpiod_lookups = 1,
+ .tps68470_gpio_lookup_tables = {
+ &intel_nvl_tps68470_gpios,
+ },
+};
+
static const struct dmi_system_id int3472_tps68470_board_data_table[] = {
{
.matches = {
@@ -415,6 +524,13 @@ static const struct dmi_system_id int3472_tps68470_board_data_table[] = {
},
.driver_data = (void *)&msi_p14_ai_evo_tps68470_board_data,
},
+ {
+ .matches = {
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Nova Lake Client Platform"),
+ },
+ .driver_data = (void *)&intel_nvl_tps68470_board_data,
+ },
{ }
};
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH v10 2/2] media: ov13b10: Support multiple regulators
2026-04-08 10:45 [PATCH v10 0/2] Add TPS68470 power supply support for ov13b10 sensor Arun T
2026-04-08 10:45 ` [PATCH v10 1/2] platform/x86: int3472: Add TPS68470 board data for Intel nvl Arun T
@ 2026-04-08 10:45 ` Arun T
1 sibling, 0 replies; 3+ messages in thread
From: Arun T @ 2026-04-08 10:45 UTC (permalink / raw)
To: arun.t, johannes.goede
Cc: sakari.ailus, arec.kao, ilpo.jarvinen, dan.scally,
platform-driver-x86, linux-media, linux-kernel, mehdi.djait
The OV13B10 sensor driver currently handles a single regulator called
avdd, however the sensor can be supplied by up to three regulators.
Update the driver to handle all of them together using the regulator
bulk API.
Signed-off-by: Arun T <arun.t@intel.com>
Reviewed-by: Hans de Goede <johannes.goede@oss.qualcomm.com>
---
drivers/media/i2c/ov13b10.c | 47 ++++++++++++++++++++-----------------
1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/drivers/media/i2c/ov13b10.c b/drivers/media/i2c/ov13b10.c
index 5421874732bc..b0d34141a13a 100644
--- a/drivers/media/i2c/ov13b10.c
+++ b/drivers/media/i2c/ov13b10.c
@@ -8,6 +8,7 @@
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/pm_runtime.h>
+#include <linux/regulator/consumer.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-fwnode.h>
@@ -699,6 +700,12 @@ static const struct ov13b10_mode supported_2_lanes_modes[] = {
},
};
+static const char * const ov13b10_supply_names[] = {
+ "dovdd", /* Digital I/O power */
+ "avdd", /* Analog power */
+ "dvdd", /* Digital core power */
+};
+
struct ov13b10 {
struct device *dev;
@@ -708,7 +715,7 @@ struct ov13b10 {
struct v4l2_ctrl_handler ctrl_handler;
struct clk *img_clk;
- struct regulator *avdd;
+ struct regulator_bulk_data supplies[ARRAY_SIZE(ov13b10_supply_names)];
struct gpio_desc *reset;
/* V4L2 Controls */
@@ -1194,9 +1201,8 @@ static int ov13b10_power_off(struct device *dev)
struct ov13b10 *ov13b10 = to_ov13b10(sd);
gpiod_set_value_cansleep(ov13b10->reset, 1);
-
- if (ov13b10->avdd)
- regulator_disable(ov13b10->avdd);
+ regulator_bulk_disable(ARRAY_SIZE(ov13b10_supply_names),
+ ov13b10->supplies);
clk_disable_unprepare(ov13b10->img_clk);
@@ -1214,14 +1220,12 @@ static int ov13b10_power_on(struct device *dev)
dev_err(dev, "failed to enable imaging clock: %d", ret);
return ret;
}
-
- if (ov13b10->avdd) {
- ret = regulator_enable(ov13b10->avdd);
- if (ret < 0) {
- dev_err(dev, "failed to enable avdd: %d", ret);
- clk_disable_unprepare(ov13b10->img_clk);
- return ret;
- }
+ ret = regulator_bulk_enable(ARRAY_SIZE(ov13b10_supply_names),
+ ov13b10->supplies);
+ if (ret < 0) {
+ dev_err(dev, "failed to enable regulators\n");
+ clk_disable_unprepare(ov13b10->img_clk);
+ return ret;
}
gpiod_set_value_cansleep(ov13b10->reset, 0);
@@ -1475,7 +1479,8 @@ static int ov13b10_get_pm_resources(struct ov13b10 *ov13b)
unsigned long freq;
int ret;
- ov13b->reset = devm_gpiod_get_optional(ov13b->dev, "reset", GPIOD_OUT_LOW);
+ ov13b->reset = devm_gpiod_get_optional(ov13b->dev, "reset",
+ GPIOD_OUT_LOW);
if (IS_ERR(ov13b->reset))
return dev_err_probe(ov13b->dev, PTR_ERR(ov13b->reset),
"failed to get reset gpio\n");
@@ -1491,15 +1496,15 @@ static int ov13b10_get_pm_resources(struct ov13b10 *ov13b)
"external clock %lu is not supported\n",
freq);
- ov13b->avdd = devm_regulator_get_optional(ov13b->dev, "avdd");
- if (IS_ERR(ov13b->avdd)) {
- ret = PTR_ERR(ov13b->avdd);
- ov13b->avdd = NULL;
- if (ret != -ENODEV)
- return dev_err_probe(ov13b->dev, ret,
- "failed to get avdd regulator\n");
- }
+ for (unsigned int i = 0; i < ARRAY_SIZE(ov13b10_supply_names); i++)
+ ov13b->supplies[i].supply = ov13b10_supply_names[i];
+ ret = devm_regulator_bulk_get(ov13b->dev,
+ ARRAY_SIZE(ov13b10_supply_names),
+ ov13b->supplies);
+ if (ret)
+ return dev_err_probe(ov13b->dev, ret,
+ "failed to get regulators\n");
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread