[PATCH v2 2/2] drm/bridge: tc358767: Improve DPI output pixel clock accuracy

Marek Vasut marex at denx.de
Mon Nov 25 23:48:20 UTC 2024


On 11/22/24 2:32 PM, Dmitry Baryshkov wrote:
> On Tue, Nov 12, 2024 at 03:05:37AM +0100, Marek Vasut wrote:
>> The Pixel PLL is not very capable and may come up with wildly inaccurate
>> clock. Since DPI panels are often tolerant to slightly higher pixel clock
>> without being operated outside of specification, calculate two Pixel PLL
>> from either mode clock or display_timing .pixelclock.max , whichever is
>> higher. Since the Pixel PLL output clock frequency calculation always
>> returns lower frequency than the requested clock frequency, passing in
>> the higher clock frequency should result in output clock frequency which
>> is closer to the expected pixel clock.
>>
>> For the Chefree CH101 panel with 13 MHz Xtal input clock, the frequency
>> without this patch is 65 MHz which is out of the panel specification of
>> 68.9..73.4 MHz, while with this patch it is 71.5 MHz which is well within
>> the specification and far more accurate.
> 
> Granted that most of the panel drivers do not implement get_timings()
> and granted that there are no current users of that interface, I think
> we should move away from it (and maybe even drop it completely from
> drm_panel).

It does fit DPI and LVDS panels and their descriptions in datasheets the 
best.

> What about achieving the same via slightly different approach: register
> a non-preferred mode with the clock equal to the max clock allowed. The
> bridge driver can then use the default and the "max" mode to select PLL
> clock.
> 
> I understand that this suggestion doesn't follow the DPI panel
> specifics, which are closer to the continuous timings rather than fixed
> set of modes, however I really don't think that it's worth keeping the
> interface for the sake of a single driver. Original commit 2938931f3732
> ("drm/panel: Add display timing support") from 2014 mentions using those
> timings for .mode_fixup(), but I couldn't find a trace of the
> corresponding implementation.
> 
> Another possible option might be to impletent adjusting modes in
> .atomic_check() / .mode_fixup().
Something like this ?

static const struct display_timing chefree_ch101olhlwh_002_timing = {
   .pixelclock = { 68900000, 71100000, 73400000 },
   ...
};

static const struct panel_desc chefree_ch101olhlwh_002 = {
   .timings = &chefree_ch101olhlwh_002_timing,
   .num_timings = 1,
   ...
};

... would turn into ...

static const struct drm_display_mode chefree_ch101olhlwh_002_mode[3] = {
   {
     .clock = 68900000,
     ...
   }, {
     .clock = 71100000,
     ...
   }, {
     .clock = 73400000,
     ...
   }
};

static const struct panel_desc chefree_ch101olhlwh_002 = {
   .modes = &chefree_ch101olhlwh_002_mode,
   .num_timings = 3,
   ...
};

?

Maybe some mode flag to specify which mode is MIN/TYP/MAX would be 
useful with that change too ?

Finally, the TC358767 driver would test all modes and find the most 
accurate one ?


More information about the dri-devel mailing list