Hi Laurent, and thanks for the review. On 2024-03-04 at 23:31 +02, Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> wrote: > Hi Mikhail, > > Thank you for the patch. > > On Thu, Feb 29, 2024 at 07:53:32PM +0300, Mikhail Rudenko wrote: >> Split ov4689_s_stream into __ov4689_stream_on and __ov4689_stream_off >> functions. Also remove repetitive pm_runtime_put calls and call >> pm_runtime_put once at the end of the __ov4689_stream_off function if >> any error occurred. >> >> Signed-off-by: Mikhail Rudenko <mike.rudenko@xxxxxxxxx> >> --- >> drivers/media/i2c/ov4689.c | 100 ++++++++++++++++++++----------------- >> 1 file changed, 53 insertions(+), 47 deletions(-) >> >> diff --git a/drivers/media/i2c/ov4689.c b/drivers/media/i2c/ov4689.c >> index 2496067b90a0..5cea9b5ba201 100644 >> --- a/drivers/media/i2c/ov4689.c >> +++ b/drivers/media/i2c/ov4689.c >> @@ -537,61 +537,67 @@ static int ov4689_setup_blc_anchors(struct ov4689 *ov4689, >> return ret; >> } >> >> +static int __ov4689_stream_on(struct ov4689 *ov4689, > > No need for the __ prefix. Same for __ov4689_stream_off(). Will remove the prefix in v4. >> + struct v4l2_subdev_state *sd_state) >> +{ >> + int ret; >> + >> + ret = pm_runtime_resume_and_get(ov4689->dev); >> + if (ret < 0) >> + return ret; >> + >> + ret = cci_multi_reg_write(ov4689->regmap, ov4689_common_regs, >> + ARRAY_SIZE(ov4689_common_regs), NULL); >> + if (ret) >> + goto cleanup_pm; >> + >> + ret = ov4689_setup_timings(ov4689, sd_state); >> + if (ret) >> + goto cleanup_pm; >> + >> + ret = ov4689_setup_blc_anchors(ov4689, sd_state); >> + if (ret) >> + goto cleanup_pm; >> + >> + ret = __v4l2_ctrl_handler_setup(&ov4689->ctrl_handler); >> + if (ret) >> + goto cleanup_pm; >> + >> + ret = cci_write(ov4689->regmap, OV4689_REG_CTRL_MODE, >> + OV4689_MODE_STREAMING, NULL); >> + if (ret) >> + goto cleanup_pm; >> + >> + return 0; >> + >> + cleanup_pm: > > No space before the label. I would also name it just "error". Thanks for the suggestion, will do so in v4. > With those small changes, > > Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > >> + pm_runtime_put(ov4689->dev); >> + return ret; >> +} >> + >> +static int __ov4689_stream_off(struct ov4689 *ov4689) >> +{ >> + cci_write(ov4689->regmap, OV4689_REG_CTRL_MODE, OV4689_MODE_SW_STANDBY, >> + NULL); >> + pm_runtime_mark_last_busy(ov4689->dev); >> + pm_runtime_put_autosuspend(ov4689->dev); >> + >> + return 0; >> +} >> + >> static int ov4689_s_stream(struct v4l2_subdev *sd, int on) >> { >> struct ov4689 *ov4689 = to_ov4689(sd); >> struct v4l2_subdev_state *sd_state; >> - struct device *dev = ov4689->dev; >> - int ret = 0; >> + int ret; >> >> sd_state = v4l2_subdev_lock_and_get_active_state(&ov4689->subdev); >> >> - if (on) { >> - ret = pm_runtime_resume_and_get(dev); >> - if (ret < 0) >> - goto unlock_and_return; >> - >> - ret = cci_multi_reg_write(ov4689->regmap, >> - ov4689_common_regs, >> - ARRAY_SIZE(ov4689_common_regs), >> - NULL); >> - if (ret) { >> - pm_runtime_put(dev); >> - goto unlock_and_return; >> - } >> - >> - ret = ov4689_setup_timings(ov4689, sd_state); >> - if (ret) { >> - pm_runtime_put(dev); >> - goto unlock_and_return; >> - } >> - >> - ret = ov4689_setup_blc_anchors(ov4689, sd_state); >> - if (ret) { >> - pm_runtime_put(dev); >> - goto unlock_and_return; >> - } >> - >> - ret = __v4l2_ctrl_handler_setup(&ov4689->ctrl_handler); >> - if (ret) { >> - pm_runtime_put(dev); >> - goto unlock_and_return; >> - } >> - >> - ret = cci_write(ov4689->regmap, OV4689_REG_CTRL_MODE, >> - OV4689_MODE_STREAMING, NULL); >> - if (ret) { >> - pm_runtime_put(dev); >> - goto unlock_and_return; >> - } >> - } else { >> - cci_write(ov4689->regmap, OV4689_REG_CTRL_MODE, >> - OV4689_MODE_SW_STANDBY, NULL); >> - pm_runtime_mark_last_busy(dev); >> - pm_runtime_put_autosuspend(dev); >> - } >> + if (on) >> + ret = __ov4689_stream_on(ov4689, sd_state); >> + else >> + ret = __ov4689_stream_off(ov4689); >> >> -unlock_and_return: >> v4l2_subdev_unlock_state(sd_state); >> >> return ret; -- Best regards, Mikhail Rudenko