From: Alexander Stein <alexander.stein@ew.tq-group.com>
To: linux-media@vger.kernel.org
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Manivannan Sadhasivam <mani@kernel.org>,
Sakari Ailus <sakari.ailus@iki.fi>
Subject: Re: [PATCH 09/19] media: i2c: imx290: Simplify error handling when writing registers
Date: Thu, 21 Jul 2022 11:50:31 +0200 [thread overview]
Message-ID: <7343048.MhkbZ0Pkbq@steina-w> (raw)
In-Reply-To: <20220721083540.1525-10-laurent.pinchart@ideasonboard.com>
Am Donnerstag, 21. Juli 2022, 10:35:30 CEST schrieb Laurent Pinchart:
> Error handling for register writes requires checking the error status of
> every single write. This makes the code complex, or incorrect when the
> checks are omitted. Simplify this by passing a pointer to an error code
> to the imx290_write_reg() function, which allows writing multiple
> registers in a row and only checking for errors at the end.
>
> While at it, rename imx290_write_reg() to imx290_write() as there's
> nothing else than registers to write, and rename imx290_read_reg()
> accordingly.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/media/i2c/imx290.c | 86 ++++++++++++++------------------------
> 1 file changed, 32 insertions(+), 54 deletions(-)
>
> diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c
> index 3f67c4d2417f..5b7f9027b50f 100644
> --- a/drivers/media/i2c/imx290.c
> +++ b/drivers/media/i2c/imx290.c
> @@ -367,7 +367,7 @@ static inline struct imx290 *to_imx290(struct
> v4l2_subdev *_sd) return container_of(_sd, struct imx290, sd);
> }
>
> -static int __always_unused imx290_read_reg(struct imx290 *imx290, u32 addr,
> u32 *value) +static int __always_unused imx290_read(struct imx290 *imx290,
> u32 addr, u32 *value) {
> u8 data[3] = { 0, 0, 0 };
> int ret;
> @@ -385,17 +385,23 @@ static int __always_unused imx290_read_reg(struct
> imx290 *imx290, u32 addr, u32 return 0;
> }
>
> -static int imx290_write_reg(struct imx290 *imx290, u32 addr, u32 value)
> +static int imx290_write(struct imx290 *imx290, u32 addr, u32 value, int
> *err) {
> u8 data[3] = { value & 0xff, (value >> 8) & 0xff, value >> 16 };
> int ret;
>
> + if (err && *err)
> + return *err;
> +
> ret = regmap_raw_write(imx290->regmap, addr & IMX290_REG_ADDR_MASK,
> data, (addr >> IMX290_REG_SIZE_SHIFT)
& 3);
> - if (ret < 0)
> + if (ret < 0) {
> dev_err(imx290->dev, "%u-bit write to 0x%04x failed:
%d\n",
> ((addr >> IMX290_REG_SIZE_SHIFT) & 3) * 8,
> addr & IMX290_REG_ADDR_MASK, ret);
> + if (err)
> + *err = ret;
> + }
>
> return ret;
> }
> @@ -408,7 +414,7 @@ static int imx290_set_register_array(struct imx290
> *imx290, int ret;
>
> for (i = 0; i < num_settings; ++i, ++settings) {
> - ret = imx290_write_reg(imx290, settings->reg, settings-
>val);
> + ret = imx290_write(imx290, settings->reg, settings->val,
NULL);
> if (ret < 0)
> return ret;
> }
> @@ -419,29 +425,16 @@ static int imx290_set_register_array(struct imx290
> *imx290, return 0;
> }
>
> -static int imx290_set_gain(struct imx290 *imx290, u32 value)
> -{
> - int ret;
> -
> - ret = imx290_write_reg(imx290, IMX290_GAIN, value);
> - if (ret)
> - dev_err(imx290->dev, "Unable to write gain\n");
> -
> - return ret;
> -}
> -
> /* Stop streaming */
> static int imx290_stop_streaming(struct imx290 *imx290)
> {
> - int ret;
> + int ret = 0;
>
> - ret = imx290_write_reg(imx290, IMX290_STANDBY, 0x01);
> - if (ret < 0)
> - return ret;
> + imx290_write(imx290, IMX290_STANDBY, 0x01, &ret);
>
> msleep(30);
>
> - return imx290_write_reg(imx290, IMX290_XMSTA, 0x01);
> + return imx290_write(imx290, IMX290_XMSTA, 0x01, &ret);
> }
>
> static int imx290_set_ctrl(struct v4l2_ctrl *ctrl)
> @@ -456,25 +449,25 @@ static int imx290_set_ctrl(struct v4l2_ctrl *ctrl)
>
> switch (ctrl->id) {
> case V4L2_CID_GAIN:
> - ret = imx290_set_gain(imx290, ctrl->val);
> + ret = imx290_write(imx290, IMX290_GAIN, ctrl->val,
NULL);
> break;
> case V4L2_CID_TEST_PATTERN:
> if (ctrl->val) {
> - imx290_write_reg(imx290, IMX290_BLKLEVEL, 0);
> + imx290_write(imx290, IMX290_BLKLEVEL, 0,
&ret);
> usleep_range(10000, 11000);
> - imx290_write_reg(imx290, IMX290_PGCTRL,
> - (u8)
(IMX290_PGCTRL_REGEN |
> - IMX290_PGCTRL_THRU |
> -
IMX290_PGCTRL_MODE(ctrl->val)));
> + imx290_write(imx290, IMX290_PGCTRL,
> + (u8)(IMX290_PGCTRL_REGEN |
> + IMX290_PGCTRL_THRU |
> + IMX290_PGCTRL_MODE(ctrl-
>val)), &ret);
> } else {
> - imx290_write_reg(imx290, IMX290_PGCTRL,
0x00);
> + imx290_write(imx290, IMX290_PGCTRL, 0x00,
&ret);
> usleep_range(10000, 11000);
> if (imx290->bpp == 10)
> - imx290_write_reg(imx290,
IMX290_BLKLEVEL,
> - 0x3c);
> + imx290_write(imx290,
IMX290_BLKLEVEL, 0x3c,
> + &ret);
> else /* 12 bits per pixel */
> - imx290_write_reg(imx290,
IMX290_BLKLEVEL,
> - 0xf0);
> + imx290_write(imx290,
IMX290_BLKLEVEL, 0xf0,
> + &ret);
> }
> break;
> default:
> @@ -695,7 +688,8 @@ static int imx290_start_streaming(struct imx290 *imx290)
> return ret;
> }
>
> - ret = imx290_write_reg(imx290, IMX290_HMAX, imx290->current_mode-
>hmax);
> + ret = imx290_write(imx290, IMX290_HMAX, imx290->current_mode->hmax,
> + NULL);
> if (ret)
> return ret;
>
> @@ -706,14 +700,12 @@ static int imx290_start_streaming(struct imx290
> *imx290) return ret;
> }
>
> - ret = imx290_write_reg(imx290, IMX290_STANDBY, 0x00);
> - if (ret < 0)
> - return ret;
> + imx290_write(imx290, IMX290_STANDBY, 0x00, &ret);
>
> msleep(30);
Well you introduce a hard 30ms delay when the i2c transfer above fails, but I
guess that's negligible.
> /* Start streaming */
> - return imx290_write_reg(imx290, IMX290_XMSTA, 0x00);
> + return imx290_write(imx290, IMX290_XMSTA, 0x00, &ret);
> }
>
> static int imx290_set_stream(struct v4l2_subdev *sd, int enable)
> @@ -772,27 +764,13 @@ static int imx290_set_data_lanes(struct imx290
> *imx290) * validated in probe itself
> */
> dev_err(imx290->dev, "Lane configuration not
supported\n");
> - ret = -EINVAL;
> - goto exit;
> + return -EINVAL;
> }
>
> - ret = imx290_write_reg(imx290, IMX290_PHY_LANE_NUM, laneval);
> - if (ret) {
> - dev_err(imx290->dev, "Error setting Physical Lane number
register\n");
> - goto exit;
> - }
> -
> - ret = imx290_write_reg(imx290, IMX290_CSI_LANE_MODE, laneval);
> - if (ret) {
> - dev_err(imx290->dev, "Error setting CSI Lane mode
register\n");
> - goto exit;
> - }
> -
> - ret = imx290_write_reg(imx290, IMX290_FR_FDG_SEL, frsel);
> - if (ret)
> - dev_err(imx290->dev, "Error setting FR/FDG SEL
register\n");
> + imx290_write(imx290, IMX290_PHY_LANE_NUM, laneval, &ret);
> + imx290_write(imx290, IMX290_CSI_LANE_MODE, laneval, &ret);
> + imx290_write(imx290, IMX290_FR_FDG_SEL, frsel, &ret);
>
> -exit:
> return ret;
> }
Reviewed-by: Alexander Stein <alexander.stein@ew.tq-group.com>
next prev parent reply other threads:[~2022-07-21 9:50 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-21 8:35 [PATCH 00/19] media: i2c: imx290: Miscellaneous improvements Laurent Pinchart
2022-07-21 8:35 ` [PATCH 01/19] media: i2c: imx290: Use device lock for the control handler Laurent Pinchart
2022-07-21 9:22 ` Alexander Stein
2022-07-21 8:35 ` [PATCH 02/19] media: i2c: imx290: Print error code when I2C transfer fails Laurent Pinchart
2022-07-21 9:23 ` Alexander Stein
2022-07-21 8:35 ` [PATCH 03/19] media: i2c: imx290: Specify HMAX values in decimal Laurent Pinchart
2022-07-21 9:18 ` Alexander Stein
2022-07-21 11:31 ` Laurent Pinchart
2022-07-21 11:54 ` Alexander Stein
2022-07-21 12:04 ` Laurent Pinchart
2022-07-21 8:35 ` [PATCH 04/19] media: i2c: imx290: Replace macro with explicit ARRAY_SIZE() Laurent Pinchart
2022-07-21 9:23 ` Alexander Stein
2022-07-21 8:35 ` [PATCH 05/19] media: i2c: imx290: Drop imx290_write_buffered_reg() Laurent Pinchart
2022-07-21 9:24 ` Alexander Stein
2022-07-21 8:35 ` [PATCH 06/19] media: i2c: imx290: Drop regmap cache Laurent Pinchart
2022-07-21 9:27 ` Alexander Stein
2022-07-21 8:35 ` [PATCH 07/19] media: i2c: imx290: Support variable-sized registers Laurent Pinchart
2022-07-21 9:43 ` Alexander Stein
2022-07-21 10:54 ` Laurent Pinchart
2022-07-21 11:18 ` Alexander Stein
2022-07-21 11:25 ` Laurent Pinchart
2022-07-21 11:43 ` Alexander Stein
2022-07-22 14:37 ` Sakari Ailus
2022-07-23 23:06 ` Laurent Pinchart
2022-07-25 6:49 ` Alexander Stein
2022-08-23 1:08 ` Laurent Pinchart
2022-08-23 2:51 ` Laurent Pinchart
2022-08-23 7:19 ` Alexander Stein
2022-10-16 5:36 ` Laurent Pinchart
2022-07-21 8:35 ` [PATCH 08/19] media: i2c: imx290: Correct register sizes Laurent Pinchart
2022-07-21 8:35 ` [PATCH 09/19] media: i2c: imx290: Simplify error handling when writing registers Laurent Pinchart
2022-07-21 9:50 ` Alexander Stein [this message]
2022-07-21 8:35 ` [PATCH 10/19] media: i2c: imx290: Define more register macros Laurent Pinchart
2022-07-21 10:00 ` Alexander Stein
2022-07-21 11:08 ` Laurent Pinchart
2022-07-21 11:28 ` Alexander Stein
2022-10-16 4:27 ` Laurent Pinchart
2022-07-21 8:35 ` [PATCH 11/19] media: i2c: imx290: Add exposure time control Laurent Pinchart
2022-07-21 10:01 ` Alexander Stein
2022-07-21 15:52 ` Dave Stevenson
2022-07-21 8:35 ` [PATCH 12/19] media: i2c: imx290: Fix max gain value Laurent Pinchart
2022-07-21 10:02 ` Alexander Stein
2022-07-21 16:08 ` Dave Stevenson
2022-10-16 4:51 ` Laurent Pinchart
2022-07-21 8:35 ` [PATCH 13/19] media: i2c: imx290: Split control initialization to separate function Laurent Pinchart
2022-07-21 10:03 ` Alexander Stein
2022-07-21 8:35 ` [PATCH 14/19] media: i2c: imx290: Implement HBLANK and VBLANK controls Laurent Pinchart
2022-07-21 10:05 ` Alexander Stein
2022-07-21 11:17 ` Laurent Pinchart
2022-07-21 11:32 ` Alexander Stein
2022-07-21 16:37 ` Dave Stevenson
2022-10-16 6:10 ` Laurent Pinchart
2022-10-17 13:46 ` Dave Stevenson
2022-07-21 8:35 ` [PATCH 15/19] media: i2c: imx290: Create controls for fwnode properties Laurent Pinchart
2022-07-21 10:06 ` Alexander Stein
2022-07-21 8:35 ` [PATCH 16/19] media: i2c: imx290: Move registers with fixed value to init array Laurent Pinchart
2022-07-21 10:08 ` Alexander Stein
2022-07-21 10:40 ` Laurent Pinchart
2022-07-21 11:08 ` Alexander Stein
2022-07-21 16:19 ` Dave Stevenson
2022-07-22 5:53 ` Alexander Stein
2022-07-22 9:10 ` Dave Stevenson
2022-07-21 8:35 ` [PATCH 17/19] media: i2c: imx290: Factor out format retrieval to separate function Laurent Pinchart
2022-07-21 10:11 ` Alexander Stein
2022-07-21 10:36 ` Laurent Pinchart
2022-07-21 11:12 ` Alexander Stein
2022-07-21 8:35 ` [PATCH 18/19] media: i2c: imx290: Add crop selection targets support Laurent Pinchart
2022-07-21 15:39 ` Dave Stevenson
2022-10-16 5:53 ` Laurent Pinchart
2022-07-21 8:35 ` [PATCH 19/19] media: i2c: imx290: Replace GAIN control with ANALOGUE_GAIN Laurent Pinchart
2022-07-21 10:11 ` Alexander Stein
2022-08-23 1:11 ` [PATCH 00/19] media: i2c: imx290: Miscellaneous improvements Laurent Pinchart
2022-10-10 10:31 ` Dave Stevenson
2022-10-16 5:37 ` Laurent Pinchart
2022-10-16 7:34 ` Dave Stevenson
2022-10-17 18:07 ` Dave Stevenson
2022-10-18 13:43 ` Dave Stevenson
2022-10-19 10:33 ` Sakari Ailus
2022-10-19 11:38 ` Dave Stevenson
2022-10-19 13:27 ` Sakari Ailus
2023-01-14 16:03 ` Laurent Pinchart
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=7343048.MhkbZ0Pkbq@steina-w \
--to=alexander.stein@ew.tq-group.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mani@kernel.org \
--cc=sakari.ailus@iki.fi \
/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.