diff mbox series

media: ov5640: fix support of BT656 bus mode

Message ID 1602080692-6383-1-git-send-email-hugues.fruchet@st.com
State Accepted
Commit 68579b32e786f9680e7c6b6c7d17e26943bb02b3
Headers show
Series media: ov5640: fix support of BT656 bus mode | expand

Commit Message

Hugues FRUCHET Oct. 7, 2020, 2:24 p.m. UTC
fixes: 4039b03720f7 ("media: i2c: ov5640: Add support for BT656 mode")

Fix PCLK polarity not being taken into account.
Fix ov5640_write_reg()return value unchecked at power off.
Reformat code to keep register access below the register description.
Remove useless ov5640_set_stream_bt656() function.

Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>
---
 drivers/media/i2c/ov5640.c | 95 +++++++++++++++++++++++++---------------------
 1 file changed, 51 insertions(+), 44 deletions(-)

Comments

Jacopo Mondi Oct. 12, 2020, 1:35 p.m. UTC | #1
Hi Hugues,

On Wed, Oct 07, 2020 at 04:24:52PM +0200, Hugues Fruchet wrote:
> fixes: 4039b03720f7 ("media: i2c: ov5640: Add support for BT656 mode")


As per the comment from Sakari in another patch, 'Fixes' (capital 'F')
usually comes before Signed-off/Reviewed-by tags

>

> Fix PCLK polarity not being taken into account.

> Fix ov5640_write_reg()return value unchecked at power off.


Am I wrong or you broke out this part to a separate patch ?
As commented there, I don't think it's a good idea.

Are you planning to send a v2 of this patch ?

Thanks
  j

> Reformat code to keep register access below the register description.

> Remove useless ov5640_set_stream_bt656() function.

>

> Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>

> ---

>  drivers/media/i2c/ov5640.c | 95 +++++++++++++++++++++++++---------------------

>  1 file changed, 51 insertions(+), 44 deletions(-)

>

> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c

> index 8d0254d..1b20db7 100644

> --- a/drivers/media/i2c/ov5640.c

> +++ b/drivers/media/i2c/ov5640.c

> @@ -1216,20 +1216,6 @@ static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)

>  			      BIT(1), on ? 0 : BIT(1));

>  }

>

> -static int ov5640_set_stream_bt656(struct ov5640_dev *sensor, bool on)

> -{

> -	int ret;

> -

> -	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,

> -			       on ? 0x1 : 0x00);

> -	if (ret)

> -		return ret;

> -

> -	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?

> -				OV5640_REG_SYS_CTRL0_SW_PWUP :

> -				OV5640_REG_SYS_CTRL0_SW_PWDN);

> -}

> -

>  static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)

>  {

>  	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?

> @@ -1994,20 +1980,12 @@ static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on)

>  static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>  {

>  	unsigned int flags = sensor->ep.bus.parallel.flags;

> +	bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656;

>  	u8 pclk_pol = 0;

>  	u8 hsync_pol = 0;

>  	u8 vsync_pol = 0;

>  	int ret;

>

> -	if (!on) {

> -		/* Reset settings to their default values. */

> -		ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);

> -		ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20);

> -		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00);

> -		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00);

> -		return 0;

> -	}

> -

>  	/*

>  	 * Note about parallel port configuration.

>  	 *

> @@ -2024,27 +2002,57 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>  	 * - VSYNC:	active high

>  	 * - HREF:	active low

>  	 * - PCLK:	active low

> +	 *

> +	 * VSYNC & HREF are not configured if BT656 bus mode is selected

>  	 */

> +

>  	/*

> -	 * configure parallel port control lines polarity

> +	 * BT656 embedded synchronization configuration

> +	 *

> +	 * CCIR656 CTRL00

> +	 * - [7]:	SYNC code selection (0: auto generate sync code,

> +	 *		1: sync code from regs 0x4732-0x4735)

> +	 * - [6]:	f value in CCIR656 SYNC code when fixed f value

> +	 * - [5]:	Fixed f value

> +	 * - [4:3]:	Blank toggle data options (00: data=1'h040/1'h200,

> +	 *		01: data from regs 0x4736-0x4738, 10: always keep 0)

> +	 * - [1]:	Clip data disable

> +	 * - [0]:	CCIR656 mode enable

>  	 *

> -	 * POLARITY CTRL0

> -	 * - [5]:	PCLK polarity (0: active low, 1: active high)

> -	 * - [1]:	HREF polarity (0: active low, 1: active high)

> -	 * - [0]:	VSYNC polarity (mismatch here between

> -	 *		datasheet and hardware, 0 is active high

> -	 *		and 1 is active low...)

> +	 * Default CCIR656 SAV/EAV mode with default codes

> +	 * SAV=0xff000080 & EAV=0xff00009d is enabled here with settings:

> +	 * - CCIR656 mode enable

> +	 * - auto generation of sync codes

> +	 * - blank toggle data 1'h040/1'h200

> +	 * - clip reserved data (0x00 & 0xff changed to 0x01 & 0xfe)

>  	 */

> -	if (sensor->ep.bus_type == V4L2_MBUS_PARALLEL) {

> +	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,

> +			       on && bt656 ? 0x01 : 0x00);

> +	if (ret)

> +		return ret;

> +

