aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm/dsi/dsi_host.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/msm/dsi/dsi_host.c')
-rw-r--r--drivers/gpu/drm/msm/dsi/dsi_host.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
index aec97c8e5ac4..7a365df91c53 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -33,17 +33,24 @@
33static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor) 33static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor)
34{ 34{
35 u32 ver; 35 u32 ver;
36 u32 ver_6g;
37 36
38 if (!major || !minor) 37 if (!major || !minor)
39 return -EINVAL; 38 return -EINVAL;
40 39
41 /* From DSI6G(v3), addition of a 6G_HW_VERSION register at offset 0 40 /*
41 * From DSI6G(v3), addition of a 6G_HW_VERSION register at offset 0
42 * makes all other registers 4-byte shifted down. 42 * makes all other registers 4-byte shifted down.
43 *
44 * In order to identify between DSI6G(v3) and beyond, and DSIv2 and
45 * older, we read the DSI_VERSION register without any shift(offset
46 * 0x1f0). In the case of DSIv2, this hast to be a non-zero value. In
47 * the case of DSI6G, this has to be zero (the offset points to a
48 * scratch register which we never touch)
43 */ 49 */
44 ver_6g = msm_readl(base + REG_DSI_6G_HW_VERSION); 50
45 if (ver_6g == 0) { 51 ver = msm_readl(base + REG_DSI_VERSION);
46 ver = msm_readl(base + REG_DSI_VERSION); 52 if (ver) {
53 /* older dsi host, there is no register shift */
47 ver = FIELD(ver, DSI_VERSION_MAJOR); 54 ver = FIELD(ver, DSI_VERSION_MAJOR);
48 if (ver <= MSM_DSI_VER_MAJOR_V2) { 55 if (ver <= MSM_DSI_VER_MAJOR_V2) {
49 /* old versions */ 56 /* old versions */
@@ -54,12 +61,17 @@ static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor)
54 return -EINVAL; 61 return -EINVAL;
55 } 62 }
56 } else { 63 } else {
64 /*
65 * newer host, offset 0 has 6G_HW_VERSION, the rest of the
66 * registers are shifted down, read DSI_VERSION again with
67 * the shifted offset
68 */
57 ver = msm_readl(base + DSI_6G_REG_SHIFT + REG_DSI_VERSION); 69 ver = msm_readl(base + DSI_6G_REG_SHIFT + REG_DSI_VERSION);
58 ver = FIELD(ver, DSI_VERSION_MAJOR); 70 ver = FIELD(ver, DSI_VERSION_MAJOR);
59 if (ver == MSM_DSI_VER_MAJOR_6G) { 71 if (ver == MSM_DSI_VER_MAJOR_6G) {
60 /* 6G version */ 72 /* 6G version */
61 *major = ver; 73 *major = ver;
62 *minor = ver_6g; 74 *minor = msm_readl(base + REG_DSI_6G_HW_VERSION);
63 return 0; 75 return 0;
64 } else { 76 } else {
65 return -EINVAL; 77 return -EINVAL;