Skip to content
This repository was archived by the owner on Oct 5, 2018. It is now read-only.

Commit 7bfade6

Browse files
committed
Merge pull request #8 from ldts/hikey
gpu/drm: hisilicon patchset addressing display issues
2 parents 8bc8cde + f7754a0 commit 7bfade6

File tree

11 files changed

+1094
-99
lines changed

11 files changed

+1094
-99
lines changed

arch/arm64/boot/dts/hi6220.dtsi

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -675,45 +675,15 @@
675675
pinctrl-1 = <&I2C2_SCL_pmx_idle &I2C2_SDA_pmx_idle &I2C2_SCL_cfg_idle &I2C2_SDA_cfg_idle>;
676676
status = "ok";
677677

678-
/*
679678
adv7533: adv7533@39 {
680-
compatible = "adi,adv7511";
679+
compatible = "adi,adv7533";
681680
reg = <0x39>;
682681
interrupt-parent = <&gpio1>;
683682
interrupts = <1 2>;
684-
685-
gpio_pd = <&gpio0 4 0>;
683+
pd-gpio = <&gpio0 4 0>;
686684
adi,input-depth = <8>;
687685
adi,input-colorspace = "rgb";
688-
adi,input-clock = "1x";
689-
adi,input-style = <1>;
690-
adi,input-justification = "evenly";
691-
};
692-
*/
693-
694-
packet: adv7533@70 {
695-
compatible = "adv7533,packet";
696-
reg = <0x38>;
697-
};
698-
main: adv7533@7a {
699-
compatible = "adv7533,main";
700-
reg = <0x39>;
701-
has-regulator;
702-
hdmi_vdd-supply = <&ldo15>;
703-
hdmi_v1p2-supply = <&ldo22>;
704-
gpio_int = <&gpio1 1 0>;
705-
gpio_pd = <&gpio0 4 0>;
706-
gpio_dsi_sel = <&gpio0 1 0>;
707686
};
708-
cec_dsi: adv7533@78 {
709-
compatible = "adv7533,cec_dsi";
710-
reg = <0x3c>;
711-
};
712-
edid: adv7533@7e {
713-
compatible = "adv7533,edid";
714-
reg = <0x3f>;
715-
};
716-
717687
};
718688

719689
display-subsystem {
@@ -752,10 +722,8 @@
752722
reg = <0x0 0xf4107800 0x0 0x100>;
753723
clocks = <&clock_media HI6220_DSI_PCLK>;
754724
clock-names = "pclk_dsi";
755-
dsi_bit_clk_rate = <640>;
756725
vc = <0>;
757-
//encoder-slave = <&adv7533>;
758-
726+
encoder-slave = <&adv7533>;
759727
};
760728
};
761729

arch/arm64/configs/defconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,9 @@ CONFIG_REGULATOR_HI6220=y
263263
CONFIG_MEDIA_SUPPORT=y
264264
CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
265265
# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
266-
CONFIG_VIDEO_ADV7533=y
267266
CONFIG_DRM=y
268267
CONFIG_DRM_HISI=y
268+
CONFIG_DRM_I2C_ADV7533=y
269269
CONFIG_FB_ARMCLCD=y
270270
CONFIG_FRAMEBUFFER_CONSOLE=y
271271
CONFIG_LOGO=y

drivers/gpu/drm/drm_edid.c

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,9 +1125,9 @@ EXPORT_SYMBOL(drm_edid_is_valid);
11251125
* Return: 0 on success or -1 on failure.
11261126
*/
11271127
static int
1128-
drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf,
1129-
int block, int len)
1128+
drm_do_probe_ddc_edid(void *data, u8 *buf, unsigned int block, size_t len)
11301129
{
1130+
struct i2c_adapter *adapter = data;
11311131
unsigned char start = block * EDID_LENGTH;
11321132
unsigned char segment = block >> 1;
11331133
unsigned char xfers = segment ? 3 : 2;
@@ -1184,8 +1184,26 @@ static bool drm_edid_is_zero(u8 *in_edid, int length)
11841184
return true;
11851185
}
11861186

