diff mbox

drm/mxsfb: fix pixel clock polarity

Message ID 20161208002706.10147-1-stefan@agner.ch (mailing list archive)
State New, archived
Headers show

Commit Message

Stefan Agner Dec. 8, 2016, 12:27 a.m. UTC
The DRM subsystem specifies the pixel clock polarity from a
controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
the controller drives the data on pixel clocks falling edge.
That is the controllers DOTCLK_POL=0 (Default is data launched
at negative edge).

Also change the data enable logic to be high active by default
and only change if explicitly requested via bus_flags. With
that defaults are:
- Data enable: high active
- Pixel clock polarity: controller drives data on negative edge

Signed-off-by: Stefan Agner <stefan@agner.ch>
---
Hi Marek,

I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
non-standard DE polarity was causing issues. I was using a EDT display
which is part of simple panel driver since a while now and does not
specify any bus_flags currently... Of course I could (and probably should)
add the proper bus_flags there too, but there are several displays
which do not specify any polarity and likely rely on sensible driver
standards (which is afact high active for the DE signal).

--
Stefan

 drivers/gpu/drm/mxsfb/mxsfb_crtc.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

Marek Vasut Dec. 8, 2016, 12:49 a.m. UTC | #1
On 12/08/2016 01:27 AM, Stefan Agner wrote:
> The DRM subsystem specifies the pixel clock polarity from a
> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
> the controller drives the data on pixel clocks falling edge.
> That is the controllers DOTCLK_POL=0 (Default is data launched
> at negative edge).
> 
> Also change the data enable logic to be high active by default
> and only change if explicitly requested via bus_flags. With
> that defaults are:
> - Data enable: high active
> - Pixel clock polarity: controller drives data on negative edge
> 
> Signed-off-by: Stefan Agner <stefan@agner.ch>
> ---
> Hi Marek,

Hi, that was quick, thanks for checking this.

> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
> non-standard DE polarity was causing issues. I was using a EDT display
> which is part of simple panel driver since a while now and does not
> specify any bus_flags currently... Of course I could (and probably should)
> add the proper bus_flags there too, but there are several displays
> which do not specify any polarity and likely rely on sensible driver
> standards (which is afact high active for the DE signal).

I actually use a panel which requires correct settings of the flags, see
e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
would break things for me. So I wonder whether you should fix the panel
driver or whether the mxsfb should be fixed ?

> --
> Stefan
> 
>  drivers/gpu/drm/mxsfb/mxsfb_crtc.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
> index 0818903..4bcc8a3 100644
> --- a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
> +++ b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
> @@ -168,9 +168,16 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
>  		vdctrl0 |= VDCTRL0_HSYNC_ACT_HIGH;
>  	if (m->flags & DRM_MODE_FLAG_PVSYNC)
>  		vdctrl0 |= VDCTRL0_VSYNC_ACT_HIGH;
> -	if (bus_flags & DRM_BUS_FLAG_DE_HIGH)
> +	/* Data Enable should be high active by default */
> +	if (!(bus_flags & DRM_BUS_FLAG_DE_LOW))
>  		vdctrl0 |= VDCTRL0_ENABLE_ACT_HIGH;
> -	if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
> +	/*
> +	 * Note: DRM_BUS_FLAG_PIXDATA defines are controller centric,
> +	 * controllers VDCTRL0_DOTCLK is display centric.
> +	 * Drive on positive edige      -> display samples on falling edge
> +	 * DRM_BUS_FLAG_PIXDATA_POSEDGE -> VDCTRL0_DOTCLK_ACT_FALLING
> +	 */
> +	if (bus_flags & DRM_BUS_FLAG_PIXDATA_POSEDGE)
>  		vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
>  
>  	writel(vdctrl0, mxsfb->base + LCDC_VDCTRL0);
>
Stefan Agner Dec. 8, 2016, 12:59 a.m. UTC | #2
On 2016-12-07 16:49, Marek Vasut wrote:
> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>> The DRM subsystem specifies the pixel clock polarity from a
>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>> the controller drives the data on pixel clocks falling edge.
>> That is the controllers DOTCLK_POL=0 (Default is data launched
>> at negative edge).
>>
>> Also change the data enable logic to be high active by default
>> and only change if explicitly requested via bus_flags. With
>> that defaults are:
>> - Data enable: high active
>> - Pixel clock polarity: controller drives data on negative edge
>>
>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>> ---
>> Hi Marek,
> 
> Hi, that was quick, thanks for checking this.

Yeah, I couldn't wait seeing it flying :-)

> 
>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>> non-standard DE polarity was causing issues. I was using a EDT display
>> which is part of simple panel driver since a while now and does not
>> specify any bus_flags currently... Of course I could (and probably should)
>> add the proper bus_flags there too, but there are several displays
>> which do not specify any polarity and likely rely on sensible driver
>> standards (which is afact high active for the DE signal).
> 
> I actually use a panel which requires correct settings of the flags, see
> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
> would break things for me. So I wonder whether you should fix the panel
> driver or whether the mxsfb should be fixed ?

If you ask me, mxsfb.

Ok, there are actually two things, one is a bug, one is a default
change.

The bug: Pixel clock polarity is clearly defined to be controller
centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
include/drm/drm_connector.h). The driver does it wrong currently.

This might affect your display, and if it does, it is actually wrong
also in your display... However, since it is a bug, I think it is not
really a debate, it should be fixed...

The default change: Data enable should be high by default because that
is what most displays require, including yours. This won't break your
display, since you request DRM_BUS_FLAG_DE_HIGH anyway...