> +	if (on) {

> +		/*

> +		 * configure parallel port control lines polarity

> +		 *

> +		 * POLARITY CTRL0

> +		 * - [5]:	PCLK polarity (0: active low, 1: active high)

> +		 * - [1]:	HREF polarity (0: active low, 1: active high)

> +		 * - [0]:	VSYNC polarity (mismatch here between

> +		 *		datasheet and hardware, 0 is active high

> +		 *		and 1 is active low...)

> +		 */

>  		if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)

>  			pclk_pol = 1;

> -		if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)

> +		if (!bt656 && flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)

>  			hsync_pol = 1;

> -		if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)

> +		if (!bt656 && flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)

>  			vsync_pol = 1;

>

> -		ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00,

> -				       (pclk_pol << 5) | (hsync_pol << 1) |

> +		ret = ov5640_write_reg(sensor,

> +				       OV5640_REG_POLARITY_CTRL00,

> +				       (pclk_pol << 5) |

> +				       (hsync_pol << 1) |

>  				       vsync_pol);

>

>  		if (ret)

> @@ -2052,12 +2060,12 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>  	}

>

>  	/*

> -	 * powerdown MIPI TX/RX PHY & disable MIPI

> +	 * powerdown MIPI TX/RX PHY & enable DVP

>  	 *

>  	 * MIPI CONTROL 00

> -	 * 4:	 PWDN PHY TX

> -	 * 3:	 PWDN PHY RX

> -	 * 2:	 MIPI enable

> +	 * [4] = 1	: Power down MIPI HS Tx

> +	 * [3] = 1	: Power down MIPI LS Rx

> +	 * [2] = 0	: DVP enable (MIPI disable)

>  	 */

>  	ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18);

>  	if (ret)

> @@ -2074,8 +2082,7 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>  	 * - [3:0]:	D[9:6] output enable

>  	 */

>  	ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,

> -			       sensor->ep.bus_type == V4L2_MBUS_PARALLEL ?

> -			       0x7f : 0x1f);

> +			       on ? (bt656 ? 0x1f : 0x7f) : 0x00);

>  	if (ret)

>  		return ret;

>

> @@ -2085,7 +2092,9 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>  	 * PAD OUTPUT ENABLE 02

>  	 * - [7:2]:	D[5:0] output enable

>  	 */

> -	return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc);

> +	return ov5640_write_reg(sensor,

> +				OV5640_REG_PAD_OUTPUT_ENABLE02,

> +				on ? 0xfc : 0);

>  }

>

>  static int ov5640_set_power(struct ov5640_dev *sensor, bool on)

> @@ -2925,8 +2934,6 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)

>

>  		if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)

>  			ret = ov5640_set_stream_mipi(sensor, enable);

> -		else if (sensor->ep.bus_type == V4L2_MBUS_BT656)

> -			ret = ov5640_set_stream_bt656(sensor, enable);

>  		else

>  			ret = ov5640_set_stream_dvp(sensor, enable);

>

> --

> 2.7.4

>
Hugues FRUCHET Oct. 12, 2020, 2:12 p.m. UTC | #2
Hi Jacopo,

Thanks for reviewing, comments below

On 10/12/20 3:35 PM, Jacopo Mondi wrote:
> Hi Hugues,

> 

> On Wed, Oct 07, 2020 at 04:24:52PM +0200, Hugues Fruchet wrote:

>> fixes: 4039b03720f7 ("media: i2c: ov5640: Add support for BT656 mode")

> 

> As per the comment from Sakari in another patch, 'Fixes' (capital 'F')

> usually comes before Signed-off/Reviewed-by tags

I understand the "F" upper case, but I don't understand the "comes 
before Signed-off", my signed-off is inserted after this line.

> 

>>

>> Fix PCLK polarity not being taken into account.


This one fixes a real bug.

>> Fix ov5640_write_reg()return value unchecked at power off.

> 

> Am I wrong or you broke out this part to a separate patch ?

> As commented there, I don't think it's a good idea.

> 

> Are you planning to send a v2 of this patch ?

The patches was sent at same time, so it's normal that they are designed 
in same way, I'll send a v2 with this "reset to default at power off 
without check" strategy.

> 

> Thanks

>    j

> 

>> Reformat code to keep register access below the register description.

>> Remove useless ov5640_set_stream_bt656() function.

>>

>> Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>

>> ---

>>   drivers/media/i2c/ov5640.c | 95 +++++++++++++++++++++++++---------------------

>>   1 file changed, 51 insertions(+), 44 deletions(-)

>>

>> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c

>> index 8d0254d..1b20db7 100644

>> --- a/drivers/media/i2c/ov5640.c

>> +++ b/drivers/media/i2c/ov5640.c

>> @@ -1216,20 +1216,6 @@ static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)

>>   			      BIT(1), on ? 0 : BIT(1));

>>   }

>>

>> -static int ov5640_set_stream_bt656(struct ov5640_dev *sensor, bool on)

>> -{

>> -	int ret;

>> -

>> -	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,

>> -			       on ? 0x1 : 0x00);

>> -	if (ret)

>> -		return ret;

>> -

>> -	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?

>> -				OV5640_REG_SYS_CTRL0_SW_PWUP :

>> -				OV5640_REG_SYS_CTRL0_SW_PWDN);

