This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: i2c: imx415: Replace streaming flag with runtime PM check
Author:  Laurent Pinchart <laurent.pinch...@ideasonboard.com>
Date:    Thu Sep 14 20:46:00 2023 +0300

The streaming flag in the driver private structure is used for the sole
purpose of gating register writes when setting a V4L2 control. This is
better handled by checking if the sensor is powered up using the runtime
PM API. Do so and drop the streaming flag.

Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
[Sakari Ailus: Runtime PM put when setting analgue gain.]
Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>

 drivers/media/i2c/imx415.c | 34 ++++++++++++++++------------------
 1 file changed, 16 insertions(+), 18 deletions(-)

---

diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
index 9a7ac81edc28..b3fa71a16839 100644
--- a/drivers/media/i2c/imx415.c
+++ b/drivers/media/i2c/imx415.c
@@ -353,8 +353,6 @@ struct imx415 {
 
        const struct imx415_clk_params *clk_params;
 
-       bool streaming;
-
        struct v4l2_subdev subdev;
        struct media_pad pad;
 
@@ -542,8 +540,9 @@ static int imx415_s_ctrl(struct v4l2_ctrl *ctrl)
        struct v4l2_subdev_state *state;
        unsigned int vmax;
        unsigned int flip;
+       int ret;
 
-       if (!sensor->streaming)
+       if (!pm_runtime_get_if_in_use(sensor->dev))
                return 0;
 
        state = v4l2_subdev_get_locked_active_state(&sensor->subdev);
@@ -554,24 +553,33 @@ static int imx415_s_ctrl(struct v4l2_ctrl *ctrl)
                /* clamp the exposure value to VMAX. */
                vmax = format->height + sensor->vblank->cur.val;
                ctrl->val = min_t(int, ctrl->val, vmax);
-               return imx415_write(sensor, IMX415_SHR0, vmax - ctrl->val);
+               ret = imx415_write(sensor, IMX415_SHR0, vmax - ctrl->val);
+               break;
 
        case V4L2_CID_ANALOGUE_GAIN:
                /* analogue gain in 0.3 dB step size */
-               return imx415_write(sensor, IMX415_GAIN_PCG_0, ctrl->val);
+               ret = imx415_write(sensor, IMX415_GAIN_PCG_0, ctrl->val);
+               break;
 
        case V4L2_CID_HFLIP:
        case V4L2_CID_VFLIP:
                flip = (sensor->hflip->val << IMX415_HREVERSE_SHIFT) |
                       (sensor->vflip->val << IMX415_VREVERSE_SHIFT);
-               return imx415_write(sensor, IMX415_REVERSE, flip);
+               ret = imx415_write(sensor, IMX415_REVERSE, flip);
+               break;
 
        case V4L2_CID_TEST_PATTERN:
-               return imx415_set_testpattern(sensor, ctrl->val);
+               ret = imx415_set_testpattern(sensor, ctrl->val);
+               break;
 
        default:
-               return -EINVAL;
+               ret = -EINVAL;
+               break;
        }
+
+       pm_runtime_put(sensor->dev);
+
+       return ret;
 }
 
 static const struct v4l2_ctrl_ops imx415_ctrl_ops = {
@@ -766,8 +774,6 @@ static int imx415_s_stream(struct v4l2_subdev *sd, int 
enable)
                pm_runtime_mark_last_busy(sensor->dev);
                pm_runtime_put_autosuspend(sensor->dev);
 
-               sensor->streaming = false;
-
                goto unlock;
        }
 
@@ -779,13 +785,6 @@ static int imx415_s_stream(struct v4l2_subdev *sd, int 
enable)
        if (ret)
                goto err_pm;
 
-       /*
-        * Set streaming to true to ensure __v4l2_ctrl_handler_setup() will set
-        * the controls. The flag is reset to false further down if an error
-        * occurs.
-        */
-       sensor->streaming = true;
-
        ret = __v4l2_ctrl_handler_setup(&sensor->ctrls);
        if (ret < 0)
                goto err_pm;
@@ -807,7 +806,6 @@ err_pm:
         * likely has no other chance to recover.
         */
        pm_runtime_put_sync(sensor->dev);
-       sensor->streaming = false;
 
        goto unlock;
 }

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to