We could debate whether that default change is necessary, but since it
also won't affect your display, I think it is a worthwhile change.

--
Stefan


> 
>> --
>> Stefan
>>
>>  drivers/gpu/drm/mxsfb/mxsfb_crtc.c | 11 +++++++++--
>>  1 file changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
>> index 0818903..4bcc8a3 100644
>> --- a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
>> +++ b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
>> @@ -168,9 +168,16 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
>>  		vdctrl0 |= VDCTRL0_HSYNC_ACT_HIGH;
>>  	if (m->flags & DRM_MODE_FLAG_PVSYNC)
>>  		vdctrl0 |= VDCTRL0_VSYNC_ACT_HIGH;
>> -	if (bus_flags & DRM_BUS_FLAG_DE_HIGH)
>> +	/* Data Enable should be high active by default */
>> +	if (!(bus_flags & DRM_BUS_FLAG_DE_LOW))
>>  		vdctrl0 |= VDCTRL0_ENABLE_ACT_HIGH;
>> -	if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
>> +	/*
>> +	 * Note: DRM_BUS_FLAG_PIXDATA defines are controller centric,
>> +	 * controllers VDCTRL0_DOTCLK is display centric.
>> +	 * Drive on positive edige      -> display samples on falling edge
>> +	 * DRM_BUS_FLAG_PIXDATA_POSEDGE -> VDCTRL0_DOTCLK_ACT_FALLING
>> +	 */
>> +	if (bus_flags & DRM_BUS_FLAG_PIXDATA_POSEDGE)
>>  		vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
>>
>>  	writel(vdctrl0, mxsfb->base + LCDC_VDCTRL0);
>>
Stefan Agner Dec. 8, 2016, 1:26 a.m. UTC | #3
On 2016-12-07 16:59, Stefan Agner wrote:
> On 2016-12-07 16:49, Marek Vasut wrote:
>> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>>> The DRM subsystem specifies the pixel clock polarity from a
>>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>>> the controller drives the data on pixel clocks falling edge.
>>> That is the controllers DOTCLK_POL=0 (Default is data launched
>>> at negative edge).
>>>
>>> Also change the data enable logic to be high active by default
>>> and only change if explicitly requested via bus_flags. With
>>> that defaults are:
>>> - Data enable: high active
>>> - Pixel clock polarity: controller drives data on negative edge
>>>
>>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>>> ---
>>> Hi Marek,
>>
>> Hi, that was quick, thanks for checking this.
> 
> Yeah, I couldn't wait seeing it flying :-)
> 
>>
>>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>>> non-standard DE polarity was causing issues. I was using a EDT display
>>> which is part of simple panel driver since a while now and does not
>>> specify any bus_flags currently... Of course I could (and probably should)
>>> add the proper bus_flags there too, but there are several displays
>>> which do not specify any polarity and likely rely on sensible driver
>>> standards (which is afact high active for the DE signal).
>>
>> I actually use a panel which requires correct settings of the flags, see
>> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
>> would break things for me. So I wonder whether you should fix the panel
>> driver or whether the mxsfb should be fixed ?
> 
> If you ask me, mxsfb.
> 
> Ok, there are actually two things, one is a bug, one is a default
> change.
> 
> The bug: Pixel clock polarity is clearly defined to be controller
> centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
> include/drm/drm_connector.h). The driver does it wrong currently.
> 
> This might affect your display, and if it does, it is actually wrong
> also in your display... However, since it is a bug, I think it is not
> really a debate, it should be fixed...

FWIW, it seems that Ortustech com43h4m85ulc samples on falling edge, so
DRM_BUS_FLAG_PIXDATA_POSEDGE seems right. And it means that DOTCLK_POL
should be 1 (inverted), so with this patch the polarity should actually
be correct for that panel.

--
Stefan

> The default change: Data enable should be high by default because that
> is what most displays require, including yours. This won't break your
> display, since you request DRM_BUS_FLAG_DE_HIGH anyway...
> 
> We could debate whether that default change is necessary, but since it
> also won't affect your display, I think it is a worthwhile change.
> 
> --
> Stefan
> 
> 
>>
>>> --
>>> Stefan
>>>
>>>  drivers/gpu/drm/mxsfb/mxsfb_crtc.c | 11 +++++++++--
>>>  1 file changed, 9 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
>>> index 0818903..4bcc8a3 100644
>>> --- a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
>>> +++ b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
>>> @@ -168,9 +168,16 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
>>>  		vdctrl0 |= VDCTRL0_HSYNC_ACT_HIGH;
>>>  	if (m->flags & DRM_MODE_FLAG_PVSYNC)
>>>  		vdctrl0 |= VDCTRL0_VSYNC_ACT_HIGH;
>>> -	if (bus_flags & DRM_BUS_FLAG_DE_HIGH)
>>> +	/* Data Enable should be high active by default */
>>> +	if (!(bus_flags & DRM_BUS_FLAG_DE_LOW))
>>>  		vdctrl0 |= VDCTRL0_ENABLE_ACT_HIGH;
>>> -	if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
>>> +	/*
>>> +	 * Note: DRM_BUS_FLAG_PIXDATA defines are controller centric,
>>> +	 * controllers VDCTRL0_DOTCLK is display centric.
>>> +	 * Drive on positive edige      -> display samples on falling edge
>>> +	 * DRM_BUS_FLAG_PIXDATA_POSEDGE -> VDCTRL0_DOTCLK_ACT_FALLING
>>> +	 */
>>> +	if (bus_flags & DRM_BUS_FLAG_PIXDATA_POSEDGE)
>>>  		vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
>>>
>>>  	writel(vdctrl0, mxsfb->base + LCDC_VDCTRL0);
>>>
Marek Vasut Dec. 8, 2016, 2:37 a.m. UTC | #4
On 12/08/2016 02:26 AM, Stefan Agner wrote:
> On 2016-12-07 16:59, Stefan Agner wrote:
>> On 2016-12-07 16:49, Marek Vasut wrote:
>>> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>>>> The DRM subsystem specifies the pixel clock polarity from a
>>>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>>>> the controller drives the data on pixel clocks falling edge.
>>>> That is the controllers DOTCLK_POL=0 (Default is data launched
>>>> at negative edge).
>>>>
>>>> Also change the data enable logic to be high active by default
>>>> and only change if explicitly requested via bus_flags. With
>>>> that defaults are:
>>>> - Data enable: high active
>>>> - Pixel clock polarity: controller drives data on negative edge
>>>>
>>>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>>>> ---
>>>> Hi Marek,
>>>
>>> Hi, that was quick, thanks for checking this.
>>
>> Yeah, I couldn't wait seeing it flying :-)
>>
>>>
>>>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>>>> non-standard DE polarity was causing issues. I was using a EDT display
>>>> which is part of simple panel driver since a while now and does not
>>>> specify any bus_flags currently... Of course I could (and probably should)
>>>> add the proper bus_flags there too, but there are several displays
>>>> which do not specify any polarity and likely rely on sensible driver
>>>> standards (which is afact high active for the DE signal).
>>>
>>> I actually use a panel which requires correct settings of the flags, see
>>> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
>>> would break things for me. So I wonder whether you should fix the panel
>>> driver or whether the mxsfb should be fixed ?
>>
>> If you ask me, mxsfb.
>>
>> Ok, there are actually two things, one is a bug, one is a default
>> change.
>>
>> The bug: Pixel clock polarity is clearly defined to be controller
>> centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
>> include/drm/drm_connector.h). The driver does it wrong currently.
>>
>> This might affect your display, and if it does, it is actually wrong
>> also in your display... However, since it is a bug, I think it is not
>> really a debate, it should be fixed...
> 
> FWIW, it seems that Ortustech com43h4m85ulc samples on falling edge, so
> DRM_BUS_FLAG_PIXDATA_POSEDGE seems right. And it means that DOTCLK_POL
> should be 1 (inverted), so with this patch the polarity should actually
> be correct for that panel.

Well, if I apply this patch, my image is shifted by 1 px to the left and
there is a 1px white bar on the right side, so I think I have some
polarity problem now ?
Stefan Agner Dec. 8, 2016, 8:46 p.m. UTC | #5
On 2016-12-07 18:37, Marek Vasut wrote:
> On 12/08/2016 02:26 AM, Stefan Agner wrote:
>> On 2016-12-07 16:59, Stefan Agner wrote:
>>> On 2016-12-07 16:49, Marek Vasut wrote:
>>>> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>>>>> The DRM subsystem specifies the pixel clock polarity from a
>>>>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>>>>> the controller drives the data on pixel clocks falling edge.
>>>>> That is the controllers DOTCLK_POL=0 (Default is data launched
>>>>> at negative edge).
>>>>>
>>>>> Also change the data enable logic to be high active by default
>>>>> and only change if explicitly requested via bus_flags. With
>>>>> that defaults are:
>>>>> - Data enable: high active
>>>>> - Pixel clock polarity: controller drives data on negative edge
>>>>>
>>>>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>>>>> ---
>>>>> Hi Marek,
>>>>
>>>> Hi, that was quick, thanks for checking this.
>>>
>>> Yeah, I couldn't wait seeing it flying :-)
>>>
>>>>
>>>>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>>>>> non-standard DE polarity was causing issues. I was using a EDT display
>>>>> which is part of simple panel driver since a while now and does not
>>>>> specify any bus_flags currently... Of course I could (and probably should)
>>>>> add the proper bus_flags there too, but there are several displays
>>>>> which do not specify any polarity and likely rely on sensible driver
>>>>> standards (which is afact high active for the DE signal).
>>>>
>>>> I actually use a panel which requires correct settings of the flags, see
>>>> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
>>>> would break things for me. So I wonder whether you should fix the panel
>>>> driver or whether the mxsfb should be fixed ?
>>>
>>> If you ask me, mxsfb.
>>>
>>> Ok, there are actually two things, one is a bug, one is a default
>>> change.
>>>
>>> The bug: Pixel clock polarity is clearly defined to be controller
>>> centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
>>> include/drm/drm_connector.h). The driver does it wrong currently.
>>>
>>> This might affect your display, and if it does, it is actually wrong
>>> also in your display... However, since it is a bug, I think it is not
>>> really a debate, it should be fixed...
>>
>> FWIW, it seems that Ortustech com43h4m85ulc samples on falling edge, so
>> DRM_BUS_FLAG_PIXDATA_POSEDGE seems right. And it means that DOTCLK_POL
>> should be 1 (inverted), so with this patch the polarity should actually
>> be correct for that panel.
> 
> Well, if I apply this patch, my image is shifted by 1 px to the left and
> there is a 1px white bar on the right side, so I think I have some
> polarity problem now ?

Ok, lets create facts here:
1. SoloX Refrence Manual, Figure 37-13. shows DOTCLK_POL=0, and it shows
that the controller drives signals on falling edge of the pixel clock.
The i.MX 7 has the same figure.
2. Just to verify, I hooked up an oscilloscope on my i.MX 7: It shows
that with DOTCLK_POL=0 the controller drives on falling edge:
http://imgur.com/a/2f2Xt 

So my measurements verify what is in the i.MX data sheets.

The current code sets the bit when negative edge (falling edge) is
requested, which is wrong:
#define VDCTRL0_DOTCLK_ACT_FALLING	(1 << 25)
...
if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
     vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;

Not sure what is going on with your display, maybe the datasheet is just
wrong (it requires DRM_BUS_FLAG_PIXDATA_NEGEDGE in fact) or it is some
other artifact.

--
Stefan
Marek Vasut Dec. 8, 2016, 11:38 p.m. UTC | #6
On 12/08/2016 09:46 PM, Stefan Agner wrote:
> On 2016-12-07 18:37, Marek Vasut wrote:
>> On 12/08/2016 02:26 AM, Stefan Agner wrote:
>>> On 2016-12-07 16:59, Stefan Agner wrote:
>>>> On 2016-12-07 16:49, Marek Vasut wrote:
>>>>> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>>>>>> The DRM subsystem specifies the pixel clock polarity from a
>>>>>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>>>>>> the controller drives the data on pixel clocks falling edge.
>>>>>> That is the controllers DOTCLK_POL=0 (Default is data launched
>>>>>> at negative edge).
>>>>>>
>>>>>> Also change the data enable logic to be high active by default
>>>>>> and only change if explicitly requested via bus_flags. With
>>>>>> that defaults are:
>>>>>> - Data enable: high active
>>>>>> - Pixel clock polarity: controller drives data on negative edge
>>>>>>
>>>>>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>>>>>> ---
>>>>>> Hi Marek,
>>>>>
>>>>> Hi, that was quick, thanks for checking this.
>>>>
>>>> Yeah, I couldn't wait seeing it flying :-)
>>>>
>>>>>
>>>>>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>>>>>> non-standard DE polarity was causing issues. I was using a EDT display
>>>>>> which is part of simple panel driver since a while now and does not
>>>>>> specify any bus_flags currently... Of course I could (and probably should)
>>>>>> add the proper bus_flags there too, but there are several displays
>>>>>> which do not specify any polarity and likely rely on sensible driver
>>>>>> standards (which is afact high active for the DE signal).
>>>>>
>>>>> I actually use a panel which requires correct settings of the flags, see
>>>>> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
>>>>> would break things for me. So I wonder whether you should fix the panel
>>>>> driver or whether the mxsfb should be fixed ?
>>>>
>>>> If you ask me, mxsfb.
>>>>
>>>> Ok, there are actually two things, one is a bug, one is a default
>>>> change.
>>>>
>>>> The bug: Pixel clock polarity is clearly defined to be controller
>>>> centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
>>>> include/drm/drm_connector.h). The driver does it wrong currently.
>>>>
>>>> This might affect your display, and if it does, it is actually wrong
>>>> also in your display... However, since it is a bug, I think it is not
>>>> really a debate, it should be fixed...
>>>
>>> FWIW, it seems that Ortustech com43h4m85ulc samples on falling edge, so
>>> DRM_BUS_FLAG_PIXDATA_POSEDGE seems right. And it means that DOTCLK_POL
>>> should be 1 (inverted), so with this patch the polarity should actually
>>> be correct for that panel.
>>
>> Well, if I apply this patch, my image is shifted by 1 px to the left and
>> there is a 1px white bar on the right side, so I think I have some
>> polarity problem now ?
> 
> Ok, lets create facts here:
> 1. SoloX Refrence Manual, Figure 37-13. shows DOTCLK_POL=0, and it shows
> that the controller drives signals on falling edge of the pixel clock.
> The i.MX 7 has the same figure.
> 2. Just to verify, I hooked up an oscilloscope on my i.MX 7: It shows
> that with DOTCLK_POL=0 the controller drives on falling edge:
> http://imgur.com/a/2f2Xt 
> 
> So my measurements verify what is in the i.MX data sheets.

Good

> The current code sets the bit when negative edge (falling edge) is
> requested, which is wrong:
> #define VDCTRL0_DOTCLK_ACT_FALLING	(1 << 25)
> ...
> if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
>      vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
> 
> Not sure what is going on with your display, maybe the datasheet is just
> wrong (it requires DRM_BUS_FLAG_PIXDATA_NEGEDGE in fact) or it is some
> other artifact.

This is probably where the problem crept in [1], droping PIXDATA_POSEDGE
actually makes this patch work for me. CCing Philipp.