>> -}

>> -

>>   static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)

>>   {

>>   	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?

>> @@ -1994,20 +1980,12 @@ static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on)

>>   static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>   {

>>   	unsigned int flags = sensor->ep.bus.parallel.flags;

>> +	bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656;

>>   	u8 pclk_pol = 0;

>>   	u8 hsync_pol = 0;

>>   	u8 vsync_pol = 0;

>>   	int ret;

>>

>> -	if (!on) {

>> -		/* Reset settings to their default values. */

>> -		ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);

>> -		ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20);

>> -		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00);

>> -		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00);

>> -		return 0;

>> -	}

>> -

>>   	/*

>>   	 * Note about parallel port configuration.

>>   	 *

>> @@ -2024,27 +2002,57 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>   	 * - VSYNC:	active high

>>   	 * - HREF:	active low

>>   	 * - PCLK:	active low

>> +	 *

>> +	 * VSYNC & HREF are not configured if BT656 bus mode is selected

>>   	 */

>> +

>>   	/*

>> -	 * configure parallel port control lines polarity

>> +	 * BT656 embedded synchronization configuration

>> +	 *

>> +	 * CCIR656 CTRL00

>> +	 * - [7]:	SYNC code selection (0: auto generate sync code,

>> +	 *		1: sync code from regs 0x4732-0x4735)

>> +	 * - [6]:	f value in CCIR656 SYNC code when fixed f value

>> +	 * - [5]:	Fixed f value

>> +	 * - [4:3]:	Blank toggle data options (00: data=1'h040/1'h200,

>> +	 *		01: data from regs 0x4736-0x4738, 10: always keep 0)

>> +	 * - [1]:	Clip data disable

>> +	 * - [0]:	CCIR656 mode enable

>>   	 *

>> -	 * POLARITY CTRL0

>> -	 * - [5]:	PCLK polarity (0: active low, 1: active high)

>> -	 * - [1]:	HREF polarity (0: active low, 1: active high)

>> -	 * - [0]:	VSYNC polarity (mismatch here between

>> -	 *		datasheet and hardware, 0 is active high

>> -	 *		and 1 is active low...)

>> +	 * Default CCIR656 SAV/EAV mode with default codes

>> +	 * SAV=0xff000080 & EAV=0xff00009d is enabled here with settings:

>> +	 * - CCIR656 mode enable

>> +	 * - auto generation of sync codes

>> +	 * - blank toggle data 1'h040/1'h200

>> +	 * - clip reserved data (0x00 & 0xff changed to 0x01 & 0xfe)

>>   	 */

>> -	if (sensor->ep.bus_type == V4L2_MBUS_PARALLEL) {

>> +	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,

>> +			       on && bt656 ? 0x01 : 0x00);

>> +	if (ret)

>> +		return ret;

>> +

>> +	if (on) {

>> +		/*

>> +		 * configure parallel port control lines polarity

>> +		 *

>> +		 * POLARITY CTRL0

>> +		 * - [5]:	PCLK polarity (0: active low, 1: active high)

>> +		 * - [1]:	HREF polarity (0: active low, 1: active high)

>> +		 * - [0]:	VSYNC polarity (mismatch here between

>> +		 *		datasheet and hardware, 0 is active high

>> +		 *		and 1 is active low...)

>> +		 */

>>   		if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)

>>   			pclk_pol = 1;

>> -		if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)

>> +		if (!bt656 && flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)

>>   			hsync_pol = 1;

>> -		if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)

>> +		if (!bt656 && flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)

>>   			vsync_pol = 1;

>>

>> -		ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00,

>> -				       (pclk_pol << 5) | (hsync_pol << 1) |

>> +		ret = ov5640_write_reg(sensor,

>> +				       OV5640_REG_POLARITY_CTRL00,

>> +				       (pclk_pol << 5) |

>> +				       (hsync_pol << 1) |

>>   				       vsync_pol);

>>

>>   		if (ret)

>> @@ -2052,12 +2060,12 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>   	}

>>

>>   	/*

>> -	 * powerdown MIPI TX/RX PHY & disable MIPI

>> +	 * powerdown MIPI TX/RX PHY & enable DVP

>>   	 *

>>   	 * MIPI CONTROL 00

>> -	 * 4:	 PWDN PHY TX

>> -	 * 3:	 PWDN PHY RX

>> -	 * 2:	 MIPI enable

>> +	 * [4] = 1	: Power down MIPI HS Tx

>> +	 * [3] = 1	: Power down MIPI LS Rx

>> +	 * [2] = 0	: DVP enable (MIPI disable)

>>   	 */

>>   	ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18);

>>   	if (ret)

>> @@ -2074,8 +2082,7 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>   	 * - [3:0]:	D[9:6] output enable

>>   	 */

>>   	ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,

>> -			       sensor->ep.bus_type == V4L2_MBUS_PARALLEL ?

>> -			       0x7f : 0x1f);

>> +			       on ? (bt656 ? 0x1f : 0x7f) : 0x00);

>>   	if (ret)

>>   		return ret;

>>

>> @@ -2085,7 +2092,9 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>   	 * PAD OUTPUT ENABLE 02

>>   	 * - [7:2]:	D[5:0] output enable

>>   	 */

>> -	return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc);

>> +	return ov5640_write_reg(sensor,

>> +				OV5640_REG_PAD_OUTPUT_ENABLE02,

>> +				on ? 0xfc : 0);

>>   }

>>

>>   static int ov5640_set_power(struct ov5640_dev *sensor, bool on)

>> @@ -2925,8 +2934,6 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)

>>

>>   		if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)

>>   			ret = ov5640_set_stream_mipi(sensor, enable);

>> -		else if (sensor->ep.bus_type == V4L2_MBUS_BT656)

>> -			ret = ov5640_set_stream_bt656(sensor, enable);

>>   		else

>>   			ret = ov5640_set_stream_dvp(sensor, enable);

>>

>> --

>> 2.7.4

>>
Jacopo Mondi Oct. 12, 2020, 2:27 p.m. UTC | #3
Hi Hugues

On Mon, Oct 12, 2020 at 02:12:09PM +0000, Hugues FRUCHET wrote:
> Hi Jacopo,

>

> Thanks for reviewing, comments below

>

> On 10/12/20 3:35 PM, Jacopo Mondi wrote:

> > Hi Hugues,

> >

> > On Wed, Oct 07, 2020 at 04:24:52PM +0200, Hugues Fruchet wrote:


> >

> > As per the comment from Sakari in another patch, 'Fixes' (capital 'F')

> > usually comes before Signed-off/Reviewed-by tags

> I understand the "F" upper case, but I don't understand the "comes

> before Signed-off", my signed-off is inserted after this line.

>


So, this is not stated explicitly in submitting-patches.rst, but as
per all the other tags attached to a patch, they're usually placed
after the commit message

in this case:

Fix PCLK polarity not being taken into account.
Fix ov5640_write_reg()return value unchecked at power off.
Reformat code to keep register access below the register description.
Remove useless ov5640_set_stream_bt656() function.

Fixes: 4039b03720f7 ("media: i2c: ov5640: Add support for BT656 mode")
Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>


> >

> >>

> >> Fix PCLK polarity not being taken into account.

>

> This one fixes a real bug.

>


I don't think I've contested this

> >> Fix ov5640_write_reg()return value unchecked at power off.

> >

> > Am I wrong or you broke out this part to a separate patch ?

> > As commented there, I don't think it's a good idea.

> >

> > Are you planning to send a v2 of this patch ?

> The patches was sent at same time, so it's normal that they are designed

> in same way, I'll send a v2 with this "reset to default at power off

> without check" strategy.

>


I was wondering if you were planning to send a v2 with the part that
changed the power-off path removed as I would have reviewed that one
instead of this, that's all.


> >

> > Thanks

> >    j

> >

> >> Reformat code to keep register access below the register description.

> >> Remove useless ov5640_set_stream_bt656() function.

> >>

> >> Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>

> >> ---

> >>   drivers/media/i2c/ov5640.c | 95 +++++++++++++++++++++++++---------------------

> >>   1 file changed, 51 insertions(+), 44 deletions(-)

> >>

> >> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c

> >> index 8d0254d..1b20db7 100644

> >> --- a/drivers/media/i2c/ov5640.c

> >> +++ b/drivers/media/i2c/ov5640.c

> >> @@ -1216,20 +1216,6 @@ static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)

> >>   			      BIT(1), on ? 0 : BIT(1));

> >>   }

> >>

> >> -static int ov5640_set_stream_bt656(struct ov5640_dev *sensor, bool on)

> >> -{

> >> -	int ret;

> >> -

> >> -	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,

> >> -			       on ? 0x1 : 0x00);

> >> -	if (ret)

> >> -		return ret;

> >> -

> >> -	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?

> >> -				OV5640_REG_SYS_CTRL0_SW_PWUP :

> >> -				OV5640_REG_SYS_CTRL0_SW_PWDN);

> >> -}

> >> -

> >>   static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)

> >>   {

> >>   	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?

> >> @@ -1994,20 +1980,12 @@ static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on)

> >>   static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

> >>   {

> >>   	unsigned int flags = sensor->ep.bus.parallel.flags;

> >> +	bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656;

> >>   	u8 pclk_pol = 0;

> >>   	u8 hsync_pol = 0;

> >>   	u8 vsync_pol = 0;

> >>   	int ret;

> >>

> >> -	if (!on) {

> >> -		/* Reset settings to their default values. */

> >> -		ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);

> >> -		ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20);

> >> -		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00);

> >> -		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00);

> >> -		return 0;

> >> -	}

> >> -

> >>   	/*

> >>   	 * Note about parallel port configuration.

> >>   	 *

> >> @@ -2024,27 +2002,57 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

> >>   	 * - VSYNC:	active high

> >>   	 * - HREF:	active low

> >>   	 * - PCLK:	active low

> >> +	 *

> >> +	 * VSYNC & HREF are not configured if BT656 bus mode is selected

> >>   	 */

> >> +

> >>   	/*

> >> -	 * configure parallel port control lines polarity

> >> +	 * BT656 embedded synchronization configuration

> >> +	 *

> >> +	 * CCIR656 CTRL00

> >> +	 * - [7]:	SYNC code selection (0: auto generate sync code,

> >> +	 *		1: sync code from regs 0x4732-0x4735)

> >> +	 * - [6]:	f value in CCIR656 SYNC code when fixed f value

> >> +	 * - [5]:	Fixed f value

> >> +	 * - [4:3]:	Blank toggle data options (00: data=1'h040/1'h200,

> >> +	 *		01: data from regs 0x4736-0x4738, 10: always keep 0)

> >> +	 * - [1]:	Clip data disable

> >> +	 * - [0]:	CCIR656 mode enable

> >>   	 *

> >> -	 * POLARITY CTRL0

> >> -	 * - [5]:	PCLK polarity (0: active low, 1: active high)

> >> -	 * - [1]:	HREF polarity (0: active low, 1: active high)

> >> -	 * - [0]:	VSYNC polarity (mismatch here between

> >> -	 *		datasheet and hardware, 0 is active high

> >> -	 *		and 1 is active low...)

> >> +	 * Default CCIR656 SAV/EAV mode with default codes

> >> +	 * SAV=0xff000080 & EAV=0xff00009d is enabled here with settings:

> >> +	 * - CCIR656 mode enable

> >> +	 * - auto generation of sync codes

> >> +	 * - blank toggle data 1'h040/1'h200

> >> +	 * - clip reserved data (0x00 & 0xff changed to 0x01 & 0xfe)

> >>   	 */

> >> -	if (sensor->ep.bus_type == V4L2_MBUS_PARALLEL) {

> >> +	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,

> >> +			       on && bt656 ? 0x01 : 0x00);

> >> +	if (ret)

> >> +		return ret;

> >> +

> >> +	if (on) {

> >> +		/*

> >> +		 * configure parallel port control lines polarity

> >> +		 *

> >> +		 * POLARITY CTRL0

> >> +		 * - [5]:	PCLK polarity (0: active low, 1: active high)

> >> +		 * - [1]:	HREF polarity (0: active low, 1: active high)

> >> +		 * - [0]:	VSYNC polarity (mismatch here between

> >> +		 *		datasheet and hardware, 0 is active high

> >> +		 *		and 1 is active low...)

> >> +		 */

> >>   		if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)

> >>   			pclk_pol = 1;

> >> -		if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)

> >> +		if (!bt656 && flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)

> >>   			hsync_pol = 1;

> >> -		if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)

> >> +		if (!bt656 && flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)

> >>   			vsync_pol = 1;

> >>

> >> -		ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00,

> >> -				       (pclk_pol << 5) | (hsync_pol << 1) |

> >> +		ret = ov5640_write_reg(sensor,

> >> +				       OV5640_REG_POLARITY_CTRL00,

> >> +				       (pclk_pol << 5) |

> >> +				       (hsync_pol << 1) |

> >>   				       vsync_pol);

> >>

> >>   		if (ret)

> >> @@ -2052,12 +2060,12 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

> >>   	}

> >>

> >>   	/*

> >> -	 * powerdown MIPI TX/RX PHY & disable MIPI

> >> +	 * powerdown MIPI TX/RX PHY & enable DVP

> >>   	 *

> >>   	 * MIPI CONTROL 00

> >> -	 * 4:	 PWDN PHY TX

> >> -	 * 3:	 PWDN PHY RX

> >> -	 * 2:	 MIPI enable

> >> +	 * [4] = 1	: Power down MIPI HS Tx

> >> +	 * [3] = 1	: Power down MIPI LS Rx

> >> +	 * [2] = 0	: DVP enable (MIPI disable)

> >>   	 */

> >>   	ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18);

> >>   	if (ret)

> >> @@ -2074,8 +2082,7 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

> >>   	 * - [3:0]:	D[9:6] output enable

> >>   	 */

> >>   	ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,

> >> -			       sensor->ep.bus_type == V4L2_MBUS_PARALLEL ?

> >> -			       0x7f : 0x1f);

> >> +			       on ? (bt656 ? 0x1f : 0x7f) : 0x00);

> >>   	if (ret)

> >>   		return ret;

> >>

> >> @@ -2085,7 +2092,9 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

> >>   	 * PAD OUTPUT ENABLE 02

> >>   	 * - [7:2]:	D[5:0] output enable

> >>   	 */

> >> -	return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc);

> >> +	return ov5640_write_reg(sensor,

> >> +				OV5640_REG_PAD_OUTPUT_ENABLE02,

> >> +				on ? 0xfc : 0);

> >>   }

> >>

> >>   static int ov5640_set_power(struct ov5640_dev *sensor, bool on)

> >> @@ -2925,8 +2934,6 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)

> >>

> >>   		if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)

> >>   			ret = ov5640_set_stream_mipi(sensor, enable);

> >> -		else if (sensor->ep.bus_type == V4L2_MBUS_BT656)

> >> -			ret = ov5640_set_stream_bt656(sensor, enable);

> >>   		else

> >>   			ret = ov5640_set_stream_dvp(sensor, enable);

> >>

> >> --

> >> 2.7.4

> >>
Hugues FRUCHET Oct. 12, 2020, 2:30 p.m. UTC | #4
Hi Jacopo,

Many thanks for the explanations on commit message, I'm currently 
writing the v2, but if you already have comments on this v1 -appart from 
the power off section- feel free to post.

BR,
Hugues.

On 10/12/20 4:27 PM, Jacopo Mondi wrote:
> Hi Hugues

> 

> On Mon, Oct 12, 2020 at 02:12:09PM +0000, Hugues FRUCHET wrote:

>> Hi Jacopo,

>>

>> Thanks for reviewing, comments below

>>

>> On 10/12/20 3:35 PM, Jacopo Mondi wrote:

>>> Hi Hugues,

>>>

>>> On Wed, Oct 07, 2020 at 04:24:52PM +0200, Hugues Fruchet wrote:

> 

>>>

>>> As per the comment from Sakari in another patch, 'Fixes' (capital 'F')

>>> usually comes before Signed-off/Reviewed-by tags

>> I understand the "F" upper case, but I don't understand the "comes

>> before Signed-off", my signed-off is inserted after this line.

>>

> 

> So, this is not stated explicitly in submitting-patches.rst, but as

> per all the other tags attached to a patch, they're usually placed

> after the commit message

> 

> in this case:

> 

> Fix PCLK polarity not being taken into account.

> Fix ov5640_write_reg()return value unchecked at power off.

> Reformat code to keep register access below the register description.

> Remove useless ov5640_set_stream_bt656() function.

> 

> Fixes: 4039b03720f7 ("media: i2c: ov5640: Add support for BT656 mode")

> Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>

> 

>>>

>>>>

>>>> Fix PCLK polarity not being taken into account.

>>

>> This one fixes a real bug.

>>

> 

> I don't think I've contested this

> 

>>>> Fix ov5640_write_reg()return value unchecked at power off.

>>>

>>> Am I wrong or you broke out this part to a separate patch ?

>>> As commented there, I don't think it's a good idea.

>>>

>>> Are you planning to send a v2 of this patch ?

>> The patches was sent at same time, so it's normal that they are designed

>> in same way, I'll send a v2 with this "reset to default at power off

>> without check" strategy.

>>

> 

> I was wondering if you were planning to send a v2 with the part that

> changed the power-off path removed as I would have reviewed that one

> instead of this, that's all.

> 

> 

>>>

>>> Thanks

>>>     j

>>>

>>>> Reformat code to keep register access below the register description.

>>>> Remove useless ov5640_set_stream_bt656() function.

>>>>

>>>> Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>

>>>> ---

>>>>    drivers/media/i2c/ov5640.c | 95 +++++++++++++++++++++++++---------------------

>>>>    1 file changed, 51 insertions(+), 44 deletions(-)

>>>>

>>>> diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c

>>>> index 8d0254d..1b20db7 100644

>>>> --- a/drivers/media/i2c/ov5640.c

>>>> +++ b/drivers/media/i2c/ov5640.c

>>>> @@ -1216,20 +1216,6 @@ static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)

>>>>    			      BIT(1), on ? 0 : BIT(1));

>>>>    }

>>>>

>>>> -static int ov5640_set_stream_bt656(struct ov5640_dev *sensor, bool on)

>>>> -{

>>>> -	int ret;

>>>> -

>>>> -	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,

>>>> -			       on ? 0x1 : 0x00);

>>>> -	if (ret)

>>>> -		return ret;

>>>> -

>>>> -	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?

>>>> -				OV5640_REG_SYS_CTRL0_SW_PWUP :

>>>> -				OV5640_REG_SYS_CTRL0_SW_PWDN);

>>>> -}

>>>> -

>>>>    static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)

>>>>    {

>>>>    	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?

>>>> @@ -1994,20 +1980,12 @@ static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on)

>>>>    static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>>>    {

>>>>    	unsigned int flags = sensor->ep.bus.parallel.flags;

>>>> +	bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656;

>>>>    	u8 pclk_pol = 0;

>>>>    	u8 hsync_pol = 0;

>>>>    	u8 vsync_pol = 0;

>>>>    	int ret;

>>>>

>>>> -	if (!on) {

>>>> -		/* Reset settings to their default values. */

>>>> -		ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);

>>>> -		ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20);

>>>> -		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00);

>>>> -		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00);

>>>> -		return 0;

>>>> -	}

>>>> -

>>>>    	/*

>>>>    	 * Note about parallel port configuration.

>>>>    	 *

>>>> @@ -2024,27 +2002,57 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>>>    	 * - VSYNC:	active high

>>>>    	 * - HREF:	active low

>>>>    	 * - PCLK:	active low

>>>> +	 *

>>>> +	 * VSYNC & HREF are not configured if BT656 bus mode is selected

>>>>    	 */

>>>> +

>>>>    	/*

>>>> -	 * configure parallel port control lines polarity

>>>> +	 * BT656 embedded synchronization configuration

>>>> +	 *

>>>> +	 * CCIR656 CTRL00

>>>> +	 * - [7]:	SYNC code selection (0: auto generate sync code,

>>>> +	 *		1: sync code from regs 0x4732-0x4735)

>>>> +	 * - [6]:	f value in CCIR656 SYNC code when fixed f value

>>>> +	 * - [5]:	Fixed f value

>>>> +	 * - [4:3]:	Blank toggle data options (00: data=1'h040/1'h200,

>>>> +	 *		01: data from regs 0x4736-0x4738, 10: always keep 0)

>>>> +	 * - [1]:	Clip data disable

>>>> +	 * - [0]:	CCIR656 mode enable

>>>>    	 *

>>>> -	 * POLARITY CTRL0

>>>> -	 * - [5]:	PCLK polarity (0: active low, 1: active high)

>>>> -	 * - [1]:	HREF polarity (0: active low, 1: active high)

>>>> -	 * - [0]:	VSYNC polarity (mismatch here between

>>>> -	 *		datasheet and hardware, 0 is active high

>>>> -	 *		and 1 is active low...)

>>>> +	 * Default CCIR656 SAV/EAV mode with default codes

>>>> +	 * SAV=0xff000080 & EAV=0xff00009d is enabled here with settings:

>>>> +	 * - CCIR656 mode enable

>>>> +	 * - auto generation of sync codes

>>>> +	 * - blank toggle data 1'h040/1'h200

>>>> +	 * - clip reserved data (0x00 & 0xff changed to 0x01 & 0xfe)

>>>>    	 */

