From patchwork Tue Feb 4 07:04:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13958717 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 428BD204F7D; Tue, 4 Feb 2025 07:05:14 +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=1738652716; cv=none; b=ppCTqHVAeBTaQJkqIiI5gTK4zCKBPcsQKQe1c4bcwm1Jwqq+nKhT6hNoIN7iR61Com3zjcq9wfqUC2hPD1nlOBJ0fHH87LEdjsLF1GJtM+UK2W2BxhUXJ/6feO7/8WZoLiLP51ECOfFmorIjorH5gzMy/kaSs0AivjWV28ynpQg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738652716; c=relaxed/simple; bh=zs/zpjxPU+0QUaPa1Vt1KUU/FtlGY4Upb4yOBtUYaPs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aivhXZw9bNatfVyCsriOxse3UnrDgzZ8yzD8S1BBBG6bT9GyJVJTqPoRSJxdlltTVqrh1fTzg5HXCgBFGm8T6vR4aJssXCvLqupPIZ3TNDadxDDbnUZNI/DCBoYIO7726XaaZP/vplV+IqF6FaASTspMbnXLLcsYru1HZo/2RjE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (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=wAw0QDj1; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (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="wAw0QDj1" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:8839:be31:a1f6:6475:ef19:2df7]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B41B01198; Tue, 4 Feb 2025 08:04:01 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1738652642; bh=zs/zpjxPU+0QUaPa1Vt1KUU/FtlGY4Upb4yOBtUYaPs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=wAw0QDj1EJVQr6yNPldPNmwaQrSiMz6k7LuDKgMhV2JvSQ8PGE57Da8+GJYw1EZK0 fu3GhNC6BixP3ipeGdhJlnjduqd6e/tfS9JCRiiqrLU/ya5Ni621wy7hsHhIihXxS+ C29vmuPbCcPLktcMwm5kS+KWd2MHLDUQ/+zJIDog= From: Jai Luthra Date: Tue, 04 Feb 2025 12:34:36 +0530 Subject: [PATCH v6 1/5] media: i2c: imx219: Correct the minimum vblanking value Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250204-imx219_fixes-v6-1-84ffa5030972@ideasonboard.com> References: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> In-Reply-To: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> To: Dave Stevenson , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Laurent Pinchart , Jai Luthra , David Plowman X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1008; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=zbiKBhScbJyq8ATOozaLCyaAJ+K4hRoEedI8DOVPUSs=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnobwd4fO0WgZtuK6IJygoFTQ1o3GdBmMllOj+V i/PRGnMZq6JAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ6G8HQAKCRBD3pH5JJpx RfhBD/wO2hJ1kWkyQeZ5cj4mmkMjNiirey/Q76mbj3mrxh41eZsc1+VJKUlcvL/twjkQQa72z07 ThLP9RmJAyLLa+vFtjGphghSiwoozdfWca9rl3YjHiWiabLeoIfGHGGBYlJou34Aq+YPM6NgtTk SLyGmTU0kZtZVRy5Q8xMwIbzYTiRZzHtVjn1o7uLXH6Ov2Mzu70DFbVPhSKYBVXN+IeOPlxJRhS A7cNTqxFwflkb2/jo9qeMqbsMex1a1RB95MzSDXHmE3ZKS7611eCO6b5ff6HWYTQGY1RV5nCn/B xbDgulkY29QySeYAWy/3m18BjD+c23t56F3Bh+egOekbrzs8sLKjoz6K2TSiBnxtec801n4OFQn 6sHtzlnipo/dfP9FDhJSun0XgC5COItxdc8pInSA+S/gx+H+OrAOHgZiIvOMsy8Tzn/V49Jb5uu q6ItZ7TOvaq8v4I0Ba2N0S1dX0kln0GVttx16JIUdmBEvUcyo5FbybvgQ3zEhPAincPhftVv+mn 4SkK4qyQ3ZGwsdq2T5qEbaPWMBnbmkj4AuXo5ftDZ/ACLbUaGXvSahZ6kdqAfkNEwyKF1cxgDH+ VYQp67tMZXRswbyHa6e9pPmSv5Q3M0NcrACCJb38yn2T29unNKfFuFanl32vnsB+4S5qV8wkSOM fmDOfDoQOSkSItA== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 From: David Plowman The datasheet for this sensor documents the minimum vblanking as being 32 lines. It does fix some problems with occasional black lines at the bottom of images (tested on Raspberry Pi). Signed-off-by: David Plowman Reviewed-by: Jacopo Mondi Reviewed-by: Dave Stevenson Signed-off-by: Jai Luthra --- drivers/media/i2c/imx219.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 2d54cea113e19f68e1553ffb2e4c78491dc80acf..0486bbc046cb9c36afd911eb799c1b010a01d496 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -73,7 +73,7 @@ #define IMX219_REG_VTS CCI_REG16(0x0160) #define IMX219_VTS_MAX 0xffff -#define IMX219_VBLANK_MIN 4 +#define IMX219_VBLANK_MIN 32 /* HBLANK control - read only */ #define IMX219_PPL_DEFAULT 3448 From patchwork Tue Feb 4 07:04:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13958718 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 D77BC2046B1; Tue, 4 Feb 2025 07:05: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=1738652722; cv=none; b=GamS9vKHDBy/AXrKTUKc8tfjABfPP8/SltvCxcicPKyyaDAtY3pxPS8MtSM9wApfx6LKi5ss62LmATRdPbbMuPlOShYqJ7G33rVVKe7+5rLEwCJde+m0Y17fcmsrq7UxzYQCuLu9oYBuEVMWnig6ENQy3WLoufqGaBPpj+ekHD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738652722; c=relaxed/simple; bh=FMi9kfKdBsn02RX8aQTbnGRyvhmncFsH1pGkK4Gpvbk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NINsN1X28kSKKxlgx5vlW5+kBaUqM/smN2ZlN8SNA77y5U/Vws8R9UOUwIZ/T40ats6XIIx0/k35hAvwP5Ie0hUzTu14UfMQjDYJ//OYE+fzjjZlBPDJWKC0s42zCNCqbW8+IEtj8OfbDPeu6/2YL4WO3YKJddlX4PNNMjDfBfk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (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=Pu64IzT5; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (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="Pu64IzT5" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:8839:be31:a1f6:6475:ef19:2df7]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 5A8BC1193; Tue, 4 Feb 2025 08:04:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1738652647; bh=FMi9kfKdBsn02RX8aQTbnGRyvhmncFsH1pGkK4Gpvbk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Pu64IzT5mNxGZ2qJbde+csyNP9kmtivFcn8olB0FqudW90q6bbNEWOVd7LEOdaHd1 62zsK3vYzgCD4RQcX6Q4IDRQwlxHQgCqwuNNLfaJK+4HeCHnufT9WS8kwim/0wGArJ dPvhwZ9yJeR8SHrJOabAC4N8lQtWlIIAhJ30dDYA= From: Jai Luthra Date: Tue, 04 Feb 2025 12:34:37 +0530 Subject: [PATCH v6 2/5] media: i2c: imx219: Rename VTS to FRM_LENGTH Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250204-imx219_fixes-v6-2-84ffa5030972@ideasonboard.com> References: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> In-Reply-To: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> To: Dave Stevenson , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Laurent Pinchart , Jai Luthra X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3750; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=FMi9kfKdBsn02RX8aQTbnGRyvhmncFsH1pGkK4Gpvbk=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnobwdVb+eOxOwZtIUFnygZr6p4isHUkJuPf518 m/UZ4h1JDGJAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ6G8HQAKCRBD3pH5JJpx Ran/EACYBvxx1m2X9XeejeMl8jB8z53N889oGQteDoSKHw67KUP6GLL/vFuq3a4xnWFLwQ76MR5 NlVe1jzocRAtjx2luaJvHwf04z4FtnOCDv5L4abkmKRlVRieEba9ru3YDxD7rVT4F7rFui/bB7S 4mKnZUbBH0j7/xXYQUzj33hdpnLfrHGVBVdEhT5lVFhwz64a6pwup4wD3b3k7gsLmuYL1TkldoK f8OFwAfZT7TaSzBZc/F+6IBhfk2AjOa5JtQvz+N5LrdG75kVk0ixygiqJXBsGFYKy7SYbUPJGO4 dthjIHvBo8ZrRHL/UnUZ9yRoQfFAPBnVh6Zy6wUfsZs1qoeZxVIsADEfxNh7fpgEXkUUnO82HjE t9IUBTedItpfqLswgFUFDkwzfWEHDKH4nwxvKKydhX+XhGeFdFIo2V5r06iRz64i2m5vyDk2mKp VYTdVUbekokML0DffN91aCD2Il1lEN5qpAmKxllf7xJrPzbVMUP4ac/KbxCuAeJvCWPUU0ftQ+T FUfMUnNoyK4ib9E+F35O8/L1rtH+vF3KhqYz8pOgnUL8SKSVPrLG0IbReO/Je8o8sM7JofAr4CT MFouod9qGbELocmRJYR6yhylWmmTAK2TA2f2X7nci7Ww56PzB6tOimUkpYmP6D5sdeTu0IzTOuj MM2Dwd9RIwON/Cg== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 The IMX219 datasheet refers to the vertical length + blanking as FRM_LENGTH instead of VTS. Reviewed-by: Dave Stevenson Signed-off-by: Jai Luthra --- drivers/media/i2c/imx219.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 0486bbc046cb9c36afd911eb799c1b010a01d496..66460a179e8a9fc1f1216f6beffce4bcd35ff6aa 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -70,9 +70,8 @@ #define IMX219_EXPOSURE_MAX 65535 /* V_TIMING internal */ -#define IMX219_REG_VTS CCI_REG16(0x0160) -#define IMX219_VTS_MAX 0xffff - +#define IMX219_REG_FRM_LENGTH_A CCI_REG16(0x0160) +#define IMX219_FLL_MAX 0xffff #define IMX219_VBLANK_MIN 32 /* HBLANK control - read only */ @@ -154,7 +153,7 @@ struct imx219_mode { unsigned int height; /* V-timing */ - unsigned int vts_def; + unsigned int fll_def; }; static const struct cci_reg_sequence imx219_common_regs[] = { @@ -289,25 +288,25 @@ static const struct imx219_mode supported_modes[] = { /* 8MPix 15fps mode */ .width = 3280, .height = 2464, - .vts_def = 3526, + .fll_def = 3526, }, { /* 1080P 30fps cropped */ .width = 1920, .height = 1080, - .vts_def = 1763, + .fll_def = 1763, }, { /* 2x2 binned 30fps mode */ .width = 1640, .height = 1232, - .vts_def = 1763, + .fll_def = 1763, }, { /* 640x480 30fps mode */ .width = 640, .height = 480, - .vts_def = 1763, + .fll_def = 1763, }, }; @@ -418,7 +417,7 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) imx219->hflip->val | imx219->vflip->val << 1, &ret); break; case V4L2_CID_VBLANK: - cci_write(imx219->regmap, IMX219_REG_VTS, + cci_write(imx219->regmap, IMX219_REG_FRM_LENGTH_A, format->height + ctrl->val, &ret); break; case V4L2_CID_TEST_PATTERN_RED: @@ -493,15 +492,15 @@ static int imx219_init_controls(struct imx219 *imx219) /* Initial vblank/hblank/exposure parameters based on current mode */ imx219->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, V4L2_CID_VBLANK, IMX219_VBLANK_MIN, - IMX219_VTS_MAX - mode->height, 1, - mode->vts_def - mode->height); + IMX219_FLL_MAX - mode->height, 1, + mode->fll_def - mode->height); hblank = IMX219_PPL_DEFAULT - mode->width; imx219->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, V4L2_CID_HBLANK, hblank, hblank, 1, hblank); if (imx219->hblank) imx219->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; - exposure_max = mode->vts_def - 4; + exposure_max = mode->fll_def - 4; exposure_def = (exposure_max < IMX219_EXPOSURE_DEFAULT) ? exposure_max : IMX219_EXPOSURE_DEFAULT; imx219->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, @@ -847,12 +846,12 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, /* Update limits and set FPS to default */ __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN, - IMX219_VTS_MAX - mode->height, 1, - mode->vts_def - mode->height); + IMX219_FLL_MAX - mode->height, 1, + mode->fll_def - mode->height); __v4l2_ctrl_s_ctrl(imx219->vblank, - mode->vts_def - mode->height); + mode->fll_def - mode->height); /* Update max exposure while meeting expected vblanking */ - exposure_max = mode->vts_def - 4; + exposure_max = mode->fll_def - 4; exposure_def = (exposure_max < IMX219_EXPOSURE_DEFAULT) ? exposure_max : IMX219_EXPOSURE_DEFAULT; __v4l2_ctrl_modify_range(imx219->exposure, From patchwork Tue Feb 4 07:04:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13958719 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 DE71B2046B1; Tue, 4 Feb 2025 07:05: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=1738652727; cv=none; b=iVbynKB2xwUVVq+noPgGKYEQTuSBDQMZ/Qg3zD6jr9zkH3jWlH6KdETbNTz7QQy9WKNw/Xz4xoSGjpx7vLYnBQeyIDsY+e2klTz4C9RgBKgMSFeQp/aLV08FEK5lTnW96N1lrzBqlKENnniWNI/RpVo/Kn4NcbUAi/aSk1qcwYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738652727; c=relaxed/simple; bh=vIyFYBeQc9jLvlrN5HnokpDA4PpMC0ptcjbL0vZkDgI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JGEgG3fftmtXj4eFCT/1BwX4Lwttc+uTktIcVNz5aGj3ctHmRNgaNTJ00UuD7KCZ0hzabzJDeT9mvzbz0HomQYJbZldIIBBHkzdLGFCPFhpALkoXr1cykyVYePnhBxNiCB+20ifxyCLQHI+xGg3WWw46d6HKgYRLHhD1B4VrO9c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (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=v8VRc3Em; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (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="v8VRc3Em" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:8839:be31:a1f6:6475:ef19:2df7]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 44F28CDB; Tue, 4 Feb 2025 08:04:12 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1738652652; bh=vIyFYBeQc9jLvlrN5HnokpDA4PpMC0ptcjbL0vZkDgI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=v8VRc3Em7GxlPxmuEZQSkfsq0ONMqYjRMMjY6mgNsOvi2Lj1jaZmrCeRL8ikFd+kT 9Nq70Zs1mdQkLw+UfkOTqcCSmN/twQgkm4OKE4dyl0o5R+WhRHdYvW/V93tAslKol1 ZvLz1Dz+74WlraKWmh+i2NW1OTDQcp6E+u6L+jDg= From: Jai Luthra Date: Tue, 04 Feb 2025 12:34:38 +0530 Subject: [PATCH v6 3/5] media: i2c: imx219: make HBLANK r/w to allow longer exposures Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250204-imx219_fixes-v6-3-84ffa5030972@ideasonboard.com> References: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> In-Reply-To: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> To: Dave Stevenson , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Laurent Pinchart , Jai Luthra X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5281; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=TXRnc+Lo+W2/ztJl98NFA7mkkNy355PHmhaY9k2pnUc=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnobwdbed8whT5/MAqzSn8LiiyvCPy4NTkccS+b stB/gXdTu6JAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ6G8HQAKCRBD3pH5JJpx RefiEADIY+rOqA8ip4TP0K8zDpIFL2tbSeFEhKqumEfYZYg2NiowhyNOGvbvp9OLReHrepySutb xjinMKD4CiI34lGHVYNECUgh+0P9rk2fFM2zk6xSnwzONAQr7h20n9iz0IRLloEW6zGBdRJmgtm /JumhHKpnq0BeP1H8cNBnULMsqQwCK9muXdOoJj7BtoB+b+Rela9a4jA4K21zW5pBHvav+1DUA3 pAL//4E1Hk3zLWuqQwizoo6y2pDB1aKWVJjHXmmGSCrG0oDvMPQT/b7od/lUKRLuqy7cDP4ZMSN Q/Eja/pWb58vx5LM5KTiVxJUKVIzkCJ7zZmvS4vUxz6pzeWVXOGCHbxUF9B3dmEsBw9yFnMvpR3 bTEBUfX1I1qLBfaDIDYGbtMgBTB6i9gDPVM55fPHAYex3s/XLFd2cok1YnWA3Id5Cw0YsCDc3gW 4LY7VREIo/Z90sdCWEI0eJjkGAeAgMtnTNA/Hjh4Hk7PnNPwzAK5RmVFvAKOOsm4CFqv8dIp3dx ZxnNENa9ZzJthR1CxQSduaHTRZLUdqdUjEUt2ugdkDNqPfeHlCmBxZV+xcsmpL/DMUnQTZLkVHL u/CHD3ioREmh5TWMa4HozMm4O3EmO5GdaxtWj7J7JSvxtme3mw9baIrRQgnDZnnsx+W5d8aO+hS m6SLUAHIt4SqIgQ== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 From: Dave Stevenson The HBLANK control was read-only, and always configured such that the sensor line length register was 3448. This limited the maximum exposure time that could be achieved to around 1.26 secs. Make HBLANK read/write so that the line time can be extended, and thereby allow longer exposures (and slower frame rates). Retain the overall line length setting when changing modes rather than resetting it to a default. Signed-off-by: Dave Stevenson Reviewed-by: Jacopo Mondi Signed-off-by: Jai Luthra --- drivers/media/i2c/imx219.c | 48 +++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 66460a179e8a9fc1f1216f6beffce4bcd35ff6aa..8239e7ea8ec03849b339c1f314485266d4c4d8bd 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -73,11 +73,10 @@ #define IMX219_REG_FRM_LENGTH_A CCI_REG16(0x0160) #define IMX219_FLL_MAX 0xffff #define IMX219_VBLANK_MIN 32 - -/* HBLANK control - read only */ -#define IMX219_PPL_DEFAULT 3448 - #define IMX219_REG_LINE_LENGTH_A CCI_REG16(0x0162) +#define IMX219_LLP_MIN 0x0d78 +#define IMX219_LLP_MAX 0x7ff0 + #define IMX219_REG_X_ADD_STA_A CCI_REG16(0x0164) #define IMX219_REG_X_ADD_END_A CCI_REG16(0x0166) #define IMX219_REG_Y_ADD_STA_A CCI_REG16(0x0168) @@ -191,7 +190,6 @@ static const struct cci_reg_sequence imx219_common_regs[] = { { CCI_REG8(0x479b), 0x0e }, /* Frame Bank Register Group "A" */ - { IMX219_REG_LINE_LENGTH_A, 3448 }, { IMX219_REG_X_ODD_INC_A, 1 }, { IMX219_REG_Y_ODD_INC_A, 1 }, @@ -420,6 +418,10 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) cci_write(imx219->regmap, IMX219_REG_FRM_LENGTH_A, format->height + ctrl->val, &ret); break; + case V4L2_CID_HBLANK: + cci_write(imx219->regmap, IMX219_REG_LINE_LENGTH_A, + format->width + ctrl->val, &ret); + break; case V4L2_CID_TEST_PATTERN_RED: cci_write(imx219->regmap, IMX219_REG_TESTP_RED, ctrl->val, &ret); @@ -465,7 +467,7 @@ static int imx219_init_controls(struct imx219 *imx219) const struct imx219_mode *mode = &supported_modes[0]; struct v4l2_ctrl_handler *ctrl_hdlr; struct v4l2_fwnode_device_properties props; - int exposure_max, exposure_def, hblank; + int exposure_max, exposure_def; int i, ret; ctrl_hdlr = &imx219->ctrl_handler; @@ -489,17 +491,16 @@ static int imx219_init_controls(struct imx219 *imx219) if (imx219->link_freq) imx219->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; - /* Initial vblank/hblank/exposure parameters based on current mode */ + /* Initial blanking and exposure. Limits are updated during set_fmt */ imx219->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, V4L2_CID_VBLANK, IMX219_VBLANK_MIN, IMX219_FLL_MAX - mode->height, 1, mode->fll_def - mode->height); - hblank = IMX219_PPL_DEFAULT - mode->width; imx219->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, - V4L2_CID_HBLANK, hblank, hblank, - 1, hblank); - if (imx219->hblank) - imx219->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; + V4L2_CID_HBLANK, + IMX219_LLP_MIN - mode->width, + IMX219_LLP_MAX - mode->width, 1, + IMX219_LLP_MIN - mode->width); exposure_max = mode->fll_def - 4; exposure_def = (exposure_max < IMX219_EXPOSURE_DEFAULT) ? exposure_max : IMX219_EXPOSURE_DEFAULT; @@ -815,6 +816,10 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *format; struct v4l2_rect *crop; unsigned int bin_h, bin_v; + u32 prev_line_len; + + format = v4l2_subdev_state_get_format(state, 0); + prev_line_len = format->width + imx219->hblank->val; mode = v4l2_find_nearest_size(supported_modes, ARRAY_SIZE(supported_modes), @@ -822,8 +827,6 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, fmt->format.width, fmt->format.height); imx219_update_pad_format(imx219, mode, &fmt->format, fmt->format.code); - - format = v4l2_subdev_state_get_format(state, 0); *format = fmt->format; /* @@ -859,13 +862,18 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, exposure_max, imx219->exposure->step, exposure_def); /* - * Currently PPL is fixed to IMX219_PPL_DEFAULT, so hblank - * depends on mode->width only, and is not changeble in any - * way other than changing the mode. + * Retain PPL setting from previous mode so that the + * line time does not change on a mode change. + * Limits have to be recomputed as the controls define + * the blanking only, so PPL values need to have the + * mode width subtracted. */ - hblank = IMX219_PPL_DEFAULT - mode->width; - __v4l2_ctrl_modify_range(imx219->hblank, hblank, hblank, 1, - hblank); + hblank = prev_line_len - mode->width; + __v4l2_ctrl_modify_range(imx219->hblank, + IMX219_LLP_MIN - mode->width, + IMX219_LLP_MAX - mode->width, 1, + IMX219_LLP_MIN - mode->width); + __v4l2_ctrl_s_ctrl(imx219->hblank, hblank); } return 0; From patchwork Tue Feb 4 07:04:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13958720 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 0F4F02063E7; Tue, 4 Feb 2025 07:05: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=1738652731; cv=none; b=VY7rNIMq9zwEUXDB87z/o+Mz15eOGOb8hc3ISgs+u+PsOyrWXfX6jIDu4XSojMdOXZqSDc8IIPawH7p+sYw+Z6BMPKPZ9XkGsIfETyH675hmAA+k/FLDxnHrgBbzB+9j9v/tqm6gvNgNW42o9EllUdSviUhtSZgXNpBLylA3nFw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738652731; c=relaxed/simple; bh=2XHKHc5jDxS0ReYPBqzAlsz2r1Tp5Fe8TOh9+K3HdhY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GbPzWrvT0/OT2UJZ8WLFy4/DX/W9LsG5PAsnxhENOxtINEq6lDehkWOszM3fLYmg+R+qB/Moyq3diDlIJXtKPIWnEmPeS5RyuDmZsPuAoG+tQREIo9LXmpcccl9eatPmgYNhoxX6GtHwFREjDuT2u8aEoAHK8PsQeuXp4UjTxWg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (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=Crv1DwgA; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (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="Crv1DwgA" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:8839:be31:a1f6:6475:ef19:2df7]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 77E46CDB; Tue, 4 Feb 2025 08:04:16 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1738652656; bh=2XHKHc5jDxS0ReYPBqzAlsz2r1Tp5Fe8TOh9+K3HdhY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Crv1DwgArpeKwdbPOTu/vPWbe/zdMjuLtzU/utxuaaS0q5f8bL40G2K7nyTLloJ1o 2Ug9oR2/W7ez7kdAytekRnaXbfMc4DKs5aPy+SRwO39fayDcX06iXOCOuX/NxmWFXq GoXGi0cClTVLTNC2U7uOZQ9fskRjZwAHtw1q3Ft4= From: Jai Luthra Date: Tue, 04 Feb 2025 12:34:39 +0530 Subject: [PATCH v6 4/5] media: i2c: imx219: Increase minimum LLP to fix blocky artefacts Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250204-imx219_fixes-v6-4-84ffa5030972@ideasonboard.com> References: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> In-Reply-To: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> To: Dave Stevenson , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Laurent Pinchart , Jai Luthra X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1773; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=2XHKHc5jDxS0ReYPBqzAlsz2r1Tp5Fe8TOh9+K3HdhY=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnobweUTBqx6DfmucM3yFzaa9fgNakFQm0Lpgh+ AoeEBkfJXeJAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ6G8HgAKCRBD3pH5JJpx RWYiD/9NsXsLG1lmfYHjUyDVy/EG6i2jCzVM5ZN65v5Vx1MpCHsx6EAcIttCo8zzFT5G2KR+S1k 4vK+3HuPe/WQx1Q5MHL8Anylt6WMW0AffEavhDuFMya0E4RH7MQzHYD+TpxHJoQ7CGsR4bwrNbT 3B7d/vvdq3rghmXXdNvWYWWhFaw0MJjCW/CdZfNejdODaq/R5tA5e6ksVqGPIEtSbBLQKzw4Jug 0Q/v6aU2x6uqIX1iDyM05poUoOLU90EILA35iEQHp09mu8W5wupgl0hkLFZ3UkVDyToyc6w3V8b rfStW4ik3acvaXQnOiGw4KnM1nW2JXxfGvGK+RVK85+QtRAVH/y5cuUgDrjwrp5i87Ee91QSgaJ ZTiYnrv4A4sG06l67IMFwZ36EIJ1BMK8wPHN+0WkeJa7PUzkQu8HT0eHtuV/6aI0nuCkS3R8PTY uRM9qMiNRy2w1NZxXnIV6+0t1IbposwmNImsCjkeL/YG7kKNDeyu6YB19YspMI1fN8g6UkGDoPz 1BjsJdln6ghYiZki5YEw+ELBwod7/leA8yaXEoW1TYhkSIDGWBiQXwBN0tqmAKns9WapMp6MIce PE9jWYVYUkTlQM/1xNhlRPMT2g6QLecdbaCdyOm6I4MxDgVLMqw0exjyIFj1weORK3C06S5YIDC qP0P3aFHKJoDVFg== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 The sensor's internal ADC supports a minimum line length of 3448 pixels, which may be too small to use with analog binning, where ADC operates on two lines together. Switch to a higher minimum line length of 3560 pixels to fix the blocky artefacts seen with analog binning [1]. To keep the same default framerate as before for all the modes, lower the default fll value to compensate for the increase in llp. [1]: https://github.com/raspberrypi/rpicam-apps/issues/281#issuecomment-1082894118 Signed-off-by: Jai Luthra --- drivers/media/i2c/imx219.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 8239e7ea8ec03849b339c1f314485266d4c4d8bd..e4aa6e66b673bb7a8942bf8daf27267c2884ec95 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -74,7 +74,7 @@ #define IMX219_FLL_MAX 0xffff #define IMX219_VBLANK_MIN 32 #define IMX219_REG_LINE_LENGTH_A CCI_REG16(0x0162) -#define IMX219_LLP_MIN 0x0d78 +#define IMX219_LLP_MIN 0x0de8 #define IMX219_LLP_MAX 0x7ff0 #define IMX219_REG_X_ADD_STA_A CCI_REG16(0x0164) @@ -286,25 +286,25 @@ static const struct imx219_mode supported_modes[] = { /* 8MPix 15fps mode */ .width = 3280, .height = 2464, - .fll_def = 3526, + .fll_def = 3415, }, { /* 1080P 30fps cropped */ .width = 1920, .height = 1080, - .fll_def = 1763, + .fll_def = 1707, }, { /* 2x2 binned 30fps mode */ .width = 1640, .height = 1232, - .fll_def = 1763, + .fll_def = 1707, }, { /* 640x480 30fps mode */ .width = 640, .height = 480, - .fll_def = 1763, + .fll_def = 1707, }, }; From patchwork Tue Feb 4 07:04:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13958721 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 18B6D2066D4; Tue, 4 Feb 2025 07:05:34 +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=1738652735; cv=none; b=oaR2SR5AEv31nts++zGAaISgXVUikoCA5bah2EogqMyIuSGALPQ+uqQVuOyXD0fceJzi1FXyu3T0XSVJu9yVBsO1O68Xywz4oXycbPLFLe+qT9x6nvsrniVMtiEQNhDrowNt5oLudl8fYrYmTjeHNsVDUAL4uKlVhESMxxUQwYA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738652735; c=relaxed/simple; bh=dNzl8wbdvAfOo90NwAYKxLskMd36HUw/cWSeimj+kVI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DNm96uOtDN4L027S07WbUUA4RpeVUK7Y3W5wPkjfKSeD0afUojuMsulRP+FpiTpxbRdZcj/dWHtqLot9pKZyhSaCupWgbKBQlxthAcqH2u+AoSvy0ZR+5pOFHzrsnJADxOXP0FWmFrVRqnpDzenicsl26Kpz5UBSH2MBP/RKEss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (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=Qd7WrgDl; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (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="Qd7WrgDl" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:8839:be31:a1f6:6475:ef19:2df7]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D70211193; Tue, 4 Feb 2025 08:04:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1738652661; bh=dNzl8wbdvAfOo90NwAYKxLskMd36HUw/cWSeimj+kVI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Qd7WrgDl7JHWpP7B3fxSivPnJT033Ebrashi5FBn5kGLPVRgnU+6svR3FVMObeJYV BHTp1rjtx9b/CSp0iVt7lzTiLOzN31Hzsnlt8RLwxGAfQH796ygM954813+UGsc8Xl 3zoNbWVHMXq199Hx2lWJnXXf4MlL3+QDoaeWSDyQ= From: Jai Luthra Date: Tue, 04 Feb 2025 12:34:40 +0530 Subject: [PATCH v6 5/5] media: i2c: imx219: Scale the pixel rate for analog binning Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250204-imx219_fixes-v6-5-84ffa5030972@ideasonboard.com> References: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> In-Reply-To: <20250204-imx219_fixes-v6-0-84ffa5030972@ideasonboard.com> To: Dave Stevenson , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Laurent Pinchart , Jai Luthra , Naushir Patuck , Vinay Varma X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7472; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=dNzl8wbdvAfOo90NwAYKxLskMd36HUw/cWSeimj+kVI=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnobweUDS50whYjJhs7/fx2RqsGBA8ejrfXXe1w vmVjPliGFuJAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ6G8HgAKCRBD3pH5JJpx RWetD/97baWPxtJCoyyFw6UcwVigUN4Dilp678/H+9YY1AxBJRKlL9l8ZlwBZjhdb00jEeF/+Ee aQtGOMj64l8IH9u2jYPKf8FdAF9ksSdEy8JNlLhJnlaWU3SemK9+QiMv+6P9UgY4MofPdVpFyxE yJnG38AcGO2o/MZdvtG+QvjM+x0VGvbhox7QQd8kZpQwLpVlTYPj8lMpAF3ag3jJlMuPiUWO97W aa/50X9beYn0KYzzvf/uJT9qsbHwqPImv8hAnQcs8U0FEKsHAVDE+8Yu6t7ZzWUQ0wqNNqPHS9F 2DtwW1TUO49LbkmGxLLpivByHskA9Wu5HbRdHWi2qPJnlRo9tk0trPG/WnK1PqkReAQN8zdMwsP 9cmMDAoGkfKIyAVU1Mslz/d6xOaSyWqLHOafpt+ytr9qnzTLPv4vkAn/fVgngUb20dQM2vxl0nw iNlUAIJjXdtoQ55fePETnizev5fscvFeFncfMcn4/KfhWHLdpjggHybNHuhtD9dcQS2SXkxbhOh Ws6vNNsyx8cVi6lglCUhmMSewkLiJJ0hzS5hJ6vakpp4GYxn/LZmTk2XaDKA3a84AbsdIkUp8j9 mGH/e8aAtCm/dtEMXJql5n5NbBDnFku0Nwz/jUkGCz+Xdvk0i6qR6LJw0iXwQsWRK5u10dSHED1 w0/rLCAmkFk889Q== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 When the analog binning mode is used for high framerate operation, the pixel rate is effectively doubled. Account for this when setting up the pixel clock rate, and applying the vblank and exposure controls. The previous logic only used analog binning for RAW8, but normal binning limits the framerate on RAW10 480p [1]. So with this patch we switch to using special binning (with 2x pixel rate) wherever possible. [1]: https://github.com/raspberrypi/linux/issues/5493 Co-developed-by: Naushir Patuck Signed-off-by: Naushir Patuck Co-developed-by: Vinay Varma Signed-off-by: Vinay Varma Signed-off-by: Jai Luthra --- drivers/media/i2c/imx219.c | 126 +++++++++++++++++++++++++++++---------------- 1 file changed, 81 insertions(+), 45 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index e4aa6e66b673bb7a8942bf8daf27267c2884ec95..c445987de2c3e933ea9c49ba3e00a15663ef5f2e 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -144,6 +144,12 @@ #define IMX219_PIXEL_ARRAY_WIDTH 3280U #define IMX219_PIXEL_ARRAY_HEIGHT 2464U +enum binning_mode { + BINNING_NONE = IMX219_BINNING_NONE, + BINNING_X2 = IMX219_BINNING_X2, + BINNING_ANALOG_X2 = IMX219_BINNING_X2_ANALOG, +}; + /* Mode : resolution and related config&values */ struct imx219_mode { /* Frame width */ @@ -295,13 +301,13 @@ static const struct imx219_mode supported_modes[] = { .fll_def = 1707, }, { - /* 2x2 binned 30fps mode */ + /* 2x2 binned 60fps mode */ .width = 1640, .height = 1232, .fll_def = 1707, }, { - /* 640x480 30fps mode */ + /* 640x480 60fps mode */ .width = 640, .height = 480, .fll_def = 1707, @@ -356,6 +362,59 @@ static u32 imx219_get_format_code(struct imx219 *imx219, u32 code) return imx219_mbus_formats[i]; } +static u32 imx219_get_format_bpp(const struct v4l2_mbus_framefmt *format) +{ + switch (format->code) { + case MEDIA_BUS_FMT_SRGGB8_1X8: + case MEDIA_BUS_FMT_SGRBG8_1X8: + case MEDIA_BUS_FMT_SGBRG8_1X8: + case MEDIA_BUS_FMT_SBGGR8_1X8: + return 8; + + case MEDIA_BUS_FMT_SRGGB10_1X10: + case MEDIA_BUS_FMT_SGRBG10_1X10: + case MEDIA_BUS_FMT_SGBRG10_1X10: + case MEDIA_BUS_FMT_SBGGR10_1X10: + default: + return 10; + } +} + +static enum binning_mode imx219_get_binning(struct imx219 *imx219, u8 *bin_h, + u8 *bin_v) +{ + struct v4l2_subdev_state *state = + v4l2_subdev_get_locked_active_state(&imx219->sd); + const struct v4l2_mbus_framefmt *format = + v4l2_subdev_state_get_format(state, 0); + const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0); + + *bin_h = crop->width / format->width; + *bin_v = crop->height / format->height; + + if (*bin_h == 2 && *bin_v == 2) + return BINNING_ANALOG_X2; + else if (*bin_h == 2 || *bin_v == 2) + /* + * Don't use analog binning if only one dimension + * is binned, as it crops the other dimension + */ + return BINNING_X2; + else + return BINNING_NONE; +} + +static inline u32 imx219_get_rate_factor(struct imx219 *imx219) +{ + u8 bin_h, bin_v; + enum binning_mode binning = imx219_get_binning(imx219, &bin_h, &bin_v); + + if (binning == BINNING_ANALOG_X2) + return 2; + + return 1; +} + /* ----------------------------------------------------------------------------- * Controls */ @@ -367,10 +426,12 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); const struct v4l2_mbus_framefmt *format; struct v4l2_subdev_state *state; + u32 rate_factor; int ret = 0; state = v4l2_subdev_get_locked_active_state(&imx219->sd); format = v4l2_subdev_state_get_format(state, 0); + rate_factor = imx219_get_rate_factor(imx219); if (ctrl->id == V4L2_CID_VBLANK) { int exposure_max, exposure_def; @@ -399,7 +460,7 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) break; case V4L2_CID_EXPOSURE: cci_write(imx219->regmap, IMX219_REG_EXPOSURE, - ctrl->val, &ret); + ctrl->val / rate_factor, &ret); break; case V4L2_CID_DIGITAL_GAIN: cci_write(imx219->regmap, IMX219_REG_DIGITAL_GAIN, @@ -416,7 +477,7 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) break; case V4L2_CID_VBLANK: cci_write(imx219->regmap, IMX219_REG_FRM_LENGTH_A, - format->height + ctrl->val, &ret); + (format->height + ctrl->val) / rate_factor, &ret); break; case V4L2_CID_HBLANK: cci_write(imx219->regmap, IMX219_REG_LINE_LENGTH_A, @@ -587,29 +648,14 @@ static int imx219_set_framefmt(struct imx219 *imx219, { const struct v4l2_mbus_framefmt *format; const struct v4l2_rect *crop; - unsigned int bpp; - u64 bin_h, bin_v; + enum binning_mode binning; + u8 bin_h, bin_v; + u32 bpp; int ret = 0; format = v4l2_subdev_state_get_format(state, 0); crop = v4l2_subdev_state_get_crop(state, 0); - - switch (format->code) { - case MEDIA_BUS_FMT_SRGGB8_1X8: - case MEDIA_BUS_FMT_SGRBG8_1X8: - case MEDIA_BUS_FMT_SGBRG8_1X8: - case MEDIA_BUS_FMT_SBGGR8_1X8: - bpp = 8; - break; - - case MEDIA_BUS_FMT_SRGGB10_1X10: - case MEDIA_BUS_FMT_SGRBG10_1X10: - case MEDIA_BUS_FMT_SGBRG10_1X10: - case MEDIA_BUS_FMT_SBGGR10_1X10: - default: - bpp = 10; - break; - } + bpp = imx219_get_format_bpp(format); cci_write(imx219->regmap, IMX219_REG_X_ADD_STA_A, crop->left - IMX219_PIXEL_ARRAY_LEFT, &ret); @@ -620,28 +666,11 @@ static int imx219_set_framefmt(struct imx219 *imx219, cci_write(imx219->regmap, IMX219_REG_Y_ADD_END_A, crop->top - IMX219_PIXEL_ARRAY_TOP + crop->height - 1, &ret); - switch (crop->width / format->width) { - case 1: - default: - bin_h = IMX219_BINNING_NONE; - break; - case 2: - bin_h = bpp == 8 ? IMX219_BINNING_X2_ANALOG : IMX219_BINNING_X2; - break; - } - - switch (crop->height / format->height) { - case 1: - default: - bin_v = IMX219_BINNING_NONE; - break; - case 2: - bin_v = bpp == 8 ? IMX219_BINNING_X2_ANALOG : IMX219_BINNING_X2; - break; - } - - cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_H, bin_h, &ret); - cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_V, bin_v, &ret); + binning = imx219_get_binning(imx219, &bin_h, &bin_v); + cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_H, + (bin_h == 2) ? binning : BINNING_NONE, &ret); + cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_V, + (bin_v == 2) ? binning : BINNING_NONE, &ret); cci_write(imx219->regmap, IMX219_REG_X_OUTPUT_SIZE, format->width, &ret); @@ -846,6 +875,7 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, int exposure_max; int exposure_def; int hblank; + int pixel_rate; /* Update limits and set FPS to default */ __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN, @@ -874,6 +904,12 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, IMX219_LLP_MAX - mode->width, 1, IMX219_LLP_MIN - mode->width); __v4l2_ctrl_s_ctrl(imx219->hblank, hblank); + + /* Scale the pixel rate based on the mode specific factor */ + pixel_rate = imx219_get_pixel_rate(imx219) * + imx219_get_rate_factor(imx219); + __v4l2_ctrl_modify_range(imx219->pixel_rate, pixel_rate, + pixel_rate, 1, pixel_rate); } return 0;