From patchwork Mon Feb 17 13:27:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13977841 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 67BF521A953; Mon, 17 Feb 2025 13:28:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739798892; cv=none; b=UJmnKoGIXykLPqAaVrW0bnjHgPE50eTCjK0sXlNpU7fJG10Ol3UAX5S2ur4pTS/4+T45y41KLHMMdOeXDGAsPed2K82BlSt81AJJi1zvuTOtZ6L56bvSVGeWacfTxRicHEJ8D6O+ZmEAjdOE7hZoLtZ4NVpvHGhW1XEzLhz2QSc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739798892; 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=HnVXlghRHquMwC6sR5iLfbnl1KITw+77G7cEkP8ybvI1k1Vq6vpdjv2JqsCc/p8rIlGAlhyR6yaGOwx5va3P52wDUpMkJMqnvBQhk/qXIjKBa/0W0zehwOplwkCuRx1aqmVUZwuU/+3loek4CKpZlLajY74He1MHzhHq12fHhxo= 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=iZViFvxE; 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="iZViFvxE" Received: from mail.ideasonboard.com (unknown [223.190.80.185]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0BD1D22F; Mon, 17 Feb 2025 14:26:47 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1739798808; bh=zs/zpjxPU+0QUaPa1Vt1KUU/FtlGY4Upb4yOBtUYaPs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=iZViFvxElQb5ZRYxzs4Grlp2FQ2oZOVhXMR2/hb6v3+1kTQE46uaYow92w9lZSU6/ cVv5wx4OQH5No7AZK7XinGnwV/yMeRU6PuTJrxUPhTkWD3PkXHDyB/vcT1960OqzqT A9lpGyq8ZaxbYBR03iM+wUKC1kbTfmOWXl2dD4yc= From: Jai Luthra Date: Mon, 17 Feb 2025 18:57:31 +0530 Subject: [PATCH v7 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: <20250217-imx219_fixes-v7-1-83c3c63b737e@ideasonboard.com> References: <20250217-imx219_fixes-v7-0-83c3c63b737e@ideasonboard.com> In-Reply-To: <20250217-imx219_fixes-v7-0-83c3c63b737e@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/ZANAwAIAUPekfkkmnFFAcsmYgBnszlKm+6KM8d7Vzt4JlUzU2meQ+P6AQrlGbEvu FL6ECN0r2OJAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ7M5SgAKCRBD3pH5JJpx RRWzD/9l9I3CHx03ZWcy3G0qDJuYEDzOAsRdfqNE/agwtSe3hSZcuyDIiFs0QvZ1EWqmVMAWDDr KlgD7R64b4veT05l5dQlc+adgzn0zLJI7NxSAySV3mTYk+E51cItgP+4+hdOzxRKXoYkGk9wqgT ESvV+yRFZwDUDdu3iyxSS9T+FzDO50+0gPnugJ5Hs8/tpz/5A+LIZP0ihvY80d+ln+ZOZrpdpzp H+qq+FiuQHT37TVtqN+iU1MtIYxVTLDhTT0euqXlo5VkH0I79SGZhiBVFNHCzPzJ3SBd0R2stRy doFFFIebT5EFV7hpIOcWValj6Hc5fKYEq0HU655v5iG/VFR5JFNiZxfTSyQTdeqWo/xa657POAa Qq+aCnonf/sg8EKKv7mOrmEOrJfah2Q+gdlEqM9pTJnd1mZr3YRFrcFTqRWjEpQaB/P54Sn2z4I 8vtXr1iuvhgot40Z0PUuMLRnzif27eO1afGUj5JuoFWIzORrfefBeCIL5OWW5suCEw4gPJ2WZK/ 5YaMtQIUPAdsTQ6pfRi2cOhC/1l6VmpXnP+FJvgxr+sLdzZBAKEdi7BzgDFBdHiJtzA0PUX50TL MiOChiuojGdfAg1tWNNl8wx4YiISBaA/4jFxy/nVX51OHMlhImYstW8r3BERImiufQXSkwMY8Kl fGlsRYHkcx2cMJg== 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 Mon Feb 17 13:27:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13977842 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 07A4621C9EF; Mon, 17 Feb 2025 13:28: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=1739798907; cv=none; b=ZYtX90CTT6WV1pNqIDcDAylOgOZU+n2nwzGyty4izwhjjLKgIEVrNuDK2UhZB5ZPzglWT5dfGQ0oAaZQAoadMG9PIue7jKb4YH0f3nCoYMmBMr+8Xhoy086nF/d3o4FKqqPJUTZgRnaPiB+DOdha1hORfNmpYeq2cttwJvJ3Ghs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739798907; c=relaxed/simple; bh=FMi9kfKdBsn02RX8aQTbnGRyvhmncFsH1pGkK4Gpvbk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HciTbspp4xFvAdLFS5hsdiqDVbWgHOdd6fKWVV9qd2KpswuQ/ILgMYVtHLhE7ddCkP2l1AH7nc91v8mVoSGLesZ0NshVuvUYAZTYs7b9gK3MB/yPoxHZgsbCN01obumyOdlMQ3cPSQ0lt/4aV3mv3xbG4bsSh3B3Rt3d7GEkKX8= 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=B7uRyyz3; 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="B7uRyyz3" Received: from mail.ideasonboard.com (unknown [223.190.80.185]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 90E5FD53; Mon, 17 Feb 2025 14:27:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1739798823; bh=FMi9kfKdBsn02RX8aQTbnGRyvhmncFsH1pGkK4Gpvbk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=B7uRyyz3HHxOJj4bNEQ55bjjyZbivvYIrmPTtkbPNxKqdTISsm/vdKAnA8fIT0+Hs k91cbdzuksM84utY109QxvzgkoZ8kOqR6c1aF3PCGea9uxjVeMZygf8T9Zq+mxPaN9 5S9JJnn2b5A7+Gw/9KsSSBh/HqVRaKFI9h6e6PYM= From: Jai Luthra Date: Mon, 17 Feb 2025 18:57:32 +0530 Subject: [PATCH v7 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: <20250217-imx219_fixes-v7-2-83c3c63b737e@ideasonboard.com> References: <20250217-imx219_fixes-v7-0-83c3c63b737e@ideasonboard.com> In-Reply-To: <20250217-imx219_fixes-v7-0-83c3c63b737e@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/ZANAwAIAUPekfkkmnFFAcsmYgBnszlLiOPVrCZMoDe5aLBno9QYhOzs0sm5H3CXh kUec22erp6JAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ7M5SwAKCRBD3pH5JJpx RarpEACCMGyvUhs5VttcpE2EPFHk5cU/dU4O8oT7ZHtijafVttrie59Cvk7ykoUlc1+3qGSne4k mwQoGED8WYfHC090bS8KSPdVuK78b3njgIKIQPLBp5AbSwH+v5OAfIHl7HxsQB/91FxCMz+1UWD HiTbQ10wUYJKt+3Pk9pS19bAtZQggyrwIt0Kg3E1vkRwLOC0mMLcmSaYnTB0rbGCkdyCMRCYJgA f+K4kAtVEz++2L32gTpDMNFoNz44dbfYMQHHa6r50/GMAf4UU1RN+D/7g07mfG57tpQIZomWhgP Cps3jdQv+BDqdm5jkqQAig2+Wp3TXnUBip5n1O35d7nXupLW2MVxYUJgrkEg8KnInlw1xJcuwp6 WbbHAfgWuRjstaT9yOStkIxTCYGzznhY4qmmiKwFqCoqFbs98Kvkm2xHCsqb5lLZRRox0J/ylCX GcmfHR3/DVsx+9EVU5zVglMX8Y5UuiyVHc1563yZiLG4gMkhftERDfdfbLemjaTCg4p1hbO+8kM Fy7ur9kL9+VlToaoG9EzfeDZTUow6mCBHb25wlYXkr7LNmkbhUYrLRYYe8ot66KakcKL5qVz4tN +8LoPcYEG6nJOjyAnAsoOpHMImKLD5k+Lc7fmLUlBIPOl70CBpSdhW6QmR+mP+ugeYAkYWPRtcs sKsraROl5AxBBAQ== 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 Mon Feb 17 13:27:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13977843 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 E513121A931; Mon, 17 Feb 2025 13:28:39 +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=1739798921; cv=none; b=EosAjlN4/QWjeeyxaLzcYxKnpU4BV/8JNXbiVqiCV2J+ryVq2TQ5+C721xL2uPXu4Y6ZEqVhG9YDwnQJOeZzITU4LBOzjp8X8xXD/W+2RtBIXnfrAzcZXLzfrv7U2N+kBdnjrQEoIK4XEPXJlVXuxCtPIB5XJFOq3JNfrm8bV3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739798921; c=relaxed/simple; bh=vIyFYBeQc9jLvlrN5HnokpDA4PpMC0ptcjbL0vZkDgI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FWG+sIgos3W97ugFFMKFI6STeQxFO+wCEEG5MPc9jhEDX53Y6J1xF55RoQXgZXL/3eeJUAMank9WmUb/tqdKwtTmA/GE7b+R85GrKvaGRfyut9HN3GxvWheVnJyrcMm7OJRCktQk1hOMtJc21CYU3O4KbKpVhaddnansuELYs2o= 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=Pw/TyuNi; 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="Pw/TyuNi" Received: from mail.ideasonboard.com (unknown [223.190.80.185]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1B1FA22F; Mon, 17 Feb 2025 14:27:16 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1739798837; bh=vIyFYBeQc9jLvlrN5HnokpDA4PpMC0ptcjbL0vZkDgI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Pw/TyuNiTUCr6yEW4dDYoHCX7iMl9jFe25iYPWG58sQKP1nT8efXWp7+i/ydQ3B0G hh79NJ14tmZqhARKhf0tkKPItHmkA8p8eyUQ+3bNhz2rBn7RMi7ASr6d/wdiPXf1Mk E5+3vxHaa14Eg86O7FKMb2qFWwYrjs9jD1MiclmQ= From: Jai Luthra Date: Mon, 17 Feb 2025 18:57:33 +0530 Subject: [PATCH v7 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: <20250217-imx219_fixes-v7-3-83c3c63b737e@ideasonboard.com> References: <20250217-imx219_fixes-v7-0-83c3c63b737e@ideasonboard.com> In-Reply-To: <20250217-imx219_fixes-v7-0-83c3c63b737e@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/ZANAwAIAUPekfkkmnFFAcsmYgBnszlLD5uqZHOSt6fEMN8v6ZP+eeT8fSEhxrm4v PrpYfhUdwKJAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ7M5SwAKCRBD3pH5JJpx RTLPD/49KRjw5fyMmcjr9xE/695kA50RbzNqIu8FKd3PM1nTnHsP359kp4IsOs8fqTofefkoE61 sUQHt2Sr7HcGsb/rD0uxyShUSnbnfCBrNv3pORHerZJwnHp/xWLhd/Ig0o4P+5WHnznFRH8qz3a vI1k0wp9cJ8RNjy2ZrSCGIviqVJR2KmXpjNHeJ2VN6rzfnq70gXo3ubqEcT21wa1ysJ6WTMcufV XSpGgsab+tiggsd4L3opwgJclyK/+Ij4Ls3YVROKnMYdi2fwpvjY/msGvJGuturifzp3P5AqMno h6/nGghWGDftoe5Fqy/rQdVmV/Qtwpekb3/5nOaSBT2UYP7Im+bPQ80dAOF5kskPv0axJ4eDUBh Yok7nAEzavyGGsTVuYtOXOFMURyMpkZyoTS3uqFoASzS6MiRmVJ5oiyYF16ANnCyz13DVLbF80b DQzTEU/k0gJGH0orTXLIJmpi9jjRhHCpUufhQOotXZ2+f1+damhk7dIE+RQJVSldKBXYcOYaiDJ KmpZB+ptP2lzhP2ixIscgYN2PUFK+oni18HHBgHM+l8zBSQ4jJ33DJpHjmtKPmMfKFS2FZW76ql BUCWI8qoBFHEXfiP7XRDV2lwqaZsb6TAihEUaK9ouZp0LNaDi148RkgGryuJjoQJf0sNeSyAtAG SuvRRhYOjs/uwNQ== 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 Mon Feb 17 13:27:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13977844 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 F22C021A931; Mon, 17 Feb 2025 13:28:54 +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=1739798936; cv=none; b=RlxiTngBMH6xzISVAMCaSG1barCiPMdjZ/qkHyDMKnc+kW9t2iIF5weLQVp4R8yNJOvvUgNn1FUljbBifkAQwtdinnZVMPBlWxbpr2ix44oRqjJHbQ/CHC56rHZIC1Ehl7+mHiBEV1jOgxtTPeT8m2QcHB7s7LsgbXPP1U+RhwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739798936; c=relaxed/simple; bh=7iS5A8FDnPJD/vVdqvl8eYOLaMP3h7THJYVB5YmGDKE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T0Pc8FkVnox6zE7YEAWxEhE2+hM9hHbhhCDHEOzGRzCSB3dBjUAaW/qYfAGXCFrGR1dUXsjwDcdb7uIO7gaakIKkKb+NEc2JuGvxITamjno20ckNVj5pA/oyHXeQeLv7wBdF2YzUoeDH7KxeSZIDOsk+bwrYtmJTLUNPlzvW0Vo= 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=n7il6tfz; 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="n7il6tfz" Received: from mail.ideasonboard.com (unknown [223.190.80.185]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1C15F22F; Mon, 17 Feb 2025 14:27:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1739798852; bh=7iS5A8FDnPJD/vVdqvl8eYOLaMP3h7THJYVB5YmGDKE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=n7il6tfzaPmouQPOL0wh85PIuqXP+9EP+iF9D9d3jWfHaV7jK396hIGCfMclGQRpt z7AElL2bdv6k+sAPPZU5ZWtDz9WVXxGntLGMcqKicNiDsBnbijl4/tkj5pOOeoxtSE oekB11c5TWQSR3PSvR0y1xvNzTT2ZJLVISJgUBvQ= From: Jai Luthra Date: Mon, 17 Feb 2025 18:57:34 +0530 Subject: [PATCH v7 4/5] media: i2c: imx219: Increase minimum LLP for binned modes Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250217-imx219_fixes-v7-4-83c3c63b737e@ideasonboard.com> References: <20250217-imx219_fixes-v7-0-83c3c63b737e@ideasonboard.com> In-Reply-To: <20250217-imx219_fixes-v7-0-83c3c63b737e@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=3022; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=7iS5A8FDnPJD/vVdqvl8eYOLaMP3h7THJYVB5YmGDKE=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnszlLB4d7zoupT3I1s4vx44eacfrt9xzV7fF5D +LrWiUIlTeJAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ7M5SwAKCRBD3pH5JJpx Rct1D/4nEhpKf5fZK6XVU+H/wTjh/soX3mlRyHyPpdXlykICyT1R6mgabVkPrlI15lNrfs0TKsu M1deaenTnFXNwyARhsXjBHeXE0n2ObnIUUhOLmWxPxBru9+p4phghqKNsHGIlW8srAKa6/lc+AI WRQ5Ux2kCILeKpclhC3k/g/YYniholoWV7iOIA7zx39ASnv79jQ+7BTdjmWkH72nkZHHmXt359o BPXSE3zt20n+jqFhLmkYfEptyNoj3SHBLccHEQ+daRKZH2puhtbRxXfbH+uWAoQqwXBbYjvZaLr IIIc86I6HNHNVNJ/sCfTS2zefwl3VEnBwJ0IMUQWWkKAS+pY1QmpfbY42YzgQD/LLqCu3RVs+2/ q3wYh55TB6PFIzT2sQXZF4LCgKTDYrn0QUVSdzwgmQH3ljnOfnQ1WcB43Pq51c4w33uHuAX680q kewCeMCyjn3Mr07D+eSGSgfFvrP2n/urlvYrM5w9/MxRLzpy1L43uIdIjrQ25k5WVMSCKs6cB1b rcJ2x3kgcQ2E1UTalZFgQTYH3JqdTXG+kjjLhcLn43bb3z0cMoWzfZHeFyHhcIFJQ1bgOtrxUw7 eARcMB27P0Tp0w1HtvrlaZasPUwfyNn+uTCcZqyBIz/jeZgr3PQ/NR/Sjx06xwrb5QE0QvHCKWF WRs6qqwjgt5VjvQ== 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. To keep the same default framerate as before, lower the default fll value for the binned modes to compensate for the increase in llp. Link: https://github.com/raspberrypi/rpicam-apps/issues/281#issuecomment-1082894118 Reviewed-by: Jacopo Mondi Signed-off-by: Jai Luthra --- drivers/media/i2c/imx219.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 8239e7ea8ec03849b339c1f314485266d4c4d8bd..418f88386659d494ff674d64ed69b8441d1ee2cd 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -75,6 +75,7 @@ #define IMX219_VBLANK_MIN 32 #define IMX219_REG_LINE_LENGTH_A CCI_REG16(0x0162) #define IMX219_LLP_MIN 0x0d78 +#define IMX219_BINNED_LLP_MIN 0x0de8 #define IMX219_LLP_MAX 0x7ff0 #define IMX219_REG_X_ADD_STA_A CCI_REG16(0x0164) @@ -298,13 +299,13 @@ static const struct imx219_mode supported_modes[] = { /* 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, }, }; @@ -845,7 +846,7 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) { int exposure_max; int exposure_def; - int hblank; + int hblank, llp_min; /* Update limits and set FPS to default */ __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN, @@ -861,6 +862,17 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, imx219->exposure->minimum, exposure_max, imx219->exposure->step, exposure_def); + + /* + * With analog binning the default minimum line length of 3448 + * can cause artefacts because the ADC operates on two lines + * together. Switch to higher minimum of 3560 if we are binning. + */ + llp_min = (bin_h || bin_v) ? IMX219_BINNED_LLP_MIN : + IMX219_LLP_MIN; + __v4l2_ctrl_modify_range(imx219->hblank, llp_min - mode->width, + IMX219_LLP_MAX - mode->width, 1, + llp_min - mode->width); /* * Retain PPL setting from previous mode so that the * line time does not change on a mode change. @@ -869,10 +881,6 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, * mode width subtracted. */ 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); } From patchwork Mon Feb 17 13:27:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13977845 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 D08AE21A931; Mon, 17 Feb 2025 13:29:10 +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=1739798952; cv=none; b=HXFJtt5BxB6rYlIONdzDHoQuG1Nod7VvTLm33hgyY6u12xB09B5fFl9GcdRiXlo/QOMmzYI3seY60iP0vatm4GSEZ6N9PdaSMNLVI5TnHtXmecRfqfPmfYSzFAU/OpJ/HNKg24UTnA2FJ5yakchjHBNDjwtmfS0DMGqj2B2EUXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739798952; c=relaxed/simple; bh=ktCG+GBGnUm4iX2Mv7vN8PE+5DgHS41N/KgeOTVdvaM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a0jmBnP8qwHJqv+jxTyI5py5vB21TdoxR5ThCgMreJJujNwgjgP45af+tfp5sC0P72dUrebNJ1ZmRwaruzXBc/qTDlnlOba/qiLLdEAX6P2EmEtsLRqcCdvTvDDNcXjBDYuoR4aTHq/Cj9JNvkN7mlPCdPyclznc/Asn1YOqrks= 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=BqtYyz1C; 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="BqtYyz1C" Received: from mail.ideasonboard.com (unknown [223.190.80.185]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DEF2022F; Mon, 17 Feb 2025 14:27:47 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1739798868; bh=ktCG+GBGnUm4iX2Mv7vN8PE+5DgHS41N/KgeOTVdvaM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=BqtYyz1CHOfDZRLbV36pEASsfsgdnBhqppRVc5rT2NGCp4l7gAuMtC+D2wL/i8WTw ZU9dWoIi10yI7+DGIDgFknKOqlLba09sdAxGZRGObhEkQ6f30z7HF/cq6J31aaGMTa mB97Cu1i2zgT5G8jADqDRcbOHm6KUEvawkozf5XE= From: Jai Luthra Date: Mon, 17 Feb 2025 18:57:35 +0530 Subject: [PATCH v7 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: <20250217-imx219_fixes-v7-5-83c3c63b737e@ideasonboard.com> References: <20250217-imx219_fixes-v7-0-83c3c63b737e@ideasonboard.com> In-Reply-To: <20250217-imx219_fixes-v7-0-83c3c63b737e@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=6047; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=ktCG+GBGnUm4iX2Mv7vN8PE+5DgHS41N/KgeOTVdvaM=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnszlLJ1aWdAJuSd9JhL8T+85BSzADQjcCoXwV/ +aadpFW1buJAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZ7M5SwAKCRBD3pH5JJpx RX9fD/9ksDaBMb+95Zvby3XnGPrPXcgXgmIGgKVa4aQnjJJNaTuF6rjjB0vBjGuW0gzr0x2M1uQ FzUC5jvyGFhKtQvJ09dxMEAqSMHNuYAVaIAAUoPPS2ZA3jsfW61HWQkWUrTV8LHFR0wwks6lsYE W+bKTnmmhZ72L02LpX9jqbqBhuo27j6TXh8K1a5w3he5Qbv++wlVjclEitKME7xqL4o2h8hstKj TagEwsxy0VvI4v2l52TGZc1TNuCqGk2jpzPPTmqeYIla50XhxQErY76lZc4uGd4nuVT2l53o5ui nBrxfM4pPB39NRDXuX5LOviiaGtR56VBN+KpXwdFgisN6WxbFDwVJ40+EbOqqpVafKTYgY36O8k uo+MbUrgLYW+LUy+alACOvUGmTLGNH9M4D3zKnBRaqGQN15XAouzf5/a48PONIdTnwV47el/17i bHx0ueI2ViaAmnTaa5hsaG8j+jFgITy+Ek1vKb6SEcmK03n+crhPzk7YGDQtFMvh4exGgbDmZQQ 7ZBEUBIJ4rbnDFRA4GM/apNoHhujWG5XYT+swHlaJJrmKS2BQxxmPf8WD6uj/yq6SeOZTSyZW8B XkA8Y/79qd23HKa2e6w0h8BXCDIIx1W3QHsrysUqAtQyhnBly+u42OMnKaaFw5FQA7wfKoAeVnj 85KjKRTIsEBbU1A== 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 Reviewed-by: Jacopo Mondi --- drivers/media/i2c/imx219.c | 80 +++++++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 418f88386659d494ff674d64ed69b8441d1ee2cd..f97abcc5703ea32f1d6f19a4c0a671a7e978a974 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -296,13 +296,13 @@ static const struct imx219_mode supported_modes[] = { .fll_def = 1763, }, { - /* 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, @@ -357,6 +357,45 @@ static u32 imx219_get_format_code(struct imx219 *imx219, u32 code) return imx219_mbus_formats[i]; } +static void 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); + u32 hbin = crop->width / format->width; + u32 vbin = crop->height / format->height; + + *bin_h = IMX219_BINNING_NONE; + *bin_v = IMX219_BINNING_NONE; + + /* + * Use analog binning only if both dimensions are binned, as it crops + * the other dimension. + */ + if (hbin == 2 && vbin == 2) { + *bin_h = IMX219_BINNING_X2_ANALOG; + *bin_v = IMX219_BINNING_X2_ANALOG; + + return; + } + + if (hbin == 2) + *bin_h = IMX219_BINNING_X2; + if (vbin == 2) + *bin_v = IMX219_BINNING_X2; +} + +static inline u32 imx219_get_rate_factor(struct imx219 *imx219) +{ + u8 bin_h, bin_v; + + imx219_get_binning(imx219, &bin_h, &bin_v); + + return (bin_h & bin_v) == IMX219_BINNING_X2_ANALOG ? 2 : 1; +} + /* ----------------------------------------------------------------------------- * Controls */ @@ -368,10 +407,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; @@ -400,7 +441,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, @@ -417,7 +458,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, @@ -589,7 +630,7 @@ 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; + u8 bin_h, bin_v; int ret = 0; format = v4l2_subdev_state_get_format(state, 0); @@ -602,7 +643,6 @@ static int imx219_set_framefmt(struct imx219 *imx219, 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: @@ -621,26 +661,7 @@ 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; - } - + imx219_get_binning(imx219, &bin_h, &bin_v); cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_H, bin_h, &ret); cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_V, bin_v, &ret); @@ -847,6 +868,7 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, int exposure_max; int exposure_def; int hblank, llp_min; + int pixel_rate; /* Update limits and set FPS to default */ __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN, @@ -882,6 +904,12 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, */ hblank = prev_line_len - 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;