diff mbox series

[v2,08/28] media: ov2680: Fix regulators being left enabled on ov2680_power_on() errors

Message ID 20230615141349.172363-9-hdegoede@redhat.com (mailing list archive)
State New, archived
Headers show
Series media: ov2680: Bugfixes + ACPI + selection(crop-tgt) API support | expand

Commit Message

Hans de Goede June 15, 2023, 2:13 p.m. UTC
When the ov2680_power_on() "sensor soft reset failed" path is hit during
probe() the WARN() about putting an enabled regulator at
drivers/regulator/core.c:2398 triggers 3 times (once for each regulator),
filling dmesg with backtraces.

Fix this by properly disabling the regulators on ov2680_power_on() errors.

Fixes: 3ee47cad3e69 ("media: ov2680: Add Omnivision OV2680 sensor driver")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/media/i2c/ov2680.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Daniel Scally June 16, 2023, 2:27 p.m. UTC | #1
Hi Hans

On 15/06/2023 15:13, Hans de Goede wrote:
> When the ov2680_power_on() "sensor soft reset failed" path is hit during
> probe() the WARN() about putting an enabled regulator at
> drivers/regulator/core.c:2398 triggers 3 times (once for each regulator),
> filling dmesg with backtraces.
>
> Fix this by properly disabling the regulators on ov2680_power_on() errors.
>
> Fixes: 3ee47cad3e69 ("media: ov2680: Add Omnivision OV2680 sensor driver")
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---


Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>

>   drivers/media/i2c/ov2680.c | 8 ++++++--
>   1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/i2c/ov2680.c b/drivers/media/i2c/ov2680.c
> index 7fc4b39ebb37..55fc56ffad31 100644
> --- a/drivers/media/i2c/ov2680.c
> +++ b/drivers/media/i2c/ov2680.c
> @@ -475,7 +475,7 @@ static int ov2680_power_on(struct ov2680_dev *sensor)
>   		ret = ov2680_write_reg(sensor, OV2680_REG_SOFT_RESET, 0x01);
>   		if (ret != 0) {
>   			dev_err(dev, "sensor soft reset failed\n");
> -			return ret;
> +			goto err_disable_regulators;
>   		}
>   		usleep_range(1000, 2000);
>   	} else {
> @@ -485,7 +485,7 @@ static int ov2680_power_on(struct ov2680_dev *sensor)
>   
>   	ret = clk_prepare_enable(sensor->xvclk);
>   	if (ret < 0)
> -		return ret;
> +		goto err_disable_regulators;
>   
>   	sensor->is_enabled = true;
>   
> @@ -495,6 +495,10 @@ static int ov2680_power_on(struct ov2680_dev *sensor)
>   	ov2680_stream_disable(sensor);
>   
>   	return 0;
> +
> +err_disable_regulators:
> +	regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies);
> +	return ret;
>   }
>   
>   static int ov2680_s_power(struct v4l2_subdev *sd, int on)
diff mbox series

Patch

diff --git a/drivers/media/i2c/ov2680.c b/drivers/media/i2c/ov2680.c
index 7fc4b39ebb37..55fc56ffad31 100644
--- a/drivers/media/i2c/ov2680.c
+++ b/drivers/media/i2c/ov2680.c
@@ -475,7 +475,7 @@  static int ov2680_power_on(struct ov2680_dev *sensor)
 		ret = ov2680_write_reg(sensor, OV2680_REG_SOFT_RESET, 0x01);
 		if (ret != 0) {
 			dev_err(dev, "sensor soft reset failed\n");
-			return ret;
+			goto err_disable_regulators;
 		}
 		usleep_range(1000, 2000);
 	} else {
@@ -485,7 +485,7 @@  static int ov2680_power_on(struct ov2680_dev *sensor)
 
 	ret = clk_prepare_enable(sensor->xvclk);
 	if (ret < 0)
-		return ret;
+		goto err_disable_regulators;
 
 	sensor->is_enabled = true;
 
@@ -495,6 +495,10 @@  static int ov2680_power_on(struct ov2680_dev *sensor)
 	ov2680_stream_disable(sensor);
 
 	return 0;
+
+err_disable_regulators:
+	regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies);
+	return ret;
 }
 
 static int ov2680_s_power(struct v4l2_subdev *sd, int on)