From patchwork Thu Nov 21 12:08:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13881955 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 136971A3BC8; Thu, 21 Nov 2024 12:09:09 +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=1732190951; cv=none; b=nE53e2MSt2NrOX+wPyf9biEH8gKdONdnfYlHGFhinwM3FCFjKfnmfrKQLlg6MaCC69nvCvQ7aGmXRsX7o2Vg6spgINSJstVP4dPvFP0MD86OJGOx5ZwPPpeguMqVUYx25WmBPWwOxsdMs0QN4Yos27Eyi3v4BvP1MA7f7LXoopg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732190951; c=relaxed/simple; bh=7nO4W9FHrQF7HTXU3oQaITzCXQYnWKNMt/Ie0tsFwP4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T8YT8OWS5exx1NW2GY9BLzTPMLL0do0f+nY+DKIbB8jb0tk5c51oSV5BoZOnWzpfvLf6V76VGoEZZmjZxXRUumVeNcYEduqo8xr5Vd+nWlh9uOW47KEWjyGrgqY0ac2k+TOqmDlhXbemkqepdGBJNq4cBva95lh0wgPycICNAj0= 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=d2iowLUk; 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="d2iowLUk" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:883a:10f2:5b4b:5292:ac46:e988]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 121B9219; Thu, 21 Nov 2024 13:08:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1732190929; bh=7nO4W9FHrQF7HTXU3oQaITzCXQYnWKNMt/Ie0tsFwP4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=d2iowLUkB+9jHR9X5I7Px3Ny2Y6bjd8xl1CkbBG+583bgvGFAEX9JAQk924OWEOCz zUtPQ8C03XASIX0mlsjs7rcic64eTzUD0wp3yoaj2PyMtvvK/yelH3KyP1+ahDyrMw 3sutLTN8zx9NQ0riI1876hkkeSG77qyrDm0xu2Lk= From: Jai Luthra Date: Thu, 21 Nov 2024 17:38:02 +0530 Subject: [PATCH v2 1/3] 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: <20241121-imx219_fixes-v2-1-7b068a60ea40@ideasonboard.com> References: <20241121-imx219_fixes-v2-0-7b068a60ea40@ideasonboard.com> In-Reply-To: <20241121-imx219_fixes-v2-0-7b068a60ea40@ideasonboard.com> To: Dave Stevenson , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , 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=FxHt38p3XhnjMDjbzpb+rHs2MXzI2leVKatnUpUMCq4=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnPyLVMmRz8m+nEx9fJIiAjPcqVRX3B6po8Un+C v8o50joKY2JAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZz8i1QAKCRBD3pH5JJpx Rf+ID/wK8Ii1RBWF0Enn5szrgt35LizYvwDmewWsg+dn2/A0RCcp95Wl7PgAhrzufO6Sa+hnVKo gewIljvyFYfEft49IQGduxOevoztBcbwwIMnDT1goeFTwFoKiply3JN3uVX8+MZUGMQCG5a5zKQ CwTGT5apTnwvUyt1MJjEPBeXkFPbAjS0b8v0ddgObqafLPBWXoehX7wrPMnT6U0gpNS4gATzAhH 8r7R7zbAGQSzogNIEHDjGcOEelE2iX1Hu87WKAo3PdJmkLoK2ZnBgG8HVFQHmmRkkFGymyEE+vc +LbNlcCN2kN2ZUMXYL1z3Wm29mDiWMy1HdXBZAgmGerfBe4VXljR06BwINoUlPDbqg/4gSHbfBw r62gyD+6TW/N8PMykLhoF5UQnCzXk6sXlj+5AK1eY2yOMf2zfBUu6w+0XV+b9e1Dq6KI4jPSg1L E9CqzbZc45Um786pu+lTYVwwPg/QnOBQaZ6D/7UrhYbmhdsIVp/AIT5iT9IsuAnOwL0sJDuWlWw dIM0X6UxWpIURTUpcF7LNAEt3TSqKujeYBoGIvD6RBvQQdcm2hIByG16Orx0u89luNAohiFV8Bc lk3IyUh6XUoswGsIxeFrtPBZiEEU3ue0+16A+uldZTfLdtHXHJ6xfbwLa6dQ2ByggmAKTTDPIwr UJQml9GjjilHyCw== 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 e78a80b2bb2e455c857390b188c128b28c224778..f98aad74fe584a18e2fe7126f92bf294762a54e3 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -74,7 +74,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 Thu Nov 21 12:08:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13881956 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 D3E371A3BC8; Thu, 21 Nov 2024 12:09:15 +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=1732190957; cv=none; b=eXPRFi0/yRRlzelwO8xTYZrvt+DgKifw4Ep3NLQ8QG7wSRwJDmbv2+TOwViTWaoj+R0DilCU2w2wlwaFh/HBrce/J83k6Ew5H2X79geyLQnA82NkLYUm2qWN9CDgU7+EwhOveitgd8T6alY2IJXjkfkDs96pVqC44hjy0Gmz+uo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732190957; c=relaxed/simple; bh=QqI5d5eVtyBQ2t+mhUBKeyKswM4PkAT79Vz06aYH8TY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Lvj+2uG3kl5E9cp6+kHKhOpqxInSaaSpOrqXvAs4Ov9cnQNADlpcR2otOgdra+CzX2oDQb9/SBxdP2kaEDJM+YA9ORAr4H1a6OSPo5xjvZu3+2NmwxEt/5+cTRz5qAaA4mJxSUUklDqOQLwGTQrX4ng+biVa+d3K3QLv1iyd/hs= 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=P/Aqwb80; 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="P/Aqwb80" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:883a:10f2:5b4b:5292:ac46:e988]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4F18A219; Thu, 21 Nov 2024 13:08:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1732190935; bh=QqI5d5eVtyBQ2t+mhUBKeyKswM4PkAT79Vz06aYH8TY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=P/Aqwb80qSQ4wi5xdrbGt1az2wWMMTw9pPdyw0mtWF40i3L3cHaCHv2feSt0q0CmA WG6XEmyPMWpm2KxumdfTPnpu4DlfUKfox7DZmnMwBhQRNIjFMrs9rX26rn1d1VOXET L5b2W17+6Dbdr2qZX/1umOPzKPQvKdH4GegZDpxY= From: Jai Luthra Date: Thu, 21 Nov 2024 17:38:03 +0530 Subject: [PATCH v2 2/3] 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: <20241121-imx219_fixes-v2-2-7b068a60ea40@ideasonboard.com> References: <20241121-imx219_fixes-v2-0-7b068a60ea40@ideasonboard.com> In-Reply-To: <20241121-imx219_fixes-v2-0-7b068a60ea40@ideasonboard.com> To: Dave Stevenson , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jai Luthra X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4015; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=XlUePLGV68JgrfulNWEVW2gJa0c01VaOd4IHeTB6KKE=; b=kA0DAAgBQ96R+SSacUUByyZiAGc/ItagkfT6TVQoKZSpLh1gQj94fUYpNGqtTiB+cx8gPfk48 4kCMwQAAQgAHRYhBE3g2Bjl1XXo1FqvxUPekfkkmnFFBQJnPyLWAAoJEEPekfkkmnFFN2IP/0Mg JxoBWoa8DUE0EzeUSztYgCIhVcqBrh+nZwXL6I1+bJEJ63nLfi9sNkSMde62MYpsgENhlxLjb3a a/rHWd1G7jRlJPFl66bCEAkFGOnDah/56fpEqwTJCLToG5QlULvco7cgNhAI3RKf/5LhLr2gBx8 MwZAu3dYh2yWyZ0wgpvxXV6aKLY+ovLsH1/oWKAE45I9+y1Z1qfJ5wWCWkVi5CqgvcA1+dTOgNJ lNuD/HNQxGWnXBsq5Fvd75RNbyzoeLorBo1/5TmX4Jv/i6yoY5K5Z5LHNQ0g0nMtKxBVaZK2pq9 Prn9ch82gmm79VzQCOH66HtHbf7x5D1MrnxEa+Bvs9w6LlSHRnDiOWbZgDyjU4uOZTzurIr1yF0 WtXCk54Y41896YGXmFrPkPklxg7CNmjMvQDxUutWze1lEB6xmS6n1f8paYqFFrEZHBAvhElTvPV 0+TszNUtWQaecC+GeQ1C+TFVMnn45bqqdQ/YNczCv0k8ot3XkY7ldykek49JYfLeTq4gmXAAjII eqAMqRMmrh72BtfXRpUx9cYyXPbFQRTLDcKfUNZ58YhybyPlba0eiQrkQatcoEjfQYMvlqjXkPo uvOWHjS0xf/MBVVSVBbng/mU9rDuc+50SthZjKdGRMMjICe2WRRxzz2K9l/+btIOsoy8M/IPTIG XN9Up 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 HTS 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 HTS setting when changing modes rather than resetting it to a default. Signed-off-by: Dave Stevenson Signed-off-by: Jai Luthra --- drivers/media/i2c/imx219.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index f98aad74fe584a18e2fe7126f92bf294762a54e3..970e6362d0ae3a9078daf337155e83d637bc1ca1 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -76,8 +76,10 @@ #define IMX219_VBLANK_MIN 32 -/* HBLANK control - read only */ -#define IMX219_PPL_DEFAULT 3448 +/* HBLANK control range */ +#define IMX219_PPL_MIN 0x0d78 +#define IMX219_PPL_MAX 0x7ff0 +#define IMX219_REG_HTS CCI_REG16(0x0162) #define IMX219_REG_LINE_LENGTH_A CCI_REG16(0x0162) #define IMX219_REG_X_ADD_STA_A CCI_REG16(0x0164) @@ -422,6 +424,10 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) cci_write(imx219->regmap, IMX219_REG_VTS, format->height + ctrl->val, &ret); break; + case V4L2_CID_HBLANK: + cci_write(imx219->regmap, IMX219_REG_HTS, + format->width + ctrl->val, &ret); + break; case V4L2_CID_TEST_PATTERN_RED: cci_write(imx219->regmap, IMX219_REG_TESTP_RED, ctrl->val, &ret); @@ -496,12 +502,10 @@ static int imx219_init_controls(struct imx219 *imx219) V4L2_CID_VBLANK, IMX219_VBLANK_MIN, IMX219_VTS_MAX - mode->height, 1, mode->vts_def - mode->height); - hblank = IMX219_PPL_DEFAULT - mode->width; + hblank = IMX219_PPL_MIN - 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_def = (exposure_max < IMX219_EXPOSURE_DEFAULT) ? exposure_max : IMX219_EXPOSURE_DEFAULT; @@ -817,6 +821,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_hts; + + format = v4l2_subdev_state_get_format(state, 0); + prev_hts = format->width + imx219->hblank->val; mode = v4l2_find_nearest_size(supported_modes, ARRAY_SIZE(supported_modes), @@ -824,8 +832,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; /* @@ -861,13 +867,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_hts - mode->width; + __v4l2_ctrl_modify_range(imx219->hblank, + IMX219_PPL_MIN - mode->width, + IMX219_PPL_MAX - mode->width, + 1, IMX219_PPL_MIN - mode->width); + __v4l2_ctrl_s_ctrl(imx219->hblank, hblank); } return 0; From patchwork Thu Nov 21 12:08:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 13881957 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 C07DD1A3BC8; Thu, 21 Nov 2024 12:09:22 +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=1732190964; cv=none; b=Qk/4YHdQizLysYlHJldMWg9NEqOCuNrO4HTxmFxh871KpySecjzZN+eGOFzNG0hUD8ytj5+oIoJRZU9ukhpRYjuSkU6criuy89PWCYY2HdDw737NNUkXzDpx+AZfPowpTi6M8I1ub7eAQUuBZyOsNhZd9obi+BwVDUt/7Rk7IHw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732190964; c=relaxed/simple; bh=6p0goZfRhfmcY+8BF+dgtOTPBYivAv61Hi5k/4sl6I4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BmivuG8goelVCfLJVKqeCguL4V9ut9VIv5VZI/HCKtTf7z/I/orDeTh8K9JS0DpT7Ta7YxIOQIw5tTZMHvMkCVkiKYRwSUP27m1XDcqsdULY/Ky1f0VdJ1uWDyYAvK0R8cCWdRS3IKhjWsTHDFhPOtmsh/tpc/cT59JsuuWZfRs= 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=lJJ7Akzw; 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="lJJ7Akzw" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:883a:10f2:5b4b:5292:ac46:e988]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E6FF9736; Thu, 21 Nov 2024 13:09:01 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1732190942; bh=6p0goZfRhfmcY+8BF+dgtOTPBYivAv61Hi5k/4sl6I4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=lJJ7AkzwqSKSq7PhFA81EHzRBjimXPLwF9aSa2QdW2DImfFkOXm3OVLQVInyol9vJ EQgBw/4AYY8ye6q4XSzknpCGnHHJXRShEX0wiazFehEnVDLjObMhKvDY9kWYVuZaf6 lHTOXNo70wtfn4PQE7snJltaWyujB45wbFzGY7fA= From: Jai Luthra Date: Thu, 21 Nov 2024 17:38:04 +0530 Subject: [PATCH v2 3/3] 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: <20241121-imx219_fixes-v2-3-7b068a60ea40@ideasonboard.com> References: <20241121-imx219_fixes-v2-0-7b068a60ea40@ideasonboard.com> In-Reply-To: <20241121-imx219_fixes-v2-0-7b068a60ea40@ideasonboard.com> To: Dave Stevenson , Sakari Ailus , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jai Luthra , Naushir Patuck , Vinay Varma X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8446; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=6p0goZfRhfmcY+8BF+dgtOTPBYivAv61Hi5k/4sl6I4=; b=owEBbQKS/ZANAwAIAUPekfkkmnFFAcsmYgBnPyLWfvpJf3Q1ULt1yaEgOD8K55SORH6TnM6QW a+SDvEGWYmJAjMEAAEIAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCZz8i1gAKCRBD3pH5JJpx RYxYEAC4Hp1TeBUEWE51xfjCd828bvGvIT64RVLGXQgn5221iMcV0N93QY7r7l8ct+LPUjGH3h+ 0Dp7hqblq/jUHpYZz8MQvIjr5qRNSEive1F2o3AVibGhOhO2lcUy9dSfbUW9hNxYwMvDIdLYksn 1fhCJuYS9DSS9PgORGQF395pm0RVERI+95BfOLEU5ddtIniau1/7lgqN9y3gFM9EkyfvxlllJEA wnlapS2LiLC4ZyC/tdREThq9hK6mQm2IZ3iGCUABeypKf6jb/ifAKgwrRqLVdlPCQWj+a3q+zCh 9F80VxTrugb8I9waH8FizPQxVOzhzW/YYVlaheIFEPfYglfdqxnOv2YN1BJlAl2mScOv9Z0Z2wY YaS4ALj7LeMHaFq/LjmYBa3QCHVv2WaI1vp+5hSErbeJj/ZS/+WSdnnw1wk86i//XT60dlGJFOR y062wo3Cy+UH4ck+ykJUISAedpTpz0vEuoqz/GgUJRz9rrIfhRk46l0he9R/oL8traGd21ZCIim 8q1fPc+CBi+S30GMy+OyzkSwDPViUfZXqmtUULwLqeo8dvbiCFAft088ODLZPCE+N1kMYrHYlG1 J8aGJundeICkIB2/mDdiXqiNiFtAQmB8z4z4GL8jgd+tw4HBgG75O60Y6gPfa60LlwK3rAaAoWM v1jWF4CBVwTzOyg== 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 8-bit modes, but normal binning limits the framerate on 10-bit 480p [1]. So with this patch we switch to using special binning (with 2x pixel rate) for all formats of 480p mode and 8-bit 1232p. To do this cleanly, re-introduce the book-keeping for which binning mode is used with which resolution/format. [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 | 138 ++++++++++++++++++++++++++++++--------------- 1 file changed, 94 insertions(+), 44 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 970e6362d0ae3a9078daf337155e83d637bc1ca1..ec795569361987ae30bff234e97fa34600bf5975 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -149,6 +149,18 @@ #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, +}; + +enum binning_bit_depths { + BINNING_IDX_8_BIT, + BINNING_IDX_10_BIT, + BINNING_IDX_MAX +}; + /* Mode : resolution and related config&values */ struct imx219_mode { /* Frame width */ @@ -158,6 +170,9 @@ struct imx219_mode { /* V-timing */ unsigned int vts_def; + + /* binning mode based on format code */ + enum binning_mode binning[BINNING_IDX_MAX]; }; static const struct cci_reg_sequence imx219_common_regs[] = { @@ -293,24 +308,40 @@ static const struct imx219_mode supported_modes[] = { .width = 3280, .height = 2464, .vts_def = 3526, + .binning = { + [BINNING_IDX_8_BIT] = BINNING_NONE, + [BINNING_IDX_10_BIT] = BINNING_NONE, + }, }, { /* 1080P 30fps cropped */ .width = 1920, .height = 1080, .vts_def = 1763, + .binning = { + [BINNING_IDX_8_BIT] = BINNING_NONE, + [BINNING_IDX_10_BIT] = BINNING_NONE, + }, }, { /* 2x2 binned 30fps mode */ .width = 1640, .height = 1232, .vts_def = 1763, + .binning = { + [BINNING_IDX_8_BIT] = BINNING_ANALOG_X2, + [BINNING_IDX_10_BIT] = BINNING_X2, + }, }, { /* 640x480 30fps mode */ .width = 640, .height = 480, .vts_def = 1763, + .binning = { + [BINNING_IDX_8_BIT] = BINNING_ANALOG_X2, + [BINNING_IDX_10_BIT] = BINNING_ANALOG_X2, + }, }, }; @@ -337,6 +368,9 @@ struct imx219 { /* Two or Four lanes */ u8 lanes; + + /* Binning mode */ + enum binning_mode binning; }; static inline struct imx219 *to_imx219(struct v4l2_subdev *_sd) @@ -362,6 +396,36 @@ 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 int imx219_get_rate_factor(struct imx219 *imx219) +{ + switch (imx219->binning) { + case BINNING_NONE: + case BINNING_X2: + return 1; + case BINNING_ANALOG_X2: + return 2; + } + return -EINVAL; +} + /* ----------------------------------------------------------------------------- * Controls */ @@ -373,10 +437,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; + int 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; @@ -405,7 +471,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, @@ -422,7 +488,7 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) break; case V4L2_CID_VBLANK: cci_write(imx219->regmap, IMX219_REG_VTS, - format->height + ctrl->val, &ret); + (format->height + ctrl->val) / rate_factor, &ret); break; case V4L2_CID_HBLANK: cci_write(imx219->regmap, IMX219_REG_HTS, @@ -463,7 +529,8 @@ static const struct v4l2_ctrl_ops imx219_ctrl_ops = { static unsigned long imx219_get_pixel_rate(struct imx219 *imx219) { - return (imx219->lanes == 2) ? IMX219_PIXEL_RATE : IMX219_PIXEL_RATE_4LANE; + return ((imx219->lanes == 2) ? IMX219_PIXEL_RATE : + IMX219_PIXEL_RATE_4LANE) * imx219_get_rate_factor(imx219); } /* Initialize control handlers */ @@ -592,29 +659,12 @@ 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; + 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); @@ -625,28 +675,8 @@ 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); + cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_H, imx219->binning, &ret); + cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_V, imx219->binning, &ret); cci_write(imx219->regmap, IMX219_REG_X_OUTPUT_SIZE, format->width, &ret); @@ -851,6 +881,21 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, int exposure_max; int exposure_def; int hblank; + int pixel_rate; + + /* Update binning mode based on format */ + switch (imx219_get_format_bpp(format)) { + case 8: + imx219->binning = mode->binning[BINNING_IDX_8_BIT]; + break; + + case 10: + imx219->binning = mode->binning[BINNING_IDX_10_BIT]; + break; + + default: + imx219->binning = BINNING_NONE; + } /* Update limits and set FPS to default */ __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN, @@ -879,6 +924,11 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd, IMX219_PPL_MAX - mode->width, 1, IMX219_PPL_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); + __v4l2_ctrl_modify_range(imx219->pixel_rate, pixel_rate, + pixel_rate, 1, pixel_rate); } return 0;