1187-
static u8 *
1188-
drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
1187+
/**
1188+
* drm_do_get_edid - get EDID data using a custom EDID block read function
1189+
* @connector: connector we're probing
1190+
* @get_edid_block: EDID block read function
1191+
* @data: private data passed to the block read function
1192+
*
1193+
* When the I2C adapter connected to the DDC bus is hidden behind a device that
1194+
* exposes a different interface to read EDID blocks this function can be used
1195+
* to get EDID data using a custom block read function.
1196+
*
1197+
* As in the general case the DDC bus is accessible by the kernel at the I2C
1198+
* level, drivers must make all reasonable efforts to expose it as an I2C
1199+
* adapter and use drm_get_edid() instead of abusing this function.
1200+
*
1201+
* Return: Pointer to valid EDID or NULL if we couldn't find any.
1202+
*/
1203+
struct edid *drm_do_get_edid(struct drm_connector *connector,
1204+
int (*get_edid_block)(void *data, u8 *buf, unsigned int block,
1205+
size_t len),
1206+
void *data)
11891207
{
11901208
int i, j = 0, valid_extensions = 0;
11911209
u8 *block, *new;
@@ -1196,7 +1214,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
11961214

11971215
/* base block fetch */
11981216
for (i = 0; i < 4; i++) {
1199-
if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH))
1217+
if (get_edid_block(data, block, 0, EDID_LENGTH))
12001218
goto out;
12011219
if (drm_edid_block_valid(block, 0, print_bad_edid))
12021220
break;
@@ -1210,7 +1228,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
12101228

12111229
/* if there's no extensions, we're done */
12121230
if (block[0x7e] == 0)
1213-
return block;
1231+
return (struct edid *)block;
12141232

12151233
new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL);
12161234
if (!new)
@@ -1219,7 +1237,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
12191237

