Skip to content

Commit 8eb559f

Browse files
Zheng Yangrkhuangtao
authored andcommitted
drm/rockchip: inno_hdmi: fix rk3036 video timing
RK3036 use grf register to set HSYNC/VSYNC polarity, and fix hdelay and vdelay setting. Change-Id: I3146a0a146b09f64c1d875642589d0f1dc6f27df Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
1 parent 8149b84 commit 8eb559f

1 file changed

Lines changed: 18 additions & 2 deletions

File tree

drivers/gpu/drm/rockchip/inno_hdmi.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
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

Comments
 (0)