>>>> -	if (sensor->ep.bus_type == V4L2_MBUS_PARALLEL) {

>>>> +	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,

>>>> +			       on && bt656 ? 0x01 : 0x00);

>>>> +	if (ret)

>>>> +		return ret;

>>>> +

>>>> +	if (on) {

>>>> +		/*

>>>> +		 * configure parallel port control lines polarity

>>>> +		 *

>>>> +		 * POLARITY CTRL0

>>>> +		 * - [5]:	PCLK polarity (0: active low, 1: active high)

>>>> +		 * - [1]:	HREF polarity (0: active low, 1: active high)

>>>> +		 * - [0]:	VSYNC polarity (mismatch here between

>>>> +		 *		datasheet and hardware, 0 is active high

>>>> +		 *		and 1 is active low...)

>>>> +		 */

>>>>    		if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)

>>>>    			pclk_pol = 1;

>>>> -		if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)

>>>> +		if (!bt656 && flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)

>>>>    			hsync_pol = 1;

>>>> -		if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)

>>>> +		if (!bt656 && flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)

>>>>    			vsync_pol = 1;

>>>>

>>>> -		ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00,

>>>> -				       (pclk_pol << 5) | (hsync_pol << 1) |

>>>> +		ret = ov5640_write_reg(sensor,

>>>> +				       OV5640_REG_POLARITY_CTRL00,

>>>> +				       (pclk_pol << 5) |

>>>> +				       (hsync_pol << 1) |

>>>>    				       vsync_pol);

>>>>

>>>>    		if (ret)

>>>> @@ -2052,12 +2060,12 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>>>    	}

>>>>

>>>>    	/*

>>>> -	 * powerdown MIPI TX/RX PHY & disable MIPI

>>>> +	 * powerdown MIPI TX/RX PHY & enable DVP

>>>>    	 *

>>>>    	 * MIPI CONTROL 00

>>>> -	 * 4:	 PWDN PHY TX

>>>> -	 * 3:	 PWDN PHY RX

>>>> -	 * 2:	 MIPI enable

>>>> +	 * [4] = 1	: Power down MIPI HS Tx

>>>> +	 * [3] = 1	: Power down MIPI LS Rx

>>>> +	 * [2] = 0	: DVP enable (MIPI disable)

>>>>    	 */

>>>>    	ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18);

>>>>    	if (ret)

>>>> @@ -2074,8 +2082,7 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>>>    	 * - [3:0]:	D[9:6] output enable

>>>>    	 */

>>>>    	ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,

>>>> -			       sensor->ep.bus_type == V4L2_MBUS_PARALLEL ?

>>>> -			       0x7f : 0x1f);

>>>> +			       on ? (bt656 ? 0x1f : 0x7f) : 0x00);

>>>>    	if (ret)

>>>>    		return ret;

>>>>

>>>> @@ -2085,7 +2092,9 @@ static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)

>>>>    	 * PAD OUTPUT ENABLE 02

>>>>    	 * - [7:2]:	D[5:0] output enable

>>>>    	 */

>>>> -	return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc);

>>>> +	return ov5640_write_reg(sensor,

>>>> +				OV5640_REG_PAD_OUTPUT_ENABLE02,

>>>> +				on ? 0xfc : 0);

>>>>    }

>>>>

>>>>    static int ov5640_set_power(struct ov5640_dev *sensor, bool on)

>>>> @@ -2925,8 +2934,6 @@ static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)

>>>>

>>>>    		if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)

>>>>    			ret = ov5640_set_stream_mipi(sensor, enable);

>>>> -		else if (sensor->ep.bus_type == V4L2_MBUS_BT656)

>>>> -			ret = ov5640_set_stream_bt656(sensor, enable);

>>>>    		else

>>>>    			ret = ov5640_set_stream_dvp(sensor, enable);

>>>>

>>>> --

>>>> 2.7.4

>>>>
diff mbox series

Patch

diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index 8d0254d..1b20db7 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -1216,20 +1216,6 @@  static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)
 			      BIT(1), on ? 0 : BIT(1));
 }
 