12201238
for (j = 1; j <= block[0x7e]; j++) {
12211239
for (i = 0; i < 4; i++) {
1222-
if (drm_do_probe_ddc_edid(adapter,
1240+
if (get_edid_block(data,
12231241
block + (valid_extensions + 1) * EDID_LENGTH,
12241242
j, EDID_LENGTH))
12251243
goto out;
@@ -1247,7 +1265,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
12471265
block = new;
12481266
}
12491267

1250-
return block;
1268+
return (struct edid *)block;
12511269

12521270
carp:
12531271
if (print_bad_edid) {
@@ -1260,6 +1278,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
12601278
kfree(block);
12611279
return NULL;
12621280
}
1281+
EXPORT_SYMBOL_GPL(drm_do_get_edid);
12631282

12641283
/**
12651284
* drm_probe_ddc() - probe DDC presence
@@ -1289,12 +1308,10 @@ EXPORT_SYMBOL(drm_probe_ddc);
12891308
struct edid *drm_get_edid(struct drm_connector *connector,
12901309
struct i2c_adapter *adapter)
12911310
{
1292-
struct edid *edid = NULL;
1293-
1294-
if (drm_probe_ddc(adapter))
1295-
edid = (struct edid *)drm_do_get_edid(connector, adapter);
1311+
if (!drm_probe_ddc(adapter))
1312+
return NULL;
12961313

1297-
return edid;
1314+
return drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter);
12981315
}
12991316
EXPORT_SYMBOL(drm_get_edid);
13001317

drivers/gpu/drm/hisilicon/hisi_drm_ade.c

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ struct hisi_drm_ade_crtc {
101101
u32 ade_core_rate;
102102
u32 media_noc_rate;
103103
u32 x , y;
104+
bool first_time;
104105

105106
struct drm_device *drm_dev;
106107
struct drm_crtc crtc;
@@ -340,35 +341,50 @@ static int hisi_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
340341
stride, (u32)obj->paddr, display_addr,
341342
fb->width, fb_hight);
342343

343-
/* TOP */
344-
writel(0, (ade_base + ADE_WDMA2_SRC_CFG_REG));
345-
writel(0, (ade_base + ADE_SCL3_MUX_CFG_REG));
346-
writel(0, (ade_base + ADE_SCL1_MUX_CFG_REG));
347-
writel(0, (ade_base + ADE_ROT_SRC_CFG_REG));
348-
writel(0, (ade_base + ADE_SCL2_SRC_CFG_REG));
349-
writel(0, (ade_base + ADE_SEC_OVLY_SRC_CFG_REG));
350-
writel(0, (ade_base + ADE_WDMA3_SRC_CFG_REG));
351-
writel(0, (ade_base + ADE_OVLY1_TRANS_CFG_REG));
352-
writel(0, (ade_base + ADE_CTRAN5_TRANS_CFG_REG));
353-
writel(0, (ade_base + ADE_OVLY_CTL_REG));
354-
355-
writel(0, (ade_base + ADE_SOFT_RST_SEL0_REG));
356-
writel(0, (ade_base + ADE_SOFT_RST_SEL1_REG));
357-
set_TOP_SOFT_RST_SEL0_disp_rdma(ade_base, 1);
358-
set_TOP_SOFT_RST_SEL0_ctran5(ade_base, 1);
359-
set_TOP_SOFT_RST_SEL0_ctran6(ade_base, 1);
360-
361-
writel(0, (ade_base + ADE_RELOAD_DIS0_REG));
362-
writel(0, (ade_base + ADE_RELOAD_DIS1_REG));
363-
364-
writel(TOP_DISP_CH_SRC_RDMA, (ade_base + ADE_DISP_SRC_CFG_REG));
344+
if (crtc_ade->first_time) {
345+
crtc_ade->first_time = false;
346+
/* TOP */
347+
writel(0, (ade_base + ADE_WDMA2_SRC_CFG_REG));
348+
writel(0, (ade_base + ADE_SCL3_MUX_CFG_REG));
349+
writel(0, (ade_base + ADE_SCL1_MUX_CFG_REG));
350+
writel(0, (ade_base + ADE_ROT_SRC_CFG_REG));
351+
writel(0, (ade_base + ADE_SCL2_SRC_CFG_REG));
352+
writel(0, (ade_base + ADE_SEC_OVLY_SRC_CFG_REG));
353+
writel(0, (ade_base + ADE_WDMA3_SRC_CFG_REG));
354+
writel(0, (ade_base + ADE_OVLY1_TRANS_CFG_REG));
355+
writel(0, (ade_base + ADE_CTRAN5_TRANS_CFG_REG));
356+
writel(0, (ade_base + ADE_OVLY_CTL_REG));
357+
358+
writel(0, (ade_base + ADE_SOFT_RST_SEL0_REG));
359+
writel(0, (ade_base + ADE_SOFT_RST_SEL1_REG));
360+
set_TOP_SOFT_RST_SEL0_disp_rdma(ade_base, 1);
361+
set_TOP_SOFT_RST_SEL0_ctran5(ade_base, 1);
362+
set_TOP_SOFT_RST_SEL0_ctran6(ade_base, 1);
363+
364+
writel(0, (ade_base + ADE_RELOAD_DIS0_REG));
365+
writel(0, (ade_base + ADE_RELOAD_DIS1_REG));
366+
367+
writel(TOP_DISP_CH_SRC_RDMA, (ade_base + ADE_DISP_SRC_CFG_REG));
368+
369+
/* ctran5 */
370+
writel(1, (ade_base + ADE_CTRAN5_DIS_REG));
371+
writel(fb->width * fb_hight - 1,
372+
(ade_base + ADE_CTRAN5_IMAGE_SIZE_REG));
373+
writel(1, (ade_base + ADE_CTRAN5_CFG_OK_REG));
374+
375+
/* ctran6 */
376+
writel(1, (ade_base + ADE_CTRAN6_DIS_REG));
377+
writel(fb->width * fb_hight - 1,
378+
(ade_base + ADE_CTRAN6_IMAGE_SIZE_REG));
379+
writel(1, (ade_base + ADE_CTRAN6_CFG_OK_REG));
380+
}
365381

366382
/* DISP DMA */
367383
if (16 == fb->bits_per_pixel)
368384
writel((ADE_RGB_565 << 16) & 0x1f0000,
369385
(ade_base + RD_CH_DISP_CTRL_REG));
370386
else if (32 == fb->bits_per_pixel)
371-
writel((ADE_ARGB_8888 << 16) & 0x1f0000,
387+
writel((ADE_ABGR_8888 << 16) & 0x1f0000,
372388
(ade_base + RD_CH_DISP_CTRL_REG));
373389

374390
writel(display_addr, (ade_base + RD_CH_DISP_ADDR_REG));
@@ -377,18 +393,6 @@ static int hisi_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
377393
writel(fb_hight * stride, (ade_base + RD_CH_DISP_SPACE_REG));
378394
writel(1, (ade_base + RD_CH_DISP_EN_REG));
379395

380-
/* ctran5 */
381-
writel(1, (ade_base + ADE_CTRAN5_DIS_REG));
382-
writel(fb->width * fb_hight - 1,
383-
(ade_base + ADE_CTRAN5_IMAGE_SIZE_REG));
384-
writel(1, (ade_base + ADE_CTRAN5_CFG_OK_REG));
385-
386-
/* ctran6 */
387-
writel(1, (ade_base + ADE_CTRAN6_DIS_REG));
388-
writel(fb->width * fb_hight - 1,
389-
(ade_base + ADE_CTRAN6_IMAGE_SIZE_REG));
390-
writel(1, (ade_base + ADE_CTRAN6_CFG_OK_REG));
391-
392396
writel(1, (ade_base + ADE_EN_REG));
393397
set_TOP_CTL_frm_end_start(ade_base, 1);
394398
set_LDI_CTRL_ldi_en(ade_base, ADE_ENABLE);
@@ -442,6 +446,7 @@ static int hisi_drm_crtc_create(struct hisi_drm_ade_crtc *crtc_ade)
442446
int ret;
443447

444448
crtc_ade->dpms = DRM_MODE_DPMS_OFF;
449+
crtc_ade->first_time = true;
445450

446451
ret = drm_crtc_init(crtc_ade->drm_dev, crtc, &crtc_funcs);
447452
if (ret < 0)

0 commit comments

Comments
 (0)