* [PATCH v5 0/2] Add TPS68470 power supply support for ov13b10 sensor
@ 2026-03-27 13:39 Arun T
2026-03-27 13:39 ` [PATCH v5 1/2] platform/x86: int3472: Add TPS68470 board data for intel nvl Arun T
2026-03-27 13:39 ` [PATCH v5 2/2] media: i2c: ov13b10: support tps68470 regulator and gpio Arun T
0 siblings, 2 replies; 6+ messages in thread
From: Arun T @ 2026-03-27 13:39 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
This patch series adds power supply management support for the OV13B10 camera sensor when used with TPS68470 PMIC, commonly used on Intel-based camera platforms.
The OV13B10 sensor requires three power supplies (DOVDD, AVDD, DVDD) which are provided by the TPS68470 PMIC.
This series implements proper regulator framework integration to manage these power supplies during sensor power on/off sequences.
Changes in V5:
- keep supply names to only those consumed for sensor driver like dvdd, avdd, dovdd regulators
- Removed always_on flag for other power sources except only VSIO power rail
- Removed unused gpio names (s_idle/s_enable) in gpio lookup table
- changed gpio lookup table name as intel_nvl_ovti13b1_gpios
Suggested by Dan Scally:
- Limit regulator supplies to only those consumed by sensor driver: Keep only dvdd, avdd, dovdd; remove unused vdd, vsio, vddd, vdda, vdddo mapping
- Only VSIO should be forced always-on; drop it from CORE, ANA, VCM, and VIO rails to reduce power draw.
- Rename table to intel_nvl_ovti13b1_gpios, keep only reset GPIO (remove unsupported s_idle and s_enable)
- Remove gpio lookup table name like intel_nvl_ovti13b1_gpios
Suggested by Sakari Alius:
- Asked to remove always_on flag for all power sources except vsio
Changes in v4:
- Discrete INT3472 supplying regulator to i2c-OVTI13B1:00 and tps68470 supplying regulator to i2c-OVTI13B1:01.
- Change Analog regulator name as avdd for tps68470 pmic
- Fixed regulator_consumer_supply maps to i2c-OVTI13B1:01 device.
- Removed vdd regulator from Power supply names list
Suggested by Hans:
- No "avdd" found, only "vdda" and "ana" - check if "ana" should be changed to "avdd".
- Drop unused regulator maps. Only keep the 3 maps used by sensor-driver.
- For "i2c-OVTI13B1:01" consumer, only map "dovdd", "avdd", and "dvdd" supplies.
Changes in v3:
- Fixed check patch errors as updated by sakari
- Enabled VCM regulator for ov13b10 sensor to enable autofocus to work
Suggested by Sakari:
- Add include header file in alphabetical order
- Remove extra space
- Asked to check vcm instance
Changes in v2:
- Added power supply names array for the three required regulators
- Implement regulator handling with devm_regulator_bulk_get()
- Add regulator_bulk_enable() and regulator_bulk_disable() for sensor power on/off sequence
Suggested by Hans:
- Add multiple regulators you should use the bulk regulator API
- Use use "reset" instead of "s_resetn" for parse gpio name.
- Add diffent regulator power supplies in single array
Arun T (2):
platform/x86: int3472: Add TPS68470 board data for Intel nvl
media: i2c: ov13b10: support tps68470 regulator and gpio
drivers/media/i2c/ov13b10.c | 47 ++++---
.../x86/intel/int3472/tps68470_board_data.c | 127 ++++++++++++++++++
2 files changed, 153 insertions(+), 21 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v5 1/2] platform/x86: int3472: Add TPS68470 board data for intel nvl 2026-03-27 13:39 [PATCH v5 0/2] Add TPS68470 power supply support for ov13b10 sensor Arun T @ 2026-03-27 13:39 ` Arun T 2026-03-27 15:03 ` Dan Scally 2026-03-27 13:39 ` [PATCH v5 2/2] media: i2c: ov13b10: support tps68470 regulator and gpio Arun T 1 sibling, 1 reply; 6+ messages in thread From: Arun T @ 2026-03-27 13:39 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> --- .../x86/intel/int3472/tps68470_board_data.c | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/drivers/platform/x86/intel/int3472/tps68470_board_data.c b/drivers/platform/x86/intel/int3472/tps68470_board_data.c index 71357a036292..a1c32a988bcd 100644 --- a/drivers/platform/x86/intel/int3472/tps68470_board_data.c +++ b/drivers/platform/x86/intel/int3472/tps68470_board_data.c @@ -143,6 +143,20 @@ 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 int3472_core_consumer_supplies[] = { + REGULATOR_SUPPLY("dvdd", "i2c-OVTI13B1:01"), +}; + +static struct regulator_consumer_supply int3472_ana_consumer_supplies[] = { + REGULATOR_SUPPLY("avdd", "i2c-OVTI13B1:01"), +}; + +static struct regulator_consumer_supply int3472_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, @@ -220,6 +234,83 @@ 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(int3472_core_consumer_supplies), + .consumer_supplies = int3472_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(int3472_ana_consumer_supplies), + .consumer_supplies = int3472_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 = 0, + .consumer_supplies = NULL, + +}; + +/* 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(int3472_vsio_consumer_supplies), + .consumer_supplies = int3472_vsio_consumer_supplies, +}; + +static const struct regulator_init_data intel_nvl_tps68470_aux1_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 intel_nvl_tps68470_aux2_reg_init_data = { + .constraints = { + .min_uV = 1800600, + .max_uV = 1800600, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS, + }, + .num_consumer_supplies = 0, + .consumer_supplies = NULL, +}; + static const struct tps68470_regulator_platform_data dell_7212_tps68470_pdata = { .reg_init_data = { [TPS68470_CORE] = &dell_7212_tps68470_core_reg_init_data, @@ -232,6 +323,18 @@ static const struct tps68470_regulator_platform_data dell_7212_tps68470_pdata = }, }; +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, + [TPS68470_AUX1] = &intel_nvl_tps68470_aux1_reg_init_data, + [TPS68470_AUX2] = &intel_nvl_tps68470_aux2_reg_init_data, + }, +}; + static struct gpiod_lookup_table surface_go_int347a_gpios = { .dev_id = "i2c-INT347A:00", .table = { @@ -258,6 +361,14 @@ static struct gpiod_lookup_table dell_7212_int3479_gpios = { } }; +static struct gpiod_lookup_table intel_nvl_ovti13b1_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, @@ -287,6 +398,15 @@ static const struct int3472_tps68470_board_data dell_7212_tps68470_board_data = }, }; +static const struct int3472_tps68470_board_data intel_nvl_tps68470_board_data = { + .dev_name = "i2c-INT3472:04", + .tps68470_regulator_pdata = &intel_nvl_tps68470_pdata, + .n_gpiod_lookups = 1, + .tps68470_gpio_lookup_tables = { + &intel_nvl_ovti13b1_gpios, + }, +}; + static const struct dmi_system_id int3472_tps68470_board_data_table[] = { { .matches = { @@ -316,6 +436,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, "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 [flat|nested] 6+ messages in thread
* Re: [PATCH v5 1/2] platform/x86: int3472: Add TPS68470 board data for intel nvl 2026-03-27 13:39 ` [PATCH v5 1/2] platform/x86: int3472: Add TPS68470 board data for intel nvl Arun T @ 2026-03-27 15:03 ` Dan Scally 0 siblings, 0 replies; 6+ messages in thread From: Dan Scally @ 2026-03-27 15:03 UTC (permalink / raw) To: Arun T, johannes.goede Cc: sakari.ailus, arec.kao, ilpo.jarvinen, platform-driver-x86, linux-media, linux-kernel, mehdi.djait Hi Arun, thanks for the revision On 27/03/2026 13:39, Arun T wrote: > 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> > --- > .../x86/intel/int3472/tps68470_board_data.c | 127 ++++++++++++++++++ > 1 file changed, 127 insertions(+) > > diff --git a/drivers/platform/x86/intel/int3472/tps68470_board_data.c b/drivers/platform/x86/intel/int3472/tps68470_board_data.c > index 71357a036292..a1c32a988bcd 100644 > --- a/drivers/platform/x86/intel/int3472/tps68470_board_data.c > +++ b/drivers/platform/x86/intel/int3472/tps68470_board_data.c > @@ -143,6 +143,20 @@ 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 int3472_core_consumer_supplies[] = { The name of the struct needs to be different really; INT3472 is the HID for the PMIC which will be the same for all sensors across these platforms. So far we've been naming them after the sensor _HID; so in this case this would be something like ovti13b1_core_consumer_supplies. Similar notes for the next two structs. Sorry, didn't notice that on the last version. > + REGULATOR_SUPPLY("dvdd", "i2c-OVTI13B1:01"), > +}; > + > +static struct regulator_consumer_supply int3472_ana_consumer_supplies[] = { > + REGULATOR_SUPPLY("avdd", "i2c-OVTI13B1:01"), > +}; > + > +static struct regulator_consumer_supply int3472_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, > @@ -220,6 +234,83 @@ 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(int3472_core_consumer_supplies), > + .consumer_supplies = int3472_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(int3472_ana_consumer_supplies), > + .consumer_supplies = int3472_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 = 0, > + .consumer_supplies = NULL, These discrete initialisations to 0 and NULL can be dropped; Sakari has a patch removing them across the rest of the file too. With those two changes made you can add my R-b on the next version: Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> > + > +}; > + > +/* 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(int3472_vsio_consumer_supplies), > + .consumer_supplies = int3472_vsio_consumer_supplies, > +}; > + > +static const struct regulator_init_data intel_nvl_tps68470_aux1_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 intel_nvl_tps68470_aux2_reg_init_data = { > + .constraints = { > + .min_uV = 1800600, > + .max_uV = 1800600, > + .apply_uV = 1, > + .valid_ops_mask = REGULATOR_CHANGE_STATUS, > + }, > + .num_consumer_supplies = 0, > + .consumer_supplies = NULL, > +}; > + > static const struct tps68470_regulator_platform_data dell_7212_tps68470_pdata = { > .reg_init_data = { > [TPS68470_CORE] = &dell_7212_tps68470_core_reg_init_data, > @@ -232,6 +323,18 @@ static const struct tps68470_regulator_platform_data dell_7212_tps68470_pdata = > }, > }; > > +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, > + [TPS68470_AUX1] = &intel_nvl_tps68470_aux1_reg_init_data, > + [TPS68470_AUX2] = &intel_nvl_tps68470_aux2_reg_init_data, > + }, > +}; > + > static struct gpiod_lookup_table surface_go_int347a_gpios = { > .dev_id = "i2c-INT347A:00", > .table = { > @@ -258,6 +361,14 @@ static struct gpiod_lookup_table dell_7212_int3479_gpios = { > } > }; > > +static struct gpiod_lookup_table intel_nvl_ovti13b1_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, > @@ -287,6 +398,15 @@ static const struct int3472_tps68470_board_data dell_7212_tps68470_board_data = > }, > }; > > +static const struct int3472_tps68470_board_data intel_nvl_tps68470_board_data = { > + .dev_name = "i2c-INT3472:04", > + .tps68470_regulator_pdata = &intel_nvl_tps68470_pdata, > + .n_gpiod_lookups = 1, > + .tps68470_gpio_lookup_tables = { > + &intel_nvl_ovti13b1_gpios, > + }, > +}; > + > static const struct dmi_system_id int3472_tps68470_board_data_table[] = { > { > .matches = { > @@ -316,6 +436,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, "Intel Corporation"), > + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Nova Lake Client Platform"), > + }, > + .driver_data = (void *)&intel_nvl_tps68470_board_data, > + }, > { } > }; > ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v5 2/2] media: i2c: ov13b10: support tps68470 regulator and gpio 2026-03-27 13:39 [PATCH v5 0/2] Add TPS68470 power supply support for ov13b10 sensor Arun T 2026-03-27 13:39 ` [PATCH v5 1/2] platform/x86: int3472: Add TPS68470 board data for intel nvl Arun T @ 2026-03-27 13:39 ` Arun T 2026-03-27 15:14 ` Dan Scally 1 sibling, 1 reply; 6+ messages in thread From: Arun T @ 2026-03-27 13:39 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 obtains clock and regulators from the TPS68470 PMIC. Add TPS68470 regulator and GPIO names to the sensor power on Signed-off-by: Arun T <arun.t@intel.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..4b7b17afb64c 100644 --- a/drivers/media/i2c/ov13b10.c +++ b/drivers/media/i2c/ov13b10.c @@ -3,6 +3,7 @@ #include <linux/acpi.h> #include <linux/clk.h> +#include <linux/regulator/consumer.h> #include <linux/delay.h> #include <linux/gpio/consumer.h> #include <linux/i2c.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 [flat|nested] 6+ messages in thread
* Re: [PATCH v5 2/2] media: i2c: ov13b10: support tps68470 regulator and gpio 2026-03-27 13:39 ` [PATCH v5 2/2] media: i2c: ov13b10: support tps68470 regulator and gpio Arun T @ 2026-03-27 15:14 ` Dan Scally 2026-03-27 18:29 ` T, Arun 0 siblings, 1 reply; 6+ messages in thread From: Dan Scally @ 2026-03-27 15:14 UTC (permalink / raw) To: Arun T, johannes.goede Cc: sakari.ailus, arec.kao, ilpo.jarvinen, platform-driver-x86, linux-media, linux-kernel, mehdi.djait Hi Arun, thanks for the revision On 27/03/2026 13:39, Arun T wrote: > The OV13B10 sensor obtains clock and regulators from the TPS68470 PMIC. > Add TPS68470 regulator and GPIO names to the sensor power on The commit message needs updating now really; it's changed since the early version. What it now does is switch to using the regulator bulk API to handle three regulators instead of just a single one. The GPIO changes are gone so you can skip mentioning them here. I would also not mention the TPS68470, as from the sensor driver's point of view it's irrelevant what device provides them. Maybe something like: media: ov13b10: Support multiple regulators 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> > --- > 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..4b7b17afb64c 100644 > --- a/drivers/media/i2c/ov13b10.c > +++ b/drivers/media/i2c/ov13b10.c > @@ -3,6 +3,7 @@ > > #include <linux/acpi.h> > #include <linux/clk.h> > +#include <linux/regulator/consumer.h> Alphabetical ordering please; this should go after pm_runtime.h and before v4l2-ctrls.h > #include <linux/delay.h> > #include <linux/gpio/consumer.h> > #include <linux/i2c.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); I think you can just drop this change. Thanks Dan > 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; > } > ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH v5 2/2] media: i2c: ov13b10: support tps68470 regulator and gpio 2026-03-27 15:14 ` Dan Scally @ 2026-03-27 18:29 ` T, Arun 0 siblings, 0 replies; 6+ messages in thread From: T, Arun @ 2026-03-27 18:29 UTC (permalink / raw) To: Dan Scally, johannes.goede Cc: sakari.ailus, Kao, Arec, ilpo.jarvinen, platform-driver-x86, linux-media, linux-kernel, Djait, Mehdi Hi Dan, Thanks for the review. I have updated V6 patch series as you suggested: Updated below changes in V6 patch series. - Changed consumer supply arrays from int3472_* to ovti13b1_* and update all references. - Removed consumer supply zero-init fields - Updated commit message for ov13b10 driver and rewritten for regulator bulk support - Updated <linux/regulator/consumer.h> in alphabetical order Thanks, Arun T -----Original Message----- From: Dan Scally <dan.scally@ideasonboard.com> Sent: 27 March 2026 08:45 PM To: T, Arun <arun.t@intel.com>; johannes.goede@oss.qualcomm.com Cc: sakari.ailus@linux.intel.com; Kao, Arec <arec.kao@intel.com>; ilpo.jarvinen@linux.intel.com; platform-driver-x86@vger.kernel.org; linux-media@vger.kernel.org; linux-kernel@vger.kernel.org; Djait, Mehdi <mehdi.djait@intel.com> Subject: Re: [PATCH v5 2/2] media: i2c: ov13b10: support tps68470 regulator and gpio Hi Arun, thanks for the revision On 27/03/2026 13:39, Arun T wrote: > The OV13B10 sensor obtains clock and regulators from the TPS68470 PMIC. > Add TPS68470 regulator and GPIO names to the sensor power on The commit message needs updating now really; it's changed since the early version. What it now does is switch to using the regulator bulk API to handle three regulators instead of just a single one. The GPIO changes are gone so you can skip mentioning them here. I would also not mention the TPS68470, as from the sensor driver's point of view it's irrelevant what device provides them. Maybe something like: media: ov13b10: Support multiple regulators 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> > --- > 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..4b7b17afb64c 100644 > --- a/drivers/media/i2c/ov13b10.c > +++ b/drivers/media/i2c/ov13b10.c > @@ -3,6 +3,7 @@ > > #include <linux/acpi.h> > #include <linux/clk.h> > +#include <linux/regulator/consumer.h> Alphabetical ordering please; this should go after pm_runtime.h and before v4l2-ctrls.h > #include <linux/delay.h> > #include <linux/gpio/consumer.h> > #include <linux/i2c.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); I think you can just drop this change. Thanks Dan > 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; > } > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-03-27 18:30 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-03-27 13:39 [PATCH v5 0/2] Add TPS68470 power supply support for ov13b10 sensor Arun T 2026-03-27 13:39 ` [PATCH v5 1/2] platform/x86: int3472: Add TPS68470 board data for intel nvl Arun T 2026-03-27 15:03 ` Dan Scally 2026-03-27 13:39 ` [PATCH v5 2/2] media: i2c: ov13b10: support tps68470 regulator and gpio Arun T 2026-03-27 15:14 ` Dan Scally 2026-03-27 18:29 ` T, Arun
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox