drm/bridge: analogix_dp: Fix incorrect operations with register ANALOGIX_DP_FUNC_EN_1
authorzain wang <wzz@rock-chips.com>
Mon, 23 Apr 2018 10:49:52 +0000 (12:49 +0200)
committerAndrzej Hajda <a.hajda@samsung.com>
Tue, 24 Apr 2018 06:34:43 +0000 (08:34 +0200)
Register ANALOGIX_DP_FUNC_EN_1(offset 0x18), Rockchip is different to
Exynos:

on Exynos edp phy,
BIT 7 MASTER_VID_FUNC_EN_N
BIT 6 reserved
BIT 5 SLAVE_VID_FUNC_EN_N

on Rockchip edp phy,
BIT 7 reserved
BIT 6 RK_VID_CAP_FUNC_EN_N
BIT 5 RK_VID_FIFO_FUNC_EN_N

So, we should do some private operations to Rockchip.

Cc: Tomasz Figa <tfiga@chromium.org>
Signed-off-by: zain wang <wzz@rock-chips.com>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Thierry Escande <thierry.escande@collabora.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180423105003.9004-17-enric.balletbo@collabora.com
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h

index 02ab1aaa99933a94c4bbaeb9445c70bf87632632..4eae206ec31b9d958f4c3377b3980b974cedac62 100644 (file)
@@ -126,9 +126,14 @@ void analogix_dp_reset(struct analogix_dp_device *dp)
        analogix_dp_stop_video(dp);
        analogix_dp_enable_video_mute(dp, 0);
 
-       reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
-               AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
-               HDCP_FUNC_EN_N | SW_FUNC_EN_N;
+       if (dp->plat_data && is_rockchip(dp->plat_data->dev_type))
+               reg = RK_VID_CAP_FUNC_EN_N | RK_VID_FIFO_FUNC_EN_N |
+                       SW_FUNC_EN_N;
+       else
+               reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
+                       AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
+                       HDCP_FUNC_EN_N | SW_FUNC_EN_N;
+
        writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
 
        reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N |
@@ -971,8 +976,12 @@ void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp)
        u32 reg;
 
        reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
-       reg &= ~(MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N);
-       reg |= MASTER_VID_FUNC_EN_N;
+       if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
+               reg &= ~(RK_VID_CAP_FUNC_EN_N | RK_VID_FIFO_FUNC_EN_N);
+       } else {
+               reg &= ~(MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N);
+               reg |= MASTER_VID_FUNC_EN_N;
+       }
        writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
 
        reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
index b633a4a5082a2c74e74710e735edff60ff123076..0cf27c731727d626b99cf8dd1e8802c8e71bc1f7 100644 (file)
 
 /* ANALOGIX_DP_FUNC_EN_1 */
 #define MASTER_VID_FUNC_EN_N                   (0x1 << 7)
+#define RK_VID_CAP_FUNC_EN_N                   (0x1 << 6)
 #define SLAVE_VID_FUNC_EN_N                    (0x1 << 5)
+#define RK_VID_FIFO_FUNC_EN_N                  (0x1 << 5)
 #define AUD_FIFO_FUNC_EN_N                     (0x1 << 4)
 #define AUD_FUNC_EN_N                          (0x1 << 3)
 #define HDCP_FUNC_EN_N                         (0x1 << 2)