Skip to content

Commit cbe0b3a

Browse files
Sakari Ailusmchehab
authored andcommitted
media: ov8865: Disable only enabled regulators on error path
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: 11c0d8f ("media: i2c: Add support for the OV8865 image sensor") Cc: [email protected] Signed-off-by: Sakari Ailus <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent 6ab7030 commit cbe0b3a

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

drivers/media/i2c/ov8865.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2407,27 +2407,27 @@ static int ov8865_sensor_power(struct ov8865_sensor *sensor, bool on)
24072407
if (ret) {
24082408
dev_err(sensor->dev,
24092409
"failed to enable DOVDD regulator\n");
2410-
goto disable;
2410+
return ret;
24112411
}
24122412

24132413
ret = regulator_enable(sensor->avdd);
24142414
if (ret) {
24152415
dev_err(sensor->dev,
24162416
"failed to enable AVDD regulator\n");
2417-
goto disable;
2417+
goto disable_dovdd;
24182418
}
24192419

24202420
ret = regulator_enable(sensor->dvdd);
24212421
if (ret) {
24222422
dev_err(sensor->dev,
24232423
"failed to enable DVDD regulator\n");
2424-
goto disable;
2424+
goto disable_avdd;
24252425
}
24262426

24272427
ret = clk_prepare_enable(sensor->extclk);
24282428
if (ret) {
24292429
dev_err(sensor->dev, "failed to enable EXTCLK clock\n");
2430-
goto disable;
2430+
goto disable_dvdd;
24312431
}
24322432

24332433
gpiod_set_value_cansleep(sensor->reset, 0);
@@ -2436,14 +2436,16 @@ static int ov8865_sensor_power(struct ov8865_sensor *sensor, bool on)
24362436
/* Time to enter streaming mode according to power timings. */
24372437
usleep_range(10000, 12000);
24382438
} else {
2439-
disable:
24402439
gpiod_set_value_cansleep(sensor->powerdown, 1);
24412440
gpiod_set_value_cansleep(sensor->reset, 1);
24422441

24432442
clk_disable_unprepare(sensor->extclk);
24442443

2444+
disable_dvdd:
24452445
regulator_disable(sensor->dvdd);
2446+
disable_avdd:
24462447
regulator_disable(sensor->avdd);
2448+
disable_dovdd:
24472449
regulator_disable(sensor->dovdd);
24482450
}
24492451

0 commit comments

Comments
 (0)