@@ -365,7 +365,8 @@ static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
365
365
unsigned int wr_clk =
366
366
readl_relaxed (priv -> io_base + _REG (VPU_HDMI_SETTING ));
367
367
368
- DRM_DEBUG_DRIVER ("\"%s\"\n" , mode -> name );
368
+ DRM_DEBUG_DRIVER ("\"%s\" div%d\n" , mode -> name ,
369
+ mode -> clock > 340000 ? 40 : 10 );
369
370
370
371
/* Enable clocks */
371
372
regmap_update_bits (priv -> hhi , HHI_HDMI_CLK_CNTL , 0xffff , 0x100 );
@@ -385,9 +386,17 @@ static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
385
386
/* Enable normal output to PHY */
386
387
dw_hdmi_top_write (dw_hdmi , HDMITX_TOP_BIST_CNTL , BIT (12 ));
387
388
388
- /* TMDS pattern setup (TOFIX pattern for 4k2k scrambling) */
389
- dw_hdmi_top_write (dw_hdmi , HDMITX_TOP_TMDS_CLK_PTTN_01 , 0x001f001f );
390
- dw_hdmi_top_write (dw_hdmi , HDMITX_TOP_TMDS_CLK_PTTN_23 , 0x001f001f );
389
+ /* TMDS pattern setup (TOFIX Handle the YUV420 case) */
390
+ if (mode -> clock > 340000 ) {
391
+ dw_hdmi_top_write (dw_hdmi , HDMITX_TOP_TMDS_CLK_PTTN_01 , 0 );
392
+ dw_hdmi_top_write (dw_hdmi , HDMITX_TOP_TMDS_CLK_PTTN_23 ,
393
+ 0x03ff03ff );
394
+ } else {
395
+ dw_hdmi_top_write (dw_hdmi , HDMITX_TOP_TMDS_CLK_PTTN_01 ,
396
+ 0x001f001f );
397
+ dw_hdmi_top_write (dw_hdmi , HDMITX_TOP_TMDS_CLK_PTTN_23 ,
398
+ 0x001f001f );
399
+ }
391
400
392
401
/* Load TMDS pattern */
393
402
dw_hdmi_top_write (dw_hdmi , HDMITX_TOP_TMDS_CLK_PTTN_CNTL , 0x1 );
@@ -413,6 +422,8 @@ static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
413
422
/* Disable clock, fifo, fifo_wr */
414
423
regmap_update_bits (priv -> hhi , HHI_HDMI_PHY_CNTL1 , 0xf , 0 );
415
424
425
+ dw_hdmi_set_high_tmds_clock_ratio (hdmi );
426
+
416
427
msleep (100 );
417
428
418
429
/* Reset PHY 3 times in a row */
@@ -557,6 +568,10 @@ dw_hdmi_mode_valid(struct drm_connector *connector,
557
568
558
569
DRM_DEBUG_DRIVER ("Modeline " DRM_MODE_FMT "\n" , DRM_MODE_ARG (mode ));
559
570
571
+ /* If sink max TMDS clock, we reject the mode */
572
+ if (mode -> clock > connector -> display_info .max_tmds_clock )
573
+ return MODE_BAD ;
574
+
560
575
/* Check against non-VIC supported modes */
561
576
if (!vic ) {
562
577
status = meson_venc_hdmi_supported_mode (mode );
0 commit comments