[1] https://patchwork.kernel.org/patch/9301517/
Stefan Agner Dec. 14, 2016, 12:01 a.m. UTC | #7
On 2016-12-08 15:38, Marek Vasut wrote:
> On 12/08/2016 09:46 PM, Stefan Agner wrote:
>> On 2016-12-07 18:37, Marek Vasut wrote:
>>> On 12/08/2016 02:26 AM, Stefan Agner wrote:
>>>> On 2016-12-07 16:59, Stefan Agner wrote:
>>>>> On 2016-12-07 16:49, Marek Vasut wrote:
>>>>>> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>>>>>>> The DRM subsystem specifies the pixel clock polarity from a
>>>>>>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>>>>>>> the controller drives the data on pixel clocks falling edge.
>>>>>>> That is the controllers DOTCLK_POL=0 (Default is data launched
>>>>>>> at negative edge).
>>>>>>>
>>>>>>> Also change the data enable logic to be high active by default
>>>>>>> and only change if explicitly requested via bus_flags. With
>>>>>>> that defaults are:
>>>>>>> - Data enable: high active
>>>>>>> - Pixel clock polarity: controller drives data on negative edge
>>>>>>>
>>>>>>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>>>>>>> ---
>>>>>>> Hi Marek,
>>>>>>
>>>>>> Hi, that was quick, thanks for checking this.
>>>>>
>>>>> Yeah, I couldn't wait seeing it flying :-)
>>>>>
>>>>>>
>>>>>>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>>>>>>> non-standard DE polarity was causing issues. I was using a EDT display
>>>>>>> which is part of simple panel driver since a while now and does not
>>>>>>> specify any bus_flags currently... Of course I could (and probably should)
>>>>>>> add the proper bus_flags there too, but there are several displays
>>>>>>> which do not specify any polarity and likely rely on sensible driver
>>>>>>> standards (which is afact high active for the DE signal).
>>>>>>
>>>>>> I actually use a panel which requires correct settings of the flags, see
>>>>>> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
>>>>>> would break things for me. So I wonder whether you should fix the panel
>>>>>> driver or whether the mxsfb should be fixed ?
>>>>>
>>>>> If you ask me, mxsfb.
>>>>>
>>>>> Ok, there are actually two things, one is a bug, one is a default
>>>>> change.
>>>>>
>>>>> The bug: Pixel clock polarity is clearly defined to be controller
>>>>> centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
>>>>> include/drm/drm_connector.h). The driver does it wrong currently.
>>>>>
>>>>> This might affect your display, and if it does, it is actually wrong
>>>>> also in your display... However, since it is a bug, I think it is not
>>>>> really a debate, it should be fixed...
>>>>
>>>> FWIW, it seems that Ortustech com43h4m85ulc samples on falling edge, so
>>>> DRM_BUS_FLAG_PIXDATA_POSEDGE seems right. And it means that DOTCLK_POL
>>>> should be 1 (inverted), so with this patch the polarity should actually
>>>> be correct for that panel.
>>>
>>> Well, if I apply this patch, my image is shifted by 1 px to the left and
>>> there is a 1px white bar on the right side, so I think I have some
>>> polarity problem now ?
>>
>> Ok, lets create facts here:
>> 1. SoloX Refrence Manual, Figure 37-13. shows DOTCLK_POL=0, and it shows
>> that the controller drives signals on falling edge of the pixel clock.
>> The i.MX 7 has the same figure.
>> 2. Just to verify, I hooked up an oscilloscope on my i.MX 7: It shows
>> that with DOTCLK_POL=0 the controller drives on falling edge:
>> http://imgur.com/a/2f2Xt
>>
>> So my measurements verify what is in the i.MX data sheets.
> 
> Good
> 
>> The current code sets the bit when negative edge (falling edge) is
>> requested, which is wrong:
>> #define VDCTRL0_DOTCLK_ACT_FALLING	(1 << 25)
>> ...
>> if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
>>      vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
>>
>> Not sure what is going on with your display, maybe the datasheet is just
>> wrong (it requires DRM_BUS_FLAG_PIXDATA_NEGEDGE in fact) or it is some
>> other artifact.
> 
> This is probably where the problem crept in [1], droping PIXDATA_POSEDGE
> actually makes this patch work for me. CCing Philipp.
> 
> [1] https://patchwork.kernel.org/patch/9301517/

I looked at a old data sheet of that display and it seemed that
PIXDATA_POSEDGE is the right thing. Panelook.cn lists newer data sheets,
but I couldn't find them on the open internet, do you  have access to a
newer one?

http://www.panelook.cn/COM43H4M85ULC_ORTUSTECH_4.3_LCM_overview_17296.html

I guess in the end it doesn't matter: Given that it is verified that the
controllers data sheet is right, I vote for merging that patch and fix
the displays polarity...

