diff options
author | Hans de Goede <hdegoede@redhat.com> | 2023-02-05 15:05:39 +0000 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@kernel.org> | 2023-04-15 10:31:27 +0100 |
commit | 2cd6478cbe05b87b55611e3f511f73cef2ea42c2 (patch) | |
tree | 54fc6adab82b169c01e568bf614191b9ec51461d /drivers/staging | |
parent | 920cf0ba6350c3898ec9e0ac7c341b192d652633 (diff) | |
download | lwn-2cd6478cbe05b87b55611e3f511f73cef2ea42c2.tar.gz lwn-2cd6478cbe05b87b55611e3f511f73cef2ea42c2.zip |
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: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/media/atomisp/i2c/atomisp-ov2680.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/staging/media/atomisp/i2c/atomisp-ov2680.c b/drivers/staging/media/atomisp/i2c/atomisp-ov2680.c index 3181276ed027..63de214916f5 100644 --- a/drivers/staging/media/atomisp/i2c/atomisp-ov2680.c +++ b/drivers/staging/media/atomisp/i2c/atomisp-ov2680.c @@ -419,7 +419,7 @@ static int ov2680_s_stream(struct v4l2_subdev *sd, int enable) if (enable) { ret = pm_runtime_get_sync(sensor->sd.dev); if (ret < 0) - goto error_unlock; + goto error_power_down; ret = ov2680_set_mode(sensor); if (ret) @@ -447,6 +447,7 @@ static int ov2680_s_stream(struct v4l2_subdev *sd, int enable) error_power_down: pm_runtime_put(sensor->sd.dev); + sensor->is_streaming = false; error_unlock: mutex_unlock(&sensor->input_lock); return ret; @@ -644,8 +645,10 @@ static int ov2680_probe(struct i2c_client *client) pm_runtime_use_autosuspend(dev); ret = ov2680_s_config(&sensor->sd); - if (ret) + if (ret) { + ov2680_remove(client); return ret; + } sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; sensor->pad.flags = MEDIA_PAD_FL_SOURCE; |