diff options
author | Archit Taneja <architt@codeaurora.org> | 2018-01-17 01:05:25 -0500 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2018-02-20 10:41:20 -0500 |
commit | 973e02db35c2c4036693e32ed6f250eefd8c322c (patch) | |
tree | 87b487f88a958d527ac69e4e8d724dce0dfc28de | |
parent | 6d5796af7136046835621ffe680eb15ce88500b6 (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/Kconfig | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/Makefile | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/dsi/phy/dsi_phy.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c | 52 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/dsi/pll/dsi_pll.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/dsi/pll/dsi_pll.h | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c | 176 |
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 | |||
98 | config 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 | |||
83 | msm-$(CONFIG_DRM_MSM_DSI_20NM_PHY) += dsi/phy/dsi_phy_20nm.o | 83 | msm-$(CONFIG_DRM_MSM_DSI_20NM_PHY) += dsi/phy/dsi_phy_20nm.o |
84 | msm-$(CONFIG_DRM_MSM_DSI_28NM_8960_PHY) += dsi/phy/dsi_phy_28nm_8960.o | 84 | msm-$(CONFIG_DRM_MSM_DSI_28NM_8960_PHY) += dsi/phy/dsi_phy_28nm_8960.o |
85 | msm-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/phy/dsi_phy_14nm.o | 85 | msm-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/phy/dsi_phy_14nm.o |
86 | msm-$(CONFIG_DRM_MSM_DSI_10NM_PHY) += dsi/phy/dsi_phy_10nm.o | ||
86 | 87 | ||
87 | ifeq ($(CONFIG_DRM_MSM_DSI_PLL),y) | 88 | ifeq ($(CONFIG_DRM_MSM_DSI_PLL),y) |
88 | msm-y += dsi/pll/dsi_pll.o | 89 | msm-y += dsi/pll/dsi_pll.o |
89 | msm-$(CONFIG_DRM_MSM_DSI_28NM_PHY) += dsi/pll/dsi_pll_28nm.o | 90 | msm-$(CONFIG_DRM_MSM_DSI_28NM_PHY) += dsi/pll/dsi_pll_28nm.o |
90 | msm-$(CONFIG_DRM_MSM_DSI_28NM_8960_PHY) += dsi/pll/dsi_pll_28nm_8960.o | 91 | msm-$(CONFIG_DRM_MSM_DSI_28NM_8960_PHY) += dsi/pll/dsi_pll_28nm_8960.o |
91 | msm-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/pll/dsi_pll_14nm.o | 92 | msm-$(CONFIG_DRM_MSM_DSI_14NM_PHY) += dsi/pll/dsi_pll_14nm.o |
93 | msm-$(CONFIG_DRM_MSM_DSI_10NM_PHY) += dsi/pll/dsi_pll_10nm.o | ||
92 | endif | 94 | endif |
93 | 95 | ||
94 | obj-$(CONFIG_DRM_MSM) += msm.o | 96 | obj-$(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; | |||
48 | extern const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs; | 48 | extern const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs; |
49 | extern const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs; | 49 | extern const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs; |
50 | extern const struct msm_dsi_phy_cfg dsi_phy_14nm_cfgs; | 50 | extern const struct msm_dsi_phy_cfg dsi_phy_14nm_cfgs; |
51 | extern const struct msm_dsi_phy_cfg dsi_phy_10nm_cfgs; | ||
51 | 52 | ||
52 | struct msm_dsi_dphy_timing { | 53 | struct 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 | |||
11 | static 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 | |||
17 | static void dsi_10nm_phy_disable(struct msm_dsi_phy *phy) | ||
18 | { | ||
19 | } | ||
20 | |||
21 | static 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 | |||
36 | const 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 | ||
119 | struct msm_dsi_pll *msm_dsi_pll_10nm_init(struct platform_device *pdev, int id); | ||
120 | #else | ||
121 | static inline struct msm_dsi_pll * | ||
122 | msm_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 | |||
13 | struct 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 | */ | ||
34 | static struct dsi_pll_10nm *pll_10nm_list[DSI_MAX]; | ||
35 | |||
36 | static 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 | |||
48 | static 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 | |||
61 | static 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 | |||
73 | static 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 | |||
80 | static 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 | |||
89 | static 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 | |||
99 | static 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 | |||
115 | static 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 | |||
122 | static int pll_10nm_register(struct dsi_pll_10nm *pll_10nm) | ||
123 | { | ||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | struct 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 | } | ||