devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
To: Sakari Ailus <sakari.ailus@linux.intel.com>,
	linux-media@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Conor Dooley <conor+dt@kernel.org>,
	devicetree@vger.kernel.org
Cc: Dave Stevenson <dave.stevenson@raspberrypi.com>
Subject: [PATCH 11/21] media: i2c: imx258: Add get_selection for pixel array information
Date: Tue, 30 May 2023 18:29:50 +0100	[thread overview]
Message-ID: <20230530173000.3060865-12-dave.stevenson@raspberrypi.com> (raw)
In-Reply-To: <20230530173000.3060865-1-dave.stevenson@raspberrypi.com>

Libcamera requires the cropping information for each mode, so
add this information to the driver.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
---
 drivers/media/i2c/imx258.c | 90 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 90 insertions(+)

diff --git a/drivers/media/i2c/imx258.c b/drivers/media/i2c/imx258.c
index 82ffe09e3bdc..1fa83fe82f27 100644
--- a/drivers/media/i2c/imx258.c
+++ b/drivers/media/i2c/imx258.c
@@ -77,6 +77,14 @@
 #define REG_CONFIG_MIRROR_FLIP		0x03
 #define REG_CONFIG_FLIP_TEST_PATTERN	0x02
 
+/* IMX258 native and active pixel array size. */
+#define IMX258_NATIVE_WIDTH		4224U
+#define IMX258_NATIVE_HEIGHT		3192U
+#define IMX258_PIXEL_ARRAY_LEFT		8U
+#define IMX258_PIXEL_ARRAY_TOP		16U
+#define IMX258_PIXEL_ARRAY_WIDTH	4208U
+#define IMX258_PIXEL_ARRAY_HEIGHT	3120U
+
 struct imx258_reg {
 	u16 address;
 	u8 val;
@@ -115,6 +123,9 @@ struct imx258_mode {
 	u32 link_freq_index;
 	/* Default register values */
 	struct imx258_reg_list reg_list;
+
+	/* Analog crop rectangle. */
+	struct v4l2_rect crop;
 };
 
 /* 4208x3120 needs 1267Mbps/lane, 4 lanes. Use that rate on 2 lanes as well */
@@ -562,6 +573,12 @@ static const struct imx258_mode supported_modes[] = {
 			.regs = mode_4208x3120_regs,
 		},
 		.link_freq_index = IMX258_LINK_FREQ_1267MBPS,
+		.crop = {
+			.left = IMX258_PIXEL_ARRAY_LEFT,
+			.top = IMX258_PIXEL_ARRAY_TOP,
+			.width = 4208,
+			.height = 3120,
+		},
 	},
 	{
 		.width = 2104,
@@ -573,6 +590,12 @@ static const struct imx258_mode supported_modes[] = {
 			.regs = mode_2104_1560_regs,
 		},
 		.link_freq_index = IMX258_LINK_FREQ_640MBPS,
+		.crop = {
+			.left = IMX258_PIXEL_ARRAY_LEFT,
+			.top = IMX258_PIXEL_ARRAY_TOP,
+			.width = 4208,
+			.height = 3120,
+		},
 	},
 	{
 		.width = 1048,
@@ -584,6 +607,12 @@ static const struct imx258_mode supported_modes[] = {
 			.regs = mode_1048_780_regs,
 		},
 		.link_freq_index = IMX258_LINK_FREQ_640MBPS,
+		.crop = {
+			.left = IMX258_PIXEL_ARRAY_LEFT,
+			.top = IMX258_PIXEL_ARRAY_TOP,
+			.width = 4208,
+			.height = 3120,
+		},
 	},
 };
 
