From nobody Thu Oct 2 20:44:51 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 68F512DE711; Thu, 11 Sep 2025 08:15:01 +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=1757578504; cv=none; b=vAq7fQHhpxNPJu7rG8Sb9bSVfQ+/c83H94vRKD8Q0gNWJDzXxZ0Weh+m6aRBtl2/lp4X7+nZyZpazy0tAeOq+9048A0XHT6TkeqIxQnXQ+qwoF5ENybMLSxKYfB8OTwFg2AcQDe2aqD00L5jFkPdbLAMFU9uy2uJNqqUq/AltDk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757578504; c=relaxed/simple; bh=f554b4UEqiVHHa37Elp5PwAy1JMUtZkiY0I7rFW4grc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=exCymbKfIj0tnXm98htzNE7JCDnNP6yLMWIF930axB49Q/+re3caI3N0qZOXsNKfIfuJxfr5d3S21IBfLhLjDsxO7Z9huS3qCa9dL1J4LLbg3Ad5uRM3WYnsS4kSOlrR4XFKQRr9oImP2MkzAmRXsjqnUVj4xa4hywvY0DYn0cs= 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=tHyOc/Ht; 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="tHyOc/Ht" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:c9e9:75f9:f434:33cd:e4fe]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id BBA5D666; Thu, 11 Sep 2025 10:13:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757578425; bh=f554b4UEqiVHHa37Elp5PwAy1JMUtZkiY0I7rFW4grc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tHyOc/Htzc0wh7Kv+mJYfNDql8X38bwroyxVVWUBIidTYQhjtIsNX7cCqSspXPeex J74kgx51i58tQ4GgFHHeRlBFHM86YjqHhCqY56YXUJMz1FQbdC4ZZQsS9N58Ot8CCU GbAaHLL1DB5EJpdRXdYuCr6fXLIT3l2EZKaphqN4= From: Jai Luthra Date: Thu, 11 Sep 2025 13:44:17 +0530 Subject: [PATCH v2 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: <20250911-imx335_binning-v2-1-30a28df74df6@ideasonboard.com> References: <20250911-imx335_binning-v2-0-30a28df74df6@ideasonboard.com> In-Reply-To: <20250911-imx335_binning-v2-0-30a28df74df6@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/ZANAwAKAUPekfkkmnFFAcsmYgBowoTsEC5vhjmt+RG7EUnmsJfEX0MMD5Wa4biyR eguVThAZ2CJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMKE7AAKCRBD3pH5JJpx RfteEACuwd2eKwl4Rr9wEPP9QPXabn9zh42r80ADXFZyKn4baEcbuGkfDNwaARizndy6BxnaeHs UI0XnpfJCpavhoqsfsZTE/9yRcBQJYAYdo7v0bIrKUMeSw+69P0ChZFJfuBybDJXD4vaoXashx4 wdqNHSQb5sR8FPl+HoHbZwcHkScbB3HQ7MdafIDKaVYGPhzOpsnBywA7OFeiipGvuvdNMEVm9mS XloF2rynsnO24RabUn790/yc6HXmrXE9xT+dha4rt1jwBQi5/dppWKwmw8OnqPYfeD16J7TcIoX YLoaOZWOGGN3+hRG/e+YfADBYfO745r1CbgdcAQoB7ymk/v/ia2y4LhApUrHFAGlfxRYDWqGy+b I103DCxy32tY8KxuG3To1HCewvNvObXPP1vb1zVZDD1Cl37QyFwlFXFq/EnJtMmNHcJaRF6zL1U EKXdw0WATZauhKHwXsjEE+43qG66tl9h+FWgZ2N1urN6YG256rSxBmuZj7zotfmWxisJtJhJPvp PdrXZV8dJ+gUmBjvpaexbEKK6TaHgIWZGdzc9TmvoQ6tgbO0O/W65ZY3uzbhbFi9zadXEoiYixe M7D0nHo3f6KLycRW0RfXj+O1pxpMXhbGRD9g/W8LMwcJ9/Y4N/e8k6rApKpP4rD3dnagcVqlPRj zsBL2Z0xtAmP4vw== 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 20:44:51 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 0C32E2DF13A; Thu, 11 Sep 2025 08:15: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=1757578508; cv=none; b=W/ijnRdeo82dHj4owNBQSysaS6ksfnQo86BEDIXqHEN2hkpQwXfnweH/7ontQKJbL5VeYBVfaXzjo0sRhvGqWLfzsQ9qpctVAnS69uLqb6cVpqADrUu9cnOPX74xJc6N3t93944+elzb+99sDpDGqmGe9KH50BlLn3WSg7Elvjw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757578508; 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=fJO8X61uMrZFv/JXKmzg6K2+dF/KMLsNUodX94cmjx9cKbaw0NYcWuivUgEyNKJjTHJk+DYEvWAdubR8hHGxV3ITJyTx3IeX/p+UQBr4enR9GY7fSqhOXS7SBfTvPBk88fSr86j05el4TjtSZAsk+S3/jOhXOoX9SBvvvnCzBzM= 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=JjaTZJR1; 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="JjaTZJR1" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:c9e9:75f9:f434:33cd:e4fe]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id F154F4A4; Thu, 11 Sep 2025 10:13:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757578430; bh=vIMdOR/aTmSbXFty+Gnb3QGoox1gNusEysAjzBF+Bj8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JjaTZJR150MAQT7zw4ql6oKsIfRxuYczfx8DRYfLseOL1FWM3o3NO9EQ+JLDBkIXF FUPZ85Oxh29jUa5rYtcwYpM/Y+O0dVhwsiA/zW6rBFx21Brkja/wbfXzlhKJ+jQxpG ufv0dYF2OOuPs6FTzwCPTTplmWtgy+6cvz7w5ueI= From: Jai Luthra Date: Thu, 11 Sep 2025 13:44:18 +0530 Subject: [PATCH v2 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: <20250911-imx335_binning-v2-2-30a28df74df6@ideasonboard.com> References: <20250911-imx335_binning-v2-0-30a28df74df6@ideasonboard.com> In-Reply-To: <20250911-imx335_binning-v2-0-30a28df74df6@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/ZANAwAKAUPekfkkmnFFAcsmYgBowoTtX3RqopXRIvE1ToDe3QkUdp4OOP3r60Rdk KHBTCNClA6JAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMKE7QAKCRBD3pH5JJpx RUJaD/4tWcTFzyyocHeGwnOPs+l2Vl0w3AVo7zCU3grHmFE7KL+jMtL65057IeaxlFNBxNHgQCc MO9Bf8rrfxrU24HiLoGHMoHa8NQGpNekH9aOT+57v0JEfFOo2P+mVLyxVvEAVfQK4yLvJElex4h M49eYtMhIbpPLuUHeU7oOLgdsjxdoe8mDCcmkMXeXmKf+oEtq+w3BC6SUuoV6qIRx5akyHJA3RC CT7mEgVi1GBgjKUiuArFZj3CUjJnAbzq8i00eK2sFQ3fDY5jGx0gAu4CQjLxKpDmAr6pG1iTWy2 VAAlNHoIrASeLO7Pznb0q+g6/wBRvdnQ7MO/pozs4DUl2PCjn7XjWA9WtZ5fvLdEW9r6jFAVtIh gvC57/IzfozdRoYbhM9bUokq8Q3Fa4iVj1qaHfg/NT7C0YaZlSYMW5YLRdgoQR1/nCdS4wUvxgv pqLb1K69xPZ4LSU7PrS5xX0eRrbdgUM2wjbwiyhpd+VKD5INTc/keDKTi8e7h8K9sCqOwQachcb 9raNHJW6JrR2nCk2d1PMwq/8RZ4+KVLqM09QEXVTsZvDEt41U4/xHh/RRzdSbpJGwriWir/52kV Ukalgpb8Ohl643ZZfWJZMwvv8+mkcGTArUQgFrpMGmgkw8awrHJkJ2JhN37L+SqrT4ULvr/A8M4 HHi4jLQirlRWnDw== 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 20:44:51 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 C887D261595; Thu, 11 Sep 2025 08:15:13 +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=1757578516; cv=none; b=sV72aEUv75Ux+ZJXKt81WWvTp8Z3+/K7wWGijCVNuXcDIjJPn92n3DTNegSrw2yTEXWFCmtBW1UTmJHdrHgcdXer4g5czbVkRcufIM91s6XKldejRlje5THDzWdONUiFoMeNOyjqnLsrLXQQOltBzFDXBY5uSbzIct/XNrkrJIU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757578516; c=relaxed/simple; bh=SODWfKHrsBZ5W0y5gSSZAR/KbjGtpSDwc8JyvXaGars=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XlaQbyibwmONi1m0jF81QJw6QmO8nzl23m/qW9KlDC0kIP63VeKrThTsGvFoU1R9+DKgaOEaG9lH4STzD6IjwnSEegxZ/CYd6F+AEaQBx4/cJGPRGCxZGgBOmPBqNQOXTI132yzB+qW27iefJAeUU+JTuH833t52beymn80PyLM= 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=Z8q1JUL5; 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="Z8q1JUL5" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:c9e9:75f9:f434:33cd:e4fe]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A31ED4A4; Thu, 11 Sep 2025 10:13:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757578438; bh=SODWfKHrsBZ5W0y5gSSZAR/KbjGtpSDwc8JyvXaGars=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Z8q1JUL5eZqUCKQZ84WVsKHdRMGVc5Vnjc+b0dRmqWGNh/1Qpq/d+EhRprBFF9B1p LapDL5Ha9px78K5YS5Jm2gxSBYeTxRtsyasXnxP7cRftyxKmMsyjVsLe3cYiduQ+dN t0yfcRMdMpxOphepYTR8q7xzrOqycpL7lVeRhRf4= From: Jai Luthra Date: Thu, 11 Sep 2025 13:44:19 +0530 Subject: [PATCH v2 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: <20250911-imx335_binning-v2-3-30a28df74df6@ideasonboard.com> References: <20250911-imx335_binning-v2-0-30a28df74df6@ideasonboard.com> In-Reply-To: <20250911-imx335_binning-v2-0-30a28df74df6@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/ZANAwAKAUPekfkkmnFFAcsmYgBowoTu3Zwdpj9/oTaHOt45kabP1ltCZUMeDiLyU i5kxvlkLa2JAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMKE7gAKCRBD3pH5JJpx Rb7JEACM5vpVZKTVQFQOvi1BmldpqgeZlg6/DUr5qEsJse5v898yilbFgZaaPTiRAlkE0LGCpx6 NNf4LX0AS+XmeENotTnfbKzRSwLT8WQfhCBpe0r5xDXqa7bV8pb97d5Z/DQU5kbB1vaHmHVDAFW p/sgDFbADK3G+q7rmZuMshzMnlvF80RM6zydBx6iO0YAeTRdOcli/g347p31HfUPVnXsO4Ak/D1 GC5dKDVVUgTguewMSdZVVzy7ulSclQfnPH+PX8aRD/lSwf0ik+JN8LihlZ6SUrpQ1EULfe06zib /JJAcej8vgZuR1EIuOo5zl7r9MMGEsa4S2BIY/MLkLF+gOvHT65ww0rMhtaATzbFF/6DaVxjIJZ +YPaVx/o01o/A6AdRqjtKF5JXL6JqdQSkmPCJrf4K3T5Ih72V9AyGzgtdn71a3aLOIF8KXgUKQt 1/UME5kwVptXD/tFgAel99wFvrdILYtNnwEVCRXZupGMX75VNtLr/KVxSGp39x2bW8pYC3KRVDI v5h9XqA1IBNoWi5QPDKOv1HTBGrqj3w0kVfjMktQoBdtoFNxvc/q3h6qByFqqV1XmnMHleORCNZ jfLCVjo51Np1v9LaE3RahYGWlu9szxtWm4kkw/Nb2/VpecmnDXmnHtZNIv9ujaOzQ15OnG7Wo+G KvuZ1MgMp/3XqlA== 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 20:44:51 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 67A8C2DF12E; Thu, 11 Sep 2025 08:15:20 +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=1757578521; cv=none; b=JsBfvx+uq+3XKb4S/a97jraKw5DGYdsS8qsCQZzLRL/32g+B+ioX4ZCAvjm1CVXlUm3oFm+F1bFk2CX1XVZCf/gJ4TIQDkdtzdl9JXUFaUzvdWTZExVbHFDLBx2bPnKM8XxIFoQImgLdOIqu1uX39Ba5FnJ6ZWLQ4eWYtwT1T5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757578521; c=relaxed/simple; bh=aZlKkf1i1h0XvF+Ov2evMQQ/nZrBsd8Vt1HWgTXZ0yg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Exdv2/rBkphCFf2espivxoQRcYJSiIvPT619ve8HI1wuCikBnOiyDjwGtzupPtTkj801yMKxUa8a64tU2DJKyP2uTYGrJKxOxW44nYIG9KL2baR8SKoKCJCCTMkOaN4atiUlcUGKtjl3ddyHzAPyqps9sPvzToTnTMH5aic3wrI= 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=eVG6lYEV; 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="eVG6lYEV" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:c9e9:75f9:f434:33cd:e4fe]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1799D4A4; Thu, 11 Sep 2025 10:14:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757578444; bh=aZlKkf1i1h0XvF+Ov2evMQQ/nZrBsd8Vt1HWgTXZ0yg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=eVG6lYEVTf3CYQNvacSJWT06i1X3AZ82K1fCo/1lqppWjglc9/jqvpnp/pXmKs7qo p78Lum/o/7XIwFBqG2qOFdUXPfcpGN6e+ljLyHmC5XPbH6QbknamOaN35/c9IlysPS v3MOL6olVpoYpex/4hn3sJe4Kp6n+dnyTfRlHOXA= From: Jai Luthra Date: Thu, 11 Sep 2025 13:44:20 +0530 Subject: [PATCH v2 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: <20250911-imx335_binning-v2-4-30a28df74df6@ideasonboard.com> References: <20250911-imx335_binning-v2-0-30a28df74df6@ideasonboard.com> In-Reply-To: <20250911-imx335_binning-v2-0-30a28df74df6@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/ZANAwAKAUPekfkkmnFFAcsmYgBowoTvmPsigYGYpX0OsrT6QBfkfkOxVRcmZddeO xUKkb2TdROJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMKE7wAKCRBD3pH5JJpx RVRRD/9h6/GTmiPiMPrw9GBVM4Jk7LVJufG7l6q95Ng89wEitADtM5Iqil7ypVp5JxDVrBUEBvO 4v3uRsGVd1tGT603v6POmBAQKoUEfwF3GZ8CYOgWVo2cgcdic/xnJgoZmWOPGEyE61LsREeWvi3 FiK+XrOVcf35WTXXA9rkhh/klDtm+A3LOLMjGPi63VFubN1/dJhPNRtV2mXtswKYcVGofMkATxf IDGXYn9Mi0HIntgoRebxHWIpchzd8oC8bZRbo7B49JqDWmLd8ypm/+PJxglEOBCB4ajZ40F1B0i lvn+gjI8AUiC/P3Lfk4J51tSBVcUZsNCp48+fu/PscXVsiSEZ06ASOUQPcyr5GpATcLjPOO+2gK Gfd0XT3UQ1XME8EgU2oK4Skdc6rmPKQdGVkuj6WYs35kwP34or9Uy8bFoVu9taBJwCTecymyfMN yN/IWGKNf5p4PMk2RQixPDuhK+85vjHn4yzNv9RGZRqXSIxgnfLbY8ZIc7nDR3Tpp6gizTj8ppV hOTxkBxhlw1b8C5NhjlTD6IYfcIRkQgdnzC+ziPGvoAtbTcOsQ0xOweyh4mY8maYoVuHibbzpY8 VyULsenXUGm7XeEUWPksooTKfa/eih8gkRNd2h04IP8UxPyg6ZXD3S+rg3Ms/A1Ux8BQSaZPLR7 iosvMisgc91t56A== 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 20:44:51 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 31F1D2E2663; Thu, 11 Sep 2025 08:15:29 +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=1757578531; cv=none; b=Ho4z2DSHuMag+UUSqoo/6CmhksidnJ+G8hB1yfph8gbs5QuVAX9kBJthiF3u5wIOfmV289RvgENibDy1XRmVFq3UedOaOh+5/ilbnO3vo6rQsH3vi+5/G4lEHlCCzmgvxvD0dteE+z8oOUh3R70yXz/xEuCQ/ysZju4ofcFkFoA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757578531; c=relaxed/simple; bh=bLOkEQEv8lxgOKj1znhro5fYwb+dRvfhABBzfwGQTEM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KBSuQSH9JqqMdzPSTZWk61GWkjPdYk/SHVn9iPhWgvAV9Ue3ASIgKNhvu9R6R9oDWP0+yc0HFMkw1nlfG3jT3D61tJ8xYhmaRltHuKPK+FW1/NFl/DXx+ZJbprEL2icO3E43OaGzqwcqfHuyhTieFNXxf5L2vRep6clLzH5/znM= 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=nz8btcSD; 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="nz8btcSD" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:c9e9:75f9:f434:33cd:e4fe]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3FA744A4; Thu, 11 Sep 2025 10:14:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757578453; bh=bLOkEQEv8lxgOKj1znhro5fYwb+dRvfhABBzfwGQTEM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nz8btcSD5xUzc2y5rnRnOKyvzAYcrujPCiYkVWmk5hXjwC9lSlODTEnmvjopuUzOu h3u+ZG8InJDN724BFZO7eQh5Oji9Zh0+CvJFdL+sHyu3qAlByyd+JKkOdQ4pfQa99f 4tBzJeDT/JZiacEqDBato34xG3rMj+j74GT+ts28= From: Jai Luthra Date: Thu, 11 Sep 2025 13:44:21 +0530 Subject: [PATCH v2 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: <20250911-imx335_binning-v2-5-30a28df74df6@ideasonboard.com> References: <20250911-imx335_binning-v2-0-30a28df74df6@ideasonboard.com> In-Reply-To: <20250911-imx335_binning-v2-0-30a28df74df6@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=3633; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=bLOkEQEv8lxgOKj1znhro5fYwb+dRvfhABBzfwGQTEM=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBowoTwSWRqlbkm0BcDEx3dk//gQy0tNcw2lZb98 KPmJkn9/nqJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMKE8AAKCRBD3pH5JJpx RQs2D/42bThp7GhNuIuF9mWXc8Cm3hzPzTRRHvCDsB4NBoRXi9ZBFpSx1am3/83soRcEvhKtgys HIAFMRCCkbZm5aqFIDq8/Ru/K2ERCWjFmqHyw43YYfkApHKhaEJjBaDrqFv+2Hs8pAU/vW6Z5X6 +xxPHOh8bzlvVt7oWiforoXYUD45M1oSYqxvvBrxkN034UiULa5l/nWpCCjUwKq0cMFGE0kLE+s O1G2Uv2lNCDdnSvQpUsj3MoOLIT/QoLQx/hdgnOPRHTlLfliMDXW+YTNZIHhA8ot0xB9oDzcvqY Ga3p/mU7gW4pBPvzuBdOYcTygy1wL8F8MX23gZh9Ejh2pbrVr79PCd8+phSWlhpKnx0T9824pZh kLdH9JTxl1pIzfgy06PxUJdND1Ry6YD4F0R1ZJ3KHxtFcH2softDdJRjyYa8shN5jGlHLRFDi6Z fNpoAqT3ZR83c27brVLKDy84tFVfL/dAsfXRlzk+IQTzV5kKuiUtrroUGAuD7M/9y00MEXy1PqO t7kvz4JiPNVqDeRN7f2okIb9DCxswCgOPZZqZayHKUReNd4OyWTxa2SmQSrSveqgOA2jVQ3yV+1 vPL/L64gXf9C5kVM5qzqfoSyDMvfoj2grn+iAz9OuTF6WW7aG6Hqq19uukLDamQwxHTBPlq/UZt AnX7ol9oE1MAarg== 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. Signed-off-by: Jai Luthra Reviewed-by: Kieran Bingham --- 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 20:44:51 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 80CB02DF158; Thu, 11 Sep 2025 08:15:37 +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=1757578539; cv=none; b=hyRuTjscLJz+iyDWspRAzGz4ZewJy+3clWC0qx3+sKwSDXRq1TTrr6XAyFjO/7mfNOrIRsTQ9d59NYW6GLQjK/aqC7J0B6H7Z+UVZoLEvcA5odfMNrk411CKTmDLhVp3Lf43Quduw+eIlG1D6q6wAjf4BLsHBSzUgIvDAEUGT+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757578539; c=relaxed/simple; bh=gMvZYVz30eqvJbIVDZFXZ6aZlKWcQHZzSXmlx43ny9E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BeVWmJGDpxjY3cd31M14pe2pDa2mWjICWOEynu9f8cr3W8hu5wXKYQHiKcAu4jv68RfFoSz0KFaV9tBuBwitadZbq2WI2ORhSTbOOr6oyvbcOWzzPRRzbCxbyjThf2agsnURPbt/QXCM7DFAaNPyRAd/2vOvd1hXJCsrcTRtxQg= 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=RSlCGJ+c; 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="RSlCGJ+c" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:c9e9:75f9:f434:33cd:e4fe]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7721D4A4; Thu, 11 Sep 2025 10:14:21 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757578461; bh=gMvZYVz30eqvJbIVDZFXZ6aZlKWcQHZzSXmlx43ny9E=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RSlCGJ+cVoqf1Y3ZZmb0XCYEgZdeZAg+KraSv+e97MUvx/48sP6sZshGgPcKD/LGP TWYOEBaX7qxv5YEgZKJ1gyrnVgoApCNeQWObUWGmyXnAbCNjHXz9S7dObjVoGYNW1K xPSKnIJNkweqoe+JOa1k1581Hv5BHTbddmgyHW6w= From: Jai Luthra Date: Thu, 11 Sep 2025 13:44:22 +0530 Subject: [PATCH v2 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: <20250911-imx335_binning-v2-6-30a28df74df6@ideasonboard.com> References: <20250911-imx335_binning-v2-0-30a28df74df6@ideasonboard.com> In-Reply-To: <20250911-imx335_binning-v2-0-30a28df74df6@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=7112; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=gMvZYVz30eqvJbIVDZFXZ6aZlKWcQHZzSXmlx43ny9E=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBowoTxE+yYnhbREwNWEoIlfutl0sjHOm58NhOS5 AHKQ+/7g+aJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMKE8QAKCRBD3pH5JJpx RV1lEACmf4XJTwBm0o47L6Z6hZNl8lMkwy2eikrtYaqPSx1wjqpLkePSSo1p8Tg54a09iMBTtt+ f9oK8D6Rmhtkz2hpylZnSqbnkjo+mylkdkd7odXa0elQoMO0WqO7qqAibI/3LB7zGwAPU++RWEa uyqZQwcEsTdVy5XGY+lbJtiiknyozNU2IASiQgNC9YPMB74jxgoUdADYyte1qjzMDaN715c4mQG olDM6L4ZY87W6/FROKugvj/9VaVRfJBqe6Ux+edBenZBFaiy8DKAErwWkrNpedGp79a9NoWb153 uGcj5T+PfByKDSLiZ6EtCJidjvIk6rjqJW0oYuYPeDs53nUrqwxqWh8SqM7wcFC2/zPwxEAg31r gPMvmb6/cnti48dTSVr11kg4UZLYw2rwxU7N5oLgOvNALrenN85GqFc5ll0oujdicmkPRkHvJdp nwuyS1AGwjRH9aKAP8rI3WIusX60UqjbDvvBCo6ZiaJ3eBDxKpeSN6rft9xiUAAa8pW/xkLdzER MfCgHOvyjJc80+NKfdWBm4Zq+kiDdbnlvuI5Zn0nke6OhV04s3YxnL+qV33xl8KZVghu4GYzQuT CtBm2VzHtMw49e5Rl8e9600/nGp8sEdu4nMX3fr1hW2T9pbHHdVLAw+SdWOHmeYlf6Q30uPI5MU fMFwkFy+jh3dTmw== 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. Signed-off-by: Jai Luthra Reviewed-by: Kieran Bingham --- 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 20:44:51 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 C8D602DECA1; Thu, 11 Sep 2025 08:15:46 +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=1757578549; cv=none; b=NLyc5VfmmcU7WQpPT/Nm6oKYgYU2Ex/OCRvwjKSkO0g594odZJoSdMHQ7iqKwF/0pEcgWcd1vhzjor0/h0xppI6zLKBHAVqw3Rm4alnUzDlBK3YMHKD0hQM7ngYWy6eBU+OA0CCCgepelqJQkToOLTVRaftWHfGg9viN5xD0z58= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757578549; c=relaxed/simple; bh=ZTldZJg3fSukQrYzsfoKKMopLHDHUG6BHoXEM47d4Dg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dTDuufA0qVhJs/84l00ca1FoQOk7Aw3ktJlFafLTHPwqBHEpz0dGNAmPrY55tRYU7l9/tyk5xhl7vUIG99namoYq+gt+trvF8VqVN7F+XHY+iAJUzTkUSXyOTBOtPZH37xEFOW3Y+0N7td+36++bFLuywM613xmXmZpd0FPH2Iw= 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=k04AlcJB; 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="k04AlcJB" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:c9e9:75f9:f434:33cd:e4fe]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id BD37A4A4; Thu, 11 Sep 2025 10:14:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757578471; bh=ZTldZJg3fSukQrYzsfoKKMopLHDHUG6BHoXEM47d4Dg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=k04AlcJBc0pZH5GV8y4wvAJT9mghTY7WmhFOyiG5BPdzOHpX/9qKhOnyqE5cyxaNQ Bcc0MwePX/Gt8lLNtTqvUtW0DRS5CssO69BjXXlVA2WCNWdWJxmWjkAIpMPRFEc4zP I1MPiudpyIaEZ+6ZCzD/yeqexEzOmJxh7/NOzbWk= From: Jai Luthra Date: Thu, 11 Sep 2025 13:44:23 +0530 Subject: [PATCH v2 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: <20250911-imx335_binning-v2-7-30a28df74df6@ideasonboard.com> References: <20250911-imx335_binning-v2-0-30a28df74df6@ideasonboard.com> In-Reply-To: <20250911-imx335_binning-v2-0-30a28df74df6@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=15617; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=ZTldZJg3fSukQrYzsfoKKMopLHDHUG6BHoXEM47d4Dg=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBowoTyXIoHsXINfi8MkIQlnN2zLt/IZ5VMOZ9Qm IGTOkbLzSOJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMKE8gAKCRBD3pH5JJpx RXuQD/93xwdCe18R+zBHXaTa1Hby5Rie00SXTUhD+5NnLDyLulOdm3iJUEC9X9vefRkovfG7lIh o6Q+B1VI0YbfLVWhp41i/kZ006IoF3vKgmEXJEFc47yJhPFHpgM8mkwjUcddDlb9dVRh00BZbUu E9u4Q/vzwKTI1UfpBgkK/el5gc99IcRWrPtpdzVBt0UzgyFR+xQ09bpz7EspWhqZq3BB/Qo3yRw TTK3y3LAxoP+5Czm0e5KR6TiGD6cur9YYSUxiiSSqEDOnqmWg0vUW702EI3thowhfmDbow/osWF bdNR92RulxzqyuJBdJEARnvd8g0ofICMPOv7p2kznWb/xWSLneoXDPvsiwIHuF/7QsF8Ue3jOp8 V32hojtKXl+P9KZjLQLd3XuZdEsqJM2BNXZ4x3Wkn9TRDbm9/2HeRQdLjRX0fpu0qNPEYTpKSZ7 xkoEgnG6cfd/95xz/rx36aADuuDOOVD2va+ocYa9fQF+23Pq3B4mKLYiueIJePW7TC46ykDua3m EWRgJVmw8YF3Exqne9LtiKghpZJpRaHO+pAyrh6JQeOIChwdSCVSedLzXNahpyqWxwOZwAFMB2k r+YdfymzLb/W9qqxLjBqV7q0jJIQaSiwokdjixXiPPvB18LCYLZt23YN2JCtjY2MZnBBJFnnOr+ 1H/rNSk92KpZJLw== 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. Signed-off-by: Jai Luthra Reviewed-by: Kieran Bingham --- 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..c985edab7e2a965ccd9427b013c= bb3fa8778de2b 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 20:44:51 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 AF6FE2DF158; Thu, 11 Sep 2025 08:15:52 +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=1757578554; cv=none; b=OGmlsXTuexoZONkRVE9C+w4nt87O3LGIYViQ7Fk5fcDcOy2ARWB0Yf0k+0bGgYLOXZMDAkEAOr+sTN23jl3zQrcUBQzOG2PzkTU0tVkskeQIMC4Bt3D/MX6FB6WHl/9xMiCpFC7aTPi5Mzpg5k93DNg24NljttW5lQYiydRuu90= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757578554; c=relaxed/simple; bh=59zBBGBXVwiK8KdUtCF+f5sq/Ca4rZOdlUR6YSCmksE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ckvJmBWJEDsRgo20V6nJRa5yh3O9Lbm1cHZzuU5xggkpS17kdohku0KPFiEJgaYZQL/6vBe947EJ4XoyOzbGwKu0gc27pueckpmhAhbvSpkTYCSsD6GOCtSrUxCAQpHdGd5Q+JV5/vxFyVWer/uQmbV602kVilm+LugbCDX7fe0= 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=b7yuYE3K; 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="b7yuYE3K" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c66:c9e9:75f9:f434:33cd:e4fe]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A0FD66F3; Thu, 11 Sep 2025 10:14:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1757578477; bh=59zBBGBXVwiK8KdUtCF+f5sq/Ca4rZOdlUR6YSCmksE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=b7yuYE3KdzifpPGrkIN+DmVo9oD2tkHdZdZqHa6ZV2STwkuYNtQTS+XXB73AeZrxe egZ9sZ0/x2uSXU5fGsTAC8DrkvlR4mIL+Kb08ZNaj6DcsOVifq3Q1Xkfm9VnadfqYA X+Sv2MMvkyemkaGssP6zTFOWTieZOJ0dLln+F0CE= From: Jai Luthra Date: Thu, 11 Sep 2025 13:44:24 +0530 Subject: [PATCH v2 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: <20250911-imx335_binning-v2-8-30a28df74df6@ideasonboard.com> References: <20250911-imx335_binning-v2-0-30a28df74df6@ideasonboard.com> In-Reply-To: <20250911-imx335_binning-v2-0-30a28df74df6@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=3358; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=59zBBGBXVwiK8KdUtCF+f5sq/Ca4rZOdlUR6YSCmksE=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBowoTzE7ORwzfIdbEPtzwpnhY0b0mfq6Qhx68rM uQFquS1nYeJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaMKE8wAKCRBD3pH5JJpx RTs6D/sFYv62KI1RA7ppIgWdWrtNcDP0mRUhFtpqd/1kMk9L1UdSOEywu3yNv4yjgl/MrcsT5as FilZruRPT7NM0/uoJYs1+bhE0qOFZ3eGHOPOrG2GezJUtqKA0Ypzad1tHyyAr3pM1jFQWI/01Bc r/4KFeRGb7jtF+dwF1DOJDwN0xo+cgwstP7sFqNltc0FoHXZ8AGTaVjt+PvbAztbvhNXZI2BSdr y8L7eoAhldMup3Y2Kt1uGefL42nhfXo4cwKmse/DudeApgk1kFCt46wXFz4uRMEFgxuWV186vWm 7dW3z4P8oOIfHZJQt3V23Fgo7odzRPT+iUgEV8iD1E7J0e3B2r9Uw9SDZPU3UXwXdnjwp/FKxdQ nvpbphug5xBjypeaPE2tJbRP1q0ibkqviJsfLI3E7h6sRTwUVKNpzxdFQ+v5z/ko0wM8EO02Gjx mvUq/XdQkGHNriufLNhjChw4xFl4PSOmqeT/JX9PCyEv8rtYM4GvYtPbhrSonN29rP8URMdTZ0g UKC0lXV+E8jgiqvbfmFSFbuxZWq9ChCxCIbdhVXkAm94U/sksiR7PmiwkEL7KGDhi2mkOrVHYS1 o+ereArtjcoyIfk2UmSXIHaWLIZVlVuWh2f5kcQHz5nFqglrmXqERNub452/UNkYPxgp1eJ7+hm zw8Co9mU1GJ5pvw== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 Switch from s_stream to enable_streams and disable_streams callbacks. Signed-off-by: Jai Luthra Reviewed-by: Kieran Bingham --- 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 c985edab7e2a965ccd9427b013cbb3fa8778de2b..a1af70d050bca79255ac9303e85= 08de919bc4fdc 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