From nobody Thu Oct 2 15:35:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C2B127E045; Mon, 15 Sep 2025 06:39:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918377; cv=none; b=BYWiv7iSCLe0SDjBOOY7YHNtSZcZgCGjp3NEsoxMNDaTeld+r6VbgefcqUK8FlaqtvCN3ArzIHiRMGkWm+gYuR37hxhBgF0Joj5SdJ621pKXsjQ0Q+GIN7B9PMu3XG3FDBtMZrEV514vvVjeU04iwas31cc5AQtyR4IdPIu4MpQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918377; c=relaxed/simple; bh=f554b4UEqiVHHa37Elp5PwAy1JMUtZkiY0I7rFW4grc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tuMpo5KGmoas9pd56JEeirhZYazrTeGYO+PNkv7G0UCnREtIJZjUI3LY+RDOWSHOR7b/OtQbtsdThngeRxF2vvEq9tCQtX98O05ChVXiLG9hyTwK63vKy7T6hw+4HRbPCHn6LjnYPSoRE+YASl3/h6c2ANKbCPJwpntkezDq518= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=QGTlfqcM; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="QGTlfqcM" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:2dbc:e233:e1b4:15e7:45cd]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 5372AC71; Mon, 15 Sep 2025 08:38:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757918296; bh=f554b4UEqiVHHa37Elp5PwAy1JMUtZkiY0I7rFW4grc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QGTlfqcMYIcDLi50odSJCN27k2PldmzG5VM6Bxb5n4sYetT765NB5NBBuXW9sEaS8 VnEJy4Scpi74l8eVc1NqMCbPOuCeULnQKly37rPeaq4hwiD/sQyHmMPlaExLJduw1I EITxZKaewnPtqWRugo+lbe4A4WeAGj/OJTcLAjUo= From: Jai Luthra Date: Mon, 15 Sep 2025 12:09:07 +0530 Subject: [PATCH v3 1/8] media: imx335: Rectify name of mode struct Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250915-imx335_binning-v3-1-16ecabf2090d@ideasonboard.com> References: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> In-Reply-To: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> To: Kieran Bingham , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Tommaso Merciai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1462; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=m9o+E8P8Et1zh2okIxdKsiF7R7Zf9sUf+PhNJ2zoZjw=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBox7SQVyXae5hIWSZRXAtKungGIr1lOo1TSY10Y 6VYlIcMI3mJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMe0kAAKCRBD3pH5JJpx RXGMEADPXyYq4acXRtKvQ5LWHJunpFXIam1dXCCt/KU8rntdSx9YO3ZseHFBdteFbznxUPVs+LF CitjGLUnFpfetD2gogUxcTHTEYvASNSJT/x5fSZFcqr00MnoMiruNA04wq8EmkXDgJQoBVaNC/K BRrffz3SnItt4ipVX4NZh1JOcNwbCpWSGYFN+87B1V4BepOZ5g/mV5iEqOX0iqWwcO4E/JZVRel rxpQbfqv/xEO+bINGVk8FXoxPldopurhZPfOs1RxSBJFhm626cjvvUIwDGBUSteKquqrvYieo6B MayBrOe9Sm3pxaHwtSHoJMO1PgxWjwKaclWwyhvqBI3PTlzxZh9CKhmPFt7YT85It56hJIL9O/w EPXcOBXfafTN8lO+UDhlHyA+wJcHNnEFt9LKKLZawuHlT4yuCLpIU7otCfPChDYuhoYZyF8EnL8 gNEJidLIMGWcyprzUrzYoTRAYQ8YgrwUX69+KyekkwMt/y1AFwgglMEtWsit1g7m4Q9QSYS4pjb JyxHisde0rYF6K2g6okvP56Z7+F3OlVWq/xo9P/WA2A4BW8JPPEoi6ju+T8Ri5QYNl7LcvPjIqd GZxad+ZwKAWFUGdel+SsDRibjrxEmPxp0CBO/K+2MChhLf5pqD8zWWcKUxKggZ7+Vp5YvriEbcA c0+RCtzKiBsFzxw== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 From: Umang Jain In commit 81495a59baeb ("media: imx335: Fix active area height discrepency") the height for the mode struct was rectified to '1944'. However, the name of mode struct is still reflecting to '1940'. Update it. Signed-off-by: Umang Jain Reviewed-by: Tommaso Merciai Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- drivers/media/i2c/imx335.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index c043df2f15fb25b3a56422092f99a1fd9a508fa9..213cfb7276611f522db0643186f= 25a8fef3c39db 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -252,7 +252,7 @@ static const int imx335_tpg_val[] =3D { }; =20 /* Sensor mode registers */ -static const struct cci_reg_sequence mode_2592x1940_regs[] =3D { +static const struct cci_reg_sequence mode_2592x1944_regs[] =3D { { IMX335_REG_MODE_SELECT, IMX335_MODE_STANDBY }, { IMX335_REG_MASTER_MODE, 0x00 }, { IMX335_REG_WINMODE, 0x04 }, @@ -416,8 +416,8 @@ static const struct imx335_mode supported_mode =3D { .vblank_max =3D 133060, .pclk =3D 396000000, .reg_list =3D { - .num_of_regs =3D ARRAY_SIZE(mode_2592x1940_regs), - .regs =3D mode_2592x1940_regs, + .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_regs), + .regs =3D mode_2592x1944_regs, }, }; =20 --=20 2.51.0 From nobody Thu Oct 2 15:35:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 83918280308; Mon, 15 Sep 2025 06:39:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918383; cv=none; b=q7OfMTOx2YYjPIXM2+6wCWXyhwWZRqI6Q4f0nCPR3FDk7/kirsIClRF31eyz0fBOkqHOZKYhAUya6MHt3jFPPIfbVLnIcqOXKHBAc9Ji9Bc78kGW46ysvArJj8y+8RIt9QaxPHDifrwFu0zsf+R8rtinstGqOWqxLNWfxXT5LWs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918383; c=relaxed/simple; bh=vIMdOR/aTmSbXFty+Gnb3QGoox1gNusEysAjzBF+Bj8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oHsE4Z+5ypmQmpfqJnXgKP3Sngy9cSH2+NFGXsZytQ6IRByiwq/7VsML/R5QiU2xI7hi6+t6xX8wiLSVHZS9/Ff1teb4BeHMzZUJsGoKB3hAhUfjmULva7AkHVyk3SARDesWIk9/EBRoyPyO0xqdr5/3Zm+EiDgJFuCJbFl1npg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=Qm5w/V+L; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Qm5w/V+L" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:2dbc:e233:e1b4:15e7:45cd]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4E3FD14B0; Mon, 15 Sep 2025 08:38:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757918302; bh=vIMdOR/aTmSbXFty+Gnb3QGoox1gNusEysAjzBF+Bj8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Qm5w/V+LBzb2x23Qu6rWCxKD+iKfovcOofK8I1lP3yaCMfs7UB0UpgeKF59KelERI zj6W6vhCyIiMND+WGxKmGNl08erZnoco0CJsQyCSLYBQLABo2w8fMIyjqbMTW1TI9P xhCtnF8B6FNxSnvmQD22GOu+7myXy4xrxLAPYBOg= From: Jai Luthra Date: Mon, 15 Sep 2025 12:09:08 +0530 Subject: [PATCH v3 2/8] media: imx335: Support vertical flip Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250915-imx335_binning-v3-2-16ecabf2090d@ideasonboard.com> References: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> In-Reply-To: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> To: Kieran Bingham , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Tommaso Merciai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5962; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=liLNKWlzDyJ/CykjOqCqXzd/MzDVMhJvSzuAgSgGt+Q=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBox7SR/PC8H4H14jn0/xB3tNab8MPjn5LfTRARP T5r3BPECNaJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMe0kQAKCRBD3pH5JJpx RVXmEACH3FbbV5T+hXkAZYn/ZLD7fugqVkCkERU54EpFeO1NrN1G4Lggp5laai4eVp24n51dNT1 xreROdur/NMqS5l+piEiIwf31nciuf3sbyvNgBBQE3QPRQSZHy84dhWyTe44GPUnEpFEnw5qMJ3 mghlbiaDLZdUMfd9Lw6icljaQhlIUxuehtGFkVxOwU8UkMyBa8rdTK4aoK4urgxdoyoeerU5IwS QzbU86u6jdsDweAUkFmLtFhJoYn14TCgYI+uV6MGK7q8lAMaKpCj2RxGPLMfS9SyNVvn3+9vdri fLr69kNMydYGBJPPWy40+2GYwQxb7urKA3n/5Itsq2IO6Fq75emj/klKa2gdrDjTkJHjPi8kRzh urZupEKtnkdR7SbtgfUj1uVkCsxbBOa2MBp5LtJT6BPOE1ka6tCSkF3rFEJSb3N2atQBtUzQJYD NyyzYDHjn1zmxyvutkKWaNFxbVeDFxJGIJ8Nigk9S8R/vppMPtiJMFgWBFz1yHOEEqPpgt/V+iP atKKhKEdlGW85FXayoy6wHZtSlNzUMW5c7SUDWxaplUarZ8JMTXnskN7kTyEwK6KWs6CJSi2lVD jEBS84mEhUu/OYpkvYtZLh41oKdt5yxrg5dm9vANvec6Eee3TDuT9Twi2sEHY/RYIjOzAMZj4gD 7obwW5cspuomngA== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 From: Umang Jain Support vertical flip by setting REG_VREVERSE. Additional registers also needs to be set per mode, according to the readout direction (normal/inverted) as mentioned in the data sheet. Since the register IMX335_REG_AREA3_ST_ADR_1 is based on the flip (and is set via vflip related registers), it has been moved out of the 2592x1944 mode regs. Signed-off-by: Umang Jain Reviewed-by: Tommaso Merciai Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- drivers/media/i2c/imx335.c | 71 ++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index 213cfb7276611f522db0643186f25a8fef3c39db..27baf6c9b426a324632db7e3935= 14463611a5ae7 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -56,6 +56,9 @@ #define IMX335_AGAIN_STEP 1 #define IMX335_AGAIN_DEFAULT 0 =20 +/* Vertical flip */ +#define IMX335_REG_VREVERSE CCI_REG8(0x304f) + #define IMX335_REG_TPG_TESTCLKEN CCI_REG8(0x3148) =20 #define IMX335_REG_INCLKSEL1 CCI_REG16_LE(0x314c) @@ -155,6 +158,8 @@ static const char * const imx335_supply_name[] =3D { * @vblank_max: Maximum vertical blanking in lines * @pclk: Sensor pixel clock * @reg_list: Register list for sensor mode + * @vflip_normal: Register list vflip (normal readout) + * @vflip_inverted: Register list vflip (inverted readout) */ struct imx335_mode { u32 width; @@ -166,6 +171,8 @@ struct imx335_mode { u32 vblank_max; u64 pclk; struct imx335_reg_list reg_list; + struct imx335_reg_list vflip_normal; + struct imx335_reg_list vflip_inverted; }; =20 /** @@ -183,6 +190,7 @@ struct imx335_mode { * @pclk_ctrl: Pointer to pixel clock control * @hblank_ctrl: Pointer to horizontal blanking control * @vblank_ctrl: Pointer to vertical blanking control + * @vflip: Pointer to vertical flip control * @exp_ctrl: Pointer to exposure control * @again_ctrl: Pointer to analog gain control * @vblank: Vertical blanking in lines @@ -207,6 +215,7 @@ struct imx335 { struct v4l2_ctrl *pclk_ctrl; struct v4l2_ctrl *hblank_ctrl; struct v4l2_ctrl *vblank_ctrl; + struct v4l2_ctrl *vflip; struct { struct v4l2_ctrl *exp_ctrl; struct v4l2_ctrl *again_ctrl; @@ -259,7 +268,6 @@ static const struct cci_reg_sequence mode_2592x1944_reg= s[] =3D { { IMX335_REG_HTRIMMING_START, 48 }, { IMX335_REG_HNUM, 2592 }, { IMX335_REG_Y_OUT_SIZE, 1944 }, - { IMX335_REG_AREA3_ST_ADR_1, 176 }, { IMX335_REG_AREA3_WIDTH_1, 3928 }, { IMX335_REG_OPB_SIZE_V, 0 }, { IMX335_REG_XVS_XHS_DRV, 0x00 }, @@ -333,6 +341,26 @@ static const struct cci_reg_sequence mode_2592x1944_re= gs[] =3D { { CCI_REG8(0x3a00), 0x00 }, }; =20 +static const struct cci_reg_sequence mode_2592x1944_vflip_normal[] =3D { + { IMX335_REG_AREA3_ST_ADR_1, 176 }, + + /* Undocumented V-Flip related registers on Page 55 of datasheet. */ + { CCI_REG8(0x3081), 0x02, }, + { CCI_REG8(0x3083), 0x02, }, + { CCI_REG16_LE(0x30b6), 0x00 }, + { CCI_REG16_LE(0x3116), 0x08 }, +}; + +static const struct cci_reg_sequence mode_2592x1944_vflip_inverted[] =3D { + { IMX335_REG_AREA3_ST_ADR_1, 4112 }, + + /* Undocumented V-Flip related registers on Page 55 of datasheet. */ + { CCI_REG8(0x3081), 0xfe, }, + { CCI_REG8(0x3083), 0xfe, }, + { CCI_REG16_LE(0x30b6), 0x1fa }, + { CCI_REG16_LE(0x3116), 0x002 }, +}; + static const struct cci_reg_sequence raw10_framefmt_regs[] =3D { { IMX335_REG_ADBIT, 0x00 }, { IMX335_REG_MDBIT, 0x00 }, @@ -419,6 +447,14 @@ static const struct imx335_mode supported_mode =3D { .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_regs), .regs =3D mode_2592x1944_regs, }, + .vflip_normal =3D { + .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_vflip_normal), + .regs =3D mode_2592x1944_vflip_normal, + }, + .vflip_inverted =3D { + .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_vflip_inverted), + .regs =3D mode_2592x1944_vflip_inverted, + }, }; =20 /** @@ -492,6 +528,26 @@ static int imx335_update_exp_gain(struct imx335 *imx33= 5, u32 exposure, u32 gain) return ret; } =20 +static int imx335_update_vertical_flip(struct imx335 *imx335, u32 vflip) +{ + int ret =3D 0; + + if (vflip) + cci_multi_reg_write(imx335->cci, + imx335->cur_mode->vflip_inverted.regs, + imx335->cur_mode->vflip_inverted.num_of_regs, + &ret); + else + cci_multi_reg_write(imx335->cci, + imx335->cur_mode->vflip_normal.regs, + imx335->cur_mode->vflip_normal.num_of_regs, + &ret); + if (ret) + return ret; + + return cci_write(imx335->cci, IMX335_REG_VREVERSE, vflip, NULL); +} + static int imx335_update_test_pattern(struct imx335 *imx335, u32 pattern_i= ndex) { int ret =3D 0; @@ -593,6 +649,10 @@ static int imx335_set_ctrl(struct v4l2_ctrl *ctrl) =20 ret =3D imx335_update_exp_gain(imx335, exposure, analog_gain); =20 + break; + case V4L2_CID_VFLIP: + ret =3D imx335_update_vertical_flip(imx335, ctrl->val); + break; case V4L2_CID_TEST_PATTERN: ret =3D imx335_update_test_pattern(imx335, ctrl->val); @@ -1175,7 +1235,7 @@ static int imx335_init_controls(struct imx335 *imx335) return ret; =20 /* v4l2_fwnode_device_properties can add two more controls */ - ret =3D v4l2_ctrl_handler_init(ctrl_hdlr, 9); + ret =3D v4l2_ctrl_handler_init(ctrl_hdlr, 10); if (ret) return ret; =20 @@ -1210,6 +1270,13 @@ static int imx335_init_controls(struct imx335 *imx33= 5) =20 v4l2_ctrl_cluster(2, &imx335->exp_ctrl); =20 + imx335->vflip =3D v4l2_ctrl_new_std(ctrl_hdlr, + &imx335_ctrl_ops, + V4L2_CID_VFLIP, + 0, 1, 1, 0); + if (imx335->vflip) + imx335->vflip->flags |=3D V4L2_CTRL_FLAG_MODIFY_LAYOUT; + imx335->vblank_ctrl =3D v4l2_ctrl_new_std(ctrl_hdlr, &imx335_ctrl_ops, V4L2_CID_VBLANK, --=20 2.51.0 From nobody Thu Oct 2 15:35:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4391280308; Mon, 15 Sep 2025 06:39:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918389; cv=none; b=VagYnWLUzH8Smc8C3R6x4DkbJ1UF2nnL9pTj9/eMa+P8PNrjBAaB3gR7uhRKAiEjz1CsuPSsQM63XNVeYq34HzvZuNT/Yxo4Sz2TR36g+MD360EkIwCRFqoa+gj9t8iWR4Vf6q6Fx5A9PbyfCxTdXNECfuZDX5ZwG+g29KnVBv8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918389; c=relaxed/simple; bh=SODWfKHrsBZ5W0y5gSSZAR/KbjGtpSDwc8JyvXaGars=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UIzwNfxYPkA16uImU2knK99xEoDLgQ4XD12JMF57sxmK1J14i92UNHRaEbJpj6+J5f6rXcg4QhURIDqkY4+41WolLO4LJwn2j1Auve8gTNxEVzw7/LviznyLzCuQu1BSQYlb8k+K43Sl7qtgwrMaN93dSS574VPvJAT1pvVfYeY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=G0g7uSOW; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="G0g7uSOW" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:2dbc:e233:e1b4:15e7:45cd]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B9227C71; Mon, 15 Sep 2025 08:38:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757918309; bh=SODWfKHrsBZ5W0y5gSSZAR/KbjGtpSDwc8JyvXaGars=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=G0g7uSOW+5JSQxo3+kr9KyWUHgfuIfscdNYAXj4c3DeMzqcFRx/SXBDanuoBThIK6 QuPZW7XQOubWikMtFGgd/ZQ3qqQLEtIXzh7iXfzAAhtJ1NTXys+kwLQPjS0Df61Q3w 3UWJEjbhmQe47OAXRBsDQhLzSr1IV3fRdJPhWzfY= From: Jai Luthra Date: Mon, 15 Sep 2025 12:09:09 +0530 Subject: [PATCH v3 3/8] media: imx335: Update the native pixel array width Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250915-imx335_binning-v3-3-16ecabf2090d@ideasonboard.com> References: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> In-Reply-To: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> To: Kieran Bingham , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Tommaso Merciai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2017; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=SODWfKHrsBZ5W0y5gSSZAR/KbjGtpSDwc8JyvXaGars=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBox7SSamT5gv0hTuhM8craEg1Aat/RgPmNyn82Y Dg37CApKkuJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMe0kgAKCRBD3pH5JJpx RTFRD/wJO6SsYudXs5NNnsJzOpPaG39xN6CPEVbgWFvCq8k1Yk/yi+ACZ2ieI+bHiljMeMrIrII orIB30KBO+xSx87vSX9pRA6SU8RVSTSmvY2tuQAQAZNWRZTAUXgCZYkZJ5kTJtex11Kwj+63W9U b0lN2ZNVa+dKYE0x54sZXdBGy44NSsUxEOcybVGO4rUvcDvzq3f66DsMTq6YZSnOXZbfUsMcU7X 6I+3aL+eSRCpLsH3xSgmW7TC+hQp4YUC06MfemtGPHIsFioO44Hb0ECn8MGuF1/iiuV13TPfcfL 6hrVMaV0aOSvwru9PlnGUbesUP8CU5Ku1Gt8uk3ZPtXWvHINr+uXgR6p4pX1Vlw7mdcXfsjgbUL b2TgQ0ks8nbHXAabIH7LgTgPXLGe6mrHbHltSSO7JeMfTaEUHUzF1L9naiMCanogqLeu3Whq5bX nOMu7XE1B3AKA+3mDxVvMEKnJCHeEkvsfcCw+pc94M/VJBRQGuAXT13wH9vS4EM6GLphU4a8X2n qKo7Rs3Z88u7GUfL8VpcFbD8wp4BfsC0SyoMMf87gUf3ZEDn5h/2KGsglM9KK7x/G6e/KBoh59O CNA8iSp/dx7JpUOCD+vhm3i29L/bBdkW+NBoaTt/5O0SF77q3WP4Y/O0xYbiWXSWHCS9BhCqFCy 1FeX+4oPjDznVIQ== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 The sensor datasheet reports actual total number of pixels as 2696x2044. This becomes important for supporting 2x2 binning modes that can go beyond the current maximum pixel array width set here. Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- drivers/media/i2c/imx335.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index 27baf6c9b426a324632db7e393514463611a5ae7..3522a6b1ca14e27c46a55e18e5b= f51240ea5a6ee 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -124,12 +124,20 @@ #define IMX335_NUM_DATA_LANES 4 =20 /* IMX335 native and active pixel array size. */ -#define IMX335_NATIVE_WIDTH 2616U -#define IMX335_NATIVE_HEIGHT 1964U -#define IMX335_PIXEL_ARRAY_LEFT 12U -#define IMX335_PIXEL_ARRAY_TOP 12U -#define IMX335_PIXEL_ARRAY_WIDTH 2592U -#define IMX335_PIXEL_ARRAY_HEIGHT 1944U +static const struct v4l2_rect imx335_native_area =3D { + .top =3D 0, + .left =3D 0, + .width =3D 2696, + .height =3D 2044, +}; + +static const struct v4l2_rect imx335_active_area =3D { + .top =3D 50, + .left =3D 52, + .width =3D 2592, + .height =3D 1944, +}; + =20 /** * struct imx335_reg_list - imx335 sensor register list @@ -869,21 +877,13 @@ static int imx335_get_selection(struct v4l2_subdev *s= d, { switch (sel->target) { case V4L2_SEL_TGT_NATIVE_SIZE: - sel->r.top =3D 0; - sel->r.left =3D 0; - sel->r.width =3D IMX335_NATIVE_WIDTH; - sel->r.height =3D IMX335_NATIVE_HEIGHT; - + sel->r =3D imx335_native_area; return 0; =20 case V4L2_SEL_TGT_CROP: case V4L2_SEL_TGT_CROP_DEFAULT: case V4L2_SEL_TGT_CROP_BOUNDS: - sel->r.top =3D IMX335_PIXEL_ARRAY_TOP; - sel->r.left =3D IMX335_PIXEL_ARRAY_LEFT; - sel->r.width =3D IMX335_PIXEL_ARRAY_WIDTH; - sel->r.height =3D IMX335_PIXEL_ARRAY_HEIGHT; - + sel->r =3D imx335_active_area; return 0; } =20 --=20 2.51.0 From nobody Thu Oct 2 15:35:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1400728751F; Mon, 15 Sep 2025 06:39:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918398; cv=none; b=BZK9DdsNncksZNH/eiHHTDsel8reKKceC0HhonvY4xJTEia9igwrGRvSQYnBuhBvBOAF/ymxI9CUeFdqL0ANAx2HkaZ4Cq+LO4UbzCEuMpzMWzcaOuL6ZbOMP9HoF2DeGPQPOp1mhXUj+2o7MsMSZXUDLoabvk/3HqlyM7xzH70= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918398; c=relaxed/simple; bh=aZlKkf1i1h0XvF+Ov2evMQQ/nZrBsd8Vt1HWgTXZ0yg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VFW/D7MHfSvn+kmlPmmQ2i3A1J6CHdIEEzpyIJj6S0VjWbxNevEuOpTIU7mjPFfqOFuy/X5U4RIyWuKcbUAlXT4Istw8bHRS3vA1EOkx1ImwpoP3sckdOtrc2EAdYKPKlTypj/ZdXu2P/gnis8qE1D+wogjg2KIwucpoBxKCIb8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=qZYEitbk; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="qZYEitbk" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:2dbc:e233:e1b4:15e7:45cd]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 04478C71; Mon, 15 Sep 2025 08:38:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757918318; bh=aZlKkf1i1h0XvF+Ov2evMQQ/nZrBsd8Vt1HWgTXZ0yg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=qZYEitbkx/lTDT1oosO0rI/fKHsiPN6GWmnPTON5rIQJC0uLXA05Pk6WU7unZF6rk Om94bgYQf2OGZubLGExQgC7hi6kPSHKE0CaaGa92V00pXkjJZFVfFpEeoNY7qgD7oM BL/ecCxaSyV7lqOqXD9CwB2DAzyH1eXY1voj7sh8= From: Jai Luthra Date: Mon, 15 Sep 2025 12:09:10 +0530 Subject: [PATCH v3 4/8] media: imx335: Update HBLANK range on mode change Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250915-imx335_binning-v3-4-16ecabf2090d@ideasonboard.com> References: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> In-Reply-To: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> To: Kieran Bingham , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Tommaso Merciai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1166; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=aZlKkf1i1h0XvF+Ov2evMQQ/nZrBsd8Vt1HWgTXZ0yg=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBox7STxnoNuN2N24wmm25jnZRnnGdHN61Wz0IOy mm4ksnI9rCJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMe0kwAKCRBD3pH5JJpx RXXoD/47BOKM7qRnK97NmmuC56ZyKqVYO7u5bVg3lX3g2n6fw5R3uLtutD6LR8wkxor95NeXQJL YhfI/WAIe9C/vMm7HhEnW9kTMNyald4m+eQBBuyRIrafztuflaey/s5i8kosMZIGNq4q0U7/hsz cCKu5AklvRV1BcSu7SN8shkKaeUX8axiMxUZE6NRqXGrls6LfBBROwGhutlVCw0xVKIhiS+AtMK EBOlK7Aj4HN65gVjjmjEQNZGZF0E014Qnv1jA8iMDP4gRvrXlpkDugUio4YDr6j6yYRN0lKd7fp Uv6ObgLoOWuwkkRl4MsPuRDVH260JCimJ/QgpzN4Sp+VfLG2XFZN6b4AlukGwRRv39aG44ut5o6 e4ziuPlXRnh459U76FufHHMgpJyWiM/NPc9tbiGQR5ARqjQ2sGVwN86m5ok4BXDxNa9UoH25i10 a2uKfao60JeQqZsZulqiJaxHbrPIbpDpfGkumMDmIt5VKcEaZLo86mYYbhsgNv92J7pHv/8AOHg E8cdFpwoCHxGAnJo7IeXFX+8e+XOAL902mH6MFgxCIjdK/27L+QexGHkvzdisSIFKfdK2ucpMH7 tZmRSySPVVeQOK3hAzB6akVuM4dqkZYket78ghObkZWIUydf6A+TZUxz0qu3hCTiVaHeAydw2nJ 2dwdM+GUh60Qw1w== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 While switching modes, updating to a different value of HBLANK isn't sufficient, as this is a read-only control with a single allowed value, and thus hblank_min =3D=3D hblank_max =3D=3D hblank of the default mode. So to correctly update the user-facing value of the HBLANK parameter, which is necessary for correct framerate calculation, update the whole range when switching modes. Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- drivers/media/i2c/imx335.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index 3522a6b1ca14e27c46a55e18e5bf51240ea5a6ee..62a76517ecb263a4fd7e7a593c0= 2a3cdaf3da190 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -493,7 +493,8 @@ static int imx335_update_controls(struct imx335 *imx335, if (ret) return ret; =20 - ret =3D __v4l2_ctrl_s_ctrl(imx335->hblank_ctrl, mode->hblank); + ret =3D __v4l2_ctrl_modify_range(imx335->hblank_ctrl, mode->hblank, + mode->hblank, 1, mode->hblank); if (ret) return ret; =20 --=20 2.51.0 From nobody Thu Oct 2 15:35:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 169542874F9; Mon, 15 Sep 2025 06:40:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918408; cv=none; b=jfY1CBD6YmVUucgDBHMNMdLqsdjqpmvefjB+5XD5C9ZGMClrMMywi7Bv9IQUjvq6QhpNTjUL/EUIsc/h5ZdZjRRxsOQXJLs8ljvlnQVbORJS1RzcArOxQ+4x6PqifRMPa475ftfBV42/O1k2atXVG3rO4UjVi3xGSkwSI9sNWNc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918408; c=relaxed/simple; bh=Z27Luf1hV+G1on3BVIe0T+c/+Uec1k2icLXye/u0ti8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GNZvIFoA5/xxL3H4NmnR0SSL6te7V2WjueuEAHi2HJkocan7scTRbfHHTw2ohft6K9HS2IHL0ECcaG+DJuWNs7P+PJuqtE4Lg/QAUkgrIxCeUqm8Gr9P9xS4uypFPDoavB5UJjA1lX/XpwymgOEaYtfvck+f8/NGDJVO3tPb5ck= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=MhmEQVyL; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="MhmEQVyL" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:2dbc:e233:e1b4:15e7:45cd]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1CE69C71; Mon, 15 Sep 2025 08:38:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757918327; bh=Z27Luf1hV+G1on3BVIe0T+c/+Uec1k2icLXye/u0ti8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MhmEQVyL8gjCC08MQpVOWDS/WJZkpCMczh/x5/hTG5s3+MPtVvIHHEPHc4pc66/wJ TWUAWWAaaGJHRtzOXVHAig2QaJrGuuvyFFavQ4J6kSXNOKi/HlDvrRbmYEoQkKktCK bQwCyDBEXZCdT4a+nF83ooZJGHwk4QZipfHXfOSE= From: Jai Luthra Date: Mon, 15 Sep 2025 12:09:11 +0530 Subject: [PATCH v3 5/8] media: imx335: Handle runtime PM in leaf functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250915-imx335_binning-v3-5-16ecabf2090d@ideasonboard.com> References: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> In-Reply-To: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> To: Kieran Bingham , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Tommaso Merciai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3696; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=Z27Luf1hV+G1on3BVIe0T+c/+Uec1k2icLXye/u0ti8=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBox7SUhX05DKUd06tpXTMFe+FGdE3QhSD3w7+rf CGVbk05G5KJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMe0lAAKCRBD3pH5JJpx RYclEADIhswdS+Q8xhOeHejr9jsuwelt4B4kw1rCI4RpOpHMMGxGgXsItnqlbXBWzfFBUAxJ6FG qiqNVuDNt3MuKfJAXKsTjRtJRXeq1cnH8jzSZyXPaKY3yCjEzbkTrvefe8CGyFVNTrn1z3PNJ9Q tOykDLnAdVjh16FxKF9bzfcWGrvdqWcuTAwceMkE7jLDseR30CmAuANUMqu7oULiJPZHFtfZDgk VfOMhcvXwihSD3Bg3yxNViTqqnhVYmF2KmuSDghPsrTUY7kmGinK+/8g3M5RNbYe92N5ebBPl1g VDI5o1686jU5fjB7mZ5cTQvMm+3mpPpgfhvnOhHqKL6jk0fsB8h0rkYJkAB1C4dhlACEMg0oBzT q8/e+2lHoisZARiM2ZEDilqGbr2fYf9abufumVVAz1GZCG9BoicYTSwI/DUzYJttfV42I54wwaR Jy7EMdB61LRGuaFoXtslYkGqlM7zcE12xv1kNqaNouFLET8Mch/RwI938tvxjBYZ8XRjMJhB3kX vk3YXN9OLdyZjnVU36XF/3LrKNaujP1Rs4NMXzCDHwN4rzvSZ7gyyD5EYfWK001u5ZFCytQTSN8 ZgTgoQtbMBeylNTELc31Fz465cuZnArXNgLyfHM9WYdUqiXmY+0OBOlqBgKuubyy2bOzMc39uuM 4Lbue4/Jvrx069Q== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 Simplify .s_stream callback implementation by moving the runtime PM calls to the leaf functions. This patch should not affect any functionality. Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- drivers/media/i2c/imx335.c | 51 ++++++++++++++++++++----------------------= ---- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index 62a76517ecb263a4fd7e7a593c02a3cdaf3da190..7631f41e6f1e65695fb76a66d9a= c5a3588c69658 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -919,13 +919,17 @@ static int imx335_start_streaming(struct imx335 *imx3= 35) const struct imx335_reg_list *reg_list; int ret; =20 + ret =3D pm_runtime_resume_and_get(imx335->dev); + if (ret < 0) + return ret; + /* Setup PLL */ reg_list =3D &link_freq_reglist[__ffs(imx335->link_freq_bitmap)]; ret =3D cci_multi_reg_write(imx335->cci, reg_list->regs, reg_list->num_of_regs, NULL); if (ret) { dev_err(imx335->dev, "%s failed to set plls\n", __func__); - return ret; + goto err_rpm_put; } =20 /* Write sensor mode registers */ @@ -934,27 +938,27 @@ static int imx335_start_streaming(struct imx335 *imx3= 35) reg_list->num_of_regs, NULL); if (ret) { dev_err(imx335->dev, "fail to write initial registers\n"); - return ret; + goto err_rpm_put; } =20 ret =3D imx335_set_framefmt(imx335); if (ret) { dev_err(imx335->dev, "%s failed to set frame format: %d\n", __func__, ret); - return ret; + goto err_rpm_put; } =20 /* Configure lanes */ ret =3D cci_write(imx335->cci, IMX335_REG_LANEMODE, imx335->lane_mode, NULL); if (ret) - return ret; + goto err_rpm_put; =20 /* Setup handler will write actual exposure and gain */ ret =3D __v4l2_ctrl_handler_setup(imx335->sd.ctrl_handler); if (ret) { dev_err(imx335->dev, "fail to setup handler\n"); - return ret; + goto err_rpm_put; } =20 /* Start streaming */ @@ -962,25 +966,29 @@ static int imx335_start_streaming(struct imx335 *imx3= 35) IMX335_MODE_STREAMING, NULL); if (ret) { dev_err(imx335->dev, "fail to start streaming\n"); - return ret; + goto err_rpm_put; } =20 /* Initial regulator stabilization period */ usleep_range(18000, 20000); =20 return 0; + +err_rpm_put: + pm_runtime_put(imx335->dev); + + return ret; } =20 /** * imx335_stop_streaming() - Stop sensor stream * @imx335: pointer to imx335 device - * - * Return: 0 if successful, error code otherwise. */ -static int imx335_stop_streaming(struct imx335 *imx335) +static void imx335_stop_streaming(struct imx335 *imx335) { - return cci_write(imx335->cci, IMX335_REG_MODE_SELECT, - IMX335_MODE_STANDBY, NULL); + cci_write(imx335->cci, IMX335_REG_MODE_SELECT, + IMX335_MODE_STANDBY, NULL); + pm_runtime_put(imx335->dev); } =20 /** @@ -993,30 +1001,15 @@ static int imx335_stop_streaming(struct imx335 *imx3= 35) static int imx335_set_stream(struct v4l2_subdev *sd, int enable) { struct imx335 *imx335 =3D to_imx335(sd); - int ret; + int ret =3D 0; =20 mutex_lock(&imx335->mutex); =20 - if (enable) { - ret =3D pm_runtime_resume_and_get(imx335->dev); - if (ret) - goto error_unlock; - + if (enable) ret =3D imx335_start_streaming(imx335); - if (ret) - goto error_power_off; - } else { + else imx335_stop_streaming(imx335); - pm_runtime_put(imx335->dev); - } - - mutex_unlock(&imx335->mutex); =20 - return 0; - -error_power_off: - pm_runtime_put(imx335->dev); -error_unlock: mutex_unlock(&imx335->mutex); =20 return ret; --=20 2.51.0 From nobody Thu Oct 2 15:35:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0D572882B7; Mon, 15 Sep 2025 06:40:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918413; cv=none; b=O/+h10NX+DeWORyWrxmEIilFgmyJcPlKvsrJhWZFJJz2mDpEEINwZr5lVayvLoH3u0MMljdLM0+AzCtyqLRwG1gq23edFEceJ5Ks9q+4uOy37+ickxjJ2zPIw7M86baSVV5BjlV8A7JBFKIH3h4xbh+WAw2VGTajowOm7U7Sff0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918413; c=relaxed/simple; bh=avfpzotIJNr7ZAssrGuB1xQBZmVl0SIyY0rYb5SR79Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gFWXaIxNbzRT32J9+aB8a8NsETHKbd7huzgGiiH+2/raqvdEMGdimO2dEP1R7YtE4PxfZW6Pn8e9m0i2Sd+zDcaLEQVxcWbc0KBB6Ri23wIcOktD3or/ewrnBD/icqwx+x8OCVmt/ePOdWXMmcqncqnEy4vyohDSIeIwe4qf9Wo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=KlUuzN4q; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="KlUuzN4q" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:2dbc:e233:e1b4:15e7:45cd]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DF03EC71; Mon, 15 Sep 2025 08:38:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757918333; bh=avfpzotIJNr7ZAssrGuB1xQBZmVl0SIyY0rYb5SR79Q=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=KlUuzN4qKD6HRYJgSFwoQW0ashlqBzvqhnPNRHtJZXbafXcAAiCWVd7MEH88u0nqv 4UDYw7qgxhgP2Tk0lzsQTnEKkwr6+Mga5izVjH8/4+lY34FvtHrpJB49ufXkGzFxcs Gp8KEBfoymW5nXdAcNrOhpPwrSQvmsz+nAkXLiIs= From: Jai Luthra Date: Mon, 15 Sep 2025 12:09:12 +0530 Subject: [PATCH v3 6/8] media: imx355: Use subdev active state Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250915-imx335_binning-v3-6-16ecabf2090d@ideasonboard.com> References: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> In-Reply-To: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> To: Kieran Bingham , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Tommaso Merciai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7175; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=avfpzotIJNr7ZAssrGuB1xQBZmVl0SIyY0rYb5SR79Q=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBox7SV11D49By4uouidX+Xg/P3JInSx5AZ8H8e2 TDXJkqMh7KJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMe0lQAKCRBD3pH5JJpx RQPnEACnDQd+YMlFUK9Odrw7Yq+x3dqWrNnXWxOgPcYMuxoWIc9OChbOwydmMKtA9g9SH18nym2 CdGA+Wf6lIOkCGUZv+egur/T3kcpwcTlDWBJuwrN4p6iSxWggvFqhehLuEBSk9aosdNZv/pOiL4 Oeq+YeWDL/QSruTlce4vnKvPbsLesUWPMeZsVQEjvwSUpfah1pscr/ToQzeeKCicglZZ0cUjOUq 1iZ7YeYeEF0LhMm1ImYgFtaZPHzV2zZGeoKchrnA5mmX1U7e1iNSxJ8P/pu6lmtXyLbcGjJ3j+W A4+2TgkY2A9MAIUkHfWnJNgBy+e9RoIgp0Cj0p5fySzpJ0vAHDsKl8A6dhBVscRQlh1ARM+2XDJ fqKOJ7CRdR01dZPFvsufeqnp/vmWY1+/0ALBtbmlg5NA4YlV5jaOHmB8EV8Y0x3xptatYqRuFCs BZzu8TVzeTigKKjAK96Y/ceFHsblvNcL0hvKVQUnjVKXn3CpmO385RUyMaBReHEQ+0MMArzSCqI qgAeFDjA2+619g2htL+uk646bek6LWDYp/oohxjCPVvx177pIEnPsf8oOSoF26TDe7H94k52/H+ l9zoZgcsbJOHeppqFV5w/W9RH+rYQFvrkSAsvYVnYYuN6zIS3sYf7NO7rY6fw3Gf/H5Glhh4qn8 3irOEU9VBUYu1tg== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 Port the driver to use the subdev active state. This simplifies locking, and makes it easier to support different crop sizes for binned modes, by storing the crop rectangle inside the subdev state. Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- drivers/media/i2c/imx335.c | 79 ++++++++++++------------------------------= ---- 1 file changed, 21 insertions(+), 58 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index 7631f41e6f1e65695fb76a66d9ac5a3588c69658..9b9bbe6473d545bc5618c0fe819= 1df0b18037cd8 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -204,7 +204,6 @@ struct imx335_mode { * @vblank: Vertical blanking in lines * @lane_mode: Mode for number of connected data lanes * @cur_mode: Pointer to current selected sensor mode - * @mutex: Mutex for serializing sensor controls * @link_freq_bitmap: Menu bitmap for link_freq_ctrl * @cur_mbus_code: Currently selected media bus format code */ @@ -231,7 +230,6 @@ struct imx335 { u32 vblank; u32 lane_mode; const struct imx335_mode *cur_mode; - struct mutex mutex; unsigned long link_freq_bitmap; u32 cur_mbus_code; }; @@ -766,36 +764,6 @@ static void imx335_fill_pad_format(struct imx335 *imx3= 35, fmt->format.xfer_func =3D V4L2_XFER_FUNC_NONE; } =20 -/** - * imx335_get_pad_format() - Get subdevice pad format - * @sd: pointer to imx335 V4L2 sub-device structure - * @sd_state: V4L2 sub-device configuration - * @fmt: V4L2 sub-device format need to be set - * - * Return: 0 if successful, error code otherwise. - */ -static int imx335_get_pad_format(struct v4l2_subdev *sd, - struct v4l2_subdev_state *sd_state, - struct v4l2_subdev_format *fmt) -{ - struct imx335 *imx335 =3D to_imx335(sd); - - mutex_lock(&imx335->mutex); - - if (fmt->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) { - struct v4l2_mbus_framefmt *framefmt; - - framefmt =3D v4l2_subdev_state_get_format(sd_state, fmt->pad); - fmt->format =3D *framefmt; - } else { - imx335_fill_pad_format(imx335, imx335->cur_mode, fmt); - } - - mutex_unlock(&imx335->mutex); - - return 0; -} - /** * imx335_set_pad_format() - Set subdevice pad format * @sd: pointer to imx335 V4L2 sub-device structure @@ -809,12 +777,12 @@ static int imx335_set_pad_format(struct v4l2_subdev *= sd, struct v4l2_subdev_format *fmt) { struct imx335 *imx335 =3D to_imx335(sd); + struct v4l2_mbus_framefmt *format; const struct imx335_mode *mode; int i, ret =3D 0; =20 - mutex_lock(&imx335->mutex); - mode =3D &supported_mode; + for (i =3D 0; i < ARRAY_SIZE(imx335_mbus_codes); i++) { if (imx335_mbus_codes[i] =3D=3D fmt->format.code) imx335->cur_mbus_code =3D imx335_mbus_codes[i]; @@ -822,19 +790,15 @@ static int imx335_set_pad_format(struct v4l2_subdev *= sd, =20 imx335_fill_pad_format(imx335, mode, fmt); =20 - if (fmt->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) { - struct v4l2_mbus_framefmt *framefmt; + format =3D v4l2_subdev_state_get_format(sd_state, fmt->pad); + *format =3D fmt->format; =20 - framefmt =3D v4l2_subdev_state_get_format(sd_state, fmt->pad); - *framefmt =3D fmt->format; - } else { + if (fmt->which =3D=3D V4L2_SUBDEV_FORMAT_ACTIVE) { ret =3D imx335_update_controls(imx335, mode); if (!ret) imx335->cur_mode =3D mode; } =20 - mutex_unlock(&imx335->mutex); - return ret; } =20 @@ -854,12 +818,10 @@ static int imx335_init_state(struct v4l2_subdev *sd, fmt.which =3D sd_state ? V4L2_SUBDEV_FORMAT_TRY : V4L2_SUBDEV_FORMAT_ACTI= VE; imx335_fill_pad_format(imx335, &supported_mode, &fmt); =20 - mutex_lock(&imx335->mutex); __v4l2_ctrl_modify_range(imx335->link_freq_ctrl, 0, __fls(imx335->link_freq_bitmap), ~(imx335->link_freq_bitmap), __ffs(imx335->link_freq_bitmap)); - mutex_unlock(&imx335->mutex); =20 return imx335_set_pad_format(sd, sd_state, &fmt); } @@ -1001,16 +963,17 @@ static void imx335_stop_streaming(struct imx335 *imx= 335) static int imx335_set_stream(struct v4l2_subdev *sd, int enable) { struct imx335 *imx335 =3D to_imx335(sd); + struct v4l2_subdev_state *state; int ret =3D 0; =20 - mutex_lock(&imx335->mutex); + state =3D v4l2_subdev_lock_and_get_active_state(sd); =20 if (enable) ret =3D imx335_start_streaming(imx335); else imx335_stop_streaming(imx335); =20 - mutex_unlock(&imx335->mutex); + v4l2_subdev_unlock_state(state); =20 return ret; } @@ -1138,7 +1101,7 @@ static const struct v4l2_subdev_pad_ops imx335_pad_op= s =3D { .enum_frame_size =3D imx335_enum_frame_size, .get_selection =3D imx335_get_selection, .set_selection =3D imx335_get_selection, - .get_fmt =3D imx335_get_pad_format, + .get_fmt =3D v4l2_subdev_get_fmt, .set_fmt =3D imx335_set_pad_format, }; =20 @@ -1233,9 +1196,6 @@ static int imx335_init_controls(struct imx335 *imx335) if (ret) return ret; =20 - /* Serialize controls with sensor device */ - ctrl_hdlr->lock =3D &imx335->mutex; - /* Initialize exposure and gain */ lpfr =3D mode->vblank + mode->height; imx335->exp_ctrl =3D v4l2_ctrl_new_std(ctrl_hdlr, @@ -1355,12 +1315,10 @@ static int imx335_probe(struct i2c_client *client) return ret; } =20 - mutex_init(&imx335->mutex); - ret =3D imx335_power_on(imx335->dev); if (ret) { dev_err(imx335->dev, "failed to power-on the sensor\n"); - goto error_mutex_destroy; + return ret; } =20 /* Check module identity */ @@ -1393,11 +1351,18 @@ static int imx335_probe(struct i2c_client *client) goto error_handler_free; } =20 + imx335->sd.state_lock =3D imx335->ctrl_handler.lock; + ret =3D v4l2_subdev_init_finalize(&imx335->sd); + if (ret < 0) { + dev_err(imx335->dev, "subdev init error\n"); + goto error_media_entity; + } + ret =3D v4l2_async_register_subdev_sensor(&imx335->sd); if (ret < 0) { dev_err(imx335->dev, "failed to register async subdev: %d\n", ret); - goto error_media_entity; + goto error_subdev_cleanup; } =20 pm_runtime_set_active(imx335->dev); @@ -1406,14 +1371,14 @@ static int imx335_probe(struct i2c_client *client) =20 return 0; =20 +error_subdev_cleanup: + v4l2_subdev_cleanup(&imx335->sd); error_media_entity: media_entity_cleanup(&imx335->sd.entity); error_handler_free: v4l2_ctrl_handler_free(imx335->sd.ctrl_handler); error_power_off: imx335_power_off(imx335->dev); -error_mutex_destroy: - mutex_destroy(&imx335->mutex); =20 return ret; } @@ -1427,9 +1392,9 @@ static int imx335_probe(struct i2c_client *client) static void imx335_remove(struct i2c_client *client) { struct v4l2_subdev *sd =3D i2c_get_clientdata(client); - struct imx335 *imx335 =3D to_imx335(sd); =20 v4l2_async_unregister_subdev(sd); + v4l2_subdev_cleanup(sd); media_entity_cleanup(&sd->entity); v4l2_ctrl_handler_free(sd->ctrl_handler); =20 @@ -1437,8 +1402,6 @@ static void imx335_remove(struct i2c_client *client) if (!pm_runtime_status_suspended(&client->dev)) imx335_power_off(&client->dev); pm_runtime_set_suspended(&client->dev); - - mutex_destroy(&imx335->mutex); } =20 static const struct dev_pm_ops imx335_pm_ops =3D { --=20 2.51.0 From nobody Thu Oct 2 15:35:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE80128BAB9; Mon, 15 Sep 2025 06:40:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918420; cv=none; b=mxwbhv0w8OG0RJ493as7YC6DVHH8lMr7wCFne+14h1L6Uy0wjsSQ6gLE49Urd5xsQvfT42qe48e9EvJz1eXOvVtLAVLEx8tDYXw92U+OTI3+b0eJ2BYeySFEQTeq6FojUvcPncNhSG9WlpA/8RGokCaTe5yer3VDpTzgcTjvwU4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918420; c=relaxed/simple; bh=ZikkkNL8IjE4jQsojkleHw8OR2RznsV4ygfKB+g4yIQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PL5oPHNL9lWhffDycSnXzwtXfladGROHN53Xih5JgMURbDbq7vos/OseZ6aKnjkIkkNSFjiLG9vU/89G14+FneU1Xd+HItc2dq6/MofCM0tBM8NeZvjOOIgCzI/22JyvaFn7q/WJdeE/2Y8qiq5BlEa4rhbvfXbMDMxcypIOTng= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=spyTVkj7; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="spyTVkj7" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:2dbc:e233:e1b4:15e7:45cd]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0445DC71; Mon, 15 Sep 2025 08:38:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757918339; bh=ZikkkNL8IjE4jQsojkleHw8OR2RznsV4ygfKB+g4yIQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=spyTVkj7h5GGC+onYkp7nPRVfmRMUP0iJwV5vUuN61IyXkzt+823z+5M6OBzBR3qU I6T5rE71CzTIzf1hFzR/sWb9xkXJEO9qnU/p/sjZETMuwmoN6OOvgAZDm1Gyq/C4Cs C6BHc/okxATslqRtrd4BkmQf6gO7o3YPt+apDr6o= From: Jai Luthra Date: Mon, 15 Sep 2025 12:09:13 +0530 Subject: [PATCH v3 7/8] media: imx335: Support 2x2 binning Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250915-imx335_binning-v3-7-16ecabf2090d@ideasonboard.com> References: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> In-Reply-To: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> To: Kieran Bingham , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Tommaso Merciai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=15646; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=ZikkkNL8IjE4jQsojkleHw8OR2RznsV4ygfKB+g4yIQ=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBox7SW4Oexj76XNsFS5Pf3flSo6gdxJ/HHv2RCU Jm+LlsyIymJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMe0lgAKCRBD3pH5JJpx RVN/EACgPRv36DlTLtDCXN61Bq0JP3UIQfRLEw1XaxbPcYIt3yqbd/JzaNnWR/vDrPfX+XtOvq+ 0hBD34+fBw8gUoNzatJZO3sr+uqe5qLqpbU1s2EMfoVlEe+C7u+qGeTG+g1sMFBpx50FC4hMKen ToQj58Ry1T/sMlyjhe3H8EAGLbailTJvzaepl/EILZVldEszqT1j1MkXgjJrUITd274WHVjQyGr 4xyGvU+qvZVDWM+yuHwDpkZMUqgaDaDxxHNDtMYZZJsxUUbroxXBLsu4OFyqKokbYyGosP6IAC2 A4vYRDdPZT1h4tp1SBcJ6Z7in95ywK74GJLs2XK2hFWQPxlxa+jI8UDC6s4tIdaTnQ4/9V/2vy+ 7pdc7534O95BEuW09FI+v84e953XY/EdBhUxFDYyMIcTDEa56sFUm9SfyYH+bqw0U7qXYNVL5dO k8BqxN/m6oXEWOwl22byCCdKinqfISjx6TM5u5wxkm5FyKW8AmTfZQj4FlKP/wy2PNAS/AmrAda r7wLtJ+Uf7mrqdHkLQ+DCSnDKU8clw3SaKFQMUojlM0eQLGLHxnzH537IOzG+KDcc3pobF1ygRa X0XQCcWWAg1PQb8GyCsYjZ2UD+PsaAl1UbX1cI/QBgjOrJd4CQcwtUbhWcuyeitWfH1rBvSI9Sk a7rS5avvUrbHHSw== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 Introduce 2x2 binning mode (1312x972@60fps). Since there are multiple modes now, use v4l2_find_nearest_size() to select the appropriate mode in .set_fmt(). For 2x2 binning the minimum shutter value supported is 17 instead of 9. This effects the maximum allowed exposure time, and if not enforced then the sensor produces very dark frames when the minimum shutter limit is violated. Lastly, update the crop size reported to the userspace. When trying 2x2 binning with the datasheet suggested pixel array size (i.e. 2592 / 2 =3D> 1296), on some platforms (Raspberry Pi 5) artefacts are introduced on the right edge of the output image. Instead, using a higher width of 1312 works fine on all platforms. Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- drivers/media/i2c/imx335.c | 275 +++++++++++++++++++++++++++++++++++------= ---- 1 file changed, 217 insertions(+), 58 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index 9b9bbe6473d545bc5618c0fe8191df0b18037cd8..e320c7e6fcede823bd67bae617c= 24196cbbed8c6 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -35,6 +35,7 @@ =20 /* Lines per frame */ #define IMX335_REG_VMAX CCI_REG24_LE(0x3030) +#define IMX335_REG_HMAX CCI_REG16_LE(0x3034) =20 #define IMX335_REG_OPB_SIZE_V CCI_REG8(0x304c) #define IMX335_REG_ADBIT CCI_REG8(0x3050) @@ -42,10 +43,13 @@ =20 #define IMX335_REG_SHUTTER CCI_REG24_LE(0x3058) #define IMX335_EXPOSURE_MIN 1 -#define IMX335_EXPOSURE_OFFSET 9 +#define IMX335_SHUTTER_MIN 9 +#define IMX335_SHUTTER_MIN_BINNED 17 #define IMX335_EXPOSURE_STEP 1 #define IMX335_EXPOSURE_DEFAULT 0x0648 =20 +#define IMX335_REG_AREA2_WIDTH_1 CCI_REG16_LE(0x3072) + #define IMX335_REG_AREA3_ST_ADR_1 CCI_REG16_LE(0x3074) #define IMX335_REG_AREA3_WIDTH_1 CCI_REG16_LE(0x3076) =20 @@ -133,12 +137,11 @@ static const struct v4l2_rect imx335_native_area =3D { =20 static const struct v4l2_rect imx335_active_area =3D { .top =3D 50, - .left =3D 52, - .width =3D 2592, + .left =3D 36, + .width =3D 2624, .height =3D 1944, }; =20 - /** * struct imx335_reg_list - imx335 sensor register list * @num_of_regs: Number of registers in the list @@ -155,8 +158,14 @@ static const char * const imx335_supply_name[] =3D { "dvdd", /* Digital Core (1.2V) supply */ }; =20 +enum imx335_scan_mode { + IMX335_ALL_PIXEL, + IMX335_2_2_BINNING, +}; + /** * struct imx335_mode - imx335 sensor mode structure + * @scan_mode: Configuration scan mode (All pixel / 2x2Binning) * @width: Frame width * @height: Frame height * @code: Format code @@ -170,6 +179,7 @@ static const char * const imx335_supply_name[] =3D { * @vflip_inverted: Register list vflip (inverted readout) */ struct imx335_mode { + enum imx335_scan_mode scan_mode; u32 width; u32 height; u32 code; @@ -271,12 +281,33 @@ static const struct cci_reg_sequence mode_2592x1944_r= egs[] =3D { { IMX335_REG_MODE_SELECT, IMX335_MODE_STANDBY }, { IMX335_REG_MASTER_MODE, 0x00 }, { IMX335_REG_WINMODE, 0x04 }, + { IMX335_REG_HMAX, 550 }, { IMX335_REG_HTRIMMING_START, 48 }, { IMX335_REG_HNUM, 2592 }, { IMX335_REG_Y_OUT_SIZE, 1944 }, + { IMX335_REG_AREA2_WIDTH_1, 40 }, { IMX335_REG_AREA3_WIDTH_1, 3928 }, { IMX335_REG_OPB_SIZE_V, 0 }, { IMX335_REG_XVS_XHS_DRV, 0x00 }, +}; + +static const struct cci_reg_sequence mode_1312x972_regs[] =3D { + { IMX335_REG_MODE_SELECT, IMX335_MODE_STANDBY }, + { IMX335_REG_MASTER_MODE, 0x00 }, + { IMX335_REG_WINMODE, 0x01 }, + { IMX335_REG_HMAX, 275 }, + { IMX335_REG_HTRIMMING_START, 48 }, + { IMX335_REG_HNUM, 2600 }, + { IMX335_REG_Y_OUT_SIZE, 972 }, + { IMX335_REG_AREA2_WIDTH_1, 48 }, + { IMX335_REG_AREA3_WIDTH_1, 3936 }, + { IMX335_REG_OPB_SIZE_V, 0 }, + { IMX335_REG_XVS_XHS_DRV, 0x00 }, + { CCI_REG8(0x3300), 1 }, /* TCYCLE */ + { CCI_REG8(0x3199), 0x30 }, /* HADD/VADD */ +}; + +static const struct cci_reg_sequence imx335_common_regs[] =3D { { CCI_REG8(0x3288), 0x21 }, { CCI_REG8(0x328a), 0x02 }, { CCI_REG8(0x3414), 0x05 }, @@ -367,16 +398,72 @@ static const struct cci_reg_sequence mode_2592x1944_v= flip_inverted[] =3D { { CCI_REG16_LE(0x3116), 0x002 }, }; =20 -static const struct cci_reg_sequence raw10_framefmt_regs[] =3D { - { IMX335_REG_ADBIT, 0x00 }, - { IMX335_REG_MDBIT, 0x00 }, - { IMX335_REG_ADBIT1, 0x1ff }, +static const struct cci_reg_sequence mode_1312x972_vflip_normal[] =3D { + { IMX335_REG_AREA3_ST_ADR_1, 176 }, + + /* Undocumented */ + { CCI_REG8(0x3078), 0x04 }, + { CCI_REG8(0x3079), 0xfd }, + { CCI_REG8(0x307a), 0x04 }, + { CCI_REG8(0x307b), 0xfe }, + { CCI_REG8(0x307c), 0x04 }, + { CCI_REG8(0x307d), 0xfb }, + { CCI_REG8(0x307e), 0x04 }, + { CCI_REG8(0x307f), 0x02 }, + { CCI_REG8(0x3080), 0x04 }, + { CCI_REG8(0x3081), 0xfd }, + { CCI_REG8(0x3082), 0x04 }, + { CCI_REG8(0x3083), 0xfe }, + { CCI_REG8(0x3084), 0x04 }, + { CCI_REG8(0x3085), 0xfb }, + { CCI_REG8(0x3086), 0x04 }, + { CCI_REG8(0x3087), 0x02 }, + { CCI_REG8(0x30a4), 0x77 }, + { CCI_REG8(0x30a8), 0x20 }, + { CCI_REG8(0x30a9), 0x00 }, + { CCI_REG8(0x30ac), 0x08 }, + { CCI_REG8(0x30ad), 0x08 }, + { CCI_REG8(0x30b0), 0x20 }, + { CCI_REG8(0x30b1), 0x00 }, + { CCI_REG8(0x30b4), 0x10 }, + { CCI_REG8(0x30b5), 0x10 }, + { CCI_REG16_LE(0x30b6), 0x00 }, + { CCI_REG16_LE(0x3112), 0x10 }, + { CCI_REG16_LE(0x3116), 0x10 }, }; =20 -static const struct cci_reg_sequence raw12_framefmt_regs[] =3D { - { IMX335_REG_ADBIT, 0x01 }, - { IMX335_REG_MDBIT, 0x01 }, - { IMX335_REG_ADBIT1, 0x47 }, +static const struct cci_reg_sequence mode_1312x972_vflip_inverted[] =3D { + { IMX335_REG_AREA3_ST_ADR_1, 4112 }, + + /* Undocumented */ + { CCI_REG8(0x3078), 0x04 }, + { CCI_REG8(0x3079), 0xfd }, + { CCI_REG8(0x307a), 0x04 }, + { CCI_REG8(0x307b), 0xfe }, + { CCI_REG8(0x307c), 0x04 }, + { CCI_REG8(0x307d), 0xfb }, + { CCI_REG8(0x307e), 0x04 }, + { CCI_REG8(0x307f), 0x02 }, + { CCI_REG8(0x3080), 0xfc }, + { CCI_REG8(0x3081), 0x05 }, + { CCI_REG8(0x3082), 0xfc }, + { CCI_REG8(0x3083), 0x02 }, + { CCI_REG8(0x3084), 0xfc }, + { CCI_REG8(0x3085), 0x03 }, + { CCI_REG8(0x3086), 0xfc }, + { CCI_REG8(0x3087), 0xfe }, + { CCI_REG8(0x30a4), 0x77 }, + { CCI_REG8(0x30a8), 0x20 }, + { CCI_REG8(0x30a9), 0x00 }, + { CCI_REG8(0x30ac), 0x08 }, + { CCI_REG8(0x30ad), 0x78 }, + { CCI_REG8(0x30b0), 0x20 }, + { CCI_REG8(0x30b1), 0x00 }, + { CCI_REG8(0x30b4), 0x10 }, + { CCI_REG8(0x30b5), 0x70 }, + { CCI_REG16_LE(0x30b6), 0x01f2 }, + { CCI_REG16_LE(0x3112), 0x10 }, + { CCI_REG16_LE(0x3116), 0x02 }, }; =20 static const struct cci_reg_sequence mipi_data_rate_1188Mbps[] =3D { @@ -441,25 +528,49 @@ static const u32 imx335_mbus_codes[] =3D { }; =20 /* Supported sensor mode configurations */ -static const struct imx335_mode supported_mode =3D { - .width =3D 2592, - .height =3D 1944, - .hblank =3D 342, - .vblank =3D 2556, - .vblank_min =3D 2556, - .vblank_max =3D 133060, - .pclk =3D 396000000, - .reg_list =3D { - .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_regs), - .regs =3D mode_2592x1944_regs, - }, - .vflip_normal =3D { - .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_vflip_normal), - .regs =3D mode_2592x1944_vflip_normal, - }, - .vflip_inverted =3D { - .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_vflip_inverted), - .regs =3D mode_2592x1944_vflip_inverted, +static const struct imx335_mode supported_modes[] =3D { + { + .scan_mode =3D IMX335_ALL_PIXEL, + .width =3D 2592, + .height =3D 1944, + .hblank =3D 342, + .vblank =3D 2556, + .vblank_min =3D 2556, + .vblank_max =3D 133060, + .pclk =3D 396000000, + .reg_list =3D { + .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_regs), + .regs =3D mode_2592x1944_regs, + }, + .vflip_normal =3D { + .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_vflip_normal), + .regs =3D mode_2592x1944_vflip_normal, + }, + .vflip_inverted =3D { + .num_of_regs =3D ARRAY_SIZE(mode_2592x1944_vflip_inverted), + .regs =3D mode_2592x1944_vflip_inverted, + } + }, { + .scan_mode =3D IMX335_2_2_BINNING, + .width =3D 1312, + .height =3D 972, + .hblank =3D 155, + .vblank =3D 3528, + .vblank_min =3D 3528, + .vblank_max =3D 133060, + .pclk =3D 396000000, + .reg_list =3D { + .num_of_regs =3D ARRAY_SIZE(mode_1312x972_regs), + .regs =3D mode_1312x972_regs, + }, + .vflip_normal =3D { + .num_of_regs =3D ARRAY_SIZE(mode_1312x972_vflip_normal), + .regs =3D mode_1312x972_vflip_normal, + }, + .vflip_inverted =3D { + .num_of_regs =3D ARRAY_SIZE(mode_1312x972_vflip_inverted), + .regs =3D mode_1312x972_vflip_inverted, + }, }, }; =20 @@ -616,18 +727,22 @@ static int imx335_set_ctrl(struct v4l2_ctrl *ctrl) =20 /* Propagate change of current control to all related controls */ if (ctrl->id =3D=3D V4L2_CID_VBLANK) { + u32 shutter_min =3D IMX335_SHUTTER_MIN; + u32 lpfr; + imx335->vblank =3D imx335->vblank_ctrl->val; + lpfr =3D imx335->vblank + imx335->cur_mode->height; =20 dev_dbg(imx335->dev, "Received vblank %u, new lpfr %u\n", - imx335->vblank, - imx335->vblank + imx335->cur_mode->height); + imx335->vblank, lpfr); + + if (imx335->cur_mode->scan_mode =3D=3D IMX335_2_2_BINNING) + shutter_min =3D IMX335_SHUTTER_MIN_BINNED; =20 ret =3D __v4l2_ctrl_modify_range(imx335->exp_ctrl, IMX335_EXPOSURE_MIN, - imx335->vblank + - imx335->cur_mode->height - - IMX335_EXPOSURE_OFFSET, - 1, IMX335_EXPOSURE_DEFAULT); + lpfr - shutter_min, 1, + IMX335_EXPOSURE_DEFAULT); if (ret) return ret; } @@ -727,17 +842,16 @@ static int imx335_enum_frame_size(struct v4l2_subdev = *sd, struct imx335 *imx335 =3D to_imx335(sd); u32 code; =20 - /* Only a single supported_mode available. */ - if (fsize->index > 0) + if (fsize->index >=3D ARRAY_SIZE(supported_modes)) return -EINVAL; =20 code =3D imx335_get_format_code(imx335, fsize->code); if (fsize->code !=3D code) return -EINVAL; =20 - fsize->min_width =3D supported_mode.width; + fsize->min_width =3D supported_modes[fsize->index].width; fsize->max_width =3D fsize->min_width; - fsize->min_height =3D supported_mode.height; + fsize->min_height =3D supported_modes[fsize->index].height; fsize->max_height =3D fsize->min_height; =20 return 0; @@ -779,9 +893,13 @@ static int imx335_set_pad_format(struct v4l2_subdev *s= d, struct imx335 *imx335 =3D to_imx335(sd); struct v4l2_mbus_framefmt *format; const struct imx335_mode *mode; + struct v4l2_rect *crop; int i, ret =3D 0; =20 - mode =3D &supported_mode; + mode =3D v4l2_find_nearest_size(supported_modes, + ARRAY_SIZE(supported_modes), + width, height, + fmt->format.width, fmt->format.height); =20 for (i =3D 0; i < ARRAY_SIZE(imx335_mbus_codes); i++) { if (imx335_mbus_codes[i] =3D=3D fmt->format.code) @@ -793,6 +911,16 @@ static int imx335_set_pad_format(struct v4l2_subdev *s= d, format =3D v4l2_subdev_state_get_format(sd_state, fmt->pad); *format =3D fmt->format; =20 + crop =3D v4l2_subdev_state_get_crop(sd_state, fmt->pad); + crop->width =3D fmt->format.width; + crop->height =3D fmt->format.height; + if (mode->scan_mode =3D=3D IMX335_2_2_BINNING) { + crop->width *=3D 2; + crop->height *=3D 2; + } + crop->left =3D (imx335_native_area.width - crop->width) / 2; + crop->top =3D (imx335_native_area.height - crop->height) / 2; + if (fmt->which =3D=3D V4L2_SUBDEV_FORMAT_ACTIVE) { ret =3D imx335_update_controls(imx335, mode); if (!ret) @@ -816,7 +944,7 @@ static int imx335_init_state(struct v4l2_subdev *sd, struct v4l2_subdev_format fmt =3D { 0 }; =20 fmt.which =3D sd_state ? V4L2_SUBDEV_FORMAT_TRY : V4L2_SUBDEV_FORMAT_ACTI= VE; - imx335_fill_pad_format(imx335, &supported_mode, &fmt); + imx335_fill_pad_format(imx335, &supported_modes[0], &fmt); =20 __v4l2_ctrl_modify_range(imx335->link_freq_ctrl, 0, __fls(imx335->link_freq_bitmap), @@ -839,11 +967,15 @@ static int imx335_get_selection(struct v4l2_subdev *s= d, struct v4l2_subdev_selection *sel) { switch (sel->target) { + case V4L2_SEL_TGT_CROP: + sel->r =3D *v4l2_subdev_state_get_crop(sd_state, 0); + + return 0; + case V4L2_SEL_TGT_NATIVE_SIZE: sel->r =3D imx335_native_area; return 0; =20 - case V4L2_SEL_TGT_CROP: case V4L2_SEL_TGT_CROP_DEFAULT: case V4L2_SEL_TGT_CROP_BOUNDS: sel->r =3D imx335_active_area; @@ -855,19 +987,35 @@ static int imx335_get_selection(struct v4l2_subdev *s= d, =20 static int imx335_set_framefmt(struct imx335 *imx335) { - switch (imx335->cur_mbus_code) { - case MEDIA_BUS_FMT_SRGGB10_1X10: - return cci_multi_reg_write(imx335->cci, raw10_framefmt_regs, - ARRAY_SIZE(raw10_framefmt_regs), - NULL); - - case MEDIA_BUS_FMT_SRGGB12_1X12: - return cci_multi_reg_write(imx335->cci, raw12_framefmt_regs, - ARRAY_SIZE(raw12_framefmt_regs), - NULL); + /* + * In the all-pixel scan mode the AD conversion shall match the output + * bit width requested. + * + * However, when 2/2 binning is enabled, the AD conversion is always + * 10-bit, so we ensure ADBIT is clear and ADBIT1 is assigned 0x1ff. + * That's as much as the documentation gives us... + */ + int ret =3D 0; + u8 bpp =3D imx335->cur_mbus_code =3D=3D MEDIA_BUS_FMT_SRGGB10_1X10 ? 10 := 12; + u8 ad_conv =3D bpp; + + /* Start with the output mode */ + cci_write(imx335->cci, IMX335_REG_MDBIT, bpp =3D=3D 12, &ret); + + /* Enforce 10 bit AD on binning modes */ + if (imx335->cur_mode->scan_mode =3D=3D IMX335_2_2_BINNING) + ad_conv =3D 10; + + /* AD Conversion configuration */ + if (ad_conv =3D=3D 10) { + cci_write(imx335->cci, IMX335_REG_ADBIT, 0x00, &ret); + cci_write(imx335->cci, IMX335_REG_ADBIT1, 0x1ff, &ret); + } else { /* 12 bit AD Conversion */ + cci_write(imx335->cci, IMX335_REG_ADBIT, 0x01, &ret); + cci_write(imx335->cci, IMX335_REG_ADBIT1, 0x47, &ret); } =20 - return -EINVAL; + return ret; } =20 /** @@ -903,6 +1051,14 @@ static int imx335_start_streaming(struct imx335 *imx3= 35) goto err_rpm_put; } =20 + /* Write sensor common registers */ + ret =3D cci_multi_reg_write(imx335->cci, imx335_common_regs, + ARRAY_SIZE(imx335_common_regs), NULL); + if (ret) { + dev_err(imx335->dev, "fail to write initial registers\n"); + goto err_rpm_put; + } + ret =3D imx335_set_framefmt(imx335); if (ret) { dev_err(imx335->dev, "%s failed to set frame format: %d\n", @@ -1184,7 +1340,7 @@ static int imx335_init_controls(struct imx335 *imx335) struct v4l2_ctrl_handler *ctrl_hdlr =3D &imx335->ctrl_handler; const struct imx335_mode *mode =3D imx335->cur_mode; struct v4l2_fwnode_device_properties props; - u32 lpfr; + u32 lpfr, shutter_min; int ret; =20 ret =3D v4l2_fwnode_device_parse(imx335->dev, &props); @@ -1198,11 +1354,14 @@ static int imx335_init_controls(struct imx335 *imx3= 35) =20 /* Initialize exposure and gain */ lpfr =3D mode->vblank + mode->height; + shutter_min =3D IMX335_SHUTTER_MIN; + if (mode->scan_mode =3D=3D IMX335_2_2_BINNING) + shutter_min =3D IMX335_SHUTTER_MIN_BINNED; imx335->exp_ctrl =3D v4l2_ctrl_new_std(ctrl_hdlr, &imx335_ctrl_ops, V4L2_CID_EXPOSURE, IMX335_EXPOSURE_MIN, - lpfr - IMX335_EXPOSURE_OFFSET, + lpfr - shutter_min, IMX335_EXPOSURE_STEP, IMX335_EXPOSURE_DEFAULT); =20 @@ -1329,7 +1488,7 @@ static int imx335_probe(struct i2c_client *client) } =20 /* Set default mode to max resolution */ - imx335->cur_mode =3D &supported_mode; + imx335->cur_mode =3D &supported_modes[0]; imx335->cur_mbus_code =3D imx335_mbus_codes[0]; imx335->vblank =3D imx335->cur_mode->vblank; =20 --=20 2.51.0 From nobody Thu Oct 2 15:35:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5447F1A5B9E; Mon, 15 Sep 2025 06:40:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918427; cv=none; b=mySPuC5IBLdn2HZoxXh2OFWNm+yyMAhIrS6ZSxv+GnCK2glfDHd1tx2TJjaEmM5q93NUWaodxsEMhCPfM4j2QOq7J9mbPGbx++LQb6vqTiRwZhHC6ZqHxyyqsfEMYKAmM2Eh/0FS3AorqVztJYPY69HWBXi9bmd8bJoz0b+fXwM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757918427; c=relaxed/simple; bh=1oATAxVL9L8+W4Wm3xhU3r66jDl8E04elcLrcxGUIqw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Swy0CldI4Li9POhlx0l/P3SH+uBZyrI3lUc6xMdgUa9sWgEVKQi3w43NZpol6NmAcoE5TtmusJx7viqTRFw0bDWsAboFaDpgE5iAkMDwXbk1BQzuG77KN6p0IBEzWPW9F3nAPNhlQTXm1uTACoKlPX3GzEQi3nzwegTESG9XorM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=SOWsV4v3; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="SOWsV4v3" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:2dbc:e233:e1b4:15e7:45cd]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 61A5BC71; Mon, 15 Sep 2025 08:39:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757918346; bh=1oATAxVL9L8+W4Wm3xhU3r66jDl8E04elcLrcxGUIqw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=SOWsV4v3s9N3Dr5pzUODuvmtOkJW63u83wkDuwuPQqKkF/esIPz6fp/eA6LAlolIo SUfRI6pNuqJsew1Tp2FBEiRTMtDGBPmOgCN/ZIpKCJzYj1t5sB63OfWR+KZap3+8B+ hBn0Pwcy14JHK9WCyPIgsS28N7cCuSb9KQUJ3vaY= From: Jai Luthra Date: Mon, 15 Sep 2025 12:09:14 +0530 Subject: [PATCH v3 8/8] media: imx335: Switch to {enable,disable}_streams Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250915-imx335_binning-v3-8-16ecabf2090d@ideasonboard.com> References: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> In-Reply-To: <20250915-imx335_binning-v3-0-16ecabf2090d@ideasonboard.com> To: Kieran Bingham , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Tommaso Merciai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3419; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=1oATAxVL9L8+W4Wm3xhU3r66jDl8E04elcLrcxGUIqw=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBox7SWA1eJ64lhrSMyPgpk82+aL4IDQKaIJJ5bO c4z/bY40+mJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMe0lgAKCRBD3pH5JJpx RUpsD/wOIEEjjLU6ju09e/DaXSkUC963kgjfoXImdsa+OknPcGwx7N1sKmnIIfPusA+6odip+5b YFQwMqrCui8acoANCajSHi/x/zBRchmA9XBC+U/9/gN1IAxj7ejNbTosDOKNEkg3uyGKfMqd84r JO4XxUVJGP0BJPRGOzcC4lP64ZK8PvDJbS+cSuFYoe3rp7sSES+pkrC5N5i/+/s6F4/vHV3eDSB fng06pwgIbVNuyqjWlCPdiGb9DxK8UKZJnYK1iolxtglwNV/sdPzeaUkM/y6rWiWM3ijbxG5Q5y KMotxWLa0MKA0nPTQltspr1DPZ1Wv5dP8YzSLgnN5ssiXHOAt7QdMA8hPlLEAxDtoEhqqbhchPk aLhGTDxB1LvQjR6XQQYkGYd2iUkSdQQc+Mm+OxxZiml2CXgjAlvN+GhC2W5kJrhzTBOKPwgr/m9 OKjMXjhmqMCUCIdIYK3/fOC3KtDOkXT7G6BmHKP/qWA4iVDqZm0wCV5oKAYmRBCmKCiajurWrn3 QIM/hRrHfuci5TewvlPCZ+hK69aM4OjFyxjEO84DYjIVc02cPo3LBlGTWdxoQ9HXU/SJC1ObL6j VKStLlGWwk4O1l64K/NcjTNolZVGloV80d+sD0Sgov6Do6gZ4NtDXiMnvkLZaWBG/af0zyv4vx/ eRlIdIhzDuxHbfw== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 Switch from s_stream to enable_streams and disable_streams callbacks. Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- drivers/media/i2c/imx335.c | 53 +++++++++++++++++++++---------------------= ---- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c index e320c7e6fcede823bd67bae617c24196cbbed8c6..ebdd6ef534499a1d518977675c1= 6a78c31c71c6d 100644 --- a/drivers/media/i2c/imx335.c +++ b/drivers/media/i2c/imx335.c @@ -1019,13 +1019,19 @@ static int imx335_set_framefmt(struct imx335 *imx33= 5) } =20 /** - * imx335_start_streaming() - Start sensor stream - * @imx335: pointer to imx335 device + * imx335_enable_streams() - Enable sensor streams + * @sd: V4L2 subdevice + * @state: V4L2 subdevice state + * @pad: The pad to enable + * @streams_mask: Bitmask of streams to enable * * Return: 0 if successful, error code otherwise. */ -static int imx335_start_streaming(struct imx335 *imx335) +static int imx335_enable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, u32 pad, + u64 streams_mask) { + struct imx335 *imx335 =3D to_imx335(sd); const struct imx335_reg_list *reg_list; int ret; =20 @@ -1099,37 +1105,24 @@ static int imx335_start_streaming(struct imx335 *im= x335) } =20 /** - * imx335_stop_streaming() - Stop sensor stream - * @imx335: pointer to imx335 device - */ -static void imx335_stop_streaming(struct imx335 *imx335) -{ - cci_write(imx335->cci, IMX335_REG_MODE_SELECT, - IMX335_MODE_STANDBY, NULL); - pm_runtime_put(imx335->dev); -} - -/** - * imx335_set_stream() - Enable sensor streaming - * @sd: pointer to imx335 subdevice - * @enable: set to enable sensor streaming + * imx335_disable_streams() - Disable sensor streams + * @sd: V4L2 subdevice + * @state: V4L2 subdevice state + * @pad: The pad to disable + * @streams_mask: Bitmask of streams to disable * * Return: 0 if successful, error code otherwise. */ -static int imx335_set_stream(struct v4l2_subdev *sd, int enable) +static int imx335_disable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, u32 pad, + u64 streams_mask) { struct imx335 *imx335 =3D to_imx335(sd); - struct v4l2_subdev_state *state; - int ret =3D 0; - - state =3D v4l2_subdev_lock_and_get_active_state(sd); - - if (enable) - ret =3D imx335_start_streaming(imx335); - else - imx335_stop_streaming(imx335); + int ret; =20 - v4l2_subdev_unlock_state(state); + ret =3D cci_write(imx335->cci, IMX335_REG_MODE_SELECT, + IMX335_MODE_STANDBY, NULL); + pm_runtime_put(imx335->dev); =20 return ret; } @@ -1249,7 +1242,7 @@ static int imx335_parse_hw_config(struct imx335 *imx3= 35) =20 /* V4l2 subdevice ops */ static const struct v4l2_subdev_video_ops imx335_video_ops =3D { - .s_stream =3D imx335_set_stream, + .s_stream =3D v4l2_subdev_s_stream_helper, }; =20 static const struct v4l2_subdev_pad_ops imx335_pad_ops =3D { @@ -1259,6 +1252,8 @@ static const struct v4l2_subdev_pad_ops imx335_pad_op= s =3D { .set_selection =3D imx335_get_selection, .get_fmt =3D v4l2_subdev_get_fmt, .set_fmt =3D imx335_set_pad_format, + .enable_streams =3D imx335_enable_streams, + .disable_streams =3D imx335_disable_streams, }; =20 static const struct v4l2_subdev_ops imx335_subdev_ops =3D { --=20 2.51.0