aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArchit Taneja <architt@codeaurora.org>2018-01-17 01:05:25 -0500
committerRob Clark <robdclark@gmail.com>2018-02-20 10:41:20 -0500
commit973e02db35c2c4036693e32ed6f250eefd8c322c (patch)
tree87b487f88a958d527ac69e4e8d724dce0dfc28de
parent6d5796af7136046835621ffe680eb15ce88500b6 (diff)
drm/msm/dsi: Add skeleton 10nm PHY/PLL code
Add new 10nm DSI PLL/PHY files that will be used on SDM845. Just populate empty pll/phy funcs for now. These will be filled up later. Signed-off-by: Archit Taneja <architt@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r--drivers/gpu/drm/msm/Kconfig7
-rw-r--r--drivers/gpu/drm/msm/Makefile2
-rw-r--r--drivers/gpu/drm/msm/dsi/dsi.h1
-rw-r--r--drivers/gpu/drm/msm/dsi/phy/dsi_phy.c4
-rw-r--r--drivers/gpu/drm/msm/dsi/phy/dsi_phy.h1
-rw-r--r--drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c52
-rw-r--r--drivers/gpu/drm/msm/dsi/pll/dsi_pll.c3
-rw-r--r--drivers/gpu/drm/msm/dsi/pll/dsi_pll.h9
-rw-r--r--drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c176
9 files changed, 255 insertions, 0 deletions
diff --git a/drivers/gpu/drm/msm/Kconfig b/drivers/gpu/drm/msm/Kconfig
index 3065cb290aa8..38cbde971b48 100644
--- a/drivers/gpu/drm/msm/Kconfig
+++ b/drivers/gpu/drm/msm/Kconfig
@@ -94,3 +94,10 @@ config DRM_MSM_DSI_14NM_PHY
94 default y 94 default y
95 help 95 help
96 Choose this option if DSI PHY on 8996 is used on the platform. 96 Choose this option if DSI PHY on 8996 is used on the platform.
97
98config DRM_MSM_DSI_10NM_PHY
99 bool "Enable DSI 10nm PHY driver in MSM DRM (used by SDM845)"
100 depends on DRM_MSM_DSI
101 default y
102 help
103 Choose this option if DSI PHY on SDM845 is used on the platform.
diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index ebe0c3d0b126..f74d449476f4 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -83,12 +83,14 @@ msm-$(CONFIG_DRM_MSM_DSI_28NM_PHY) += dsi/phy/dsi_phy_28nm.o
83msm-$(CONFIG_DRM_MSM_DSI_20NM_PHY) += dsi/phy/dsi_phy_20nm.o 83msm-$(CONFIG_DRM_MSM_DSI_20NM_PHY) += dsi/phy/dsi_phy_20nm.o
84msm-$(CONFIG_DRM_MSM_DSI_28NM_8960_PHY) += dsi/phy/dsi_phy_28nm_8960.o 84msm-$(CONFIG_DRM_MSM_DSI_28NM_8960_PHY) += dsi/phy/dsi_phy_28nm_8960.o
85msm-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/phy/dsi_phy_14nm.o 85msm-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/phy/dsi_phy_14nm.o
86msm-$(CONFIG_DRM_MSM_DSI_10NM_PHY) += dsi/phy/dsi_phy_10nm.o
86 87
87ifeq ($(CONFIG_DRM_MSM_DSI_PLL),y) 88ifeq ($(CONFIG_DRM_MSM_DSI_PLL),y)
88msm-y += dsi/pll/dsi_pll.o 89msm-y += dsi/pll/dsi_pll.o
89msm-$(CONFIG_DRM_MSM_DSI_28NM_PHY) += dsi/pll/dsi_pll_28nm.o 90msm-$(CONFIG_DRM_MSM_DSI_28NM_PHY) += dsi/pll/dsi_pll_28nm.o
90msm-$(CONFIG_DRM_MSM_DSI_28NM_8960_PHY) += dsi/pll/dsi_pll_28nm_8960.o 91msm-$(CONFIG_DRM_MSM_DSI_28NM_8960_PHY) += dsi/pll/dsi_pll_28nm_8960.o
91msm-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/pll/dsi_pll_14nm.o 92msm-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/pll/dsi_pll_14nm.o
93msm-$(CONFIG_DRM_MSM_DSI_10NM_PHY) += dsi/pll/dsi_pll_10nm.o
92endif 94endif
93 95
94obj-$(CONFIG_DRM_MSM) += msm.o 96obj-$(CONFIG_DRM_MSM) += msm.o
diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h
index 2302046197a8..70d9a9a47acd 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.h
+++ b/drivers/gpu/drm/msm/dsi/dsi.h
@@ -36,6 +36,7 @@ enum msm_dsi_phy_type {
36 MSM_DSI_PHY_20NM, 36 MSM_DSI_PHY_20NM,
37 MSM_DSI_PHY_28NM_8960, 37 MSM_DSI_PHY_28NM_8960,
38 MSM_DSI_PHY_14NM, 38 MSM_DSI_PHY_14NM,
39 MSM_DSI_PHY_10NM,
39 MSM_DSI_PHY_MAX 40 MSM_DSI_PHY_MAX
40}; 41};
41 42
diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
index c8bfaa780651..8e9d5c255820 100644
--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
+++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
@@ -395,6 +395,10 @@ static const struct of_device_id dsi_phy_dt_match[] = {
395 { .compatible = "qcom,dsi-phy-14nm", 395 { .compatible = "qcom,dsi-phy-14nm",
396 .data = &dsi_phy_14nm_cfgs }, 396 .data = &dsi_phy_14nm_cfgs },
397#endif 397#endif
398#ifdef CONFIG_DRM_MSM_DSI_10NM_PHY
399 { .compatible = "qcom,dsi-phy-10nm",
400 .data = &dsi_phy_10nm_cfgs },
401#endif
398 {} 402 {}
399}; 403};
400 404
diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h
index 1733f6608a09..c56268cbdb3d 100644
--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h
+++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h
@@ -48,6 +48,7 @@ extern const struct msm_dsi_phy_cfg dsi_phy_28nm_lp_cfgs;
48extern const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs; 48extern const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs;
49extern const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs; 49extern const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs;
50extern const struct msm_dsi_phy_cfg dsi_phy_14nm_cfgs; 50extern const struct msm_dsi_phy_cfg dsi_phy_14nm_cfgs;
51extern const struct msm_dsi_phy_cfg dsi_phy_10nm_cfgs;
51 52
52struct msm_dsi_dphy_timing { 53struct msm_dsi_dphy_timing {
53 u32 clk_pre; 54 u32 clk_pre;
diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
new file mode 100644
index 000000000000..b7545fb63bf5
--- /dev/null
+++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
@@ -0,0 +1,52 @@
1/*
2 * SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2018, The Linux Foundation
4 */
5
6#include <linux/iopoll.h>
7
8#include "dsi_phy.h"
9#include "dsi.xml.h"
10
11static int dsi_10nm_phy_enable(struct msm_dsi_phy *phy, int src_pll_id,
12 struct msm_dsi_phy_clk_request *clk_req)
13{
14 return 0;
15}
16
17static void dsi_10nm_phy_disable(struct msm_dsi_phy *phy)
18{
19}
20
21static int dsi_10nm_phy_init(struct msm_dsi_phy *phy)
22{
23 struct platform_device *pdev = phy->pdev;
24
25 phy->lane_base = msm_ioremap(pdev, "dsi_phy_lane",
26 "DSI_PHY_LANE");
27 if (IS_ERR(phy->lane_base)) {
28 dev_err(&pdev->dev, "%s: failed to map phy lane base\n",
29 __func__);
30 return -ENOMEM;
31 }
32
33 return 0;
34}
35
36const struct msm_dsi_phy_cfg dsi_phy_10nm_cfgs = {
37 .type = MSM_DSI_PHY_10NM,
38 .src_pll_truthtable = { {false, false}, {true, false} },
39 .reg_cfg = {
40 .num = 1,
41 .regs = {
42 {"vdds", 36000, 32},
43 },
44 },
45 .ops = {
46 .enable = dsi_10nm_phy_enable,
47 .disable = dsi_10nm_phy_disable,
48 .init = dsi_10nm_phy_init,
49 },
50 .io_start = { 0xae94400, 0xae96400 },
51 .num_dsi_phy = 2,
52};
diff --git a/drivers/gpu/drm/msm/dsi/pll/dsi_pll.c b/drivers/gpu/drm/msm/dsi/pll/dsi_pll.c
index 491f08dce969..613e206fa4fc 100644
--- a/drivers/gpu/drm/msm/dsi/pll/dsi_pll.c
+++ b/drivers/gpu/drm/msm/dsi/pll/dsi_pll.c
@@ -166,6 +166,9 @@ struct msm_dsi_pll *msm_dsi_pll_init(struct platform_device *pdev,
166 case MSM_DSI_PHY_14NM: 166 case MSM_DSI_PHY_14NM:
167 pll = msm_dsi_pll_14nm_init(pdev, id); 167 pll = msm_dsi_pll_14nm_init(pdev, id);
168 break; 168 break;
169 case MSM_DSI_PHY_10NM:
170 pll = msm_dsi_pll_10nm_init(pdev, id);
171 break;
169 default: 172 default:
170 pll = ERR_PTR(-ENXIO); 173 pll = ERR_PTR(-ENXIO);
171 break; 174 break;
diff --git a/drivers/gpu/drm/msm/dsi/pll/dsi_pll.h b/drivers/gpu/drm/msm/dsi/pll/dsi_pll.h
index f63e7ada74a8..8b32271cbc24 100644
--- a/drivers/gpu/drm/msm/dsi/pll/dsi_pll.h
+++ b/drivers/gpu/drm/msm/dsi/pll/dsi_pll.h
@@ -115,5 +115,14 @@ msm_dsi_pll_14nm_init(struct platform_device *pdev, int id)
115 return ERR_PTR(-ENODEV); 115 return ERR_PTR(-ENODEV);
116} 116}
117#endif 117#endif
118#ifdef CONFIG_DRM_MSM_DSI_10NM_PHY
119struct msm_dsi_pll *msm_dsi_pll_10nm_init(struct platform_device *pdev, int id);
120#else
121static inline struct msm_dsi_pll *
122msm_dsi_pll_10nm_init(struct platform_device *pdev, int id)
123{
124 return ERR_PTR(-ENODEV);
125}
126#endif
118#endif /* __DSI_PLL_H__ */ 127#endif /* __DSI_PLL_H__ */
119 128
diff --git a/drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c b/drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c
new file mode 100644
index 000000000000..34c24442d34b
--- /dev/null
+++ b/drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c
@@ -0,0 +1,176 @@
1/*
2 * SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2018, The Linux Foundation
4 */
5
6#include <linux/clk.h>
7#include <linux/clk-provider.h>
8#include <linux/iopoll.h>
9
10#include "dsi_pll.h"
11#include "dsi.xml.h"
12
13struct dsi_pll_10nm {
14 struct msm_dsi_pll base;
15
16 int id;
17 struct platform_device *pdev;
18
19 void __iomem *phy_cmn_mmio;
20 void __iomem *mmio;
21
22 int vco_delay;
23
24 enum msm_dsi_phy_usecase uc;
25 struct dsi_pll_10nm *slave;
26};
27
28#define to_pll_10nm(x) container_of(x, struct dsi_pll_10nm, base)
29
30/*
31 * Global list of private DSI PLL struct pointers. We need this for Dual DSI
32 * mode, where the master PLL's clk_ops needs access the slave's private data
33 */
34static struct dsi_pll_10nm *pll_10nm_list[DSI_MAX];
35
36static int dsi_pll_10nm_vco_set_rate(struct clk_hw *hw, unsigned long rate,
37 unsigned long parent_rate)
38{
39 struct msm_dsi_pll *pll = hw_clk_to_pll(hw);
40 struct dsi_pll_10nm *pll_10nm = to_pll_10nm(pll);
41
42 DBG("DSI PLL%d rate=%lu, parent's=%lu", pll_10nm->id, rate,
43 parent_rate);
44
45 return 0;
46}
47
48static unsigned long dsi_pll_10nm_vco_recalc_rate(struct clk_hw *hw,
49 unsigned long parent_rate)
50{
51 struct msm_dsi_pll *pll = hw_clk_to_pll(hw);
52 struct dsi_pll_10nm *pll_10nm = to_pll_10nm(pll);
53 u64 vco_rate = 0x0;
54
55 DBG("DSI PLL%d returning vco rate = %lu", pll_10nm->id,
56 (unsigned long)vco_rate);
57
58 return (unsigned long)vco_rate;
59}
60
61static const struct clk_ops clk_ops_dsi_pll_10nm_vco = {
62 .round_rate = msm_dsi_pll_helper_clk_round_rate,
63 .set_rate = dsi_pll_10nm_vco_set_rate,
64 .recalc_rate = dsi_pll_10nm_vco_recalc_rate,
65 .prepare = msm_dsi_pll_helper_clk_prepare,
66 .unprepare = msm_dsi_pll_helper_clk_unprepare,
67};
68
69/*
70 * PLL Callbacks
71 */
72
73static void dsi_pll_10nm_save_state(struct msm_dsi_pll *pll)
74{
75 struct dsi_pll_10nm *pll_10nm = to_pll_10nm(pll);
76
77 DBG("DSI PLL%d", pll_10nm->id);
78}
79
80static int dsi_pll_10nm_restore_state(struct msm_dsi_pll *pll)
81{
82 struct dsi_pll_10nm *pll_10nm = to_pll_10nm(pll);
83
84 DBG("DSI PLL%d", pll_10nm->id);
85
86 return 0;
87}
88
89static int dsi_pll_10nm_set_usecase(struct msm_dsi_pll *pll,
90 enum msm_dsi_phy_usecase uc)
91{
92 struct dsi_pll_10nm *pll_10nm = to_pll_10nm(pll);
93
94 DBG("DSI PLL%d", pll_10nm->id);
95
96 return 0;
97}
98
99static int dsi_pll_10nm_get_provider(struct msm_dsi_pll *pll,
100 struct clk **byte_clk_provider,
101 struct clk **pixel_clk_provider)
102{
103 struct dsi_pll_10nm *pll_10nm = to_pll_10nm(pll);
104
105 DBG("DSI PLL%d", pll_10nm->id);
106
107 if (byte_clk_provider)
108 *byte_clk_provider = NULL;
109 if (pixel_clk_provider)
110 *pixel_clk_provider = NULL;
111
112 return 0;
113}
114
115static void dsi_pll_10nm_destroy(struct msm_dsi_pll *pll)
116{
117 struct dsi_pll_10nm *pll_10nm = to_pll_10nm(pll);
118
119 DBG("DSI PLL%d", pll_10nm->id);
120}
121
122static int pll_10nm_register(struct dsi_pll_10nm *pll_10nm)
123{
124 return 0;
125}
126
127struct msm_dsi_pll *msm_dsi_pll_10nm_init(struct platform_device *pdev, int id)
128{
129 struct dsi_pll_10nm *pll_10nm;
130 struct msm_dsi_pll *pll;
131 int ret;
132
133 if (!pdev)
134 return ERR_PTR(-ENODEV);
135
136 pll_10nm = devm_kzalloc(&pdev->dev, sizeof(*pll_10nm), GFP_KERNEL);
137 if (!pll_10nm)
138 return ERR_PTR(-ENOMEM);
139
140 DBG("DSI PLL%d", id);
141
142 pll_10nm->pdev = pdev;
143 pll_10nm->id = id;
144 pll_10nm_list[id] = pll_10nm;
145
146 pll_10nm->phy_cmn_mmio = msm_ioremap(pdev, "dsi_phy", "DSI_PHY");
147 if (IS_ERR_OR_NULL(pll_10nm->phy_cmn_mmio)) {
148 dev_err(&pdev->dev, "failed to map CMN PHY base\n");
149 return ERR_PTR(-ENOMEM);
150 }
151
152 pll_10nm->mmio = msm_ioremap(pdev, "dsi_pll", "DSI_PLL");
153 if (IS_ERR_OR_NULL(pll_10nm->mmio)) {
154 dev_err(&pdev->dev, "failed to map PLL base\n");
155 return ERR_PTR(-ENOMEM);
156 }
157
158 pll = &pll_10nm->base;
159 pll->min_rate = 1000000000UL;
160 pll->max_rate = 3500000000UL;
161 pll->get_provider = dsi_pll_10nm_get_provider;
162 pll->destroy = dsi_pll_10nm_destroy;
163 pll->save_state = dsi_pll_10nm_save_state;
164 pll->restore_state = dsi_pll_10nm_restore_state;
165 pll->set_usecase = dsi_pll_10nm_set_usecase;
166
167 pll_10nm->vco_delay = 1;
168
169 ret = pll_10nm_register(pll_10nm);
170 if (ret) {
171 dev_err(&pdev->dev, "failed to register PLL: %d\n", ret);
172 return ERR_PTR(ret);
173 }
174
175 return pll;
176}