@@ -703,6 +732,7 @@ static int imx258_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
 {
 	struct v4l2_mbus_framefmt *try_fmt =
 		v4l2_subdev_get_try_format(sd, fh->state, 0);
+	struct v4l2_rect *try_crop;
 
 	/* Initialize try_fmt */
 	try_fmt->width = supported_modes[0].width;
@@ -710,6 +740,13 @@ static int imx258_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
 	try_fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10;
 	try_fmt->field = V4L2_FIELD_NONE;
 
+	/* Initialize try_crop */
+	try_crop = v4l2_subdev_get_try_crop(sd, fh->state, 0);
+	try_crop->left = IMX258_PIXEL_ARRAY_LEFT;
+	try_crop->top = IMX258_PIXEL_ARRAY_TOP;
+	try_crop->width = IMX258_PIXEL_ARRAY_WIDTH;
+	try_crop->height = IMX258_PIXEL_ARRAY_HEIGHT;
+
 	return 0;
 }
 
@@ -958,6 +995,58 @@ static int imx258_set_pad_format(struct v4l2_subdev *sd,
 	return 0;
 }
 
+static const struct v4l2_rect *
+__imx258_get_pad_crop(struct imx258 *imx258,
+		      struct v4l2_subdev_state *sd_state,
+		      unsigned int pad, enum v4l2_subdev_format_whence which)
+{
+	switch (which) {
+	case V4L2_SUBDEV_FORMAT_TRY:
+		return v4l2_subdev_get_try_crop(&imx258->sd, sd_state, pad);
+	case V4L2_SUBDEV_FORMAT_ACTIVE:
+		return &imx258->cur_mode->crop;
+	}
+
+	return NULL;
+}
+
+static int imx258_get_selection(struct v4l2_subdev *sd,
+				struct v4l2_subdev_state *sd_state,
+				struct v4l2_subdev_selection *sel)
+{
+	switch (sel->target) {
+	case V4L2_SEL_TGT_CROP: {
+		struct imx258 *imx258 = to_imx258(sd);
+
+		mutex_lock(&imx258->mutex);
+		sel->r = *__imx258_get_pad_crop(imx258, sd_state, sel->pad,
+						sel->which);
+		mutex_unlock(&imx258->mutex);
+
+		return 0;
+	}
+
+	case V4L2_SEL_TGT_NATIVE_SIZE:
+		sel->r.left = 0;
+		sel->r.top = 0;
+		sel->r.width = IMX258_NATIVE_WIDTH;
+		sel->r.height = IMX258_NATIVE_HEIGHT;
+
+		return 0;
+
+	case V4L2_SEL_TGT_CROP_DEFAULT:
+	case V4L2_SEL_TGT_CROP_BOUNDS:
+		sel->r.left = IMX258_PIXEL_ARRAY_LEFT;
+		sel->r.top = IMX258_PIXEL_ARRAY_TOP;
+		sel->r.width = IMX258_PIXEL_ARRAY_WIDTH;
+		sel->r.height = IMX258_PIXEL_ARRAY_HEIGHT;
+
+		return 0;
+	}
+
+	return -EINVAL;
+}
+
 /* Start streaming */
 static int imx258_start_streaming(struct imx258 *imx258)
 {
@@ -1170,6 +1259,7 @@ static const struct v4l2_subdev_pad_ops imx258_pad_ops = {
 	.get_fmt = imx258_get_pad_format,
 	.set_fmt = imx258_set_pad_format,
 	.enum_frame_size = imx258_enum_frame_size,
+	.get_selection = imx258_get_selection,
 };
 
 static const struct v4l2_subdev_ops imx258_subdev_ops = {
-- 
2.25.1


  parent reply	other threads:[~2023-05-30 17:31 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-30 17:29 [PATCH 00/21] imx258 improvements series Dave Stevenson
2023-05-30 17:29 ` [PATCH 01/21] media: i2c: imx258: Remove unused defines Dave Stevenson
2023-05-31 15:08   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 02/21] media: i2c: imx258: Make image geometry meet sensor requirements Dave Stevenson
2023-05-31 15:09   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 03/21] media: i2c: imx258: Disable digital cropping on binned modes Dave Stevenson
2023-05-31 15:02   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 04/21] media: i2c: imx258: Remove redundant I2C writes Dave Stevenson
2023-05-31 15:10   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 05/21] media: i2c: imx258: Add regulator control Dave Stevenson
2023-05-31 15:11   ` Jacopo Mondi
2023-05-31 15:26     ` Dave Stevenson
2023-05-30 17:29 ` [PATCH 06/21] media: i2c: imx258: Make V4L2_CID_VBLANK configurable Dave Stevenson
2023-05-31 15:16   ` Jacopo Mondi
2023-05-31 15:33     ` Dave Stevenson
2023-05-30 17:29 ` [PATCH 07/21] media: i2c: imx258: Split out common registers from the mode based ones Dave Stevenson
2023-05-31 15:26   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 08/21] media: i2c: imx258: Add support for 24MHz clock Dave Stevenson
2023-06-02 12:59   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 09/21] media: i2c: imx258: Add support for running on 2 CSI data lanes Dave Stevenson
2023-05-30 17:37   ` Dave Stevenson
2023-05-31  8:07   ` kernel test robot
2023-06-02 13:23   ` Jacopo Mondi
2023-06-02 17:46     ` Dave Stevenson
2023-05-30 17:29 ` [PATCH 10/21] media: i2c: imx258: Follow normal V4L2 behaviours for clipping exposure Dave Stevenson
2023-05-31 15:27   ` Jacopo Mondi
2023-05-30 17:29 ` Dave Stevenson [this message]
2023-06-02 13:24   ` [PATCH 11/21] media: i2c: imx258: Add get_selection for pixel array information Jacopo Mondi
2023-05-30 17:29 ` [PATCH 12/21] media: i2c: imx258: Allow configuration of clock lane behaviour Dave Stevenson
2023-06-02 13:26   ` Jacopo Mondi
2023-06-02 15:18     ` Dave Stevenson
2023-05-30 17:29 ` [PATCH 13/21] media: i2c: imx258: Correct max FRM_LENGTH_LINES value Dave Stevenson
2023-06-02 13:33   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 14/21] media: i2c: imx258: Add support for long exposure modes Dave Stevenson
2023-06-02 13:38   ` Jacopo Mondi
2023-06-02 17:12     ` Dave Stevenson
2023-05-30 17:29 ` [PATCH 15/21] media: i2c: imx258: Issue reset before starting streaming Dave Stevenson
2023-06-02 13:42   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 16/21] media: i2c: imx258: Set pixel_rate range to the same as the value Dave Stevenson
2023-06-02 13:44   ` Jacopo Mondi
2023-05-30 17:29 ` [PATCH 17/21] media: i2c: imx258: Support faster pixel rate on binned modes Dave Stevenson
2023-05-30 17:29 ` [PATCH 18/21] dt-bindings: media: imx258: Rename to include vendor prefix Dave Stevenson
2023-05-30 17:35   ` Conor Dooley
2023-05-30 17:29 ` [PATCH 19/21] dt-bindings: media: imx258: Add alternate compatible strings Dave Stevenson
2023-05-30 17:38   ` Conor Dooley
2023-05-30 17:48     ` Dave Stevenson
2023-05-30 19:36       ` Conor Dooley
2023-05-30 17:29 ` [PATCH 20/21] media: i2c: imx258: Change register settings for variants of the sensor Dave Stevenson
2023-06-02 13:48   ` Jacopo Mondi
2023-06-02 14:30     ` Dave Stevenson
2023-05-30 17:30 ` [PATCH 21/21] media: i2c: imx258: Make HFLIP and VFLIP controls writable Dave Stevenson
2023-06-02 13:58   ` Jacopo Mondi
2023-06-02 14:42     ` Dave Stevenson
2023-07-18 12:08 ` [PATCH 00/21] imx258 improvements series Arnaud Ferraris

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=20230530173000.3060865-12-dave.stevenson@raspberrypi.com \
    --to=dave.stevenson@raspberrypi.com \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-media@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=sakari.ailus@linux.intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).