--
Stefan
Marek Vasut Dec. 14, 2016, 8:04 a.m. UTC | #8
On 12/14/2016 01:01 AM, Stefan Agner wrote:
> On 2016-12-08 15:38, Marek Vasut wrote:
>> On 12/08/2016 09:46 PM, Stefan Agner wrote:
>>> On 2016-12-07 18:37, Marek Vasut wrote:
>>>> On 12/08/2016 02:26 AM, Stefan Agner wrote:
>>>>> On 2016-12-07 16:59, Stefan Agner wrote:
>>>>>> On 2016-12-07 16:49, Marek Vasut wrote:
>>>>>>> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>>>>>>>> The DRM subsystem specifies the pixel clock polarity from a
>>>>>>>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>>>>>>>> the controller drives the data on pixel clocks falling edge.
>>>>>>>> That is the controllers DOTCLK_POL=0 (Default is data launched
>>>>>>>> at negative edge).
>>>>>>>>
>>>>>>>> Also change the data enable logic to be high active by default
>>>>>>>> and only change if explicitly requested via bus_flags. With
>>>>>>>> that defaults are:
>>>>>>>> - Data enable: high active
>>>>>>>> - Pixel clock polarity: controller drives data on negative edge
>>>>>>>>
>>>>>>>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>>>>>>>> ---
>>>>>>>> Hi Marek,
>>>>>>>
>>>>>>> Hi, that was quick, thanks for checking this.
>>>>>>
>>>>>> Yeah, I couldn't wait seeing it flying :-)
>>>>>>
>>>>>>>
>>>>>>>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>>>>>>>> non-standard DE polarity was causing issues. I was using a EDT display
>>>>>>>> which is part of simple panel driver since a while now and does not
>>>>>>>> specify any bus_flags currently... Of course I could (and probably should)
>>>>>>>> add the proper bus_flags there too, but there are several displays
>>>>>>>> which do not specify any polarity and likely rely on sensible driver
>>>>>>>> standards (which is afact high active for the DE signal).
>>>>>>>
>>>>>>> I actually use a panel which requires correct settings of the flags, see
>>>>>>> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
>>>>>>> would break things for me. So I wonder whether you should fix the panel
>>>>>>> driver or whether the mxsfb should be fixed ?
>>>>>>
>>>>>> If you ask me, mxsfb.
>>>>>>
>>>>>> Ok, there are actually two things, one is a bug, one is a default
>>>>>> change.
>>>>>>
>>>>>> The bug: Pixel clock polarity is clearly defined to be controller
>>>>>> centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
>>>>>> include/drm/drm_connector.h). The driver does it wrong currently.
>>>>>>
>>>>>> This might affect your display, and if it does, it is actually wrong
>>>>>> also in your display... However, since it is a bug, I think it is not
>>>>>> really a debate, it should be fixed...
>>>>>
>>>>> FWIW, it seems that Ortustech com43h4m85ulc samples on falling edge, so
>>>>> DRM_BUS_FLAG_PIXDATA_POSEDGE seems right. And it means that DOTCLK_POL
>>>>> should be 1 (inverted), so with this patch the polarity should actually
>>>>> be correct for that panel.
>>>>
>>>> Well, if I apply this patch, my image is shifted by 1 px to the left and
>>>> there is a 1px white bar on the right side, so I think I have some
>>>> polarity problem now ?
>>>
>>> Ok, lets create facts here:
>>> 1. SoloX Refrence Manual, Figure 37-13. shows DOTCLK_POL=0, and it shows
>>> that the controller drives signals on falling edge of the pixel clock.
>>> The i.MX 7 has the same figure.
>>> 2. Just to verify, I hooked up an oscilloscope on my i.MX 7: It shows
>>> that with DOTCLK_POL=0 the controller drives on falling edge:
>>> http://imgur.com/a/2f2Xt
>>>
>>> So my measurements verify what is in the i.MX data sheets.
>>
>> Good
>>
>>> The current code sets the bit when negative edge (falling edge) is
>>> requested, which is wrong:
>>> #define VDCTRL0_DOTCLK_ACT_FALLING	(1 << 25)
>>> ...
>>> if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
>>>      vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
>>>
>>> Not sure what is going on with your display, maybe the datasheet is just
>>> wrong (it requires DRM_BUS_FLAG_PIXDATA_NEGEDGE in fact) or it is some
>>> other artifact.
>>
>> This is probably where the problem crept in [1], droping PIXDATA_POSEDGE
>> actually makes this patch work for me. CCing Philipp.
>>
>> [1] https://patchwork.kernel.org/patch/9301517/
> 
> I looked at a old data sheet of that display and it seemed that
> PIXDATA_POSEDGE is the right thing. Panelook.cn lists newer data sheets,
> but I couldn't find them on the open internet, do you  have access to a
> newer one?

Which "version" do you have ? Probably not though.

> http://www.panelook.cn/COM43H4M85ULC_ORTUSTECH_4.3_LCM_overview_17296.html
> 
> I guess in the end it doesn't matter: Given that it is verified that the
> controllers data sheet is right, I vote for merging that patch and fix
> the displays polarity...

Merging which patch ?
Stefan Agner Dec. 14, 2016, 8:29 p.m. UTC | #9
On 2016-12-14 00:04, Marek Vasut wrote:
> On 12/14/2016 01:01 AM, Stefan Agner wrote:
>> On 2016-12-08 15:38, Marek Vasut wrote:
>>> On 12/08/2016 09:46 PM, Stefan Agner wrote:
>>>> On 2016-12-07 18:37, Marek Vasut wrote:
>>>>> On 12/08/2016 02:26 AM, Stefan Agner wrote:
>>>>>> On 2016-12-07 16:59, Stefan Agner wrote:
>>>>>>> On 2016-12-07 16:49, Marek Vasut wrote:
>>>>>>>> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>>>>>>>>> The DRM subsystem specifies the pixel clock polarity from a
>>>>>>>>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>>>>>>>>> the controller drives the data on pixel clocks falling edge.
>>>>>>>>> That is the controllers DOTCLK_POL=0 (Default is data launched
>>>>>>>>> at negative edge).
>>>>>>>>>
>>>>>>>>> Also change the data enable logic to be high active by default
>>>>>>>>> and only change if explicitly requested via bus_flags. With
>>>>>>>>> that defaults are:
>>>>>>>>> - Data enable: high active
>>>>>>>>> - Pixel clock polarity: controller drives data on negative edge
>>>>>>>>>
>>>>>>>>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>>>>>>>>> ---
>>>>>>>>> Hi Marek,
>>>>>>>>
>>>>>>>> Hi, that was quick, thanks for checking this.
>>>>>>>
>>>>>>> Yeah, I couldn't wait seeing it flying :-)
>>>>>>>
>>>>>>>>
>>>>>>>>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>>>>>>>>> non-standard DE polarity was causing issues. I was using a EDT display
>>>>>>>>> which is part of simple panel driver since a while now and does not
>>>>>>>>> specify any bus_flags currently... Of course I could (and probably should)
>>>>>>>>> add the proper bus_flags there too, but there are several displays
>>>>>>>>> which do not specify any polarity and likely rely on sensible driver
>>>>>>>>> standards (which is afact high active for the DE signal).
>>>>>>>>
>>>>>>>> I actually use a panel which requires correct settings of the flags, see
>>>>>>>> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
>>>>>>>> would break things for me. So I wonder whether you should fix the panel
>>>>>>>> driver or whether the mxsfb should be fixed ?
>>>>>>>
>>>>>>> If you ask me, mxsfb.
>>>>>>>
>>>>>>> Ok, there are actually two things, one is a bug, one is a default
>>>>>>> change.
>>>>>>>
>>>>>>> The bug: Pixel clock polarity is clearly defined to be controller
>>>>>>> centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
>>>>>>> include/drm/drm_connector.h). The driver does it wrong currently.
>>>>>>>
>>>>>>> This might affect your display, and if it does, it is actually wrong
>>>>>>> also in your display... However, since it is a bug, I think it is not
>>>>>>> really a debate, it should be fixed...
>>>>>>
>>>>>> FWIW, it seems that Ortustech com43h4m85ulc samples on falling edge, so
>>>>>> DRM_BUS_FLAG_PIXDATA_POSEDGE seems right. And it means that DOTCLK_POL
>>>>>> should be 1 (inverted), so with this patch the polarity should actually
>>>>>> be correct for that panel.
>>>>>
>>>>> Well, if I apply this patch, my image is shifted by 1 px to the left and
>>>>> there is a 1px white bar on the right side, so I think I have some
>>>>> polarity problem now ?
>>>>
>>>> Ok, lets create facts here:
>>>> 1. SoloX Refrence Manual, Figure 37-13. shows DOTCLK_POL=0, and it shows
>>>> that the controller drives signals on falling edge of the pixel clock.
>>>> The i.MX 7 has the same figure.
>>>> 2. Just to verify, I hooked up an oscilloscope on my i.MX 7: It shows
>>>> that with DOTCLK_POL=0 the controller drives on falling edge:
>>>> http://imgur.com/a/2f2Xt
>>>>
>>>> So my measurements verify what is in the i.MX data sheets.
>>>
>>> Good
>>>
>>>> The current code sets the bit when negative edge (falling edge) is
>>>> requested, which is wrong:
>>>> #define VDCTRL0_DOTCLK_ACT_FALLING	(1 << 25)
>>>> ...
>>>> if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
>>>>      vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
>>>>
>>>> Not sure what is going on with your display, maybe the datasheet is just
>>>> wrong (it requires DRM_BUS_FLAG_PIXDATA_NEGEDGE in fact) or it is some
>>>> other artifact.
>>>
>>> This is probably where the problem crept in [1], droping PIXDATA_POSEDGE
>>> actually makes this patch work for me. CCing Philipp.
>>>
>>> [1] https://patchwork.kernel.org/patch/9301517/
>>
>> I looked at a old data sheet of that display and it seemed that
>> PIXDATA_POSEDGE is the right thing. Panelook.cn lists newer data sheets,
>> but I couldn't find them on the open internet, do you  have access to a
>> newer one?
> 
> Which "version" do you have ? Probably not though.
> 

I couldn't find it anymore, but I think it said Rev. 0

>> http://www.panelook.cn/COM43H4M85ULC_ORTUSTECH_4.3_LCM_overview_17296.html
>>
>> I guess in the end it doesn't matter: Given that it is verified that the
>> controllers data sheet is right, I vote for merging that patch and fix
>> the displays polarity...
> 
> Merging which patch ?

This patch.

And I guess, to keep your display working, a patch which changes the
Ortustech pixel clock flag...

