media: ov8865: Disable only enabled regulators on error path
Subsystems (3)
This is an automatic generated email to let you know that the following patch were queued:
Subject: media: ov8865: Disable only enabled regulators on error path Author: Sakari Ailus <[email protected]> Date: Wed Dec 15 09:38:48 2021 +0100
If powering on the sensor failed, the entire power-off sequence was run independently of how far the power-on sequence proceeded before the error. This lead to disabling regulators and/or clock that was not enabled.
Fix this by disabling only clocks and regulators that were enabled previously.
Fixes 11c0d8fdccc5 ("media: i2c: Add support for the OV8865 image sensor")
Signed-off-by Sakari Ailus <[email protected]>
Signed-off-by Mauro Carvalho Chehab <[email protected]>
drivers/media/i2c/ov8865.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
---
drivers/media/i2c/ov8865.c +7 -5
@@ -2407,27 +2407,27 @@ static int ov8865_sensor_power(struct ov8865_sensor *sensor, bool on)if (ret) {dev_err (sensor->dev,"failed to enable DOVDD regulator\n" ); - goto disable; +return ret; } ret =regulator_enable (sensor->avdd);if (ret) {dev_err (sensor->dev,"failed to enable AVDD regulator\n" ); - goto disable; + goto disable_dovdd; } ret =regulator_enable (sensor->dvdd);if (ret) {dev_err (sensor->dev,"failed to enable DVDD regulator\n" ); - goto disable; + goto disable_avdd; } ret =clk_prepare_enable (sensor->extclk);if (ret) {dev_err (sensor->dev,"failed to enable EXTCLK clock\n" ); - goto disable; + goto disable_dvdd; }gpiod_set_value_cansleep (sensor->reset,0 );
@@ -2436,14 +2436,16 @@ static int ov8865_sensor_power(struct ov8865_sensor *sensor, bool on)/* Time to enter streaming mode according to power timings. */ usleep_range (10000 ,12000 ); }else { -disable:gpiod_set_value_cansleep (sensor->powerdown,1 );gpiod_set_value_cansleep (sensor->reset,1 );clk_disable_unprepare (sensor->extclk); +disable_dvdd:regulator_disable (sensor->dvdd); +disable_avdd:regulator_disable (sensor->avdd); +disable_dovdd:regulator_disable (sensor->dovdd); }