diff options
Diffstat (limited to 'drivers/gpu/drm/msm/dsi/dsi_host.c')
-rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi_host.c | 24 |
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 @@ | |||
33 | static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor) | 33 | static 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; |