* Re: [PATCH 01/11] media: i2c: ov5640: Set default WB gains [not found] ` <20260501-ov5640_cleanup-v1-1-0869a7802a33@ideasonboard.com> @ 2026-05-14 7:44 ` Jacopo Mondi 0 siblings, 0 replies; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 7:44 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Hi Kieran On Fri, May 01, 2026 at 04:39:03PM +0100, Kieran Bingham wrote: > The default values for the Blue and Red balance should be > the same as the Green balance (0x400/1024). > > Update the values to ensure no change is applied by default. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 85ecc23b3587..01ea6b2bfeeb 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -3470,9 +3470,9 @@ static int ov5640_init_controls(struct ov5640_dev *sensor) > V4L2_CID_AUTO_WHITE_BALANCE, > 0, 1, 1, 1); > ctrls->blue_balance = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BLUE_BALANCE, > - 0, 4095, 1, 0); > + 0, 4095, 1, 1024); > ctrls->red_balance = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_RED_BALANCE, > - 0, 4095, 1, 0); > + 0, 4095, 1, 1024); The register format is not documented, but 0x400 is indeed the default. Looking at the control max value and the register default which is reasonable to assume represents x1.0, I presume it is safe to assume unsigned Q2.10 for the WB gains. Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > /* Auto/manual exposure */ > ctrls->auto_exp = v4l2_ctrl_new_std_menu(hdl, ops, > V4L2_CID_EXPOSURE_AUTO, > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-2-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 02/11] media: i2c: ov5640: Set exposure minimum and defaults [not found] ` <20260501-ov5640_cleanup-v1-2-0869a7802a33@ideasonboard.com> @ 2026-05-14 7:58 ` Jacopo Mondi 2026-05-14 8:01 ` Jacopo Mondi 0 siblings, 1 reply; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 7:58 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Hi Kieran On Fri, May 01, 2026 at 04:39:04PM +0100, Kieran Bingham wrote: > A zero exposure would be a fully black image and not useful as a sensor. > Increase the minimum and default control values to sane parameters. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 01ea6b2bfeeb..b5e529ea662b 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -3479,7 +3479,7 @@ static int ov5640_init_controls(struct ov5640_dev *sensor) > V4L2_EXPOSURE_MANUAL, 0, > V4L2_EXPOSURE_AUTO); > ctrls->exposure = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE, > - 0, 65535, 1, 0); > + 4, 65535, 1, 1000); Where does 1000 come from ? The register default is 512, should we use that value ? Also, is the 4 lines step value correct ? > /* Auto/manual gain */ > ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN, > 0, 1, 1, 1); > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 02/11] media: i2c: ov5640: Set exposure minimum and defaults 2026-05-14 7:58 ` [PATCH 02/11] media: i2c: ov5640: Set exposure minimum and defaults Jacopo Mondi @ 2026-05-14 8:01 ` Jacopo Mondi 0 siblings, 0 replies; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:01 UTC (permalink / raw) To: Jacopo Mondi Cc: Kieran Bingham, Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel On Thu, May 14, 2026 at 09:58:43AM +0200, Jacopo Mondi wrote: > Hi Kieran > > On Fri, May 01, 2026 at 04:39:04PM +0100, Kieran Bingham wrote: > > A zero exposure would be a fully black image and not useful as a sensor. > > Increase the minimum and default control values to sane parameters. > > > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > --- > > drivers/media/i2c/ov5640.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > > index 01ea6b2bfeeb..b5e529ea662b 100644 > > --- a/drivers/media/i2c/ov5640.c > > +++ b/drivers/media/i2c/ov5640.c > > @@ -3479,7 +3479,7 @@ static int ov5640_init_controls(struct ov5640_dev *sensor) > > V4L2_EXPOSURE_MANUAL, 0, > > V4L2_EXPOSURE_AUTO); > > ctrls->exposure = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE, > > - 0, 65535, 1, 0); > > + 4, 65535, 1, 1000); > > Where does 1000 come from ? The register default is 512, should we use > that value ? > > Also, is the 4 lines step value correct ? Sorry, this is the minimum of course. How did you pick 4 ? > > > /* Auto/manual gain */ > > ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN, > > 0, 1, 1, 1); > > > > -- > > 2.52.0 > > > > ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-3-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 03/11] media: i2c: ov5640: Fix minimum gain to 1.0x [not found] ` <20260501-ov5640_cleanup-v1-3-0869a7802a33@ideasonboard.com> @ 2026-05-14 8:05 ` Jacopo Mondi 0 siblings, 0 replies; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:05 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel On Fri, May 01, 2026 at 04:39:05PM +0100, Kieran Bingham wrote: > Adjust the Analogue Gain control to only provide a minimum gain of 1.0, > and ensure that this is the default value rather than '0' which is > invalid. > > Requesting an Analogue gain of 0 would result in a black frame, and when > the sensor is over exposed the Exposure should be reduced instead. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index b5e529ea662b..0dc4f4272d05 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -3484,7 +3484,7 @@ static int ov5640_init_controls(struct ov5640_dev *sensor) > ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN, > 0, 1, 1, 1); > ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_ANALOGUE_GAIN, > - 0, 1023, 1, 0); > + 16, 1023, 1, 16); Again the register is not documented, but it is said that 0xff = x32 which suggests Q6.4 hence 16 should be x1.0 Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > ctrls->saturation = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SATURATION, > 0, 255, 1, 64); > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-4-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 04/11] media: i2c: ov5640: fix error path in ov5640_set_mode [not found] ` <20260501-ov5640_cleanup-v1-4-0869a7802a33@ideasonboard.com> @ 2026-05-14 8:08 ` Jacopo Mondi 0 siblings, 0 replies; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:08 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel On Fri, May 01, 2026 at 04:39:06PM +0100, Kieran Bingham wrote: > During ov5640_set_mode if the call to set the pclk fails, we should > correctly restore the state of the auto exposure > and auto gain if they were modified on entry into the function. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 0dc4f4272d05..244c341d0e77 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -2349,7 +2349,7 @@ static int ov5640_set_mode(struct ov5640_dev *sensor) > else > ret = ov5640_set_dvp_pclk(sensor); > if (ret < 0) > - return 0; > + goto restore_auto_exp_gain; > > if ((dn_mode == SUBSAMPLING && orig_dn_mode == SCALING) || > (dn_mode == SCALING && orig_dn_mode == SUBSAMPLING)) { > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-5-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 05/11] media: i2c: ov5640: Remove unsupported bayer orders [not found] ` <20260501-ov5640_cleanup-v1-5-0869a7802a33@ideasonboard.com> @ 2026-05-14 8:10 ` Jacopo Mondi 2026-05-14 8:43 ` Kieran Bingham 0 siblings, 1 reply; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:10 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Hi Kieran On Fri, May 01, 2026 at 04:39:07PM +0100, Kieran Bingham wrote: > The OV5640 only outputs SBGGR8. Remove the incorrectly advertised > alternatives which allow a misconfigured pipeline to be established. Do you have any idea why the datasheet mentions all the RGGB permutations as valid outputs ? > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 21 --------------------- > 1 file changed, 21 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 244c341d0e77..e1e253730206 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -309,27 +309,6 @@ static const struct ov5640_pixfmt ov5640_csi2_formats[] = { > .bpp = 8, > .ctrl00 = 0x00, > .mux = OV5640_FMT_MUX_RAW_DPC, > - }, { > - /* Raw bayer, GBGB... / RGRG... */ > - .code = MEDIA_BUS_FMT_SGBRG8_1X8, > - .colorspace = V4L2_COLORSPACE_SRGB, > - .bpp = 8, > - .ctrl00 = 0x01, > - .mux = OV5640_FMT_MUX_RAW_DPC, > - }, { > - /* Raw bayer, GRGR... / BGBG... */ > - .code = MEDIA_BUS_FMT_SGRBG8_1X8, > - .colorspace = V4L2_COLORSPACE_SRGB, > - .bpp = 8, > - .ctrl00 = 0x02, > - .mux = OV5640_FMT_MUX_RAW_DPC, > - }, { > - /* Raw bayer, RGRG... / GBGB... */ > - .code = MEDIA_BUS_FMT_SRGGB8_1X8, > - .colorspace = V4L2_COLORSPACE_SRGB, > - .bpp = 8, > - .ctrl00 = 0x03, > - .mux = OV5640_FMT_MUX_RAW_DPC, > }, Seems like you've missed the same entries in the ov5640_dvp_formats[] table. > { /* sentinel */ } > }; > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 05/11] media: i2c: ov5640: Remove unsupported bayer orders 2026-05-14 8:10 ` [PATCH 05/11] media: i2c: ov5640: Remove unsupported bayer orders Jacopo Mondi @ 2026-05-14 8:43 ` Kieran Bingham 2026-05-14 9:22 ` Jacopo Mondi 0 siblings, 1 reply; 18+ messages in thread From: Kieran Bingham @ 2026-05-14 8:43 UTC (permalink / raw) To: Jacopo Mondi Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Quoting Jacopo Mondi (2026-05-14 09:10:48) > Hi Kieran > > On Fri, May 01, 2026 at 04:39:07PM +0100, Kieran Bingham wrote: > > The OV5640 only outputs SBGGR8. Remove the incorrectly advertised > > alternatives which allow a misconfigured pipeline to be established. > > Do you have any idea why the datasheet mentions all the RGGB > permutations as valid outputs ? I would anticipate it's because the internal ISP component can support them. But now I think more I have to admit, I have no idea if other modules might have different physical orderings. But certainly as far as I can tell any given module can only have a single 'correct' value here. So we'll have to try to work out how to confirm/verify that perhaps ? > > > > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > --- > > drivers/media/i2c/ov5640.c | 21 --------------------- > > 1 file changed, 21 deletions(-) > > > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > > index 244c341d0e77..e1e253730206 100644 > > --- a/drivers/media/i2c/ov5640.c > > +++ b/drivers/media/i2c/ov5640.c > > @@ -309,27 +309,6 @@ static const struct ov5640_pixfmt ov5640_csi2_formats[] = { > > .bpp = 8, > > .ctrl00 = 0x00, > > .mux = OV5640_FMT_MUX_RAW_DPC, > > - }, { > > - /* Raw bayer, GBGB... / RGRG... */ > > - .code = MEDIA_BUS_FMT_SGBRG8_1X8, > > - .colorspace = V4L2_COLORSPACE_SRGB, > > - .bpp = 8, > > - .ctrl00 = 0x01, > > - .mux = OV5640_FMT_MUX_RAW_DPC, > > - }, { > > - /* Raw bayer, GRGR... / BGBG... */ > > - .code = MEDIA_BUS_FMT_SGRBG8_1X8, > > - .colorspace = V4L2_COLORSPACE_SRGB, > > - .bpp = 8, > > - .ctrl00 = 0x02, > > - .mux = OV5640_FMT_MUX_RAW_DPC, > > - }, { > > - /* Raw bayer, RGRG... / GBGB... */ > > - .code = MEDIA_BUS_FMT_SRGGB8_1X8, > > - .colorspace = V4L2_COLORSPACE_SRGB, > > - .bpp = 8, > > - .ctrl00 = 0x03, > > - .mux = OV5640_FMT_MUX_RAW_DPC, > > }, > > Seems like you've missed the same entries in the ov5640_dvp_formats[] > table. That was intentional so far as I can only test the CSI variant. But perhaps for the same reasons mentioned above, whatever happens on one will be the same on the other. I hope posting this will find some wider testers 'perhaps' if anyone cares. -- Kieran. > > > { /* sentinel */ } > > }; > > > > -- > > 2.52.0 > > > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 05/11] media: i2c: ov5640: Remove unsupported bayer orders 2026-05-14 8:43 ` Kieran Bingham @ 2026-05-14 9:22 ` Jacopo Mondi 0 siblings, 0 replies; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 9:22 UTC (permalink / raw) To: Kieran Bingham Cc: Jacopo Mondi, Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Hi Kieran On Thu, May 14, 2026 at 09:43:42AM +0100, Kieran Bingham wrote: > Quoting Jacopo Mondi (2026-05-14 09:10:48) > > Hi Kieran > > > > On Fri, May 01, 2026 at 04:39:07PM +0100, Kieran Bingham wrote: > > > The OV5640 only outputs SBGGR8. Remove the incorrectly advertised > > > alternatives which allow a misconfigured pipeline to be established. > > > > Do you have any idea why the datasheet mentions all the RGGB > > permutations as valid outputs ? > > I would anticipate it's because the internal ISP component can support them. > Note that an analogue crop rectangle not aligned with the Bayer macro-pixel could change the pattern, but the sensor's ISP shouldn't need to be informed afaiu > But now I think more I have to admit, I have no idea if other modules > might have different physical orderings. > > But certainly as far as I can tell any given module can only have a > single 'correct' value here. analogue crop alignment apart :) > > So we'll have to try to work out how to confirm/verify that perhaps ? > > > > > > > > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > > --- > > > drivers/media/i2c/ov5640.c | 21 --------------------- > > > 1 file changed, 21 deletions(-) > > > > > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > > > index 244c341d0e77..e1e253730206 100644 > > > --- a/drivers/media/i2c/ov5640.c > > > +++ b/drivers/media/i2c/ov5640.c > > > @@ -309,27 +309,6 @@ static const struct ov5640_pixfmt ov5640_csi2_formats[] = { > > > .bpp = 8, > > > .ctrl00 = 0x00, > > > .mux = OV5640_FMT_MUX_RAW_DPC, > > > - }, { > > > - /* Raw bayer, GBGB... / RGRG... */ > > > - .code = MEDIA_BUS_FMT_SGBRG8_1X8, > > > - .colorspace = V4L2_COLORSPACE_SRGB, > > > - .bpp = 8, > > > - .ctrl00 = 0x01, > > > - .mux = OV5640_FMT_MUX_RAW_DPC, > > > - }, { > > > - /* Raw bayer, GRGR... / BGBG... */ > > > - .code = MEDIA_BUS_FMT_SGRBG8_1X8, > > > - .colorspace = V4L2_COLORSPACE_SRGB, > > > - .bpp = 8, > > > - .ctrl00 = 0x02, > > > - .mux = OV5640_FMT_MUX_RAW_DPC, > > > - }, { > > > - /* Raw bayer, RGRG... / GBGB... */ > > > - .code = MEDIA_BUS_FMT_SRGGB8_1X8, > > > - .colorspace = V4L2_COLORSPACE_SRGB, > > > - .bpp = 8, > > > - .ctrl00 = 0x03, > > > - .mux = OV5640_FMT_MUX_RAW_DPC, > > > }, > > > > Seems like you've missed the same entries in the ov5640_dvp_formats[] > > table. > > That was intentional so far as I can only test the CSI variant. But > perhaps for the same reasons mentioned above, whatever happens on one > will be the same on the other. > > I hope posting this will find some wider testers 'perhaps' if anyone > cares. > > -- > Kieran. > > > > > > { /* sentinel */ } > > > }; > > > > > > -- > > > 2.52.0 > > > > > > ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-6-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 06/11] media: i2c: ov5640: split out the LSC registers [not found] ` <20260501-ov5640_cleanup-v1-6-0869a7802a33@ideasonboard.com> @ 2026-05-14 8:23 ` Jacopo Mondi 2026-05-14 8:44 ` Kieran Bingham 0 siblings, 1 reply; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:23 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Hi Kieran On Fri, May 01, 2026 at 04:39:08PM +0100, Kieran Bingham wrote: > Lens shading is a characteristic which is specific to the lens of a > given module. > > Separate the Lens Shading Calibration registers from the init_setting > to identify the registers which must be updated when changing a lens. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > --- > > The ordering of the table entries here are maintained and not resorted > (i.e. that first line) to make it easy to confirm that no adjustment is > made to the data here. > > I've also moved the LSC 'above' the init table as otherwise the diff > becomes unreviewable - as it shows a different hunk being conceptually > moved instead and hides the ability to see what is moving. > > Though that itself also confirms that the values don't change here, so > I'm happy to move it down if requested. > --- > drivers/media/i2c/ov5640.c | 51 +++++++++++++++++++++++++++------------------- > 1 file changed, 30 insertions(+), 21 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index e1e253730206..b4e1ec4364df 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -522,6 +522,31 @@ static const struct v4l2_mbus_framefmt ov5640_dvp_default_fmt = { > .field = V4L2_FIELD_NONE, > }; > > +static const struct reg_value ov5640_lsc[] = { > + /* Lens Shading Correction */ > + {0x5800, 0x23, 0, 0}, {0x5801, 0x14, 0, 0}, > + {0x5802, 0x0f, 0, 0}, {0x5803, 0x0f, 0, 0}, {0x5804, 0x12, 0, 0}, > + {0x5805, 0x26, 0, 0}, {0x5806, 0x0c, 0, 0}, {0x5807, 0x08, 0, 0}, > + {0x5808, 0x05, 0, 0}, {0x5809, 0x05, 0, 0}, {0x580a, 0x08, 0, 0}, > + {0x580b, 0x0d, 0, 0}, {0x580c, 0x08, 0, 0}, {0x580d, 0x03, 0, 0}, > + {0x580e, 0x00, 0, 0}, {0x580f, 0x00, 0, 0}, {0x5810, 0x03, 0, 0}, > + {0x5811, 0x09, 0, 0}, {0x5812, 0x07, 0, 0}, {0x5813, 0x03, 0, 0}, > + {0x5814, 0x00, 0, 0}, {0x5815, 0x01, 0, 0}, {0x5816, 0x03, 0, 0}, > + {0x5817, 0x08, 0, 0}, {0x5818, 0x0d, 0, 0}, {0x5819, 0x08, 0, 0}, > + {0x581a, 0x05, 0, 0}, {0x581b, 0x06, 0, 0}, {0x581c, 0x08, 0, 0}, > + {0x581d, 0x0e, 0, 0}, {0x581e, 0x29, 0, 0}, {0x581f, 0x17, 0, 0}, > + {0x5820, 0x11, 0, 0}, {0x5821, 0x11, 0, 0}, {0x5822, 0x15, 0, 0}, > + {0x5823, 0x28, 0, 0}, {0x5824, 0x46, 0, 0}, {0x5825, 0x26, 0, 0}, > + {0x5826, 0x08, 0, 0}, {0x5827, 0x26, 0, 0}, {0x5828, 0x64, 0, 0}, > + {0x5829, 0x26, 0, 0}, {0x582a, 0x24, 0, 0}, {0x582b, 0x22, 0, 0}, > + {0x582c, 0x24, 0, 0}, {0x582d, 0x24, 0, 0}, {0x582e, 0x06, 0, 0}, > + {0x582f, 0x22, 0, 0}, {0x5830, 0x40, 0, 0}, {0x5831, 0x42, 0, 0}, > + {0x5832, 0x24, 0, 0}, {0x5833, 0x26, 0, 0}, {0x5834, 0x24, 0, 0}, > + {0x5835, 0x22, 0, 0}, {0x5836, 0x22, 0, 0}, {0x5837, 0x26, 0, 0}, > + {0x5838, 0x44, 0, 0}, {0x5839, 0x24, 0, 0}, {0x583a, 0x26, 0, 0}, > + {0x583b, 0x28, 0, 0}, {0x583c, 0x42, 0, 0}, {0x583d, 0xce, 0, 0}, > +}; > + > static const struct reg_value ov5640_init_setting[] = { > {0x3103, 0x11, 0, 0}, > {0x3103, 0x03, 0, 0}, {0x3630, 0x36, 0, 0}, > @@ -574,27 +599,8 @@ static const struct reg_value ov5640_init_setting[] = { > {0x548d, 0xcd, 0, 0}, {0x548e, 0xdd, 0, 0}, {0x548f, 0xea, 0, 0}, > {0x5490, 0x1d, 0, 0}, {0x5580, 0x02, 0, 0}, {0x5583, 0x40, 0, 0}, > {0x5584, 0x10, 0, 0}, {0x5589, 0x10, 0, 0}, {0x558a, 0x00, 0, 0}, > - {0x558b, 0xf8, 0, 0}, {0x5800, 0x23, 0, 0}, {0x5801, 0x14, 0, 0}, > - {0x5802, 0x0f, 0, 0}, {0x5803, 0x0f, 0, 0}, {0x5804, 0x12, 0, 0}, > - {0x5805, 0x26, 0, 0}, {0x5806, 0x0c, 0, 0}, {0x5807, 0x08, 0, 0}, > - {0x5808, 0x05, 0, 0}, {0x5809, 0x05, 0, 0}, {0x580a, 0x08, 0, 0}, > - {0x580b, 0x0d, 0, 0}, {0x580c, 0x08, 0, 0}, {0x580d, 0x03, 0, 0}, > - {0x580e, 0x00, 0, 0}, {0x580f, 0x00, 0, 0}, {0x5810, 0x03, 0, 0}, > - {0x5811, 0x09, 0, 0}, {0x5812, 0x07, 0, 0}, {0x5813, 0x03, 0, 0}, > - {0x5814, 0x00, 0, 0}, {0x5815, 0x01, 0, 0}, {0x5816, 0x03, 0, 0}, > - {0x5817, 0x08, 0, 0}, {0x5818, 0x0d, 0, 0}, {0x5819, 0x08, 0, 0}, > - {0x581a, 0x05, 0, 0}, {0x581b, 0x06, 0, 0}, {0x581c, 0x08, 0, 0}, > - {0x581d, 0x0e, 0, 0}, {0x581e, 0x29, 0, 0}, {0x581f, 0x17, 0, 0}, > - {0x5820, 0x11, 0, 0}, {0x5821, 0x11, 0, 0}, {0x5822, 0x15, 0, 0}, > - {0x5823, 0x28, 0, 0}, {0x5824, 0x46, 0, 0}, {0x5825, 0x26, 0, 0}, > - {0x5826, 0x08, 0, 0}, {0x5827, 0x26, 0, 0}, {0x5828, 0x64, 0, 0}, > - {0x5829, 0x26, 0, 0}, {0x582a, 0x24, 0, 0}, {0x582b, 0x22, 0, 0}, > - {0x582c, 0x24, 0, 0}, {0x582d, 0x24, 0, 0}, {0x582e, 0x06, 0, 0}, > - {0x582f, 0x22, 0, 0}, {0x5830, 0x40, 0, 0}, {0x5831, 0x42, 0, 0}, > - {0x5832, 0x24, 0, 0}, {0x5833, 0x26, 0, 0}, {0x5834, 0x24, 0, 0}, > - {0x5835, 0x22, 0, 0}, {0x5836, 0x22, 0, 0}, {0x5837, 0x26, 0, 0}, > - {0x5838, 0x44, 0, 0}, {0x5839, 0x24, 0, 0}, {0x583a, 0x26, 0, 0}, > - {0x583b, 0x28, 0, 0}, {0x583c, 0x42, 0, 0}, {0x583d, 0xce, 0, 0}, > + {0x558b, 0xf8, 0, 0}, > + I'm wondering if the empty line here is intentional. Regardless: Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > {0x5025, 0x00, 0, 0}, {0x3a0f, 0x30, 0, 0}, {0x3a10, 0x28, 0, 0}, > {0x3a1b, 0x30, 0, 0}, {0x3a1e, 0x26, 0, 0}, {0x3a11, 0x60, 0, 0}, > {0x3a1f, 0x14, 0, 0}, {0x3008, 0x02, 0, 0}, {0x3c00, 0x04, 0, 300}, > @@ -2396,6 +2402,9 @@ static int ov5640_restore_mode(struct ov5640_dev *sensor) > ov5640_load_regs(sensor, ov5640_init_setting, > ARRAY_SIZE(ov5640_init_setting)); > > + /* Load the Lens Shading Correction Table */ > + ov5640_load_regs(sensor, ov5640_lsc, ARRAY_SIZE(ov5640_lsc)); > + > ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f, > (ilog2(OV5640_SCLK2X_ROOT_DIV) << 2) | > ilog2(OV5640_SCLK_ROOT_DIV)); > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 06/11] media: i2c: ov5640: split out the LSC registers 2026-05-14 8:23 ` [PATCH 06/11] media: i2c: ov5640: split out the LSC registers Jacopo Mondi @ 2026-05-14 8:44 ` Kieran Bingham 0 siblings, 0 replies; 18+ messages in thread From: Kieran Bingham @ 2026-05-14 8:44 UTC (permalink / raw) To: Jacopo Mondi Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Quoting Jacopo Mondi (2026-05-14 09:23:50) > Hi Kieran > > On Fri, May 01, 2026 at 04:39:08PM +0100, Kieran Bingham wrote: > > Lens shading is a characteristic which is specific to the lens of a > > given module. > > > > Separate the Lens Shading Calibration registers from the init_setting > > to identify the registers which must be updated when changing a lens. > > > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > > > --- > > > > The ordering of the table entries here are maintained and not resorted > > (i.e. that first line) to make it easy to confirm that no adjustment is > > made to the data here. > > > > I've also moved the LSC 'above' the init table as otherwise the diff > > becomes unreviewable - as it shows a different hunk being conceptually > > moved instead and hides the ability to see what is moving. > > > > Though that itself also confirms that the values don't change here, so > > I'm happy to move it down if requested. > > --- > > drivers/media/i2c/ov5640.c | 51 +++++++++++++++++++++++++++------------------- > > 1 file changed, 30 insertions(+), 21 deletions(-) > > > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > > index e1e253730206..b4e1ec4364df 100644 > > --- a/drivers/media/i2c/ov5640.c > > +++ b/drivers/media/i2c/ov5640.c > > @@ -522,6 +522,31 @@ static const struct v4l2_mbus_framefmt ov5640_dvp_default_fmt = { > > .field = V4L2_FIELD_NONE, > > }; > > > > +static const struct reg_value ov5640_lsc[] = { > > + /* Lens Shading Correction */ > > + {0x5800, 0x23, 0, 0}, {0x5801, 0x14, 0, 0}, > > + {0x5802, 0x0f, 0, 0}, {0x5803, 0x0f, 0, 0}, {0x5804, 0x12, 0, 0}, > > + {0x5805, 0x26, 0, 0}, {0x5806, 0x0c, 0, 0}, {0x5807, 0x08, 0, 0}, > > + {0x5808, 0x05, 0, 0}, {0x5809, 0x05, 0, 0}, {0x580a, 0x08, 0, 0}, > > + {0x580b, 0x0d, 0, 0}, {0x580c, 0x08, 0, 0}, {0x580d, 0x03, 0, 0}, > > + {0x580e, 0x00, 0, 0}, {0x580f, 0x00, 0, 0}, {0x5810, 0x03, 0, 0}, > > + {0x5811, 0x09, 0, 0}, {0x5812, 0x07, 0, 0}, {0x5813, 0x03, 0, 0}, > > + {0x5814, 0x00, 0, 0}, {0x5815, 0x01, 0, 0}, {0x5816, 0x03, 0, 0}, > > + {0x5817, 0x08, 0, 0}, {0x5818, 0x0d, 0, 0}, {0x5819, 0x08, 0, 0}, > > + {0x581a, 0x05, 0, 0}, {0x581b, 0x06, 0, 0}, {0x581c, 0x08, 0, 0}, > > + {0x581d, 0x0e, 0, 0}, {0x581e, 0x29, 0, 0}, {0x581f, 0x17, 0, 0}, > > + {0x5820, 0x11, 0, 0}, {0x5821, 0x11, 0, 0}, {0x5822, 0x15, 0, 0}, > > + {0x5823, 0x28, 0, 0}, {0x5824, 0x46, 0, 0}, {0x5825, 0x26, 0, 0}, > > + {0x5826, 0x08, 0, 0}, {0x5827, 0x26, 0, 0}, {0x5828, 0x64, 0, 0}, > > + {0x5829, 0x26, 0, 0}, {0x582a, 0x24, 0, 0}, {0x582b, 0x22, 0, 0}, > > + {0x582c, 0x24, 0, 0}, {0x582d, 0x24, 0, 0}, {0x582e, 0x06, 0, 0}, > > + {0x582f, 0x22, 0, 0}, {0x5830, 0x40, 0, 0}, {0x5831, 0x42, 0, 0}, > > + {0x5832, 0x24, 0, 0}, {0x5833, 0x26, 0, 0}, {0x5834, 0x24, 0, 0}, > > + {0x5835, 0x22, 0, 0}, {0x5836, 0x22, 0, 0}, {0x5837, 0x26, 0, 0}, > > + {0x5838, 0x44, 0, 0}, {0x5839, 0x24, 0, 0}, {0x583a, 0x26, 0, 0}, > > + {0x583b, 0x28, 0, 0}, {0x583c, 0x42, 0, 0}, {0x583d, 0xce, 0, 0}, > > +}; > > + > > static const struct reg_value ov5640_init_setting[] = { > > {0x3103, 0x11, 0, 0}, > > {0x3103, 0x03, 0, 0}, {0x3630, 0x36, 0, 0}, > > @@ -574,27 +599,8 @@ static const struct reg_value ov5640_init_setting[] = { > > {0x548d, 0xcd, 0, 0}, {0x548e, 0xdd, 0, 0}, {0x548f, 0xea, 0, 0}, > > {0x5490, 0x1d, 0, 0}, {0x5580, 0x02, 0, 0}, {0x5583, 0x40, 0, 0}, > > {0x5584, 0x10, 0, 0}, {0x5589, 0x10, 0, 0}, {0x558a, 0x00, 0, 0}, > > - {0x558b, 0xf8, 0, 0}, {0x5800, 0x23, 0, 0}, {0x5801, 0x14, 0, 0}, > > - {0x5802, 0x0f, 0, 0}, {0x5803, 0x0f, 0, 0}, {0x5804, 0x12, 0, 0}, > > - {0x5805, 0x26, 0, 0}, {0x5806, 0x0c, 0, 0}, {0x5807, 0x08, 0, 0}, > > - {0x5808, 0x05, 0, 0}, {0x5809, 0x05, 0, 0}, {0x580a, 0x08, 0, 0}, > > - {0x580b, 0x0d, 0, 0}, {0x580c, 0x08, 0, 0}, {0x580d, 0x03, 0, 0}, > > - {0x580e, 0x00, 0, 0}, {0x580f, 0x00, 0, 0}, {0x5810, 0x03, 0, 0}, > > - {0x5811, 0x09, 0, 0}, {0x5812, 0x07, 0, 0}, {0x5813, 0x03, 0, 0}, > > - {0x5814, 0x00, 0, 0}, {0x5815, 0x01, 0, 0}, {0x5816, 0x03, 0, 0}, > > - {0x5817, 0x08, 0, 0}, {0x5818, 0x0d, 0, 0}, {0x5819, 0x08, 0, 0}, > > - {0x581a, 0x05, 0, 0}, {0x581b, 0x06, 0, 0}, {0x581c, 0x08, 0, 0}, > > - {0x581d, 0x0e, 0, 0}, {0x581e, 0x29, 0, 0}, {0x581f, 0x17, 0, 0}, > > - {0x5820, 0x11, 0, 0}, {0x5821, 0x11, 0, 0}, {0x5822, 0x15, 0, 0}, > > - {0x5823, 0x28, 0, 0}, {0x5824, 0x46, 0, 0}, {0x5825, 0x26, 0, 0}, > > - {0x5826, 0x08, 0, 0}, {0x5827, 0x26, 0, 0}, {0x5828, 0x64, 0, 0}, > > - {0x5829, 0x26, 0, 0}, {0x582a, 0x24, 0, 0}, {0x582b, 0x22, 0, 0}, > > - {0x582c, 0x24, 0, 0}, {0x582d, 0x24, 0, 0}, {0x582e, 0x06, 0, 0}, > > - {0x582f, 0x22, 0, 0}, {0x5830, 0x40, 0, 0}, {0x5831, 0x42, 0, 0}, > > - {0x5832, 0x24, 0, 0}, {0x5833, 0x26, 0, 0}, {0x5834, 0x24, 0, 0}, > > - {0x5835, 0x22, 0, 0}, {0x5836, 0x22, 0, 0}, {0x5837, 0x26, 0, 0}, > > - {0x5838, 0x44, 0, 0}, {0x5839, 0x24, 0, 0}, {0x583a, 0x26, 0, 0}, > > - {0x583b, 0x28, 0, 0}, {0x583c, 0x42, 0, 0}, {0x583d, 0xce, 0, 0}, > > + {0x558b, 0xf8, 0, 0}, > > + > > I'm wondering if the empty line here is intentional. Yes, to start separating the functional blocks. I think we can work a lot more to break out this whole register table with the full datasheet being 'public'. > Regardless: > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > > {0x5025, 0x00, 0, 0}, {0x3a0f, 0x30, 0, 0}, {0x3a10, 0x28, 0, 0}, > > {0x3a1b, 0x30, 0, 0}, {0x3a1e, 0x26, 0, 0}, {0x3a11, 0x60, 0, 0}, > > {0x3a1f, 0x14, 0, 0}, {0x3008, 0x02, 0, 0}, {0x3c00, 0x04, 0, 300}, > > @@ -2396,6 +2402,9 @@ static int ov5640_restore_mode(struct ov5640_dev *sensor) > > ov5640_load_regs(sensor, ov5640_init_setting, > > ARRAY_SIZE(ov5640_init_setting)); > > > > + /* Load the Lens Shading Correction Table */ > > + ov5640_load_regs(sensor, ov5640_lsc, ARRAY_SIZE(ov5640_lsc)); > > + > > ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f, > > (ilog2(OV5640_SCLK2X_ROOT_DIV) << 2) | > > ilog2(OV5640_SCLK_ROOT_DIV)); > > > > -- > > 2.52.0 > > > > ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-8-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 08/11] media: i2c: ov5640: Document AWB control registers [not found] ` <20260501-ov5640_cleanup-v1-8-0869a7802a33@ideasonboard.com> @ 2026-05-14 8:33 ` Jacopo Mondi 2026-05-14 8:34 ` Jacopo Mondi 1 sibling, 0 replies; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:33 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel On Fri, May 01, 2026 at 04:39:10PM +0100, Kieran Bingham wrote: > Identify and map the registers that are controlling the AWB and > document their current impact inline in the register set. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 61 +++++++++++++++++++++++++++++++++++----------- > 1 file changed, 47 insertions(+), 14 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 4b6804fc47e1..34fe7f51e17b 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -112,6 +112,34 @@ > #define OV5640_REG_PCLK_PERIOD 0x4837 > #define OV5640_REG_ISP_FORMAT_MUX_CTRL 0x501f > #define OV5640_REG_PRE_ISP_TEST_SET1 0x503d > + > +#define OV5640_REG_AWB_CONTROL_00 0x5180 /* AWB B block */ > +#define OV5640_REG_AWB_CONTROL_01 0x5181 /* AWB Step and Slope control */ > +#define OV5640_REG_AWB_CONTROL_02 0x5182 /* 7:4 Max local counter 3:0 mas fast counter */ s/mas/max ? > +#define OV5640_REG_AWB_CONTROL_03 0x5183 /* AWB Simple/Advanced control */ > +#define OV5640_REG_AWB_CONTROL_04 0x5184 /* Count and G enable */ > +#define OV5640_REG_AWB_CONTROL_05 0x5185 /* Stable Range Thresholds */ > + > +#define OV5640_REG_AWB_CONTROL_17 0x5191 /* AWB Top limit */ > +#define OV5640_REG_AWB_CONTROL_18 0x5192 /* AWB Bottom limit */ > +#define OV5640_REG_AWB_CONTROL_19 0x5193 /* Red limit */ > +#define OV5640_REG_AWB_CONTROL_20 0x5194 /* Green limit */ > +#define OV5640_REG_AWB_CONTROL_21 0x5195 /* Blue limit */ > + > +#define OV5640_REG_AWB_CONTROL_22 0x5196 /* AWB Freeze and Simple Selection */ > +#define OV5640_AWB_FREEZE BIT(5) /* AWB freeze */ > +#define OV5640_AWB_SIMPLE_SELECT_MASK GENMASK(3, 2) > +#define OV5640_AWB_SIMPLE_AFTER_AWB_0 0 /* AWB simple from after AWB gain */ > +#define OV5640_AWB_SIMPLE_AFTER_GMA_0 1 /* AWB simple from after RAW GMA */ > +#define OV5640_AWB_SIMPLE_AFTER_GMA_1 2 /* AWB simple from after RAW GMA */ That's weird, but that's what the datasheet describes, yes > +#define OV5640_AWB_SIMPLE_AFTER_AWB_1 3 /* AWB simple from after AWB gain */ > +#define OV5640_AWB_FAST_ENABLE BIT(1) /* AWB fast enable */ > +#define OV5640_AWB_BIAS_STAT BIT(0) > + > +#define OV5640_REG_AWB_CONTROL_23 0x5197 /* Local Limit */ > + > +#define OV5640_REG_AWB_CONTROL_30 0x519e /* Local limit and Stable Select */ > + > #define OV5640_REG_SDE_CTRL0 0x5580 > #define OV5640_REG_SDE_CTRL1 0x5581 > #define OV5640_REG_SDE_CTRL3 0x5583 > @@ -576,12 +604,14 @@ static const struct reg_value ov5640_init_setting[] = { > {0x5000, 0xa7, 0, 0}, {0x5001, 0xa3, 0, 0}, > > /* AWB Control */ > - {0x5180, 0xff, 0, 0}, > - {0x5181, 0xf2, 0, 0}, > - {0x5182, 0x00, 0, 0}, > - {0x5183, 0x14, 0, 0}, > - {0x5184, 0x25, 0, 0}, > - {0x5185, 0x24, 0, 0}, > + {OV5640_REG_AWB_CONTROL_00, 0xff, 0, 0}, /* AWB B Block */ > + {OV5640_REG_AWB_CONTROL_01, 0xf2, 0, 0}, /* Step and Slope - one zone, 0 slope, step fast=step local = 3 */ > + {OV5640_REG_AWB_CONTROL_02, 0x00, 0, 0}, /* Local/Fast counters @ 0 */ > + {OV5640_REG_AWB_CONTROL_03, 0x14, 0, 0}, /* Advanced AWB: AWB SIMF, AWB Win = 1 */ > + {OV5640_REG_AWB_CONTROL_04, 0x25, 0, 0}, /* G-Enable, Count-limit=1, count threshold=1 */ > + {OV5640_REG_AWB_CONTROL_05, 0x24, 0, 0}, /* Stable Ranges: Threshold for [7:4] unstable to stable [3:0] stable to unstable */ > + > + /* AWB Advanced Control - Undocumented */ > {0x5186, 0x09, 0, 0}, > {0x5187, 0x09, 0, 0}, > {0x5188, 0x09, 0, 0}, > @@ -593,20 +623,23 @@ static const struct reg_value ov5640_init_setting[] = { > {0x518e, 0x34, 0, 0}, > {0x518f, 0x6b, 0, 0}, > {0x5190, 0x46, 0, 0}, > - {0x5191, 0xf8, 0, 0}, > - {0x5192, 0x04, 0, 0}, > - {0x5193, 0x70, 0, 0}, > - {0x5194, 0xf0, 0, 0}, > - {0x5195, 0xf0, 0, 0}, > - {0x5196, 0x03, 0, 0}, > - {0x5197, 0x01, 0, 0}, > + > + {OV5640_REG_AWB_CONTROL_17, 0xf8, 0, 0}, /* AWB Top limit (Default 0xff)*/ > + {OV5640_REG_AWB_CONTROL_18, 0x04, 0, 0}, /* AWB Bottom limit (Default 0x00) */ > + {OV5640_REG_AWB_CONTROL_19, 0x70, 0, 0}, /* Red limit (Default 0xf0) */ > + {OV5640_REG_AWB_CONTROL_20, 0xf0, 0, 0}, /* Green Limit (Default 0xf0) */ > + {OV5640_REG_AWB_CONTROL_21, 0xf0, 0, 0}, /* Blue limit (Default 0xf0) */ > + {OV5640_REG_AWB_CONTROL_22, 0x03, 0, 0}, /* AWB after AWB gain; Fast enable; Bias stat; */ > + {OV5640_REG_AWB_CONTROL_23, 0x01, 0, 0}, /* Local limit (Default 0x02) */ > + > + /* Debug mode - Undocumented */ > {0x5198, 0x04, 0, 0}, > {0x5199, 0x6c, 0, 0}, > {0x519a, 0x04, 0, 0}, > {0x519b, 0x00, 0, 0}, > {0x519c, 0x09, 0, 0}, > {0x519d, 0x2b, 0, 0}, > - {0x519e, 0x38, 0, 0}, > + {OV5640_REG_AWB_CONTROL_30, 0x38, 0, 0}, /* [7:4] Debug = 3; [3] Local Limit Select = 1; [2] Simple stable select=0; [1:0] Debug=0 */ I'm happy to go over line limit for better documentation. I anticipate someone might ask to place the comment in the line above to reduce the line length, but I'm not going to be that person :) Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > {0x5381, 0x1e, 0, 0}, {0x5382, 0x5b, 0, 0}, {0x5383, 0x08, 0, 0}, > {0x5384, 0x0a, 0, 0}, {0x5385, 0x7e, 0, 0}, {0x5386, 0x88, 0, 0}, > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 08/11] media: i2c: ov5640: Document AWB control registers [not found] ` <20260501-ov5640_cleanup-v1-8-0869a7802a33@ideasonboard.com> 2026-05-14 8:33 ` [PATCH 08/11] media: i2c: ov5640: Document AWB control registers Jacopo Mondi @ 2026-05-14 8:34 ` Jacopo Mondi 2026-05-14 8:48 ` Kieran Bingham 1 sibling, 1 reply; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:34 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Ah sorry, I would squash this with the previous one. If you prefer to keep them separate, add my tag to 07 as well. On Fri, May 01, 2026 at 04:39:10PM +0100, Kieran Bingham wrote: > Identify and map the registers that are controlling the AWB and > document their current impact inline in the register set. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 61 +++++++++++++++++++++++++++++++++++----------- > 1 file changed, 47 insertions(+), 14 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 4b6804fc47e1..34fe7f51e17b 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -112,6 +112,34 @@ > #define OV5640_REG_PCLK_PERIOD 0x4837 > #define OV5640_REG_ISP_FORMAT_MUX_CTRL 0x501f > #define OV5640_REG_PRE_ISP_TEST_SET1 0x503d > + > +#define OV5640_REG_AWB_CONTROL_00 0x5180 /* AWB B block */ > +#define OV5640_REG_AWB_CONTROL_01 0x5181 /* AWB Step and Slope control */ > +#define OV5640_REG_AWB_CONTROL_02 0x5182 /* 7:4 Max local counter 3:0 mas fast counter */ > +#define OV5640_REG_AWB_CONTROL_03 0x5183 /* AWB Simple/Advanced control */ > +#define OV5640_REG_AWB_CONTROL_04 0x5184 /* Count and G enable */ > +#define OV5640_REG_AWB_CONTROL_05 0x5185 /* Stable Range Thresholds */ > + > +#define OV5640_REG_AWB_CONTROL_17 0x5191 /* AWB Top limit */ > +#define OV5640_REG_AWB_CONTROL_18 0x5192 /* AWB Bottom limit */ > +#define OV5640_REG_AWB_CONTROL_19 0x5193 /* Red limit */ > +#define OV5640_REG_AWB_CONTROL_20 0x5194 /* Green limit */ > +#define OV5640_REG_AWB_CONTROL_21 0x5195 /* Blue limit */ > + > +#define OV5640_REG_AWB_CONTROL_22 0x5196 /* AWB Freeze and Simple Selection */ > +#define OV5640_AWB_FREEZE BIT(5) /* AWB freeze */ > +#define OV5640_AWB_SIMPLE_SELECT_MASK GENMASK(3, 2) > +#define OV5640_AWB_SIMPLE_AFTER_AWB_0 0 /* AWB simple from after AWB gain */ > +#define OV5640_AWB_SIMPLE_AFTER_GMA_0 1 /* AWB simple from after RAW GMA */ > +#define OV5640_AWB_SIMPLE_AFTER_GMA_1 2 /* AWB simple from after RAW GMA */ > +#define OV5640_AWB_SIMPLE_AFTER_AWB_1 3 /* AWB simple from after AWB gain */ > +#define OV5640_AWB_FAST_ENABLE BIT(1) /* AWB fast enable */ > +#define OV5640_AWB_BIAS_STAT BIT(0) > + > +#define OV5640_REG_AWB_CONTROL_23 0x5197 /* Local Limit */ > + > +#define OV5640_REG_AWB_CONTROL_30 0x519e /* Local limit and Stable Select */ > + > #define OV5640_REG_SDE_CTRL0 0x5580 > #define OV5640_REG_SDE_CTRL1 0x5581 > #define OV5640_REG_SDE_CTRL3 0x5583 > @@ -576,12 +604,14 @@ static const struct reg_value ov5640_init_setting[] = { > {0x5000, 0xa7, 0, 0}, {0x5001, 0xa3, 0, 0}, > > /* AWB Control */ > - {0x5180, 0xff, 0, 0}, > - {0x5181, 0xf2, 0, 0}, > - {0x5182, 0x00, 0, 0}, > - {0x5183, 0x14, 0, 0}, > - {0x5184, 0x25, 0, 0}, > - {0x5185, 0x24, 0, 0}, > + {OV5640_REG_AWB_CONTROL_00, 0xff, 0, 0}, /* AWB B Block */ > + {OV5640_REG_AWB_CONTROL_01, 0xf2, 0, 0}, /* Step and Slope - one zone, 0 slope, step fast=step local = 3 */ > + {OV5640_REG_AWB_CONTROL_02, 0x00, 0, 0}, /* Local/Fast counters @ 0 */ > + {OV5640_REG_AWB_CONTROL_03, 0x14, 0, 0}, /* Advanced AWB: AWB SIMF, AWB Win = 1 */ > + {OV5640_REG_AWB_CONTROL_04, 0x25, 0, 0}, /* G-Enable, Count-limit=1, count threshold=1 */ > + {OV5640_REG_AWB_CONTROL_05, 0x24, 0, 0}, /* Stable Ranges: Threshold for [7:4] unstable to stable [3:0] stable to unstable */ > + > + /* AWB Advanced Control - Undocumented */ > {0x5186, 0x09, 0, 0}, > {0x5187, 0x09, 0, 0}, > {0x5188, 0x09, 0, 0}, > @@ -593,20 +623,23 @@ static const struct reg_value ov5640_init_setting[] = { > {0x518e, 0x34, 0, 0}, > {0x518f, 0x6b, 0, 0}, > {0x5190, 0x46, 0, 0}, > - {0x5191, 0xf8, 0, 0}, > - {0x5192, 0x04, 0, 0}, > - {0x5193, 0x70, 0, 0}, > - {0x5194, 0xf0, 0, 0}, > - {0x5195, 0xf0, 0, 0}, > - {0x5196, 0x03, 0, 0}, > - {0x5197, 0x01, 0, 0}, > + > + {OV5640_REG_AWB_CONTROL_17, 0xf8, 0, 0}, /* AWB Top limit (Default 0xff)*/ > + {OV5640_REG_AWB_CONTROL_18, 0x04, 0, 0}, /* AWB Bottom limit (Default 0x00) */ > + {OV5640_REG_AWB_CONTROL_19, 0x70, 0, 0}, /* Red limit (Default 0xf0) */ > + {OV5640_REG_AWB_CONTROL_20, 0xf0, 0, 0}, /* Green Limit (Default 0xf0) */ > + {OV5640_REG_AWB_CONTROL_21, 0xf0, 0, 0}, /* Blue limit (Default 0xf0) */ > + {OV5640_REG_AWB_CONTROL_22, 0x03, 0, 0}, /* AWB after AWB gain; Fast enable; Bias stat; */ > + {OV5640_REG_AWB_CONTROL_23, 0x01, 0, 0}, /* Local limit (Default 0x02) */ > + > + /* Debug mode - Undocumented */ > {0x5198, 0x04, 0, 0}, > {0x5199, 0x6c, 0, 0}, > {0x519a, 0x04, 0, 0}, > {0x519b, 0x00, 0, 0}, > {0x519c, 0x09, 0, 0}, > {0x519d, 0x2b, 0, 0}, > - {0x519e, 0x38, 0, 0}, > + {OV5640_REG_AWB_CONTROL_30, 0x38, 0, 0}, /* [7:4] Debug = 3; [3] Local Limit Select = 1; [2] Simple stable select=0; [1:0] Debug=0 */ > > {0x5381, 0x1e, 0, 0}, {0x5382, 0x5b, 0, 0}, {0x5383, 0x08, 0, 0}, > {0x5384, 0x0a, 0, 0}, {0x5385, 0x7e, 0, 0}, {0x5386, 0x88, 0, 0}, > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 08/11] media: i2c: ov5640: Document AWB control registers 2026-05-14 8:34 ` Jacopo Mondi @ 2026-05-14 8:48 ` Kieran Bingham 0 siblings, 0 replies; 18+ messages in thread From: Kieran Bingham @ 2026-05-14 8:48 UTC (permalink / raw) To: Jacopo Mondi Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Quoting Jacopo Mondi (2026-05-14 09:34:40) > Ah sorry, > I would squash this with the previous one. If you prefer to keep > them separate, add my tag to 07 as well. Ack, I tried to keep things separated so it was clear I wasn't modifying values while splitting, and then changing the readability. I didn't want any unintended changes to be disguised. Happy to squash now it's had some eyes over though. -- Kieran ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-9-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 09/11] media: i2c: ov5640: Add ISP Control registers [not found] ` <20260501-ov5640_cleanup-v1-9-0869a7802a33@ideasonboard.com> @ 2026-05-14 8:36 ` Jacopo Mondi 0 siblings, 0 replies; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:36 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Hi Kieran On Fri, May 01, 2026 at 04:39:11PM +0100, Kieran Bingham wrote: > Define the bits for the ISP control register to be able to use > and explain component enablement. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index 34fe7f51e17b..fd369a13463e 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -110,6 +110,21 @@ > #define OV5640_REG_MIPI_CTRL00 0x4800 > #define OV5640_REG_DEBUG_MODE 0x4814 > #define OV5640_REG_PCLK_PERIOD 0x4837 > + > +#define OV5640_REG_ISP_CTRL00 0x5000 > +#define OV5640_ISP_00_LENC_ENABLE BIT(7) > +#define OV5640_ISP_00_GMA_ENABLE BIT(5) > +#define OV5640_ISP_00_BPC_ENABLE BIT(2) > +#define OV5640_ISP_00_WPC_ENABLE BIT(1) > +#define OV5640_ISP_00_CIP_ENABLE BIT(0) > + > +#define OV5640_REG_ISP_CTRL01 0x5001 > +#define OV5640_ISP_01_SDE_ENABLE BIT(7) > +#define OV5640_ISP_01_SCL_ENABLE BIT(5) > +#define OV5640_ISP_01_UVA_ENABLE BIT(2) > +#define OV5640_ISP_01_CMX_ENABLE BIT(1) > +#define OV5640_ISP_01_AWB_ENABLE BIT(0) > + Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > #define OV5640_REG_ISP_FORMAT_MUX_CTRL 0x501f > #define OV5640_REG_PRE_ISP_TEST_SET1 0x503d > > @@ -601,7 +616,10 @@ static const struct reg_value ov5640_init_setting[] = { > {0x3002, 0x1c, 0, 0}, {0x3004, 0xff, 0, 0}, {0x3006, 0xc3, 0, 0}, > {0x302e, 0x08, 0, 0}, {0x4300, 0x3f, 0, 0}, > {0x501f, 0x00, 0, 0}, {0x440e, 0x00, 0, 0}, {0x4837, 0x0a, 0, 0}, > - {0x5000, 0xa7, 0, 0}, {0x5001, 0xa3, 0, 0}, > + > + /* ISP Control */ > + {OV5640_REG_ISP_CTRL00, 0xa7, 0, 0}, > + {OV5640_REG_ISP_CTRL01, 0xa3, 0, 0}, > > /* AWB Control */ > {OV5640_REG_AWB_CONTROL_00, 0xff, 0, 0}, /* AWB B Block */ > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-10-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 10/11] media: i2c: ov5640: Disable ISP for raw output [not found] ` <20260501-ov5640_cleanup-v1-10-0869a7802a33@ideasonboard.com> @ 2026-05-14 8:39 ` Jacopo Mondi 2026-05-14 8:50 ` Kieran Bingham 0 siblings, 1 reply; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:39 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Hi Kieran On Fri, May 01, 2026 at 04:39:12PM +0100, Kieran Bingham wrote: > The OV5640 has ISP operations that can run even when outputting RAW > bayer data. These include the Lens Shading Correction, Gamma and Auto > white balance which need to be disabled when performing module > calibration using RAW data. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 45 ++++++++++++++++++++++++++++++++++++++------- > 1 file changed, 38 insertions(+), 7 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index fd369a13463e..f63d81640f54 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -280,28 +280,28 @@ static const struct ov5640_pixfmt ov5640_dvp_formats[] = { > }, { > /* Raw, BGBG... / GRGR... */ > .code = MEDIA_BUS_FMT_SBGGR8_1X8, > - .colorspace = V4L2_COLORSPACE_SRGB, > + .colorspace = V4L2_COLORSPACE_RAW, > .bpp = 8, > .ctrl00 = 0x00, > .mux = OV5640_FMT_MUX_RAW_DPC, > }, { > /* Raw bayer, GBGB... / RGRG... */ > .code = MEDIA_BUS_FMT_SGBRG8_1X8, > - .colorspace = V4L2_COLORSPACE_SRGB, > + .colorspace = V4L2_COLORSPACE_RAW, > .bpp = 8, > .ctrl00 = 0x01, > .mux = OV5640_FMT_MUX_RAW_DPC, > }, { > /* Raw bayer, GRGR... / BGBG... */ > .code = MEDIA_BUS_FMT_SGRBG8_1X8, > - .colorspace = V4L2_COLORSPACE_SRGB, > + .colorspace = V4L2_COLORSPACE_RAW, > .bpp = 8, > .ctrl00 = 0x02, > .mux = OV5640_FMT_MUX_RAW_DPC, > }, { > /* Raw bayer, RGRG... / GBGB... */ > .code = MEDIA_BUS_FMT_SRGGB8_1X8, > - .colorspace = V4L2_COLORSPACE_SRGB, > + .colorspace = V4L2_COLORSPACE_RAW, > .bpp = 8, > .ctrl00 = 0x03, > .mux = OV5640_FMT_MUX_RAW_DPC, > @@ -348,7 +348,7 @@ static const struct ov5640_pixfmt ov5640_csi2_formats[] = { > }, { > /* Raw, BGBG... / GRGR... */ > .code = MEDIA_BUS_FMT_SBGGR8_1X8, > - .colorspace = V4L2_COLORSPACE_SRGB, > + .colorspace = V4L2_COLORSPACE_RAW, > .bpp = 8, > .ctrl00 = 0x00, > .mux = OV5640_FMT_MUX_RAW_DPC, > @@ -473,6 +473,7 @@ struct ov5640_dev { > > struct v4l2_mbus_framefmt fmt; > bool pending_fmt_change; > + bool is_raw; > > const struct ov5640_mode_info *current_mode; > const struct ov5640_mode_info *last_mode; > @@ -618,8 +619,13 @@ static const struct reg_value ov5640_init_setting[] = { > {0x501f, 0x00, 0, 0}, {0x440e, 0x00, 0, 0}, {0x4837, 0x0a, 0, 0}, > > /* ISP Control */ > - {OV5640_REG_ISP_CTRL00, 0xa7, 0, 0}, > - {OV5640_REG_ISP_CTRL01, 0xa3, 0, 0}, > + {OV5640_REG_ISP_CTRL00, OV5640_ISP_00_LENC_ENABLE | OV5640_ISP_00_GMA_ENABLE | > + OV5640_ISP_00_BPC_ENABLE | OV5640_ISP_00_WPC_ENABLE | > + OV5640_ISP_00_CIP_ENABLE, 0, 0}, > + > + /* OV5640_ISP_01_UVA_ENABLE is not enabled */ > + {OV5640_REG_ISP_CTRL01, OV5640_ISP_01_SDE_ENABLE | OV5640_ISP_01_SCL_ENABLE | > + OV5640_ISP_01_CMX_ENABLE | OV5640_ISP_01_AWB_ENABLE, 0, 0}, Should we avoid writing these registers at all in the init sequence ? > > /* AWB Control */ > {OV5640_REG_AWB_CONTROL_00, 0xff, 0, 0}, /* AWB B Block */ > @@ -3116,6 +3122,31 @@ static int ov5640_set_framefmt(struct ov5640_dev *sensor, > if (ret) > return ret; > > + /* > + * Disable all ISP image processing (Lens Shading, Gamma, AWB...) for > + * RAW modes to facilitate module tuning. > + */ > + sensor->is_raw = pixfmt->colorspace == V4L2_COLORSPACE_RAW; Unless it is used later on, the 'is_raw' flag can be kept a local variable. > + if (sensor->is_raw) { > + ret = ov5640_write_reg(sensor, OV5640_REG_ISP_CTRL00, 0); > + if (ret) > + return ret; > + } else { > + ret = ov5640_write_reg(sensor, OV5640_REG_ISP_CTRL00, > + OV5640_ISP_00_LENC_ENABLE | OV5640_ISP_00_GMA_ENABLE | > + OV5640_ISP_00_BPC_ENABLE | OV5640_ISP_00_WPC_ENABLE | > + OV5640_ISP_00_CIP_ENABLE); > + if (ret) > + return ret; > + > + /* OV5640_ISP_01_UVA_ENABLE is not enabled */ > + ret = ov5640_write_reg(sensor, OV5640_REG_ISP_CTRL01, > + OV5640_ISP_01_SDE_ENABLE | OV5640_ISP_01_SCL_ENABLE | > + OV5640_ISP_01_CMX_ENABLE | OV5640_ISP_01_AWB_ENABLE); > + if (ret) > + return ret; > + } > + > /* > * TIMING TC REG21: > * - [5]: JPEG enable > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 10/11] media: i2c: ov5640: Disable ISP for raw output 2026-05-14 8:39 ` [PATCH 10/11] media: i2c: ov5640: Disable ISP for raw output Jacopo Mondi @ 2026-05-14 8:50 ` Kieran Bingham 0 siblings, 0 replies; 18+ messages in thread From: Kieran Bingham @ 2026-05-14 8:50 UTC (permalink / raw) To: Jacopo Mondi Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Quoting Jacopo Mondi (2026-05-14 09:39:31) > Hi Kieran > > On Fri, May 01, 2026 at 04:39:12PM +0100, Kieran Bingham wrote: > > The OV5640 has ISP operations that can run even when outputting RAW > > bayer data. These include the Lens Shading Correction, Gamma and Auto > > white balance which need to be disabled when performing module > > calibration using RAW data. > > > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > --- > > drivers/media/i2c/ov5640.c | 45 ++++++++++++++++++++++++++++++++++++++------- > > 1 file changed, 38 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > > index fd369a13463e..f63d81640f54 100644 > > --- a/drivers/media/i2c/ov5640.c > > +++ b/drivers/media/i2c/ov5640.c > > @@ -280,28 +280,28 @@ static const struct ov5640_pixfmt ov5640_dvp_formats[] = { > > }, { > > /* Raw, BGBG... / GRGR... */ > > .code = MEDIA_BUS_FMT_SBGGR8_1X8, > > - .colorspace = V4L2_COLORSPACE_SRGB, > > + .colorspace = V4L2_COLORSPACE_RAW, > > .bpp = 8, > > .ctrl00 = 0x00, > > .mux = OV5640_FMT_MUX_RAW_DPC, > > }, { > > /* Raw bayer, GBGB... / RGRG... */ > > .code = MEDIA_BUS_FMT_SGBRG8_1X8, > > - .colorspace = V4L2_COLORSPACE_SRGB, > > + .colorspace = V4L2_COLORSPACE_RAW, > > .bpp = 8, > > .ctrl00 = 0x01, > > .mux = OV5640_FMT_MUX_RAW_DPC, > > }, { > > /* Raw bayer, GRGR... / BGBG... */ > > .code = MEDIA_BUS_FMT_SGRBG8_1X8, > > - .colorspace = V4L2_COLORSPACE_SRGB, > > + .colorspace = V4L2_COLORSPACE_RAW, > > .bpp = 8, > > .ctrl00 = 0x02, > > .mux = OV5640_FMT_MUX_RAW_DPC, > > }, { > > /* Raw bayer, RGRG... / GBGB... */ > > .code = MEDIA_BUS_FMT_SRGGB8_1X8, > > - .colorspace = V4L2_COLORSPACE_SRGB, > > + .colorspace = V4L2_COLORSPACE_RAW, > > .bpp = 8, > > .ctrl00 = 0x03, > > .mux = OV5640_FMT_MUX_RAW_DPC, > > @@ -348,7 +348,7 @@ static const struct ov5640_pixfmt ov5640_csi2_formats[] = { > > }, { > > /* Raw, BGBG... / GRGR... */ > > .code = MEDIA_BUS_FMT_SBGGR8_1X8, > > - .colorspace = V4L2_COLORSPACE_SRGB, > > + .colorspace = V4L2_COLORSPACE_RAW, > > .bpp = 8, > > .ctrl00 = 0x00, > > .mux = OV5640_FMT_MUX_RAW_DPC, > > @@ -473,6 +473,7 @@ struct ov5640_dev { > > > > struct v4l2_mbus_framefmt fmt; > > bool pending_fmt_change; > > + bool is_raw; > > > > const struct ov5640_mode_info *current_mode; > > const struct ov5640_mode_info *last_mode; > > @@ -618,8 +619,13 @@ static const struct reg_value ov5640_init_setting[] = { > > {0x501f, 0x00, 0, 0}, {0x440e, 0x00, 0, 0}, {0x4837, 0x0a, 0, 0}, > > > > /* ISP Control */ > > - {OV5640_REG_ISP_CTRL00, 0xa7, 0, 0}, > > - {OV5640_REG_ISP_CTRL01, 0xa3, 0, 0}, > > + {OV5640_REG_ISP_CTRL00, OV5640_ISP_00_LENC_ENABLE | OV5640_ISP_00_GMA_ENABLE | > > + OV5640_ISP_00_BPC_ENABLE | OV5640_ISP_00_WPC_ENABLE | > > + OV5640_ISP_00_CIP_ENABLE, 0, 0}, > > + > > + /* OV5640_ISP_01_UVA_ENABLE is not enabled */ > > + {OV5640_REG_ISP_CTRL01, OV5640_ISP_01_SDE_ENABLE | OV5640_ISP_01_SCL_ENABLE | > > + OV5640_ISP_01_CMX_ENABLE | OV5640_ISP_01_AWB_ENABLE, 0, 0}, > > Should we avoid writing these registers at all in the init sequence ? Oh probably. I haven't tested that yet, but indeed. > > > > /* AWB Control */ > > {OV5640_REG_AWB_CONTROL_00, 0xff, 0, 0}, /* AWB B Block */ > > @@ -3116,6 +3122,31 @@ static int ov5640_set_framefmt(struct ov5640_dev *sensor, > > if (ret) > > return ret; > > > > + /* > > + * Disable all ISP image processing (Lens Shading, Gamma, AWB...) for > > + * RAW modes to facilitate module tuning. > > + */ > > + sensor->is_raw = pixfmt->colorspace == V4L2_COLORSPACE_RAW; > > Unless it is used later on, the 'is_raw' flag can be kept a local > variable. Haha yes, no idea why I put it in the main dev structure. Will move. Thanks. > > > + if (sensor->is_raw) { > > + ret = ov5640_write_reg(sensor, OV5640_REG_ISP_CTRL00, 0); > > + if (ret) > > + return ret; > > + } else { > > + ret = ov5640_write_reg(sensor, OV5640_REG_ISP_CTRL00, > > + OV5640_ISP_00_LENC_ENABLE | OV5640_ISP_00_GMA_ENABLE | > > + OV5640_ISP_00_BPC_ENABLE | OV5640_ISP_00_WPC_ENABLE | > > + OV5640_ISP_00_CIP_ENABLE); > > + if (ret) > > + return ret; > > + > > + /* OV5640_ISP_01_UVA_ENABLE is not enabled */ > > + ret = ov5640_write_reg(sensor, OV5640_REG_ISP_CTRL01, > > + OV5640_ISP_01_SDE_ENABLE | OV5640_ISP_01_SCL_ENABLE | > > + OV5640_ISP_01_CMX_ENABLE | OV5640_ISP_01_AWB_ENABLE); > > + if (ret) > > + return ret; > > + } > > + > > /* > > * TIMING TC REG21: > > * - [5]: JPEG enable > > > > -- > > 2.52.0 > > > > ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20260501-ov5640_cleanup-v1-11-0869a7802a33@ideasonboard.com>]
* Re: [PATCH 11/11] media: i2c: ov5640: Split out format mux registers [not found] ` <20260501-ov5640_cleanup-v1-11-0869a7802a33@ideasonboard.com> @ 2026-05-14 8:41 ` Jacopo Mondi 2026-05-14 8:51 ` Kieran Bingham 0 siblings, 1 reply; 18+ messages in thread From: Jacopo Mondi @ 2026-05-14 8:41 UTC (permalink / raw) To: Kieran Bingham Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel On Fri, May 01, 2026 at 04:39:13PM +0100, Kieran Bingham wrote: > The init_setting table configures format control and mux to default for > YUV420 output. These are later determined by the users format > selection, and so are candidates for removal from the init table. Can we remove them then :) ? > > Split the additions out from the register block and document them. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > drivers/media/i2c/ov5640.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > index f63d81640f54..477f6a3ddbf6 100644 > --- a/drivers/media/i2c/ov5640.c > +++ b/drivers/media/i2c/ov5640.c > @@ -615,8 +615,13 @@ static const struct reg_value ov5640_init_setting[] = { > {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0}, > {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0}, {0x3000, 0x00, 0, 0}, > {0x3002, 0x1c, 0, 0}, {0x3004, 0xff, 0, 0}, {0x3006, 0xc3, 0, 0}, > - {0x302e, 0x08, 0, 0}, {0x4300, 0x3f, 0, 0}, > - {0x501f, 0x00, 0, 0}, {0x440e, 0x00, 0, 0}, {0x4837, 0x0a, 0, 0}, > + {0x302e, 0x08, 0, 0}, > + > + /* Format control, Mux control */ > + {0x4300, 0x3f, 0, 0}, /* YUV420 YYYY... / UYVY... */ > + {0x501f, 0x00, 0, 0}, /* ISP YUV422 */ > + > + {0x440e, 0x00, 0, 0}, {0x4837, 0x0a, 0, 0}, > > /* ISP Control */ > {OV5640_REG_ISP_CTRL00, OV5640_ISP_00_LENC_ENABLE | OV5640_ISP_00_GMA_ENABLE | > > -- > 2.52.0 > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 11/11] media: i2c: ov5640: Split out format mux registers 2026-05-14 8:41 ` [PATCH 11/11] media: i2c: ov5640: Split out format mux registers Jacopo Mondi @ 2026-05-14 8:51 ` Kieran Bingham 0 siblings, 0 replies; 18+ messages in thread From: Kieran Bingham @ 2026-05-14 8:51 UTC (permalink / raw) To: Jacopo Mondi Cc: Sakari Ailus, Steve Longerbeam, Mauro Carvalho Chehab, linux-media, linux-kernel Quoting Jacopo Mondi (2026-05-14 09:41:02) > > On Fri, May 01, 2026 at 04:39:13PM +0100, Kieran Bingham wrote: > > The init_setting table configures format control and mux to default for > > YUV420 output. These are later determined by the users format > > selection, and so are candidates for removal from the init table. > > Can we remove them then :) ? Maybe indeed! I'll double check this when I next spin the series. -- Kieran > > > > > Split the additions out from the register block and document them. > > > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > --- > > drivers/media/i2c/ov5640.c | 9 +++++++-- > > 1 file changed, 7 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c > > index f63d81640f54..477f6a3ddbf6 100644 > > --- a/drivers/media/i2c/ov5640.c > > +++ b/drivers/media/i2c/ov5640.c > > @@ -615,8 +615,13 @@ static const struct reg_value ov5640_init_setting[] = { > > {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0}, > > {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0}, {0x3000, 0x00, 0, 0}, > > {0x3002, 0x1c, 0, 0}, {0x3004, 0xff, 0, 0}, {0x3006, 0xc3, 0, 0}, > > - {0x302e, 0x08, 0, 0}, {0x4300, 0x3f, 0, 0}, > > - {0x501f, 0x00, 0, 0}, {0x440e, 0x00, 0, 0}, {0x4837, 0x0a, 0, 0}, > > + {0x302e, 0x08, 0, 0}, > > + > > + /* Format control, Mux control */ > > + {0x4300, 0x3f, 0, 0}, /* YUV420 YYYY... / UYVY... */ > > + {0x501f, 0x00, 0, 0}, /* ISP YUV422 */ > > + > > + {0x440e, 0x00, 0, 0}, {0x4837, 0x0a, 0, 0}, > > > > /* ISP Control */ > > {OV5640_REG_ISP_CTRL00, OV5640_ISP_00_LENC_ENABLE | OV5640_ISP_00_GMA_ENABLE | > > > > -- > > 2.52.0 > > > > ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2026-05-14 9:22 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260501-ov5640_cleanup-v1-0-0869a7802a33@ideasonboard.com>
[not found] ` <20260501-ov5640_cleanup-v1-1-0869a7802a33@ideasonboard.com>
2026-05-14 7:44 ` [PATCH 01/11] media: i2c: ov5640: Set default WB gains Jacopo Mondi
[not found] ` <20260501-ov5640_cleanup-v1-2-0869a7802a33@ideasonboard.com>
2026-05-14 7:58 ` [PATCH 02/11] media: i2c: ov5640: Set exposure minimum and defaults Jacopo Mondi
2026-05-14 8:01 ` Jacopo Mondi
[not found] ` <20260501-ov5640_cleanup-v1-3-0869a7802a33@ideasonboard.com>
2026-05-14 8:05 ` [PATCH 03/11] media: i2c: ov5640: Fix minimum gain to 1.0x Jacopo Mondi
[not found] ` <20260501-ov5640_cleanup-v1-4-0869a7802a33@ideasonboard.com>
2026-05-14 8:08 ` [PATCH 04/11] media: i2c: ov5640: fix error path in ov5640_set_mode Jacopo Mondi
[not found] ` <20260501-ov5640_cleanup-v1-5-0869a7802a33@ideasonboard.com>
2026-05-14 8:10 ` [PATCH 05/11] media: i2c: ov5640: Remove unsupported bayer orders Jacopo Mondi
2026-05-14 8:43 ` Kieran Bingham
2026-05-14 9:22 ` Jacopo Mondi
[not found] ` <20260501-ov5640_cleanup-v1-6-0869a7802a33@ideasonboard.com>
2026-05-14 8:23 ` [PATCH 06/11] media: i2c: ov5640: split out the LSC registers Jacopo Mondi
2026-05-14 8:44 ` Kieran Bingham
[not found] ` <20260501-ov5640_cleanup-v1-8-0869a7802a33@ideasonboard.com>
2026-05-14 8:33 ` [PATCH 08/11] media: i2c: ov5640: Document AWB control registers Jacopo Mondi
2026-05-14 8:34 ` Jacopo Mondi
2026-05-14 8:48 ` Kieran Bingham
[not found] ` <20260501-ov5640_cleanup-v1-9-0869a7802a33@ideasonboard.com>
2026-05-14 8:36 ` [PATCH 09/11] media: i2c: ov5640: Add ISP Control registers Jacopo Mondi
[not found] ` <20260501-ov5640_cleanup-v1-10-0869a7802a33@ideasonboard.com>
2026-05-14 8:39 ` [PATCH 10/11] media: i2c: ov5640: Disable ISP for raw output Jacopo Mondi
2026-05-14 8:50 ` Kieran Bingham
[not found] ` <20260501-ov5640_cleanup-v1-11-0869a7802a33@ideasonboard.com>
2026-05-14 8:41 ` [PATCH 11/11] media: i2c: ov5640: Split out format mux registers Jacopo Mondi
2026-05-14 8:51 ` Kieran Bingham
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox