2222#include <linux/module.h>
2323#include <linux/mutex.h>
2424#include <linux/of_device.h>
25+ #include <linux/regmap.h>
2526
2627#include <drm/drm_of.h>
2728#include <drm/drmP.h>
@@ -71,6 +72,7 @@ struct inno_hdmi {
7172 struct clk * aclk ;
7273 struct clk * pclk ;
7374 void __iomem * regs ;
75+ struct regmap * regmap ;
7476
7577 struct drm_connector connector ;
7678 struct drm_encoder encoder ;
@@ -451,6 +453,11 @@ static int inno_hdmi_config_video_timing(struct inno_hdmi *hdmi,
451453{
452454 int value ;
453455
456+ value = BIT (20 ) | BIT (21 );
457+ value |= mode -> flags & DRM_MODE_FLAG_PHSYNC ? BIT (4 ) : 0 ;
458+ value |= mode -> flags & DRM_MODE_FLAG_PVSYNC ? BIT (5 ) : 0 ;
459+ regmap_write (hdmi -> regmap , 0x148 , value );
460+
454461 /* Set detail external video timing polarity and interlace mode */
455462 value = v_EXTERANL_VIDEO (1 );
456463 value |= mode -> flags & DRM_MODE_FLAG_PHSYNC ?
@@ -470,7 +477,7 @@ static int inno_hdmi_config_video_timing(struct inno_hdmi *hdmi,
470477 hdmi_writeb (hdmi , HDMI_VIDEO_EXT_HBLANK_L , value & 0xFF );
471478 hdmi_writeb (hdmi , HDMI_VIDEO_EXT_HBLANK_H , (value >> 8 ) & 0xFF );
472479
473- value = mode -> hsync_start - mode -> hdisplay ;
480+ value = mode -> htotal - mode -> hsync_start ;
474481 hdmi_writeb (hdmi , HDMI_VIDEO_EXT_HDELAY_L , value & 0xFF );
475482 hdmi_writeb (hdmi , HDMI_VIDEO_EXT_HDELAY_H , (value >> 8 ) & 0xFF );
476483
@@ -485,7 +492,7 @@ static int inno_hdmi_config_video_timing(struct inno_hdmi *hdmi,
485492 value = mode -> vtotal - mode -> vdisplay ;
486493 hdmi_writeb (hdmi , HDMI_VIDEO_EXT_VBLANK , value & 0xFF );
487494
488- value = mode -> vsync_start - mode -> vdisplay ;
495+ value = mode -> vtotal - mode -> vsync_start ;
489496 hdmi_writeb (hdmi , HDMI_VIDEO_EXT_VDELAY , value & 0xFF );
490497
491498 value = mode -> vsync_end - mode -> vsync_start ;
@@ -1111,6 +1118,15 @@ static int inno_hdmi_bind(struct device *dev, struct device *master,
11111118 goto err_disable_aclk ;
11121119 }
11131120
1121+ hdmi -> regmap =
1122+ syscon_regmap_lookup_by_phandle (hdmi -> dev -> of_node ,
1123+ "rockchip,grf" );
1124+ if (IS_ERR (hdmi -> regmap )) {
1125+ dev_err (hdmi -> dev , "Unable to get rockchip,grf\n" );
1126+ ret = PTR_ERR (hdmi -> regmap );
1127+ goto err_disable_aclk ;
1128+ }
1129+
11141130 inno_hdmi_reset (hdmi );
11151131
11161132 hdmi -> ddc = inno_hdmi_i2c_adapter (hdmi );
0 commit comments