From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Xiaolei Wang <xiaolei.wang@windriver.com>
Cc: sakari.ailus@linux.intel.com, dave.stevenson@raspberrypi.com,
jacopo@jmondi.org, mchehab@kernel.org,
prabhakar.mahadev-lad.rj@bp.renesas.com,
hverkuil+cisco@kernel.org, johannes.goede@oss.qualcomm.com,
hverkuil-cisco@xs4all.nl, jai.luthra@ideasonboard.com,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 3/3] media: i2c: ov5647: switch to {enable,disable}_streams
Date: Mon, 29 Dec 2025 15:43:49 +0200 [thread overview]
Message-ID: <20251229134349.GD6598@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20251229023018.2933405-4-xiaolei.wang@windriver.com>
On Mon, Dec 29, 2025 at 10:30:18AM +0800, Xiaolei Wang wrote:
> Switch from s_stream to enable_streams and disable_streams callbacks.
>
> Signed-off-by: Xiaolei Wang <xiaolei.wang@windriver.com>
> ---
> drivers/media/i2c/ov5647.c | 69 ++++++++++++++++----------------------
> 1 file changed, 29 insertions(+), 40 deletions(-)
>
> diff --git a/drivers/media/i2c/ov5647.c b/drivers/media/i2c/ov5647.c
> index f0ca8cc14794..7f4541f46335 100644
> --- a/drivers/media/i2c/ov5647.c
> +++ b/drivers/media/i2c/ov5647.c
> @@ -637,23 +637,29 @@ static int ov5647_set_mode(struct v4l2_subdev *sd)
> return 0;
> }
>
> -static int ov5647_stream_on(struct v4l2_subdev *sd)
> +static int ov5647_enable_streams(struct v4l2_subdev *sd,
> + struct v4l2_subdev_state *state, u32 pad,
> + u64 streams_mask)
> {
> struct i2c_client *client = v4l2_get_subdevdata(sd);
> struct ov5647 *sensor = to_sensor(sd);
> u8 val = MIPI_CTRL00_BUS_IDLE;
> int ret = 0;
>
> + ret = pm_runtime_resume_and_get(&client->dev);
> + if (ret < 0)
> + return ret;
> +
> ret = ov5647_set_mode(sd);
> if (ret) {
> dev_err(&client->dev, "Failed to program sensor mode: %d\n", ret);
> - return ret;
> + goto err_rpm_put;
> }
>
> /* Apply customized values from user when stream starts. */
> - ret = v4l2_ctrl_handler_setup(sd->ctrl_handler);
> + ret = __v4l2_ctrl_handler_setup(sd->ctrl_handler);
> if (ret)
> - return ret;
> + goto err_rpm_put;
>
> if (sensor->clock_ncont)
> val |= MIPI_CTRL00_CLOCK_LANE_GATE |
> @@ -663,11 +669,18 @@ static int ov5647_stream_on(struct v4l2_subdev *sd)
> cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x00, &ret);
> cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x00, &ret);
>
> +err_rpm_put:
I would name the label 'done' as it's also used in the normal exit path,
not only in case of errors.
> + if (ret)
> + pm_runtime_put(&client->dev);
> +
> return ret;
> }
>
> -static int ov5647_stream_off(struct v4l2_subdev *sd)
> +static int ov5647_disable_streams(struct v4l2_subdev *sd,
> + struct v4l2_subdev_state *state, u32 pad,
> + u64 streams_mask)
> {
> + struct i2c_client *client = v4l2_get_subdevdata(sd);
> struct ov5647 *sensor = to_sensor(sd);
> int ret = 0;
>
> @@ -677,13 +690,15 @@ static int ov5647_stream_off(struct v4l2_subdev *sd)
> cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x0f, &ret);
> cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x01, &ret);
>
> + pm_runtime_put(&client->dev);
> +
> return ret;
> }
>
> static int ov5647_power_on(struct device *dev)
> {
> struct ov5647 *sensor = dev_get_drvdata(dev);
> - int ret;
> + int ret = 0;
>
> dev_dbg(dev, "OV5647 power on\n");
>
> @@ -706,7 +721,11 @@ static int ov5647_power_on(struct device *dev)
> }
>
> /* Stream off to coax lanes into LP-11 state. */
> - ret = ov5647_stream_off(&sensor->sd);
> + cci_write(sensor->regmap, OV5647_REG_MIPI_CTRL00,
> + MIPI_CTRL00_CLOCK_LANE_GATE | MIPI_CTRL00_BUS_IDLE |
> + MIPI_CTRL00_CLOCK_LANE_DISABLE, &ret);
> + cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x0f, &ret);
> + cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x01, &ret);
Could you please factor this code out to a separate function (you can
name it ov5647_stream_stop() for instance) instead of duplicating it ?
With that (and the 0 initialization of ret above dropped as it won't be
needed anymore),
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> if (ret < 0) {
> dev_err(dev, "camera not available, check power\n");
> goto error_clk_disable;
> @@ -803,40 +822,8 @@ __ov5647_get_pad_crop(struct ov5647 *ov5647,
> return NULL;
> }
>
> -static int ov5647_s_stream(struct v4l2_subdev *sd, int enable)
> -{
> - struct i2c_client *client = v4l2_get_subdevdata(sd);
> - int ret;
> -
> - if (enable) {
> - ret = pm_runtime_resume_and_get(&client->dev);
> - if (ret < 0)
> - return ret;
> -
> - ret = ov5647_stream_on(sd);
> - if (ret < 0) {
> - dev_err(&client->dev, "stream start failed: %d\n", ret);
> - goto error_pm;
> - }
> - } else {
> - ret = ov5647_stream_off(sd);
> - if (ret < 0) {
> - dev_err(&client->dev, "stream stop failed: %d\n", ret);
> - goto error_pm;
> - }
> - pm_runtime_put(&client->dev);
> - }
> -
> - return 0;
> -
> -error_pm:
> - pm_runtime_put(&client->dev);
> -
> - return ret;
> -}
> -
> static const struct v4l2_subdev_video_ops ov5647_subdev_video_ops = {
> - .s_stream = ov5647_s_stream,
> + .s_stream = v4l2_subdev_s_stream_helper,
> };
>
> static int ov5647_enum_mbus_code(struct v4l2_subdev *sd,
> @@ -979,6 +966,8 @@ static const struct v4l2_subdev_pad_ops ov5647_subdev_pad_ops = {
> .set_fmt = ov5647_set_pad_fmt,
> .get_fmt = ov5647_get_pad_fmt,
> .get_selection = ov5647_get_selection,
> + .enable_streams = ov5647_enable_streams,
> + .disable_streams = ov5647_disable_streams,
> };
>
> static const struct v4l2_subdev_ops ov5647_subdev_ops = {
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2025-12-29 13:44 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-29 2:30 [PATCH v2 0/3] media: i2c: ov5647: Modernize driver with CCI and new stream APIs Xiaolei Wang
2025-12-29 2:30 ` [PATCH v2 1/3] media: i2c: ov5647: Convert to CCI register access helpers Xiaolei Wang
2025-12-29 12:37 ` Tarang Raval
2025-12-29 13:01 ` Laurent Pinchart
2025-12-29 13:26 ` Tarang Raval
2025-12-31 2:57 ` xiaolei wang
2025-12-29 13:26 ` johannes.goede
2025-12-29 14:52 ` Tarang Raval
2025-12-29 2:30 ` [PATCH v2 2/3] media: i2c: ov5647: Switch to using the sub-device state lock Xiaolei Wang
2025-12-29 18:55 ` Sakari Ailus
2025-12-31 2:58 ` xiaolei wang
2025-12-29 2:30 ` [PATCH v2 3/3] media: i2c: ov5647: switch to {enable,disable}_streams Xiaolei Wang
2025-12-29 13:43 ` Laurent Pinchart [this message]
2025-12-31 3:02 ` xiaolei wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251229134349.GD6598@pendragon.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=dave.stevenson@raspberrypi.com \
--cc=hverkuil+cisco@kernel.org \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jacopo@jmondi.org \
--cc=jai.luthra@ideasonboard.com \
--cc=johannes.goede@oss.qualcomm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=prabhakar.mahadev-lad.rj@bp.renesas.com \
--cc=sakari.ailus@linux.intel.com \
--cc=xiaolei.wang@windriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.