On Sat May 17 13:40:57 2025 +0200, Hans de Goede wrote: > Switch from s_stream() to enable_streams() and disable_streams() pad > operations. They are preferred and required for streams support. > > Signed-off-by: Hans de Goede <ha...@kernel.org> > Reviewed-by: Andy Shevchenko <a...@kernel.org> > Link: https://lore.kernel.org/r/20250517114106.43494-15-ha...@kernel.org > Signed-off-by: Mauro Carvalho Chehab <mchehab+hua...@kernel.org>
Patch committed. Thanks, Mauro Carvalho Chehab drivers/staging/media/atomisp/i2c/atomisp-gc0310.c | 79 +++++++++++++--------- 1 file changed, 47 insertions(+), 32 deletions(-) --- diff --git a/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c b/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c index c6a0bc746d32..2f1f5022e2ac 100644 --- a/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c +++ b/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c @@ -458,58 +458,71 @@ static int gc0310_detect(struct gc0310_device *sensor) return 0; } -static int gc0310_s_stream(struct v4l2_subdev *sd, int enable) +static int gc0310_enable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 pad, u64 streams_mask) { struct gc0310_device *sensor = to_gc0310_sensor(sd); struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; + int ret; - dev_dbg(&client->dev, "%s S enable=%d\n", __func__, enable); mutex_lock(&sensor->input_lock); - if (enable) { - ret = pm_runtime_get_sync(&client->dev); - if (ret < 0) - goto error_power_down; + ret = pm_runtime_resume_and_get(&client->dev); + if (ret) + goto error_unlock; - ret = regmap_multi_reg_write(sensor->regmap, - gc0310_reset_register, - ARRAY_SIZE(gc0310_reset_register)); - if (ret) - goto error_power_down; + ret = regmap_multi_reg_write(sensor->regmap, + gc0310_reset_register, + ARRAY_SIZE(gc0310_reset_register)); + if (ret) + goto error_power_down; - ret = regmap_multi_reg_write(sensor->regmap, - gc0310_VGA_30fps, - ARRAY_SIZE(gc0310_VGA_30fps)); - if (ret) - goto error_power_down; + ret = regmap_multi_reg_write(sensor->regmap, + gc0310_VGA_30fps, + ARRAY_SIZE(gc0310_VGA_30fps)); + if (ret) + goto error_power_down; - /* restore value of all ctrls */ - ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler); - if (ret) - goto error_power_down; + /* restore value of all ctrls */ + ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler); - /* enable per frame MIPI and sensor ctrl reset */ - cci_write(sensor->regmap, GC0310_RESET_RELATED_REG, 0x30, &ret); - } + /* enable per frame MIPI and sensor ctrl reset */ + cci_write(sensor->regmap, GC0310_RESET_RELATED_REG, 0x30, &ret); cci_write(sensor->regmap, GC0310_RESET_RELATED_REG, GC0310_REGISTER_PAGE_3, &ret); cci_write(sensor->regmap, GC0310_SW_STREAM_REG, - enable ? GC0310_START_STREAMING : GC0310_STOP_STREAMING, - &ret); + GC0310_START_STREAMING, &ret); cci_write(sensor->regmap, GC0310_RESET_RELATED_REG, GC0310_REGISTER_PAGE_0, &ret); - if (ret) - goto error_power_down; - if (!enable) +error_power_down: + if (ret) pm_runtime_put(&client->dev); +error_unlock: mutex_unlock(&sensor->input_lock); - return 0; + return ret; +} + +static int gc0310_disable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 pad, u64 streams_mask) +{ + struct gc0310_device *sensor = to_gc0310_sensor(sd); + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret = 0; + + mutex_lock(&sensor->input_lock); + + cci_write(sensor->regmap, GC0310_RESET_RELATED_REG, + GC0310_REGISTER_PAGE_3, &ret); + cci_write(sensor->regmap, GC0310_SW_STREAM_REG, + GC0310_STOP_STREAMING, &ret); + cci_write(sensor->regmap, GC0310_RESET_RELATED_REG, + GC0310_REGISTER_PAGE_0, &ret); -error_power_down: pm_runtime_put(&client->dev); mutex_unlock(&sensor->input_lock); return ret; @@ -571,7 +584,7 @@ static const struct v4l2_subdev_sensor_ops gc0310_sensor_ops = { }; static const struct v4l2_subdev_video_ops gc0310_video_ops = { - .s_stream = gc0310_s_stream, + .s_stream = v4l2_subdev_s_stream_helper, }; static const struct v4l2_subdev_pad_ops gc0310_pad_ops = { @@ -582,6 +595,8 @@ static const struct v4l2_subdev_pad_ops gc0310_pad_ops = { .get_selection = gc0310_get_selection, .set_selection = gc0310_get_selection, .get_frame_interval = gc0310_get_frame_interval, + .enable_streams = gc0310_enable_streams, + .disable_streams = gc0310_disable_streams, }; static const struct v4l2_subdev_ops gc0310_ops = {