-static int ov5640_set_stream_bt656(struct ov5640_dev *sensor, bool on)
-{
-	int ret;
-
-	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,
-			       on ? 0x1 : 0x00);
-	if (ret)
-		return ret;
-
-	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?
-				OV5640_REG_SYS_CTRL0_SW_PWUP :
-				OV5640_REG_SYS_CTRL0_SW_PWDN);
-}
-
 static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)
 {
 	return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?
@@ -1994,20 +1980,12 @@  static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on)
 static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
 {
 	unsigned int flags = sensor->ep.bus.parallel.flags;
+	bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656;
 	u8 pclk_pol = 0;
 	u8 hsync_pol = 0;
 	u8 vsync_pol = 0;
 	int ret;
 
-	if (!on) {
-		/* Reset settings to their default values. */
-		ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);
-		ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20);
-		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00);
-		ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00);
-		return 0;
-	}
-
 	/*
 	 * Note about parallel port configuration.
 	 *
@@ -2024,27 +2002,57 @@  static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
 	 * - VSYNC:	active high
 	 * - HREF:	active low
 	 * - PCLK:	active low
+	 *
+	 * VSYNC & HREF are not configured if BT656 bus mode is selected
 	 */
+
 	/*
-	 * configure parallel port control lines polarity
+	 * BT656 embedded synchronization configuration
+	 *
+	 * CCIR656 CTRL00
+	 * - [7]:	SYNC code selection (0: auto generate sync code,
+	 *		1: sync code from regs 0x4732-0x4735)
+	 * - [6]:	f value in CCIR656 SYNC code when fixed f value
+	 * - [5]:	Fixed f value
+	 * - [4:3]:	Blank toggle data options (00: data=1'h040/1'h200,
+	 *		01: data from regs 0x4736-0x4738, 10: always keep 0)
+	 * - [1]:	Clip data disable
+	 * - [0]:	CCIR656 mode enable
 	 *
-	 * POLARITY CTRL0
-	 * - [5]:	PCLK polarity (0: active low, 1: active high)
-	 * - [1]:	HREF polarity (0: active low, 1: active high)
-	 * - [0]:	VSYNC polarity (mismatch here between
-	 *		datasheet and hardware, 0 is active high
-	 *		and 1 is active low...)
+	 * Default CCIR656 SAV/EAV mode with default codes
+	 * SAV=0xff000080 & EAV=0xff00009d is enabled here with settings:
+	 * - CCIR656 mode enable
+	 * - auto generation of sync codes
+	 * - blank toggle data 1'h040/1'h200
+	 * - clip reserved data (0x00 & 0xff changed to 0x01 & 0xfe)
 	 */
-	if (sensor->ep.bus_type == V4L2_MBUS_PARALLEL) {
+	ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,
+			       on && bt656 ? 0x01 : 0x00);
+	if (ret)
+		return ret;
+
+	if (on) {
+		/*
+		 * configure parallel port control lines polarity
+		 *
+		 * POLARITY CTRL0
+		 * - [5]:	PCLK polarity (0: active low, 1: active high)
+		 * - [1]:	HREF polarity (0: active low, 1: active high)
+		 * - [0]:	VSYNC polarity (mismatch here between
+		 *		datasheet and hardware, 0 is active high
+		 *		and 1 is active low...)
+		 */
 		if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
 			pclk_pol = 1;
-		if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)
+		if (!bt656 && flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)
 			hsync_pol = 1;
-		if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
+		if (!bt656 && flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
 			vsync_pol = 1;
 
-		ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00,
-				       (pclk_pol << 5) | (hsync_pol << 1) |
+		ret = ov5640_write_reg(sensor,
+				       OV5640_REG_POLARITY_CTRL00,
+				       (pclk_pol << 5) |
+				       (hsync_pol << 1) |
 				       vsync_pol);
 
 		if (ret)
@@ -2052,12 +2060,12 @@  static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
 	}
 
 	/*
-	 * powerdown MIPI TX/RX PHY & disable MIPI
+	 * powerdown MIPI TX/RX PHY & enable DVP
 	 *
 	 * MIPI CONTROL 00
-	 * 4:	 PWDN PHY TX
-	 * 3:	 PWDN PHY RX
-	 * 2:	 MIPI enable
+	 * [4] = 1	: Power down MIPI HS Tx
+	 * [3] = 1	: Power down MIPI LS Rx
+	 * [2] = 0	: DVP enable (MIPI disable)
 	 */
 	ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18);
 	if (ret)
@@ -2074,8 +2082,7 @@  static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
 	 * - [3:0]:	D[9:6] output enable
 	 */
 	ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,
-			       sensor->ep.bus_type == V4L2_MBUS_PARALLEL ?
-			       0x7f : 0x1f);
+			       on ? (bt656 ? 0x1f : 0x7f) : 0x00);
 	if (ret)
 		return ret;
 
@@ -2085,7 +2092,9 @@  static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
 	 * PAD OUTPUT ENABLE 02
 	 * - [7:2]:	D[5:0] output enable
 	 */
-	return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc);
+	return ov5640_write_reg(sensor,
+				OV5640_REG_PAD_OUTPUT_ENABLE02,
+				on ? 0xfc : 0);
 }
 
 static int ov5640_set_power(struct ov5640_dev *sensor, bool on)
@@ -2925,8 +2934,6 @@  static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
 
 		if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)
 			ret = ov5640_set_stream_mipi(sensor, enable);
-		else if (sensor->ep.bus_type == V4L2_MBUS_BT656)
-			ret = ov5640_set_stream_bt656(sensor, enable);
 		else
 			ret = ov5640_set_stream_dvp(sensor, enable);