Commit 2cd6478c authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab

media: atomisp: ov2680: Error handling fixes

Fix 3 error handling issues:

1. In ov2680_s_stream(), when pm_runtime_get_sync() fails it will still
   have incremented the pm-runtime reference count so we need to call
   pm_runtime_put()

2. In ov2680_s_stream() sensor->is_streaming should always be set to false
   when the sensor is powered-off even on i2c-communication errors.

3. In ov2680_probe(), call ov2680_remove() on ov2680_s_config() errors,
   so that pm_runtime_disable() is properly called to disable the
   runtime-pm which has been enabled before the ov2680_s_config() call.
Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 920cf0ba
...@@ -419,7 +419,7 @@ static int ov2680_s_stream(struct v4l2_subdev *sd, int enable) ...@@ -419,7 +419,7 @@ static int ov2680_s_stream(struct v4l2_subdev *sd, int enable)
if (enable) { if (enable) {
ret = pm_runtime_get_sync(sensor->sd.dev); ret = pm_runtime_get_sync(sensor->sd.dev);
if (ret < 0) if (ret < 0)
goto error_unlock; goto error_power_down;
ret = ov2680_set_mode(sensor); ret = ov2680_set_mode(sensor);
if (ret) if (ret)
...@@ -447,6 +447,7 @@ static int ov2680_s_stream(struct v4l2_subdev *sd, int enable) ...@@ -447,6 +447,7 @@ static int ov2680_s_stream(struct v4l2_subdev *sd, int enable)
error_power_down: error_power_down:
pm_runtime_put(sensor->sd.dev); pm_runtime_put(sensor->sd.dev);
sensor->is_streaming = false;
error_unlock: error_unlock:
mutex_unlock(&sensor->input_lock); mutex_unlock(&sensor->input_lock);
return ret; return ret;
...@@ -644,8 +645,10 @@ static int ov2680_probe(struct i2c_client *client) ...@@ -644,8 +645,10 @@ static int ov2680_probe(struct i2c_client *client)
pm_runtime_use_autosuspend(dev); pm_runtime_use_autosuspend(dev);
ret = ov2680_s_config(&sensor->sd); ret = ov2680_s_config(&sensor->sd);
if (ret) if (ret) {
ov2680_remove(client);
return ret; return ret;
}
sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
sensor->pad.flags = MEDIA_PAD_FL_SOURCE; sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment