[v2] media: ov08x40: Add Signal Integration Adjustments for specific project

Message ID 20240122030220.3009357-1-jason.z.chen@intel.com (mailing list archive)
State New
Delegated to: Sakari Ailus
Headers
Series [v2] media: ov08x40: Add Signal Integration Adjustments for specific project |

Commit Message

Chen, Jason Z Jan. 22, 2024, 3:02 a.m. UTC
  From: Jason Chen <jason.z.chen@intel.com>

Due to certain MIPI hardware designs using overly long cables, there
is a loss of signal strength, resulting in failed signal integration.
The patch includes changes to adjust the driving strength in the register
settings for a specific project.

Signed-off-by: Jason Chen <jason.z.chen@intel.com>
---
 drivers/media/i2c/ov08x40.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
  

Comments

Sakari Ailus Jan. 22, 2024, 1:06 p.m. UTC | #1
Hi Jason,

On Mon, Jan 22, 2024 at 11:02:20AM +0800, Chen, Jason Z wrote:
> From: Jason Chen <jason.z.chen@intel.com>
> 
> Due to certain MIPI hardware designs using overly long cables, there
> is a loss of signal strength, resulting in failed signal integration.
> The patch includes changes to adjust the driving strength in the register
> settings for a specific project.
> 
> Signed-off-by: Jason Chen <jason.z.chen@intel.com>
> ---
>  drivers/media/i2c/ov08x40.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/drivers/media/i2c/ov08x40.c b/drivers/media/i2c/ov08x40.c
> index 520ccd4aecf..ddcb4b6848b 100644
> --- a/drivers/media/i2c/ov08x40.c
> +++ b/drivers/media/i2c/ov08x40.c
> @@ -160,6 +160,18 @@ static const struct ov08x40_reg mipi_data_rate_800mbps[] = {
>  	{0x6002, 0x2e},
>  };
>  
> +static const struct ov08x40_reg mipi_si_changed_regs[] = {
> +	{0x481b, 0x2c}, /* HS Exit: Data Tx TEOT - reducing 8ns */
> +	{0x4826, 0x42}, /* HS Entry: Data Tx TREOT - raising 8ns */
> +	{0x4829, 0x54}, /* HS Exit: Data Tx TREOT - reducing 8ns */
> +	{0x4885, 0x1f}, /* driving strength change */

We need a better say to control these: if you need to change this to make
it work on one board, another board may well need different settings.

Probably the easiest way would be to figure out canonical, hardware
independent configuration parameters and define them in DT bindings
(Documentation/devicetree/bindings/media/video-interfaces.yaml), and add
support for those in this driver.

DMI as such could be how you figure out which settings you need, but it
should not be the task of a the sensor driver to do that.

Cc Laurent.

> +};
> +
> +struct ov08x40_reg_list si_regs = {
> +	.regs = mipi_si_changed_regs,
> +	.num_of_regs = ARRAY_SIZE(mipi_si_changed_regs),
> +};
> +
>  static const struct ov08x40_reg mode_3856x2416_regs[] = {
>  	{0x5000, 0x5d},
>  	{0x5001, 0x20},
> @@ -2913,6 +2925,9 @@ static int ov08x40_start_streaming(struct ov08x40 *ov08x)
>  		return ret;
>  	}
>  
> +	/* Apply SI change to current project */
> +	ov08x40_write_reg_list(ov08x, &si_regs);
> +
>  	/* Apply default values of current mode */
>  	reg_list = &ov08x->cur_mode->reg_list;
>  	ret = ov08x40_write_reg_list(ov08x, reg_list);
  
Laurent Pinchart Jan. 22, 2024, 2:35 p.m. UTC | #2
On Mon, Jan 22, 2024 at 01:06:20PM +0000, Sakari Ailus wrote:
> On Mon, Jan 22, 2024 at 11:02:20AM +0800, Chen, Jason Z wrote:
> > From: Jason Chen <jason.z.chen@intel.com>
> > 
> > Due to certain MIPI hardware designs using overly long cables, there
> > is a loss of signal strength, resulting in failed signal integration.
> > The patch includes changes to adjust the driving strength in the register
> > settings for a specific project.
> > 
> > Signed-off-by: Jason Chen <jason.z.chen@intel.com>
> > ---
> >  drivers/media/i2c/ov08x40.c | 15 +++++++++++++++
> >  1 file changed, 15 insertions(+)
> > 
> > diff --git a/drivers/media/i2c/ov08x40.c b/drivers/media/i2c/ov08x40.c
> > index 520ccd4aecf..ddcb4b6848b 100644
> > --- a/drivers/media/i2c/ov08x40.c
> > +++ b/drivers/media/i2c/ov08x40.c
> > @@ -160,6 +160,18 @@ static const struct ov08x40_reg mipi_data_rate_800mbps[] = {
> >  	{0x6002, 0x2e},
> >  };
> >  
> > +static const struct ov08x40_reg mipi_si_changed_regs[] = {
> > +	{0x481b, 0x2c}, /* HS Exit: Data Tx TEOT - reducing 8ns */
> > +	{0x4826, 0x42}, /* HS Entry: Data Tx TREOT - raising 8ns */
> > +	{0x4829, 0x54}, /* HS Exit: Data Tx TREOT - reducing 8ns */
> > +	{0x4885, 0x1f}, /* driving strength change */
> 
> We need a better say to control these: if you need to change this to make
> it work on one board, another board may well need different settings.
> 
> Probably the easiest way would be to figure out canonical, hardware
> independent configuration parameters and define them in DT bindings
> (Documentation/devicetree/bindings/media/video-interfaces.yaml), and add
> support for those in this driver.
> 
> DMI as such could be how you figure out which settings you need, but it
> should not be the task of a the sensor driver to do that.
> 
> Cc Laurent.

Agreed.

> > +};
> > +
> > +struct ov08x40_reg_list si_regs = {
> > +	.regs = mipi_si_changed_regs,
> > +	.num_of_regs = ARRAY_SIZE(mipi_si_changed_regs),
> > +};
> > +
> >  static const struct ov08x40_reg mode_3856x2416_regs[] = {
> >  	{0x5000, 0x5d},
> >  	{0x5001, 0x20},
> > @@ -2913,6 +2925,9 @@ static int ov08x40_start_streaming(struct ov08x40 *ov08x)
> >  		return ret;
> >  	}
> >  
> > +	/* Apply SI change to current project */
> > +	ov08x40_write_reg_list(ov08x, &si_regs);
> > +
> >  	/* Apply default values of current mode */
> >  	reg_list = &ov08x->cur_mode->reg_list;
> >  	ret = ov08x40_write_reg_list(ov08x, reg_list);
  

Patch

diff --git a/drivers/media/i2c/ov08x40.c b/drivers/media/i2c/ov08x40.c
index 520ccd4aecf..ddcb4b6848b 100644
--- a/drivers/media/i2c/ov08x40.c
+++ b/drivers/media/i2c/ov08x40.c
@@ -160,6 +160,18 @@  static const struct ov08x40_reg mipi_data_rate_800mbps[] = {
 	{0x6002, 0x2e},
 };
 
+static const struct ov08x40_reg mipi_si_changed_regs[] = {
+	{0x481b, 0x2c}, /* HS Exit: Data Tx TEOT - reducing 8ns */
+	{0x4826, 0x42}, /* HS Entry: Data Tx TREOT - raising 8ns */
+	{0x4829, 0x54}, /* HS Exit: Data Tx TREOT - reducing 8ns */
+	{0x4885, 0x1f}, /* driving strength change */
+};
+
+struct ov08x40_reg_list si_regs = {
+	.regs = mipi_si_changed_regs,
+	.num_of_regs = ARRAY_SIZE(mipi_si_changed_regs),
+};
+
 static const struct ov08x40_reg mode_3856x2416_regs[] = {
 	{0x5000, 0x5d},
 	{0x5001, 0x20},
@@ -2913,6 +2925,9 @@  static int ov08x40_start_streaming(struct ov08x40 *ov08x)
 		return ret;
 	}
 
+	/* Apply SI change to current project */
+	ov08x40_write_reg_list(ov08x, &si_regs);
+
 	/* Apply default values of current mode */
 	reg_list = &ov08x->cur_mode->reg_list;
 	ret = ov08x40_write_reg_list(ov08x, reg_list);