1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
From 11f9765a8e6723bcb7243f6dbc48e6deaf17b097 Mon Sep 17 00:00:00 2001
From: Samuel Holland <samuel@sholland.org>
Date: Sun, 3 Apr 2022 15:15:41 -0500
Subject: [PATCH 008/117] drm/sun4i: sun8i-hdmi-phy: Add support for D1 PHY
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h | 169 +++++++++++++++++++++++++
drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 32 +++++
2 files changed, 201 insertions(+)
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
@@ -145,6 +145,175 @@
#define SUN8I_HDMI_PHY_CEC_REG 0x003c
+#define SUN20I_HDMI_PHY_CTL0_REG 0x0040
+#define SUN20I_HDMI_PHY_CTL0_PLL_LOCK_MODE_MAN BIT(31)
+#define SUN20I_HDMI_PHY_CTL0_PLL_LOCK_MODE BIT(30)
+#define SUN20I_HDMI_PHY_CTL0_FIFO_WORKC_EN BIT(29)
+#define SUN20I_HDMI_PHY_CTL0_FIFO_AUTOSYNC_DIS BIT(28)
+#define SUN20I_HDMI_PHY_CTL0_ENTX GENMASK(27, 24)
+#define SUN20I_HDMI_PHY_CTL0_ENBI GENMASK(23, 20)
+#define SUN20I_HDMI_PHY_CTL0_ENLDO BIT(18)
+#define SUN20I_HDMI_PHY_CTL0_ENLDO_FS BIT(17)
+#define SUN20I_HDMI_PHY_CTL0_ENCK BIT(16)
+#define SUN20I_HDMI_PHY_CTL0_REG_PLR GENMASK(15, 12)
+#define SUN20I_HDMI_PHY_CTL0_REG_DEN GENMASK(11, 8)
+#define SUN20I_HDMI_PHY_CTL0_REG_CSMPS GENMASK(7, 6)
+#define SUN20I_HDMI_PHY_CTL0_REG_CK_TEST_SEL BIT(5)
+#define SUN20I_HDMI_PHY_CTL0_REG_CK_SEL BIT(4)
+#define SUN20I_HDMI_PHY_CTL0_HPD_EN BIT(2)
+#define SUN20I_HDMI_PHY_CTL0_SCL_EN BIT(1)
+#define SUN20I_HDMI_PHY_CTL0_SDA_EN BIT(0)
+
+#define SUN20I_HDMI_PHY_CTL1_REG 0x0044
+#define SUN20I_HDMI_PHY_CTL1_RXSENSE_MODE_MAN BIT(31)
+#define SUN20I_HDMI_PHY_CTL1_RXSENSE_MODE BIT(30)
+#define SUN20I_HDMI_PHY_CTL1_RES_S GENMASK(29, 28)
+#define SUN20I_HDMI_PHY_CTL1_RES_SCKTMDS BIT(27)
+#define SUN20I_HDMI_PHY_CTL1_REG_SWI BIT(26)
+#define SUN20I_HDMI_PHY_CTL1_REG_SVR GENMASK(25, 24)
+#define SUN20I_HDMI_PHY_CTL1_REG_BST2 GENMASK(21, 20)
+#define SUN20I_HDMI_PHY_CTL1_REG_BST1 GENMASK(19, 18)
+#define SUN20I_HDMI_PHY_CTL1_REG_BST0 GENMASK(17, 16)
+#define SUN20I_HDMI_PHY_CTL1_REG_SP2_3 GENMASK(15, 12)
+#define SUN20I_HDMI_PHY_CTL1_REG_SP2_2 GENMASK(11, 8)
+#define SUN20I_HDMI_PHY_CTL1_REG_SP2_1 GENMASK(7, 4)
+#define SUN20I_HDMI_PHY_CTL1_REG_SP2_0 GENMASK(3, 0)
+
+#define SUN20I_HDMI_PHY_CTL2_REG 0x0048
+#define SUN20I_HDMI_PHY_CTL2_HPDO_MODE_MAN BIT(31)
+#define SUN20I_HDMI_PHY_CTL2_HPDO_MODE BIT(30)
+#define SUN20I_HDMI_PHY_CTL2_REG_RESDI GENMASK(29, 24)
+#define SUN20I_HDMI_PHY_CTL2_REG_SP1_3 GENMASK(23, 19)
+#define SUN20I_HDMI_PHY_CTL2_REG_SP1_2 GENMASK(18, 14)
+#define SUN20I_HDMI_PHY_CTL2_REG_SP1_1 GENMASK(13, 9)
+#define SUN20I_HDMI_PHY_CTL2_REG_SP1_0 GENMASK(8, 4)
+#define SUN20I_HDMI_PHY_CTL2_REG_P2OPT GENMASK(3, 0)
+
+#define SUN20I_HDMI_PHY_CTL3_REG 0x004c
+#define SUN20I_HDMI_PHY_CTL3_REG_P2_3 GENMASK(31, 28)
+#define SUN20I_HDMI_PHY_CTL3_REG_P2_2 GENMASK(27, 24)
+#define SUN20I_HDMI_PHY_CTL3_REG_P2_1 GENMASK(23, 20)
+#define SUN20I_HDMI_PHY_CTL3_REG_P2_0 GENMASK(19, 16)
+#define SUN20I_HDMI_PHY_CTL3_REG_MC3 GENMASK(15, 12)
+#define SUN20I_HDMI_PHY_CTL3_REG_MC2 GENMASK(11, 8)
+#define SUN20I_HDMI_PHY_CTL3_REG_MC1 GENMASK(7, 4)
+#define SUN20I_HDMI_PHY_CTL3_REG_MC0 GENMASK(3, 0)
+
+#define SUN20I_HDMI_PHY_CTL4_REG 0x0050
+#define SUN20I_HDMI_PHY_CTL4_REG_SLV GENMASK(31, 29)
+#define SUN20I_HDMI_PHY_CTL4_REG_P1_3 GENMASK(28, 24)
+#define SUN20I_HDMI_PHY_CTL4_REG_P1_2 GENMASK(20, 16)
+#define SUN20I_HDMI_PHY_CTL4_REG_P1_1 GENMASK(12, 8)
+#define SUN20I_HDMI_PHY_CTL4_REG_P1_0 GENMASK(4, 0)
+
+#define SUN20I_HDMI_PHY_CTL5_REG 0x0054
+#define SUN20I_HDMI_PHY_CTL5_REG_P1OPT GENMASK(19, 16)
+#define SUN20I_HDMI_PHY_CTL5_REG_CKPDLYOPT BIT(12)
+#define SUN20I_HDMI_PHY_CTL5_REG_CALSW BIT(11)
+#define SUN20I_HDMI_PHY_CTL5_ENRESCK BIT(10)
+#define SUN20I_HDMI_PHY_CTL5_ENRES BIT(9)
+#define SUN20I_HDMI_PHY_CTL5_ENRCAL BIT(8)
+#define SUN20I_HDMI_PHY_CTL5_ENP2S GENMASK(7, 4)
+#define SUN20I_HDMI_PHY_CTL5_ENIB BIT(1)
+#define SUN20I_HDMI_PHY_CTL5_ENCALOG BIT(0)
+
+#define SUN20I_HDMI_PLL_CTL0_REG 0x0058
+#define SUN20I_HDMI_PLL_CTL0_CKO_SEL GENMASK(31, 30)
+#define SUN20I_HDMI_PLL_CTL0_BYPASS_PPLL BIT(29)
+#define SUN20I_HDMI_PLL_CTL0_ENVBS BIT(28)
+#define SUN20I_HDMI_PLL_CTL0_SLV GENMASK(26, 24)
+#define SUN20I_HDMI_PLL_CTL0_BCR BIT(23)
+#define SUN20I_HDMI_PLL_CTL0_BYPASS_CLRDPTH BIT(22)
+#define SUN20I_HDMI_PLL_CTL0_CLR_DPTH GENMASK(21, 20)
+#define SUN20I_HDMI_PLL_CTL0_CUTFB BIT(18)
+#define SUN20I_HDMI_PLL_CTL0_DIV2_CKBIT BIT(17)
+#define SUN20I_HDMI_PLL_CTL0_DIV2_CKTMDS BIT(16)
+#define SUN20I_HDMI_PLL_CTL0_DIV_PRE GENMASK(15, 12)
+#define SUN20I_HDMI_PLL_CTL0_DIVX1 BIT(10)
+#define SUN20I_HDMI_PLL_CTL0_SDRVEN BIT(9)
+#define SUN20I_HDMI_PLL_CTL0_VCORANGE BIT(8)
+#define SUN20I_HDMI_PLL_CTL0_N_CNTRL GENMASK(7, 6)
+#define SUN20I_HDMI_PLL_CTL0_GMP_CNTRL GENMASK(5, 4)
+#define SUN20I_HDMI_PLL_CTL0_PROP_CNTRL GENMASK(2, 0)
+
+#define SUN20I_HDMI_PLL_CTL1_REG 0x005c
+#define SUN20I_HDMI_PLL_CTL1_CTRL_MODLE_CLKSRC BIT(31)
+#define SUN20I_HDMI_PLL_CTL1_PCNT_N GENMASK(27, 20)
+#define SUN20I_HDMI_PLL_CTL1_PCNT_EN BIT(19)
+#define SUN20I_HDMI_PLL_CTL1_SDM_EN BIT(18)
+#define SUN20I_HDMI_PLL_CTL1_PIXEL_REP GENMASK(17, 16)
+#define SUN20I_HDMI_PLL_CTL1_PWRON BIT(12)
+#define SUN20I_HDMI_PLL_CTL1_RESET BIT(11)
+#define SUN20I_HDMI_PLL_CTL1_SCKREF BIT(10)
+#define SUN20I_HDMI_PLL_CTL1_SCKFB BIT(9)
+#define SUN20I_HDMI_PLL_CTL1_DRV_ANA BIT(8)
+#define SUN20I_HDMI_PLL_CTL1_FAST_TECH BIT(7)
+#define SUN20I_HDMI_PLL_CTL1_GEAR_SHIFT BIT(6)
+#define SUN20I_HDMI_PLL_CTL1_REF_CNTRL GENMASK(5, 4)
+#define SUN20I_HDMI_PLL_CTL1_INT_CNTRL GENMASK(2, 0)
+
+#define SUN20I_HDMI_AFIFO_CFG_REG 0x0060
+#define SUN20I_HDMI_AFIFO_CFG_AFIFO_ERROR BIT(0)
+#define SUN20I_HDMI_AFIFO_CFG_AFIFO_ERROR_DET BIT(1)
+
+#define SUN20I_HDMI_MODULATOR_CFG0_REG 0x0064
+#define SUN20I_HDMI_MODULATOR_CFG1_REG 0x0068
+
+#define SUN20I_HDMI_INDEB_CTRL_REG 0x006c
+#define SUN20I_HDMI_INDEB_CTRL_HPDI_DEBUGMODE BIT(29)
+#define SUN20I_HDMI_INDEB_CTRL_HPDI_DEBUG BIT(28)
+#define SUN20I_HDMI_INDEB_CTRL_SDAI_DEBUGMODE BIT(25)
+#define SUN20I_HDMI_INDEB_CTRL_SDAI_DEBUG BIT(24)
+#define SUN20I_HDMI_INDEB_CTRL_SCLI_DEBUGMODE BIT(21)
+#define SUN20I_HDMI_INDEB_CTRL_SCLI_DEBUG BIT(20)
+#define SUN20I_HDMI_INDEB_CTRL_CECI_DEBUGMODE BIT(17)
+#define SUN20I_HDMI_INDEB_CTRL_CECI_DEBUG BIT(16)
+#define SUN20I_HDMI_INDEB_CTRL_TXDATA_DEBUGMODE GENMASK(1, 0)
+
+#define SUN20I_HDMI_INDBG_TXD0_REG 0x0070
+#define SUN20I_HDMI_INDBG_TXD1_REG 0x0074
+#define SUN20I_HDMI_INDBG_TXD2_REG 0x0078
+#define SUN20I_HDMI_INDBG_TXD3_REG 0x007c
+
+#define SUN20I_HDMI_PLL_STS_REG 0x0080
+#define SUN20I_HDMI_PLL_STS_PHY_CDETPCK_STATUS BIT(31)
+#define SUN20I_HDMI_PLL_STS_PHY_CDETP_STATUS GENMASK(30, 28)
+#define SUN20I_HDMI_PLL_STS_PHY_CDETNCK_STATUS BIT(27)
+#define SUN20I_HDMI_PLL_STS_PHY_CDETN_STATUS GENMASK(26, 24)
+#define SUN20I_HDMI_PLL_STS_PHY_HPDO_STATUS BIT(23)
+#define SUN20I_HDMI_PLL_STS_PHY_SCLO_STATUS BIT(22)
+#define SUN20I_HDMI_PLL_STS_PHY_SDAO_STATUS BIT(21)
+#define SUN20I_HDMI_PLL_STS_PHY_CECO_STATUS BIT(20)
+#define SUN20I_HDMI_PLL_STS_PHY_COUT2D_STATUS BIT(17)
+#define SUN20I_HDMI_PLL_STS_PHY_RCALEND2D_STS BIT(16)
+#define SUN20I_HDMI_PLL_STS_PHY_RESDO2D_STATUS GENMASK(13, 8)
+#define SUN20I_HDMI_PLL_STS_PLL_LOCK_STATUS BIT(4)
+#define SUN20I_HDMI_PLL_STS_RXSENSE_DLY_STATUS BIT(1)
+#define SUN20I_HDMI_PLL_STS_TX_READY_DLY_STATUS BIT(0)
+
+#define SUN20I_HDMI_PRBS_CTL_REG 0x0084
+#define SUN20I_HDMI_PRBS_SEED_GEN_REG 0x0088
+#define SUN20I_HDMI_PRBS_SEED_CHK_REG 0x008c
+#define SUN20I_HDMI_PRBS_SEED_NUM_REG 0x0090
+#define SUN20I_HDMI_PRBS_CYCLE_NUM_REG 0x0094
+
+#define SUN20I_HDMI_PLL_ODLY_REG 0x0098
+#define SUN20I_HDMI_PLL_ODLY_RXSENSE_DLY_RESET BIT(31)
+#define SUN20I_HDMI_PLL_ODLY_RXSENSE_DLY_COUNT GENMASK(30, 16)
+#define SUN20I_HDMI_PLL_ODLY_TX_READY_DLY_RESET BIT(15)
+#define SUN20I_HDMI_PLL_ODLY_TX_READY_DLY_COUNT GENMASK(14, 0)
+
+#define SUN20I_HDMI_PHY_CTL6_REG 0x009c
+#define SUN20I_HDMI_PHY_CTL6_SWITCH_CLKCH_DATA BIT(31)
+#define SUN20I_HDMI_PHY_CTL6_EN_CKDAT BIT(30)
+#define SUN20I_HDMI_PHY_CTL6_CLK_GREATE2_340M GENMASK(29, 20)
+#define SUN20I_HDMI_PHY_CTL6_CLK_GREATE1_340M GENMASK(19, 10)
+#define SUN20I_HDMI_PHY_CTL6_CLK_GREATE0_340M GENMASK(9, 0)
+
+#define SUN20I_HDMI_PHY_CTL7_REG 0x00a0
+#define SUN20I_HDMI_PHY_CTL7_CLK_LOW_340M GENMASK(21, 12)
+#define SUN20I_HDMI_PHY_CTL7_CLK_GREATE3_340M GENMASK(9, 0)
+
struct sun8i_hdmi_phy;
struct sun8i_hdmi_phy_variant {
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
@@ -398,6 +398,28 @@ static const struct dw_hdmi_phy_ops sun8
.setup_hpd = dw_hdmi_phy_setup_hpd,
};
+static int sun20i_d1_hdmi_phy_config(struct dw_hdmi *hdmi, void *data,
+ const struct drm_display_info *display,
+ const struct drm_display_mode *mode)
+{
+ struct sun8i_hdmi_phy *phy = data;
+
+ return 0;
+}
+
+static void sun20i_d1_hdmi_phy_disable(struct dw_hdmi *hdmi, void *data)
+{
+ struct sun8i_hdmi_phy *phy = data;
+}
+
+static const struct dw_hdmi_phy_ops sun20i_d1_hdmi_phy_ops = {
+ .init = sun20i_d1_hdmi_phy_config,
+ .disable = sun20i_d1_hdmi_phy_disable,
+ .read_hpd = dw_hdmi_phy_read_hpd,
+ .update_hpd = dw_hdmi_phy_update_hpd,
+ .setup_hpd = dw_hdmi_phy_setup_hpd,
+};
+
static void sun8i_hdmi_phy_unlock(struct sun8i_hdmi_phy *phy)
{
/* enable read access to HDMI controller */
@@ -576,6 +598,7 @@ void sun8i_hdmi_phy_set_ops(struct sun8i
const struct sun8i_hdmi_phy_variant *variant = phy->variant;
if (variant->phy_ops) {
+ plat_data->phy_force_vendor = true;
plat_data->phy_ops = variant->phy_ops;
plat_data->phy_name = "sun8i_dw_hdmi_phy";
plat_data->phy_data = phy;
@@ -612,6 +635,11 @@ static const struct sun8i_hdmi_phy_varia
.phy_init = &sun8i_hdmi_phy_init_h3,
};
+static const struct sun8i_hdmi_phy_variant sun20i_d1_hdmi_phy = {
+ .phy_ops = &sun20i_d1_hdmi_phy_ops,
+ .phy_init = &sun50i_hdmi_phy_init_h6,
+};
+
static const struct sun8i_hdmi_phy_variant sun50i_a64_hdmi_phy = {
.has_phy_clk = true,
.phy_ops = &sun8i_h3_hdmi_phy_ops,
@@ -639,6 +667,10 @@ static const struct of_device_id sun8i_h
.data = &sun8i_r40_hdmi_phy,
},
{
+ .compatible = "allwinner,sun20i-d1-hdmi-phy",
+ .data = &sun20i_d1_hdmi_phy,
+ },
+ {
.compatible = "allwinner,sun50i-a64-hdmi-phy",
.data = &sun50i_a64_hdmi_phy,
},
|