From: Alexander Stein <alexander.stein@ew.tq-group.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: linux-media@vger.kernel.org, Sakari Ailus <sakari.ailus@iki.fi>,
Manivannan Sadhasivam <mani@kernel.org>
Subject: Re: [PATCH v1 12/15] media: i2c: imx290: Rename, extend and expand usage of imx290_pixfmt
Date: Wed, 23 Nov 2022 09:53:58 +0100 [thread overview]
Message-ID: <3529218.R56niFO833@steina-w> (raw)
In-Reply-To: <20221122223250.21233-13-laurent.pinchart@ideasonboard.com>
Hello Laurent,
thanks for the patch.
Am Dienstag, 22. November 2022, 23:32:47 CET schrieb Laurent Pinchart:
> The imx290_pixfmt structure contains information about formats,
> currently limited to the bpp value. Extend it with the register settings
> for each format, and rename it to imx290_format_info to make its purpose
> clearer. Add a function named imx290_format_info() to look up format
> info for a media bus code, and use it through the code. This allows
> dropping the imx290 bpp field as the value is now looked up dynamically.
>
> The error handling in imx290_setup_format() can also be dropped, as the
> format is guaranteed by imx290_set_fmt() to be valid.
This looks a bit weird accessing pointers returned by imx290_format_info()
unconditionally at some places, while imx290_format_info() might return NULL.
But AFAICS the cases where this might happen, due to userspace interactions,
are checked.
Acked-by: Alexander Stein <alexander.stein@ew.tq-group.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/media/i2c/imx290.c | 87 ++++++++++++++++++++------------------
> 1 file changed, 45 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c
> index cd2154983341..d279d6dd0cb4 100644
> --- a/drivers/media/i2c/imx290.c
> +++ b/drivers/media/i2c/imx290.c
> @@ -182,7 +182,6 @@ struct imx290 {
> struct media_pad pad;
>
> const struct imx290_mode *current_mode;
> - u8 bpp;
>
> struct regulator_bulk_data supplies[IMX290_NUM_SUPPLIES];
> struct gpio_desc *rst_gpio;
> @@ -414,16 +413,41 @@ static inline int imx290_modes_num(const struct imx290
> *imx290) return ARRAY_SIZE(imx290_modes_4lanes);
> }
>
> -struct imx290_pixfmt {
> +struct imx290_format_info {
> u32 code;
> u8 bpp;
> + const struct imx290_regval *regs;
> + unsigned int num_regs;
> };
>
> -static const struct imx290_pixfmt imx290_formats[] = {
> - { MEDIA_BUS_FMT_SRGGB10_1X10, 10 },
> - { MEDIA_BUS_FMT_SRGGB12_1X12, 12 },
> +static const struct imx290_format_info imx290_formats[] = {
> + {
> + .code = MEDIA_BUS_FMT_SRGGB10_1X10,
> + .bpp = 10,
> + .regs = imx290_10bit_settings,
> + .num_regs = ARRAY_SIZE(imx290_10bit_settings),
> + }, {
> + .code = MEDIA_BUS_FMT_SRGGB12_1X12,
> + .bpp = 12,
> + .regs = imx290_12bit_settings,
> + .num_regs = ARRAY_SIZE(imx290_12bit_settings),
> + }
> };
>
> +static const struct imx290_format_info *imx290_format_info(u32 code)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < ARRAY_SIZE(imx290_formats); ++i) {
> + const struct imx290_format_info *info =
&imx290_formats[i];
> +
> + if (info->code == code)
> + return info;
> + }
> +
> + return NULL;
> +}
> +
> /*
> ---------------------------------------------------------------------------
> -- * Register access
> */
> @@ -516,43 +540,31 @@ static int imx290_set_data_lanes(struct imx290
> *imx290) }
>
> static int imx290_set_black_level(struct imx290 *imx290,
> + const struct v4l2_mbus_framefmt
*format,
> unsigned int black_level, int *err)
> {
> + unsigned int bpp = imx290_format_info(format->code)->bpp;
> +
> return imx290_write(imx290, IMX290_BLKLEVEL,
> - black_level >> (16 - imx290->bpp), err);
> + black_level >> (16 - bpp), err);
> }
>
> static int imx290_setup_format(struct imx290 *imx290,
> const struct v4l2_mbus_framefmt *format)
> {
> - const struct imx290_regval *regs;
> - unsigned int num_regs;
> - unsigned int bpp;
> + const struct imx290_format_info *info;
> int ret;
>
> - switch (format->code) {
> - case MEDIA_BUS_FMT_SRGGB10_1X10:
> - regs = imx290_10bit_settings;
> - num_regs = ARRAY_SIZE(imx290_10bit_settings);
> - bpp = 10;
> - break;
> - case MEDIA_BUS_FMT_SRGGB12_1X12:
> - regs = imx290_12bit_settings;
> - num_regs = ARRAY_SIZE(imx290_12bit_settings);
> - bpp = 12;
> - break;
> - default:
> - dev_err(imx290->dev, "Unknown pixel format\n");
> - return -EINVAL;
> - }
> + info = imx290_format_info(format->code);
>
> - ret = imx290_set_register_array(imx290, regs, num_regs);
> + ret = imx290_set_register_array(imx290, info->regs, info->num_regs);
> if (ret < 0) {
> dev_err(imx290->dev, "Could not set format registers\n");
> return ret;
> }
>
> - return imx290_set_black_level(imx290, IMX290_BLACK_LEVEL_DEFAULT,
&ret);
> + return imx290_set_black_level(imx290, format,
> + IMX290_BLACK_LEVEL_DEFAULT,
&ret);
> }
>
> /*
> ---------------------------------------------------------------------------
> - @@ -586,7 +598,7 @@ static int imx290_set_ctrl(struct v4l2_ctrl *ctrl)
>
> case V4L2_CID_TEST_PATTERN:
> if (ctrl->val) {
> - imx290_set_black_level(imx290, 0, &ret);
> + imx290_set_black_level(imx290, format, 0, &ret);
> usleep_range(10000, 11000);
> imx290_write(imx290, IMX290_PGCTRL,
> (u8)(IMX290_PGCTRL_REGEN |
> @@ -595,8 +607,8 @@ static int imx290_set_ctrl(struct v4l2_ctrl *ctrl)
> } else {
> imx290_write(imx290, IMX290_PGCTRL, 0x00, &ret);
> usleep_range(10000, 11000);
> - imx290_set_black_level(imx290,
IMX290_BLACK_LEVEL_DEFAULT,
> - &ret);
> + imx290_set_black_level(imx290, format,
> +
IMX290_BLACK_LEVEL_DEFAULT, &ret);
> }
> break;
> default:
> @@ -635,7 +647,7 @@ static void imx290_ctrl_update(struct imx290 *imx290,
>
> /* pixel rate = link_freq * 2 * nr_of_lanes / bits_per_sample */
> pixel_rate = link_freq * 2 * imx290->nlanes;
> - do_div(pixel_rate, imx290->bpp);
> + do_div(pixel_rate, imx290_format_info(format->code)->bpp);
>
> __v4l2_ctrl_s_ctrl(imx290->link_freq, mode->link_freq_index);
> __v4l2_ctrl_s_ctrl_int64(imx290->pixel_rate, pixel_rate);
> @@ -837,8 +849,7 @@ static int imx290_enum_frame_size(struct v4l2_subdev
> *sd, const struct imx290 *imx290 = to_imx290(sd);
> const struct imx290_mode *imx290_modes = imx290_modes_ptr(imx290);
>
> - if ((fse->code != imx290_formats[0].code) &&
> - (fse->code != imx290_formats[1].code))
> + if (!imx290_format_info(fse->code))
> return -EINVAL;
>
> if (fse->index >= imx290_modes_num(imx290))
> @@ -859,7 +870,6 @@ static int imx290_set_fmt(struct v4l2_subdev *sd,
> struct imx290 *imx290 = to_imx290(sd);
> const struct imx290_mode *mode;
> struct v4l2_mbus_framefmt *format;
> - unsigned int i;
>
> mode = v4l2_find_nearest_size(imx290_modes_ptr(imx290),
> imx290_modes_num(imx290), width,
height,
> @@ -868,21 +878,15 @@ static int imx290_set_fmt(struct v4l2_subdev *sd,
> fmt->format.width = mode->width;
> fmt->format.height = mode->height;
>
> - for (i = 0; i < ARRAY_SIZE(imx290_formats); i++)
> - if (imx290_formats[i].code == fmt->format.code)
> - break;
> + if (!imx290_format_info(fmt->format.code))
> + fmt->format.code = imx290_formats[0].code;
>
> - if (i >= ARRAY_SIZE(imx290_formats))
> - i = 0;
> -
> - fmt->format.code = imx290_formats[i].code;
> fmt->format.field = V4L2_FIELD_NONE;
>
> format = v4l2_subdev_get_pad_format(sd, sd_state, 0);
>
> if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
> imx290->current_mode = mode;
> - imx290->bpp = imx290_formats[i].bpp;
>
> imx290_ctrl_update(imx290, &fmt->format, mode);
> }
> @@ -980,7 +984,6 @@ static int imx290_subdev_init(struct imx290 *imx290)
> int ret;
>
> imx290->current_mode = &imx290_modes_ptr(imx290)[0];
> - imx290->bpp = imx290_formats[0].bpp;
>
> v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops);
> imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
next prev parent reply other threads:[~2022-11-23 8:54 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-22 22:32 [PATCH v1 00/15] media: i2c: imx290: Miscellaneous improvements Laurent Pinchart
2022-11-22 22:32 ` [PATCH v1 01/15] media: i2c: imx290: Group functions in sections Laurent Pinchart
2022-11-23 7:46 ` Alexander Stein
2022-11-22 22:32 ` [PATCH v1 02/15] media: i2c: imx290: Factor out subdev init and cleanup to functions Laurent Pinchart
2022-11-23 7:44 ` Alexander Stein
2022-11-23 10:04 ` Laurent Pinchart
2022-11-24 18:31 ` Dave Stevenson
2022-11-24 19:25 ` Laurent Pinchart
2022-11-22 22:32 ` [PATCH v1 03/15] media: i2c: imx290: Factor out control update code to a function Laurent Pinchart
2022-11-23 7:51 ` Alexander Stein
2022-11-23 10:08 ` Laurent Pinchart
2022-11-22 22:32 ` [PATCH v1 04/15] media: i2c: imx290: Access link_freq_index directly Laurent Pinchart
2022-11-23 7:53 ` Alexander Stein
2022-11-22 22:32 ` [PATCH v1 05/15] media: i2c: imx290: Pass format and mode to imx290_calc_pixel_rate() Laurent Pinchart
2022-11-23 9:06 ` Alexander Stein
2022-11-22 22:32 ` [PATCH v1 06/15] media: i2c: imx290: Compute pixel rate and blanking in one place Laurent Pinchart
2022-11-23 7:59 ` Alexander Stein
2022-11-23 9:58 ` Dave Stevenson
2022-11-22 22:32 ` [PATCH v1 07/15] media: i2c: imx290: Factor out black level setting to a function Laurent Pinchart
2022-11-23 8:03 ` Alexander Stein
2022-11-23 10:08 ` Dave Stevenson
2022-11-23 11:00 ` Laurent Pinchart
2022-11-24 15:10 ` Dave Stevenson
2022-11-24 16:57 ` Laurent Pinchart
2022-11-24 17:16 ` David Plowman
2022-11-24 18:02 ` Laurent Pinchart
2022-11-22 22:32 ` [PATCH v1 08/15] media: i2c: imx290: Factor out DT parsing to separate function Laurent Pinchart
2022-11-23 8:14 ` Alexander Stein
2022-11-23 10:16 ` Laurent Pinchart
2022-11-22 22:32 ` [PATCH v1 09/15] media: i2c: imx290: Use dev_err_probe() Laurent Pinchart
2022-11-23 8:16 ` Alexander Stein
2022-11-22 22:32 ` [PATCH v1 10/15] media: i2c: imx290: Factor out clock initialization to separate function Laurent Pinchart
2022-11-23 8:18 ` Alexander Stein
2022-11-22 22:32 ` [PATCH v1 11/15] media: i2c: imx290: Use V4L2 subdev active state Laurent Pinchart
2022-11-23 8:42 ` Alexander Stein
2022-11-23 10:49 ` Laurent Pinchart
2022-11-28 15:33 ` Alexander Stein
2022-11-28 18:11 ` Laurent Pinchart
2022-11-22 22:32 ` [PATCH v1 12/15] media: i2c: imx290: Rename, extend and expand usage of imx290_pixfmt Laurent Pinchart
2022-11-23 8:53 ` Alexander Stein [this message]
2022-11-22 22:32 ` [PATCH v1 13/15] media: i2c: imx290: Use runtime PM autosuspend Laurent Pinchart
2022-11-22 22:32 ` [PATCH v1 14/15] media: i2c: imx290: Configure data lanes at start time Laurent Pinchart
2022-11-23 9:01 ` Alexander Stein
2022-11-23 10:16 ` Dave Stevenson
2022-11-23 14:28 ` Laurent Pinchart
2022-11-24 18:02 ` Dave Stevenson
2022-11-24 19:19 ` Laurent Pinchart
2022-11-22 22:32 ` [PATCH v1 15/15] media: i2c: imx290: Simplify imx290_set_data_lanes() Laurent Pinchart
2022-11-23 9:04 ` Alexander Stein
2022-11-23 10:25 ` 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=3529218.R56niFO833@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.