--
Stefan
Marek Vasut Dec. 14, 2016, 8:38 p.m. UTC | #10
On 12/14/2016 09:29 PM, Stefan Agner wrote:
> On 2016-12-14 00:04, Marek Vasut wrote:
>> On 12/14/2016 01:01 AM, Stefan Agner wrote:
>>> On 2016-12-08 15:38, Marek Vasut wrote:
>>>> On 12/08/2016 09:46 PM, Stefan Agner wrote:
>>>>> On 2016-12-07 18:37, Marek Vasut wrote:
>>>>>> On 12/08/2016 02:26 AM, Stefan Agner wrote:
>>>>>>> On 2016-12-07 16:59, Stefan Agner wrote:
>>>>>>>> On 2016-12-07 16:49, Marek Vasut wrote:
>>>>>>>>> On 12/08/2016 01:27 AM, Stefan Agner wrote:
>>>>>>>>>> The DRM subsystem specifies the pixel clock polarity from a
>>>>>>>>>> controllers perspective: DRM_BUS_FLAG_PIXDATA_NEGEDGE means
>>>>>>>>>> the controller drives the data on pixel clocks falling edge.
>>>>>>>>>> That is the controllers DOTCLK_POL=0 (Default is data launched
>>>>>>>>>> at negative edge).
>>>>>>>>>>
>>>>>>>>>> Also change the data enable logic to be high active by default
>>>>>>>>>> and only change if explicitly requested via bus_flags. With
>>>>>>>>>> that defaults are:
>>>>>>>>>> - Data enable: high active
>>>>>>>>>> - Pixel clock polarity: controller drives data on negative edge
>>>>>>>>>>
>>>>>>>>>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>>>>>>>>>> ---
>>>>>>>>>> Hi Marek,
>>>>>>>>>
>>>>>>>>> Hi, that was quick, thanks for checking this.
>>>>>>>>
>>>>>>>> Yeah, I couldn't wait seeing it flying :-)
>>>>>>>>
>>>>>>>>>
>>>>>>>>>> I discovered this while testing on a i.MX 7 eLCDIF IP. Particularly the
>>>>>>>>>> non-standard DE polarity was causing issues. I was using a EDT display
>>>>>>>>>> which is part of simple panel driver since a while now and does not
>>>>>>>>>> specify any bus_flags currently... Of course I could (and probably should)
>>>>>>>>>> add the proper bus_flags there too, but there are several displays
>>>>>>>>>> which do not specify any polarity and likely rely on sensible driver
>>>>>>>>>> standards (which is afact high active for the DE signal).
>>>>>>>>>
>>>>>>>>> I actually use a panel which requires correct settings of the flags, see
>>>>>>>>> e0932f9d7ba9a16f99a84943b720f109de8e3e06 in mainline , so this patch
>>>>>>>>> would break things for me. So I wonder whether you should fix the panel
>>>>>>>>> driver or whether the mxsfb should be fixed ?
>>>>>>>>
>>>>>>>> If you ask me, mxsfb.
>>>>>>>>
>>>>>>>> Ok, there are actually two things, one is a bug, one is a default
>>>>>>>> change.
>>>>>>>>
>>>>>>>> The bug: Pixel clock polarity is clearly defined to be controller
>>>>>>>> centric (see comments around DRM_BUS_FLAG_PIXDATA_*EDGE in
>>>>>>>> include/drm/drm_connector.h). The driver does it wrong currently.
>>>>>>>>
>>>>>>>> This might affect your display, and if it does, it is actually wrong
>>>>>>>> also in your display... However, since it is a bug, I think it is not
>>>>>>>> really a debate, it should be fixed...
>>>>>>>
>>>>>>> FWIW, it seems that Ortustech com43h4m85ulc samples on falling edge, so
>>>>>>> DRM_BUS_FLAG_PIXDATA_POSEDGE seems right. And it means that DOTCLK_POL
>>>>>>> should be 1 (inverted), so with this patch the polarity should actually
>>>>>>> be correct for that panel.
>>>>>>
>>>>>> Well, if I apply this patch, my image is shifted by 1 px to the left and
>>>>>> there is a 1px white bar on the right side, so I think I have some
>>>>>> polarity problem now ?
>>>>>
>>>>> Ok, lets create facts here:
>>>>> 1. SoloX Refrence Manual, Figure 37-13. shows DOTCLK_POL=0, and it shows
>>>>> that the controller drives signals on falling edge of the pixel clock.
>>>>> The i.MX 7 has the same figure.
>>>>> 2. Just to verify, I hooked up an oscilloscope on my i.MX 7: It shows
>>>>> that with DOTCLK_POL=0 the controller drives on falling edge:
>>>>> http://imgur.com/a/2f2Xt
>>>>>
>>>>> So my measurements verify what is in the i.MX data sheets.
>>>>
>>>> Good
>>>>
>>>>> The current code sets the bit when negative edge (falling edge) is
>>>>> requested, which is wrong:
>>>>> #define VDCTRL0_DOTCLK_ACT_FALLING	(1 << 25)
>>>>> ...
>>>>> if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
>>>>>      vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
>>>>>
>>>>> Not sure what is going on with your display, maybe the datasheet is just
>>>>> wrong (it requires DRM_BUS_FLAG_PIXDATA_NEGEDGE in fact) or it is some
>>>>> other artifact.
>>>>
>>>> This is probably where the problem crept in [1], droping PIXDATA_POSEDGE
>>>> actually makes this patch work for me. CCing Philipp.
>>>>
>>>> [1] https://patchwork.kernel.org/patch/9301517/
>>>
>>> I looked at a old data sheet of that display and it seemed that
>>> PIXDATA_POSEDGE is the right thing. Panelook.cn lists newer data sheets,
>>> but I couldn't find them on the open internet, do you  have access to a
>>> newer one?
>>
>> Which "version" do you have ? Probably not though.
>>
> 
> I couldn't find it anymore, but I think it said Rev. 0
> 
>>> http://www.panelook.cn/COM43H4M85ULC_ORTUSTECH_4.3_LCM_overview_17296.html
>>>
>>> I guess in the end it doesn't matter: Given that it is verified that the
>>> controllers data sheet is right, I vote for merging that patch and fix
>>> the displays polarity...
>>
>> Merging which patch ?
> 
> This patch.
> 
> And I guess, to keep your display working, a patch which changes the
> Ortustech pixel clock flag...

Well, let's do that. Btw can you send a V2 with s/edige/edge/ ? ;-)

Thanks!
diff mbox

Patch

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
index 0818903..4bcc8a3 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_crtc.c
@@ -168,9 +168,16 @@  static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
 		vdctrl0 |= VDCTRL0_HSYNC_ACT_HIGH;
 	if (m->flags & DRM_MODE_FLAG_PVSYNC)
 		vdctrl0 |= VDCTRL0_VSYNC_ACT_HIGH;
-	if (bus_flags & DRM_BUS_FLAG_DE_HIGH)
+	/* Data Enable should be high active by default */
+	if (!(bus_flags & DRM_BUS_FLAG_DE_LOW))
 		vdctrl0 |= VDCTRL0_ENABLE_ACT_HIGH;
-	if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE)
+	/*
+	 * Note: DRM_BUS_FLAG_PIXDATA defines are controller centric,
+	 * controllers VDCTRL0_DOTCLK is display centric.
+	 * Drive on positive edige      -> display samples on falling edge
+	 * DRM_BUS_FLAG_PIXDATA_POSEDGE -> VDCTRL0_DOTCLK_ACT_FALLING
+	 */
+	if (bus_flags & DRM_BUS_FLAG_PIXDATA_POSEDGE)
 		vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
 
 	writel(vdctrl0, mxsfb->base + LCDC_VDCTRL0);