1 // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
2 /*
3 * Apple Type-C PHY driver
4 *
5 * The Apple Type-C PHY (ATCPHY) is a combined PHY for USB 2.0, USB 3.x,
6 * USB4/Thunderbolt, and DisplayPort connectivity via Type-C ports found in
7 * Apple Silicon SoCs.
8 *
9 * The PHY handles muxing between these different protocols and also provides the
10 * reset controller for the attached DWC3 USB controller.
11 *
12 * No documentation for this PHY is available and its operation has been
13 * reverse engineered by observing the XNU's MMIO access using a thin hypervisor
14 * and correlating register access to XNU's very verbose debug output. Most
15 * register names comes from this debug output as well.
16 *
17 * In order to correctly setup the high speed lanes for the various modes
18 * calibration values copied from Apple's firmware by our bootloader m1n1 are
19 * required. Without these only USB2 operation is possible.
20 *
21 * Copyright (C) The Asahi Linux Contributors
22 * Author: Sven Peter <sven@kernel.org>
23 */
24
25 #include <dt-bindings/phy/phy.h>
26 #include <linux/bitfield.h>
27 #include <linux/cleanup.h>
28 #include <linux/delay.h>
29 #include <linux/iopoll.h>
30 #include <linux/lockdep.h>
31 #include <linux/module.h>
32 #include <linux/mutex.h>
33 #include <linux/of.h>
34 #include <linux/of_device.h>
35 #include <linux/phy/phy.h>
36 #include <linux/platform_device.h>
37 #include <linux/reset-controller.h>
38 #include <linux/soc/apple/tunable.h>
39 #include <linux/types.h>
40 #include <linux/usb/pd.h>
41 #include <linux/usb/typec.h>
42 #include <linux/usb/typec_altmode.h>
43 #include <linux/usb/typec_dp.h>
44 #include <linux/usb/typec_mux.h>
45 #include <linux/usb/typec_tbt.h>
46
47 #define AUSPLL_FSM_CTRL 0x1014
48
49 #define AUSPLL_APB_CMD_OVERRIDE 0x2000
50 #define AUSPLL_APB_CMD_OVERRIDE_REQ BIT(0)
51 #define AUSPLL_APB_CMD_OVERRIDE_ACK BIT(1)
52 #define AUSPLL_APB_CMD_OVERRIDE_UNK28 BIT(28)
53 #define AUSPLL_APB_CMD_OVERRIDE_CMD GENMASK(27, 3)
54
55 #define AUSPLL_FREQ_DESC_A 0x2080
56 #define AUSPLL_FD_FREQ_COUNT_TARGET GENMASK(9, 0)
57 #define AUSPLL_FD_FBDIVN_HALF BIT(10)
58 #define AUSPLL_FD_REV_DIVN GENMASK(13, 11)
59 #define AUSPLL_FD_KI_MAN GENMASK(17, 14)
60 #define AUSPLL_FD_KI_EXP GENMASK(21, 18)
61 #define AUSPLL_FD_KP_MAN GENMASK(25, 22)
62 #define AUSPLL_FD_KP_EXP GENMASK(29, 26)
63 #define AUSPLL_FD_KPKI_SCALE_HBW GENMASK(31, 30)
64
65 #define AUSPLL_FREQ_DESC_B 0x2084
66 #define AUSPLL_FD_FBDIVN_FRAC_DEN GENMASK(13, 0)
67 #define AUSPLL_FD_FBDIVN_FRAC_NUM GENMASK(27, 14)
68
69 #define AUSPLL_FREQ_DESC_C 0x2088
70 #define AUSPLL_FD_SDM_SSC_STEP GENMASK(7, 0)
71 #define AUSPLL_FD_SDM_SSC_EN BIT(8)
72 #define AUSPLL_FD_PCLK_DIV_SEL GENMASK(13, 9)
73 #define AUSPLL_FD_LFSDM_DIV GENMASK(15, 14)
74 #define AUSPLL_FD_LFCLK_CTRL GENMASK(19, 16)
75 #define AUSPLL_FD_VCLK_OP_DIVN GENMASK(21, 20)
76 #define AUSPLL_FD_VCLK_PRE_DIVN BIT(22)
77
78 #define AUSPLL_DCO_EFUSE_SPARE 0x222c
79 #define AUSPLL_RODCO_ENCAP_EFUSE GENMASK(10, 9)
80 #define AUSPLL_RODCO_BIAS_ADJUST_EFUSE GENMASK(14, 12)
81
82 #define AUSPLL_FRACN_CAN 0x22a4
83 #define AUSPLL_DLL_START_CAPCODE GENMASK(18, 17)
84
85 #define AUSPLL_CLKOUT_MASTER 0x2200
86 #define AUSPLL_CLKOUT_MASTER_PCLK_DRVR_EN BIT(2)
87 #define AUSPLL_CLKOUT_MASTER_PCLK2_DRVR_EN BIT(4)
88 #define AUSPLL_CLKOUT_MASTER_REFBUFCLK_DRVR_EN BIT(6)
89
90 #define AUSPLL_CLKOUT_DIV 0x2208
91 #define AUSPLL_CLKOUT_PLLA_REFBUFCLK_DI GENMASK(20, 16)
92
93 #define AUSPLL_BGR 0x2214
94 #define AUSPLL_BGR_CTRL_AVAIL BIT(0)
95
96 #define AUSPLL_CLKOUT_DTC_VREG 0x2220
97 #define AUSPLL_DTC_VREG_ADJUST GENMASK(16, 14)
98 #define AUSPLL_DTC_VREG_BYPASS BIT(7)
99
100 #define AUSPLL_FREQ_CFG 0x2224
101 #define AUSPLL_FREQ_REFCLK GENMASK(1, 0)
102
103 #define AUS_COMMON_SHIM_BLK_VREG 0x0a04
104 #define AUS_VREG_TRIM GENMASK(6, 2)
105
106 #define AUS_UNK_A20 0x0a20
107 #define AUS_UNK_A20_TX_CAL_CODE GENMASK(23, 20)
108
109 #define ACIOPHY_CMN_SHM_STS_REG0 0x0a74
110 #define ACIOPHY_CMN_SHM_STS_REG0_CMD_READY BIT(0)
111
112 #define CIO3PLL_CLK_CTRL 0x2a00
113 #define CIO3PLL_CLK_PCLK_EN BIT(1)
114 #define CIO3PLL_CLK_REFCLK_EN BIT(5)
115
116 #define CIO3PLL_DCO_NCTRL 0x2a38
117 #define CIO3PLL_DCO_COARSEBIN_EFUSE0 GENMASK(6, 0)
118 #define CIO3PLL_DCO_COARSEBIN_EFUSE1 GENMASK(23, 17)
119
120 #define CIO3PLL_FRACN_CAN 0x2aa4
121 #define CIO3PLL_DLL_CAL_START_CAPCODE GENMASK(18, 17)
122
123 #define CIO3PLL_DTC_VREG 0x2a20
124 #define CIO3PLL_DTC_VREG_ADJUST GENMASK(16, 14)
125
126 #define ACIOPHY_CFG0 0x08
127 #define ACIOPHY_CFG0_COMMON_BIG_OV BIT(1)
128 #define ACIOPHY_CFG0_COMMON_SMALL_OV BIT(3)
129 #define ACIOPHY_CFG0_COMMON_CLAMP_OV BIT(5)
130 #define ACIOPHY_CFG0_RX_SMALL_OV GENMASK(9, 8)
131 #define ACIOPHY_CFG0_RX_BIG_OV GENMASK(13, 12)
132 #define ACIOPHY_CFG0_RX_CLAMP_OV GENMASK(17, 16)
133
134 #define ACIOPHY_CROSSBAR 0x4c
135 #define ACIOPHY_CROSSBAR_PROTOCOL GENMASK(4, 0)
136 #define ACIOPHY_CROSSBAR_PROTOCOL_USB4 0x0
137 #define ACIOPHY_CROSSBAR_PROTOCOL_USB4_SWAPPED 0x1
138 #define ACIOPHY_CROSSBAR_PROTOCOL_USB3 0xa
139 #define ACIOPHY_CROSSBAR_PROTOCOL_USB3_SWAPPED 0xb
140 #define ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP 0x10
141 #define ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP_SWAPPED 0x11
142 #define ACIOPHY_CROSSBAR_PROTOCOL_DP 0x14
143 #define ACIOPHY_CROSSBAR_DP_SINGLE_PMA GENMASK(16, 5)
144 #define ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE 0x0000
145 #define ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK100 0x100
146 #define ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008 0x008
147 #define ACIOPHY_CROSSBAR_DP_BOTH_PMA BIT(17)
148
149 #define ACIOPHY_LANE_MODE 0x48
150 #define ACIOPHY_LANE_MODE_RX0 GENMASK(2, 0)
151 #define ACIOPHY_LANE_MODE_TX0 GENMASK(5, 3)
152 #define ACIOPHY_LANE_MODE_RX1 GENMASK(8, 6)
153 #define ACIOPHY_LANE_MODE_TX1 GENMASK(11, 9)
154
155 enum atcphy_lane_mode {
156 ACIOPHY_LANE_MODE_USB4 = 0,
157 ACIOPHY_LANE_MODE_USB3 = 1,
158 ACIOPHY_LANE_MODE_DP = 2,
159 ACIOPHY_LANE_MODE_OFF = 3,
160 };
161
162 #define ACIOPHY_TOP_BIST_CIOPHY_CFG1 0x84
163 #define ACIOPHY_TOP_BIST_CIOPHY_CFG1_CLK_EN BIT(27)
164 #define ACIOPHY_TOP_BIST_CIOPHY_CFG1_BIST_EN BIT(28)
165
166 #define ACIOPHY_TOP_BIST_OV_CFG 0x8c
167 #define ACIOPHY_TOP_BIST_OV_CFG_LN0_RESET_N_OV BIT(13)
168 #define ACIOPHY_TOP_BIST_OV_CFG_LN0_PWR_DOWN_OV BIT(25)
169
170 #define ACIOPHY_TOP_BIST_READ_CTRL 0x90
171 #define ACIOPHY_TOP_BIST_READ_CTRL_LN0_PHY_STATUS_RE BIT(2)
172
173 #define ACIOPHY_TOP_PHY_STAT 0x9c
174 #define ACIOPHY_TOP_PHY_STAT_LN0_UNK0 BIT(0)
175 #define ACIOPHY_TOP_PHY_STAT_LN0_UNK23 BIT(23)
176
177 #define ACIOPHY_TOP_BIST_PHY_CFG0 0xa8
178 #define ACIOPHY_TOP_BIST_PHY_CFG0_LN0_RESET_N BIT(0)
179
180 #define ACIOPHY_TOP_BIST_PHY_CFG1 0xac
181 #define ACIOPHY_TOP_BIST_PHY_CFG1_LN0_PWR_DOWN GENMASK(13, 10)
182
183 #define ACIOPHY_SLEEP_CTRL 0x1b0
184 #define ACIOPHY_SLEEP_CTRL_TX_BIG_OV GENMASK(3, 2)
185 #define ACIOPHY_SLEEP_CTRL_TX_SMALL_OV GENMASK(7, 6)
186 #define ACIOPHY_SLEEP_CTRL_TX_CLAMP_OV GENMASK(11, 10)
187
188 #define ACIOPHY_PLL_PCTL_FSM_CTRL1 0x1014
189 #define ACIOPHY_PLL_APB_REQ_OV_SEL GENMASK(21, 13)
190 #define ACIOPHY_PLL_COMMON_CTRL 0x1028
191 #define ACIOPHY_PLL_WAIT_FOR_CMN_READY_BEFORE_RESET_EXIT BIT(24)
192
193 #define ATCPHY_POWER_CTRL 0x20000
194 #define ATCPHY_POWER_STAT 0x20004
195 #define ATCPHY_POWER_SLEEP_SMALL BIT(0)
196 #define ATCPHY_POWER_SLEEP_BIG BIT(1)
197 #define ATCPHY_POWER_CLAMP_EN BIT(2)
198 #define ATCPHY_POWER_APB_RESET_N BIT(3)
199 #define ATCPHY_POWER_PHY_RESET_N BIT(4)
200
201 #define ATCPHY_MISC 0x20008
202 #define ATCPHY_MISC_RESET_N BIT(0)
203 #define ATCPHY_MISC_LANE_SWAP BIT(2)
204
205 #define ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0 0x7000
206 #define DP_PMA_BYTECLK_RESET BIT(0)
207 #define DP_MAC_DIV20_CLK_SEL BIT(1)
208 #define DPTXPHY_PMA_LANE_RESET_N BIT(2)
209 #define DPTXPHY_PMA_LANE_RESET_N_OV BIT(3)
210 #define DPTX_PCLK1_SELECT GENMASK(6, 4)
211 #define DPTX_PCLK2_SELECT GENMASK(9, 7)
212 #define DPRX_PCLK_SELECT GENMASK(12, 10)
213 #define DPTX_PCLK1_ENABLE BIT(13)
214 #define DPTX_PCLK2_ENABLE BIT(14)
215 #define DPRX_PCLK_ENABLE BIT(15)
216
217 #define ACIOPHY_DP_PCLK_STAT 0x7044
218 #define ACIOPHY_AUSPLL_LOCK BIT(3)
219
220 #define LN0_AUSPMA_RX_TOP 0x9000
221 #define LN0_AUSPMA_RX_EQ 0xA000
222 #define LN0_AUSPMA_RX_SHM 0xB000
223 #define LN0_AUSPMA_TX_TOP 0xC000
224 #define LN0_AUSPMA_TX_SHM 0xD000
225
226 #define LN1_AUSPMA_RX_TOP 0x10000
227 #define LN1_AUSPMA_RX_EQ 0x11000
228 #define LN1_AUSPMA_RX_SHM 0x12000
229 #define LN1_AUSPMA_TX_TOP 0x13000
230 #define LN1_AUSPMA_TX_SHM 0x14000
231
232 #define LN_AUSPMA_RX_TOP_PMAFSM 0x0010
233 #define LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV BIT(0)
234 #define LN_AUSPMA_RX_TOP_PMAFSM_PCS_REQ BIT(9)
235
236 #define LN_AUSPMA_RX_TOP_TJ_CFG_RX_TXMODE 0x00F0
237 #define LN_RX_TXMODE BIT(0)
238
239 #define LN_AUSPMA_RX_SHM_TJ_RXA_CTLE_CTRL0 0x00
240 #define LN_TX_CLK_EN BIT(20)
241 #define LN_TX_CLK_EN_OV BIT(21)
242
243 #define LN_AUSPMA_RX_SHM_TJ_RXA_AFE_CTRL1 0x04
244 #define LN_RX_DIV20_RESET_N_OV BIT(29)
245 #define LN_RX_DIV20_RESET_N BIT(30)
246
247 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL2 0x08
248 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL3 0x0C
249 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL4 0x10
250 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL5 0x14
251 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL6 0x18
252 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL7 0x1C
253 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL8 0x20
254 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL9 0x24
255 #define LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL10 0x28
256 #define LN_DTVREG_ADJUST GENMASK(31, 27)
257
258 #define LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11 0x2C
259 #define LN_DTVREG_BIG_EN BIT(23)
260 #define LN_DTVREG_BIG_EN_OV BIT(24)
261 #define LN_DTVREG_SML_EN BIT(25)
262 #define LN_DTVREG_SML_EN_OV BIT(26)
263
264 #define LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12 0x30
265 #define LN_TX_BYTECLK_RESET_SYNC_CLR BIT(22)
266 #define LN_TX_BYTECLK_RESET_SYNC_CLR_OV BIT(23)
267 #define LN_TX_BYTECLK_RESET_SYNC_EN BIT(24)
268 #define LN_TX_BYTECLK_RESET_SYNC_EN_OV BIT(25)
269 #define LN_TX_HRCLK_SEL BIT(28)
270 #define LN_TX_HRCLK_SEL_OV BIT(29)
271 #define LN_TX_PBIAS_EN BIT(30)
272 #define LN_TX_PBIAS_EN_OV BIT(31)
273
274 #define LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13 0x34
275 #define LN_TX_PRE_EN BIT(0)
276 #define LN_TX_PRE_EN_OV BIT(1)
277 #define LN_TX_PST1_EN BIT(2)
278 #define LN_TX_PST1_EN_OV BIT(3)
279 #define LN_DTVREG_ADJUST_OV BIT(15)
280
281 #define LN_AUSPMA_RX_SHM_TJ_UNK_CTRL14A 0x38
282 #define LN_AUSPMA_RX_SHM_TJ_UNK_CTRL14B 0x3C
283 #define LN_AUSPMA_RX_SHM_TJ_UNK_CTRL15A 0x40
284 #define LN_AUSPMA_RX_SHM_TJ_UNK_CTRL15B 0x44
285 #define LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16 0x48
286 #define LN_RXTERM_EN BIT(21)
287 #define LN_RXTERM_EN_OV BIT(22)
288 #define LN_RXTERM_PULLUP_LEAK_EN BIT(23)
289 #define LN_RXTERM_PULLUP_LEAK_EN_OV BIT(24)
290 #define LN_TX_CAL_CODE GENMASK(29, 25)
291 #define LN_TX_CAL_CODE_OV BIT(30)
292
293 #define LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17 0x4C
294 #define LN_TX_MARGIN GENMASK(19, 15)
295 #define LN_TX_MARGIN_OV BIT(20)
296 #define LN_TX_MARGIN_LSB BIT(21)
297 #define LN_TX_MARGIN_LSB_OV BIT(22)
298 #define LN_TX_MARGIN_P1 GENMASK(26, 23)
299 #define LN_TX_MARGIN_P1_OV BIT(27)
300 #define LN_TX_MARGIN_P1_LSB GENMASK(29, 28)
301 #define LN_TX_MARGIN_P1_LSB_OV BIT(30)
302
303 #define LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18 0x50
304 #define LN_TX_P1_CODE GENMASK(3, 0)
305 #define LN_TX_P1_CODE_OV BIT(4)
306 #define LN_TX_P1_LSB_CODE GENMASK(6, 5)
307 #define LN_TX_P1_LSB_CODE_OV BIT(7)
308 #define LN_TX_MARGIN_PRE GENMASK(10, 8)
309 #define LN_TX_MARGIN_PRE_OV BIT(11)
310 #define LN_TX_MARGIN_PRE_LSB GENMASK(13, 12)
311 #define LN_TX_MARGIN_PRE_LSB_OV BIT(14)
312 #define LN_TX_PRE_LSB_CODE GENMASK(16, 15)
313 #define LN_TX_PRE_LSB_CODE_OV BIT(17)
314 #define LN_TX_PRE_CODE GENMASK(21, 18)
315 #define LN_TX_PRE_CODE_OV BIT(22)
316
317 #define LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19 0x54
318 #define LN_TX_TEST_EN BIT(21)
319 #define LN_TX_TEST_EN_OV BIT(22)
320 #define LN_TX_EN BIT(23)
321 #define LN_TX_EN_OV BIT(24)
322 #define LN_TX_CLK_DLY_CTRL_TAPGEN GENMASK(27, 25)
323 #define LN_TX_CLK_DIV2_EN BIT(28)
324 #define LN_TX_CLK_DIV2_EN_OV BIT(29)
325 #define LN_TX_CLK_DIV2_RST BIT(30)
326 #define LN_TX_CLK_DIV2_RST_OV BIT(31)
327
328 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL20 0x58
329 #define LN_AUSPMA_RX_SHM_TJ_RXA_UNK_CTRL21 0x5C
330 #define LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22 0x60
331 #define LN_VREF_ADJUST_GRAY GENMASK(11, 7)
332 #define LN_VREF_ADJUST_GRAY_OV BIT(12)
333 #define LN_VREF_BIAS_SEL GENMASK(14, 13)
334 #define LN_VREF_BIAS_SEL_OV BIT(15)
335 #define LN_VREF_BOOST_EN BIT(16)
336 #define LN_VREF_BOOST_EN_OV BIT(17)
337 #define LN_VREF_EN BIT(18)
338 #define LN_VREF_EN_OV BIT(19)
339 #define LN_VREF_LPBKIN_DATA GENMASK(29, 28)
340 #define LN_VREF_TEST_RXLPBKDT_EN BIT(30)
341 #define LN_VREF_TEST_RXLPBKDT_EN_OV BIT(31)
342
343 #define LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0 0x00
344 #define LN_BYTECLK_RESET_SYNC_EN_OV BIT(2)
345 #define LN_BYTECLK_RESET_SYNC_EN BIT(3)
346 #define LN_BYTECLK_RESET_SYNC_CLR_OV BIT(4)
347 #define LN_BYTECLK_RESET_SYNC_CLR BIT(5)
348 #define LN_BYTECLK_RESET_SYNC_SEL_OV BIT(6)
349
350 #define LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1 0x04
351 #define LN_TXA_DIV2_EN_OV BIT(8)
352 #define LN_TXA_DIV2_EN BIT(9)
353 #define LN_TXA_DIV2_RESET_OV BIT(10)
354 #define LN_TXA_DIV2_RESET BIT(11)
355 #define LN_TXA_CLK_EN_OV BIT(22)
356 #define LN_TXA_CLK_EN BIT(23)
357
358 #define LN_AUSPMA_TX_SHM_TXA_IMP_REG0 0x08
359 #define LN_TXA_CAL_CTRL_OV BIT(0)
360 #define LN_TXA_CAL_CTRL GENMASK(18, 1)
361 #define LN_TXA_CAL_CTRL_BASE_OV BIT(19)
362 #define LN_TXA_CAL_CTRL_BASE GENMASK(23, 20)
363 #define LN_TXA_HIZ_OV BIT(29)
364 #define LN_TXA_HIZ BIT(30)
365
366 #define LN_AUSPMA_TX_SHM_TXA_IMP_REG1 0x0C
367 #define LN_AUSPMA_TX_SHM_TXA_IMP_REG2 0x10
368 #define LN_TXA_MARGIN_OV BIT(0)
369 #define LN_TXA_MARGIN GENMASK(18, 1)
370 #define LN_TXA_MARGIN_2R_OV BIT(19)
371 #define LN_TXA_MARGIN_2R BIT(20)
372
373 #define LN_AUSPMA_TX_SHM_TXA_IMP_REG3 0x14
374 #define LN_TXA_MARGIN_POST_OV BIT(0)
375 #define LN_TXA_MARGIN_POST GENMASK(10, 1)
376 #define LN_TXA_MARGIN_POST_2R_OV BIT(11)
377 #define LN_TXA_MARGIN_POST_2R BIT(12)
378 #define LN_TXA_MARGIN_POST_4R_OV BIT(13)
379 #define LN_TXA_MARGIN_POST_4R BIT(14)
380 #define LN_TXA_MARGIN_PRE_OV BIT(15)
381 #define LN_TXA_MARGIN_PRE GENMASK(21, 16)
382 #define LN_TXA_MARGIN_PRE_2R_OV BIT(22)
383 #define LN_TXA_MARGIN_PRE_2R BIT(23)
384 #define LN_TXA_MARGIN_PRE_4R_OV BIT(24)
385 #define LN_TXA_MARGIN_PRE_4R BIT(25)
386
387 #define LN_AUSPMA_TX_SHM_TXA_UNK_REG0 0x18
388 #define LN_AUSPMA_TX_SHM_TXA_UNK_REG1 0x1C
389 #define LN_AUSPMA_TX_SHM_TXA_UNK_REG2 0x20
390
391 #define LN_AUSPMA_TX_SHM_TXA_LDOCLK 0x24
392 #define LN_LDOCLK_BYPASS_SML_OV BIT(8)
393 #define LN_LDOCLK_BYPASS_SML BIT(9)
394 #define LN_LDOCLK_BYPASS_BIG_OV BIT(10)
395 #define LN_LDOCLK_BYPASS_BIG BIT(11)
396 #define LN_LDOCLK_EN_SML_OV BIT(12)
397 #define LN_LDOCLK_EN_SML BIT(13)
398 #define LN_LDOCLK_EN_BIG_OV BIT(14)
399 #define LN_LDOCLK_EN_BIG BIT(15)
400
401 /* LPDPTX registers */
402 #define LPDPTX_AUX_CFG_BLK_AUX_CTRL 0x0000
403 #define LPDPTX_BLK_AUX_CTRL_PWRDN BIT(4)
404 #define LPDPTX_BLK_AUX_RXOFFSET GENMASK(25, 22)
405
406 #define LPDPTX_AUX_CFG_BLK_AUX_LDO_CTRL 0x0008
407
408 #define LPDPTX_AUX_CFG_BLK_AUX_MARGIN 0x000c
409 #define LPDPTX_MARGIN_RCAL_RXOFFSET_EN BIT(5)
410 #define LPDPTX_AUX_MARGIN_RCAL_TXSWING GENMASK(10, 6)
411
412 #define LPDPTX_AUX_SHM_CFG_BLK_AUX_CTRL_REG0 0x0204
413 #define LPDPTX_CFG_PMA_AUX_SEL_LF_DATA BIT(15)
414
415 #define LPDPTX_AUX_SHM_CFG_BLK_AUX_CTRL_REG1 0x0208
416 #define LPDPTX_CFG_PMA_PHYS_ADJ GENMASK(22, 20)
417 #define LPDPTX_CFG_PMA_PHYS_ADJ_OV BIT(19)
418
419 #define LPDPTX_AUX_CONTROL 0x4000
420 #define LPDPTX_AUX_PWN_DOWN 0x10
421 #define LPDPTX_AUX_CLAMP_EN 0x04
422 #define LPDPTX_SLEEP_B_BIG_IN 0x02
423 #define LPDPTX_SLEEP_B_SML_IN 0x01
424 #define LPDPTX_TXTERM_CODEMSB 0x400
425 #define LPDPTX_TXTERM_CODE GENMASK(9, 5)
426
427 /* pipehandler registers */
428 #define PIPEHANDLER_OVERRIDE 0x00
429 #define PIPEHANDLER_OVERRIDE_RXVALID BIT(0)
430 #define PIPEHANDLER_OVERRIDE_RXDETECT BIT(2)
431
432 #define PIPEHANDLER_OVERRIDE_VALUES 0x04
433 #define PIPEHANDLER_OVERRIDE_VAL_RXDETECT0 BIT(1)
434 #define PIPEHANDLER_OVERRIDE_VAL_RXDETECT1 BIT(2)
435 #define PIPEHANDLER_OVERRIDE_VAL_PHY_STATUS BIT(4)
436
437 #define PIPEHANDLER_MUX_CTRL 0x0c
438 #define PIPEHANDLER_MUX_CTRL_CLK GENMASK(5, 3)
439 #define PIPEHANDLER_MUX_CTRL_DATA GENMASK(2, 0)
440 #define PIPEHANDLER_MUX_CTRL_CLK_OFF 0
441 #define PIPEHANDLER_MUX_CTRL_CLK_USB3 1
442 #define PIPEHANDLER_MUX_CTRL_CLK_USB4 2
443 #define PIPEHANDLER_MUX_CTRL_CLK_DUMMY 4
444
445 #define PIPEHANDLER_MUX_CTRL_DATA_USB3 0
446 #define PIPEHANDLER_MUX_CTRL_DATA_USB4 1
447 #define PIPEHANDLER_MUX_CTRL_DATA_DUMMY 2
448
449 #define PIPEHANDLER_LOCK_REQ 0x10
450 #define PIPEHANDLER_LOCK_ACK 0x14
451 #define PIPEHANDLER_LOCK_EN BIT(0)
452
453 #define PIPEHANDLER_AON_GEN 0x1C
454 #define PIPEHANDLER_AON_GEN_DWC3_FORCE_CLAMP_EN BIT(4)
455 #define PIPEHANDLER_AON_GEN_DWC3_RESET_N BIT(0)
456
457 #define PIPEHANDLER_NONSELECTED_OVERRIDE 0x20
458 #define PIPEHANDLER_NATIVE_RESET BIT(12)
459 #define PIPEHANDLER_DUMMY_PHY_EN BIT(15)
460 #define PIPEHANDLER_NATIVE_POWER_DOWN GENMASK(3, 0)
461
462 #define PIPEHANDLER_LOCK_ACK_TIMEOUT_US 1000
463
464 /* USB2 PHY regs */
465 #define USB2PHY_USBCTL 0x00
466 #define USB2PHY_USBCTL_RUN 2
467 #define USB2PHY_USBCTL_ISOLATION 4
468
469 #define USB2PHY_CTL 0x04
470 #define USB2PHY_CTL_RESET BIT(0)
471 #define USB2PHY_CTL_PORT_RESET BIT(1)
472 #define USB2PHY_CTL_APB_RESET_N BIT(2)
473 #define USB2PHY_CTL_SIDDQ BIT(3)
474
475 #define USB2PHY_SIG 0x08
476 #define USB2PHY_SIG_VBUSDET_FORCE_VAL BIT(0)
477 #define USB2PHY_SIG_VBUSDET_FORCE_EN BIT(1)
478 #define USB2PHY_SIG_VBUSVLDEXT_FORCE_VAL BIT(2)
479 #define USB2PHY_SIG_VBUSVLDEXT_FORCE_EN BIT(3)
480 #define USB2PHY_SIG_HOST (7 << 12)
481
482 #define USB2PHY_MISCTUNE 0x1c
483 #define USB2PHY_MISCTUNE_APBCLK_GATE_OFF BIT(29)
484 #define USB2PHY_MISCTUNE_REFCLK_GATE_OFF BIT(30)
485
486 enum atcphy_dp_link_rate {
487 ATCPHY_DP_LINK_RATE_RBR,
488 ATCPHY_DP_LINK_RATE_HBR,
489 ATCPHY_DP_LINK_RATE_HBR2,
490 ATCPHY_DP_LINK_RATE_HBR3,
491 };
492
493 /**
494 * enum atcphy_pipehandler_state - States of the PIPE mux interface ("pipehandler")
495 * @ATCPHY_PIPEHANDLER_STATE_DUMMY: "Dummy PHY" (disables USB3, USB2 only)
496 * @ATCPHY_PIPEHANDLER_STATE_USB3: USB3 directly connected to the Type-C port
497 * @ATCPHY_PIPEHANDLER_STATE_USB4: USB3 tunneled via USB4/Thunderbolt
498 *
499 * DWC3's USB3 PIPE interface is connected to a multiplexer inside this PHY
500 * which can switch between a dummy state (which effectively disables any USB3
501 * support and falls back to USB2 only operation via the separate ULPI interface),
502 * a USB3 state (for regular USB3 or USB3+DisplayPort operation) and a USB4 state
503 * (for USB3 tunneled via USB4/Thunderbolt).
504 */
505 enum atcphy_pipehandler_state {
506 ATCPHY_PIPEHANDLER_STATE_DUMMY,
507 ATCPHY_PIPEHANDLER_STATE_USB3,
508 ATCPHY_PIPEHANDLER_STATE_USB4,
509 };
510
511 /**
512 * enum atcphy_mode - Operating modes of the PHY
513 * @APPLE_ATCPHY_MODE_OFF: all PHYs powered off
514 * @APPLE_ATCPHY_MODE_USB2: Nothing on the four SS lanes (i.e. USB2 only on D-/+)
515 * @APPLE_ATCPHY_MODE_USB3: USB3 on two lanes, nothing on the other two
516 * @APPLE_ATCPHY_MODE_USB3_DP: USB3 on two lanes and DisplayPort on the other two
517 * @APPLE_ATCPHY_MODE_TBT: Thunderbolt on all lanes
518 * @APPLE_ATCPHY_MODE_USB4: USB4 on all lanes
519 * @APPLE_ATCPHY_MODE_DP: DisplayPort on all lanes
520 */
521 enum atcphy_mode {
522 APPLE_ATCPHY_MODE_OFF,
523 APPLE_ATCPHY_MODE_USB2,
524 APPLE_ATCPHY_MODE_USB3,
525 APPLE_ATCPHY_MODE_USB3_DP,
526 APPLE_ATCPHY_MODE_TBT,
527 APPLE_ATCPHY_MODE_USB4,
528 APPLE_ATCPHY_MODE_DP,
529 };
530
531 enum atcphy_lane {
532 APPLE_ATCPHY_LANE_0,
533 APPLE_ATCPHY_LANE_1,
534 };
535
536 /* Link rate configuration, field names are taken from XNU debug output or register names */
537 struct atcphy_dp_link_rate_configuration {
538 u16 freqinit_count_target;
539 u16 fbdivn_frac_den;
540 u16 fbdivn_frac_num;
541 u16 pclk_div_sel;
542 u8 lfclk_ctrl;
543 u8 vclk_op_divn;
544 bool plla_clkout_vreg_bypass;
545 bool txa_ldoclk_bypass;
546 bool txa_div2_en;
547 };
548
549 /* Crossbar and lane configuration */
550 struct atcphy_mode_configuration {
551 u32 crossbar;
552 u32 crossbar_dp_single_pma;
553 bool crossbar_dp_both_pma;
554 enum atcphy_lane_mode lane_mode[2];
555 bool dp_lane[2];
556 bool set_swap;
557 };
558
559 /**
560 * struct apple_atcphy - Apple Type-C PHY device struct
561 * @np: Device node pointer
562 * @dev: Device pointer
563 * @tunables: Firmware-provided tunable parameters
564 * @tunables.axi2af: AXI to AF interface tunables
565 * @tunables.common: Common tunables for all lanes
566 * @tunables.lane_usb3: USB3 lane-specific tunables
567 * @tunables.lane_dp: DisplayPort lane-specific tunables
568 * @tunables.lane_usb4: USB4 lane-specific tunables
569 * @mode: Current PHY operating mode
570 * @swap_lanes: True if lanes must be swapped due to cable orientation
571 * @dp_link_rate: DisplayPort link rate
572 * @pipehandler_up: True if the PIPE mux ("pipehandler") is set to USB3 or USB4 mode
573 * @regs: Memory-mapped registers
574 * @regs.core: Core registers
575 * @regs.axi2af: AXI to Apple Fabric interface registers
576 * @regs.usb2phy: USB2 PHY registers
577 * @regs.pipehandler: USB3 PIPE interface ("pipehandler") registers
578 * @regs.lpdptx: DisplayPort registers
579 * @res: Resources for memory-mapped registers, used to verify that tunables aren't out of bounds
580 * @res.core: Core register resource
581 * @res.axi2af: AXI to Apple Fabric interface resource
582 * @phys: PHY instances
583 * @phys.usb2: USB2 PHY instance
584 * @phys.usb3: USB3 PHY instance
585 * @phys.dp: DisplayPort PHY instance
586 * @phy_provider: PHY provider instance
587 * @rcdev: Reset controller device
588 * @sw: Type-C switch instance
589 * @mux: Type-C mux instance
590 * @lock: Mutex for synchronizing register access across PHY, Type-C switch/mux and reset controller
591 */
592 struct apple_atcphy {
593 struct device_node *np;
594 struct device *dev;
595
596 struct {
597 struct apple_tunable *axi2af;
598 struct apple_tunable *common[2];
599 struct apple_tunable *lane_usb3[2];
600 struct apple_tunable *lane_dp[2];
601 struct apple_tunable *lane_usb4[2];
602 } tunables;
603
604 enum atcphy_mode mode;
605 bool swap_lanes;
606 int dp_link_rate;
607 bool pipehandler_up;
608
609 struct {
610 void __iomem *core;
611 void __iomem *axi2af;
612 void __iomem *usb2phy;
613 void __iomem *pipehandler;
614 void __iomem *lpdptx;
615 } regs;
616
617 struct {
618 struct resource *core;
619 struct resource *axi2af;
620 } res;
621
622 struct {
623 struct phy *usb2;
624 struct phy *usb3;
625 struct phy *dp;
626 } phys;
627 struct phy_provider *phy_provider;
628
629 struct reset_controller_dev rcdev;
630
631 struct mutex lock;
632 };
633
634 static const struct {
635 const struct atcphy_mode_configuration normal;
636 const struct atcphy_mode_configuration swapped;
637 bool enable_dp_aux;
638 enum atcphy_pipehandler_state pipehandler_state;
639 } atcphy_modes[] = {
640 [APPLE_ATCPHY_MODE_OFF] = {
641 .normal = {
642 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3,
643 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
644 .crossbar_dp_both_pma = false,
645 .lane_mode = {ACIOPHY_LANE_MODE_OFF, ACIOPHY_LANE_MODE_OFF},
646 .dp_lane = {false, false},
647 .set_swap = false,
648 },
649 .swapped = {
650 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_SWAPPED,
651 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
652 .crossbar_dp_both_pma = false,
653 .lane_mode = {ACIOPHY_LANE_MODE_OFF, ACIOPHY_LANE_MODE_OFF},
654 .dp_lane = {false, false},
655 .set_swap = false, /* doesn't matter since the SS lanes are off */
656 },
657 .enable_dp_aux = false,
658 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_DUMMY,
659 },
660 [APPLE_ATCPHY_MODE_USB2] = {
661 .normal = {
662 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3,
663 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
664 .crossbar_dp_both_pma = false,
665 .lane_mode = {ACIOPHY_LANE_MODE_OFF, ACIOPHY_LANE_MODE_OFF},
666 .dp_lane = {false, false},
667 .set_swap = false,
668 },
669 .swapped = {
670 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_SWAPPED,
671 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
672 .crossbar_dp_both_pma = false,
673 .lane_mode = {ACIOPHY_LANE_MODE_OFF, ACIOPHY_LANE_MODE_OFF},
674 .dp_lane = {false, false},
675 .set_swap = false, /* doesn't matter since the SS lanes are off */
676 },
677 .enable_dp_aux = false,
678 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_DUMMY,
679 },
680 [APPLE_ATCPHY_MODE_USB3] = {
681 /*
682 * Setting up the lanes as DP/USB3 is intentional here, USB3/USB3 does not work
683 * and isn't required since this PHY does not support 20GBps mode anyway.
684 * The only difference to APPLE_ATCPHY_MODE_USB3_DP is that DP Aux is not enabled.
685 */
686 .normal = {
687 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP,
688 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
689 .crossbar_dp_both_pma = false,
690 .lane_mode = {ACIOPHY_LANE_MODE_USB3, ACIOPHY_LANE_MODE_DP},
691 .dp_lane = {false, true},
692 .set_swap = false,
693 },
694 .swapped = {
695 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP_SWAPPED,
696 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
697 .crossbar_dp_both_pma = false,
698 .lane_mode = {ACIOPHY_LANE_MODE_DP, ACIOPHY_LANE_MODE_USB3},
699 .dp_lane = {true, false},
700 .set_swap = true,
701 },
702 .enable_dp_aux = false,
703 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_USB3,
704 },
705 [APPLE_ATCPHY_MODE_USB3_DP] = {
706 .normal = {
707 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP,
708 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
709 .crossbar_dp_both_pma = false,
710 .lane_mode = {ACIOPHY_LANE_MODE_USB3, ACIOPHY_LANE_MODE_DP},
711 .dp_lane = {false, true},
712 .set_swap = false,
713 },
714 .swapped = {
715 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP_SWAPPED,
716 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
717 .crossbar_dp_both_pma = false,
718 .lane_mode = {ACIOPHY_LANE_MODE_DP, ACIOPHY_LANE_MODE_USB3},
719 .dp_lane = {true, false},
720 .set_swap = true,
721 },
722 .enable_dp_aux = true,
723 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_USB3,
724 },
725 [APPLE_ATCPHY_MODE_TBT] = {
726 .normal = {
727 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB4,
728 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
729 .crossbar_dp_both_pma = false,
730 .lane_mode = {ACIOPHY_LANE_MODE_USB4, ACIOPHY_LANE_MODE_USB4},
731 .dp_lane = {false, false},
732 .set_swap = false,
733 },
734 .swapped = {
735 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB4_SWAPPED,
736 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
737 .crossbar_dp_both_pma = false,
738 .lane_mode = {ACIOPHY_LANE_MODE_USB4, ACIOPHY_LANE_MODE_USB4},
739 .dp_lane = {false, false},
740 .set_swap = false, /* intentionally false */
741 },
742 .enable_dp_aux = false,
743 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_DUMMY,
744 },
745 [APPLE_ATCPHY_MODE_USB4] = {
746 .normal = {
747 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB4,
748 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
749 .crossbar_dp_both_pma = false,
750 .lane_mode = {ACIOPHY_LANE_MODE_USB4, ACIOPHY_LANE_MODE_USB4},
751 .dp_lane = {false, false},
752 .set_swap = false,
753 },
754 .swapped = {
755 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB4_SWAPPED,
756 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
757 .crossbar_dp_both_pma = false,
758 .lane_mode = {ACIOPHY_LANE_MODE_USB4, ACIOPHY_LANE_MODE_USB4},
759 .dp_lane = {false, false},
760 .set_swap = false, /* intentionally false */
761 },
762 .enable_dp_aux = false,
763 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_USB4,
764 },
765 [APPLE_ATCPHY_MODE_DP] = {
766 .normal = {
767 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_DP,
768 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK100,
769 .crossbar_dp_both_pma = true,
770 .lane_mode = {ACIOPHY_LANE_MODE_DP, ACIOPHY_LANE_MODE_DP},
771 .dp_lane = {true, true},
772 .set_swap = false,
773 },
774 .swapped = {
775 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_DP,
776 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
777 .crossbar_dp_both_pma = false, /* intentionally false */
778 .lane_mode = {ACIOPHY_LANE_MODE_DP, ACIOPHY_LANE_MODE_DP},
779 .dp_lane = {true, true},
780 .set_swap = false, /* intentionally false */
781 },
782 .enable_dp_aux = true,
783 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_DUMMY,
784 },
785 };
786
787 static const struct atcphy_dp_link_rate_configuration dp_lr_config[] = {
788 [ATCPHY_DP_LINK_RATE_RBR] = {
789 .freqinit_count_target = 0x21c,
790 .fbdivn_frac_den = 0x0,
791 .fbdivn_frac_num = 0x0,
792 .pclk_div_sel = 0x13,
793 .lfclk_ctrl = 0x5,
794 .vclk_op_divn = 0x2,
795 .plla_clkout_vreg_bypass = true,
796 .txa_ldoclk_bypass = true,
797 .txa_div2_en = true,
798 },
799 [ATCPHY_DP_LINK_RATE_HBR] = {
800 .freqinit_count_target = 0x1c2,
801 .fbdivn_frac_den = 0x3ffe,
802 .fbdivn_frac_num = 0x1fff,
803 .pclk_div_sel = 0x9,
804 .lfclk_ctrl = 0x5,
805 .vclk_op_divn = 0x2,
806 .plla_clkout_vreg_bypass = true,
807 .txa_ldoclk_bypass = true,
808 .txa_div2_en = false,
809 },
810 [ATCPHY_DP_LINK_RATE_HBR2] = {
811 .freqinit_count_target = 0x1c2,
812 .fbdivn_frac_den = 0x3ffe,
813 .fbdivn_frac_num = 0x1fff,
814 .pclk_div_sel = 0x4,
815 .lfclk_ctrl = 0x5,
816 .vclk_op_divn = 0x0,
817 .plla_clkout_vreg_bypass = true,
818 .txa_ldoclk_bypass = true,
819 .txa_div2_en = false,
820 },
821 [ATCPHY_DP_LINK_RATE_HBR3] = {
822 .freqinit_count_target = 0x2a3,
823 .fbdivn_frac_den = 0x3ffc,
824 .fbdivn_frac_num = 0x2ffd,
825 .pclk_div_sel = 0x4,
826 .lfclk_ctrl = 0x6,
827 .vclk_op_divn = 0x0,
828 .plla_clkout_vreg_bypass = false,
829 .txa_ldoclk_bypass = false,
830 .txa_div2_en = false,
831 },
832 };
833
mask32(void __iomem * reg,u32 mask,u32 set)834 static inline void mask32(void __iomem *reg, u32 mask, u32 set)
835 {
836 u32 value = readl(reg);
837
838 value &= ~mask;
839 value |= set;
840 writel(value, reg);
841 }
842
core_mask32(struct apple_atcphy * atcphy,u32 reg,u32 mask,u32 set)843 static inline void core_mask32(struct apple_atcphy *atcphy, u32 reg, u32 mask, u32 set)
844 {
845 mask32(atcphy->regs.core + reg, mask, set);
846 }
847
set32(void __iomem * reg,u32 set)848 static inline void set32(void __iomem *reg, u32 set)
849 {
850 mask32(reg, 0, set);
851 }
852
core_set32(struct apple_atcphy * atcphy,u32 reg,u32 set)853 static inline void core_set32(struct apple_atcphy *atcphy, u32 reg, u32 set)
854 {
855 core_mask32(atcphy, reg, 0, set);
856 }
857
clear32(void __iomem * reg,u32 clear)858 static inline void clear32(void __iomem *reg, u32 clear)
859 {
860 mask32(reg, clear, 0);
861 }
862
core_clear32(struct apple_atcphy * atcphy,u32 reg,u32 clear)863 static inline void core_clear32(struct apple_atcphy *atcphy, u32 reg, u32 clear)
864 {
865 core_mask32(atcphy, reg, clear, 0);
866 }
867
atcphy_get_mode_config(struct apple_atcphy * atcphy,enum atcphy_mode mode)868 static const struct atcphy_mode_configuration *atcphy_get_mode_config(struct apple_atcphy *atcphy,
869 enum atcphy_mode mode)
870 {
871 if (atcphy->swap_lanes)
872 return &atcphy_modes[mode].swapped;
873 else
874 return &atcphy_modes[mode].normal;
875 }
876
atcphy_apply_tunables(struct apple_atcphy * atcphy,enum atcphy_mode mode)877 static void atcphy_apply_tunables(struct apple_atcphy *atcphy, enum atcphy_mode mode)
878 {
879 const int lane0 = atcphy->swap_lanes ? 1 : 0;
880 const int lane1 = atcphy->swap_lanes ? 0 : 1;
881
882 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.common[0]);
883 apple_tunable_apply(atcphy->regs.axi2af, atcphy->tunables.axi2af);
884 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.common[1]);
885
886 switch (mode) {
887 /*
888 * USB 3.2 Gen 2x2 / SuperSpeed 20Gbps is not supported by this hardware and applying USB3
889 * tunables to both lanes does not result in a working PHY configuration. Thus, both
890 * USB3-only and USB3/DP get the same tunable setup here.
891 */
892 case APPLE_ATCPHY_MODE_USB3:
893 case APPLE_ATCPHY_MODE_USB3_DP:
894 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_usb3[lane0]);
895 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_dp[lane1]);
896 break;
897
898 case APPLE_ATCPHY_MODE_DP:
899 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_dp[lane0]);
900 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_dp[lane1]);
901 break;
902
903 /*
904 * Even though the various Thunderbolt versions and USB4 are different protocols they need
905 * the same tunables. The actual protocol-specific setup happens inside the Thunderbolt/USB4
906 * native host interface.
907 */
908 case APPLE_ATCPHY_MODE_TBT:
909 case APPLE_ATCPHY_MODE_USB4:
910 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_usb4[lane0]);
911 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_usb4[lane1]);
912 break;
913
914 case APPLE_ATCPHY_MODE_OFF:
915 case APPLE_ATCPHY_MODE_USB2:
916 break;
917 }
918 }
919
atcphy_pipehandler_lock(struct apple_atcphy * atcphy)920 static int atcphy_pipehandler_lock(struct apple_atcphy *atcphy)
921 {
922 int ret;
923 u32 reg;
924
925 if (readl(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_REQ) & PIPEHANDLER_LOCK_EN) {
926 dev_warn(atcphy->dev, "Pipehandler already locked\n");
927 return 0;
928 }
929
930 set32(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_REQ, PIPEHANDLER_LOCK_EN);
931
932 ret = readl_poll_timeout(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_ACK, reg,
933 reg & PIPEHANDLER_LOCK_EN, 10, PIPEHANDLER_LOCK_ACK_TIMEOUT_US);
934 if (ret) {
935 clear32(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_REQ, 1);
936 dev_warn(atcphy->dev, "Pipehandler lock not acked.\n");
937 }
938
939 return ret;
940 }
941
atcphy_pipehandler_unlock(struct apple_atcphy * atcphy)942 static int atcphy_pipehandler_unlock(struct apple_atcphy *atcphy)
943 {
944 int ret;
945 u32 reg;
946
947 clear32(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_REQ, PIPEHANDLER_LOCK_EN);
948 ret = readl_poll_timeout(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_ACK, reg,
949 !(reg & PIPEHANDLER_LOCK_EN), 10, PIPEHANDLER_LOCK_ACK_TIMEOUT_US);
950 if (ret)
951 dev_warn(atcphy->dev, "Pipehandler lock release not acked.\n");
952
953 return ret;
954 }
955
atcphy_pipehandler_check(struct apple_atcphy * atcphy)956 static int atcphy_pipehandler_check(struct apple_atcphy *atcphy)
957 {
958 int ret;
959
960 lockdep_assert_held(&atcphy->lock);
961
962 if (readl(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_ACK) & PIPEHANDLER_LOCK_EN) {
963 dev_warn(atcphy->dev, "Pipehandler already locked\n");
964
965 ret = atcphy_pipehandler_unlock(atcphy);
966 if (ret) {
967 dev_err(atcphy->dev, "Failed to unlock pipehandler\n");
968 return ret;
969 }
970 }
971
972 return 0;
973 }
974
atcphy_configure_pipehandler_usb3(struct apple_atcphy * atcphy,bool host)975 static int atcphy_configure_pipehandler_usb3(struct apple_atcphy *atcphy, bool host)
976 {
977 int ret;
978 u32 reg;
979
980 ret = atcphy_pipehandler_check(atcphy);
981 if (ret)
982 return ret;
983
984 /*
985 * Only host mode requires this unknown BIST sequence to work correctly, possibly due to
986 * some hardware quirk. Guest mode breaks if we try to apply this sequence.
987 */
988 if (host) {
989 /* Force disable link detection */
990 clear32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE_VALUES,
991 PIPEHANDLER_OVERRIDE_VAL_RXDETECT0 | PIPEHANDLER_OVERRIDE_VAL_RXDETECT1);
992 set32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE,
993 PIPEHANDLER_OVERRIDE_RXVALID);
994 set32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE,
995 PIPEHANDLER_OVERRIDE_RXDETECT);
996
997 ret = atcphy_pipehandler_lock(atcphy);
998 if (ret) {
999 dev_err(atcphy->dev, "Failed to lock pipehandler");
1000 return ret;
1001 }
1002
1003 /* BIST dance */
1004 core_set32(atcphy, ACIOPHY_TOP_BIST_PHY_CFG0,
1005 ACIOPHY_TOP_BIST_PHY_CFG0_LN0_RESET_N);
1006 core_set32(atcphy, ACIOPHY_TOP_BIST_OV_CFG, ACIOPHY_TOP_BIST_OV_CFG_LN0_RESET_N_OV);
1007 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_TOP_PHY_STAT, reg,
1008 !(reg & ACIOPHY_TOP_PHY_STAT_LN0_UNK23), 10, 10000);
1009 if (ret)
1010 dev_warn(atcphy->dev,
1011 "Timed out waiting for ACIOPHY_TOP_PHY_STAT_LN0_UNK23\n");
1012
1013 core_set32(atcphy, ACIOPHY_TOP_BIST_READ_CTRL,
1014 ACIOPHY_TOP_BIST_READ_CTRL_LN0_PHY_STATUS_RE);
1015 core_clear32(atcphy, ACIOPHY_TOP_BIST_READ_CTRL,
1016 ACIOPHY_TOP_BIST_READ_CTRL_LN0_PHY_STATUS_RE);
1017
1018 core_mask32(atcphy, ACIOPHY_TOP_BIST_PHY_CFG1,
1019 ACIOPHY_TOP_BIST_PHY_CFG1_LN0_PWR_DOWN,
1020 FIELD_PREP(ACIOPHY_TOP_BIST_PHY_CFG1_LN0_PWR_DOWN, 3));
1021
1022 core_set32(atcphy, ACIOPHY_TOP_BIST_OV_CFG,
1023 ACIOPHY_TOP_BIST_OV_CFG_LN0_PWR_DOWN_OV);
1024 core_set32(atcphy, ACIOPHY_TOP_BIST_CIOPHY_CFG1,
1025 ACIOPHY_TOP_BIST_CIOPHY_CFG1_CLK_EN);
1026 core_set32(atcphy, ACIOPHY_TOP_BIST_CIOPHY_CFG1,
1027 ACIOPHY_TOP_BIST_CIOPHY_CFG1_BIST_EN);
1028 writel(0, atcphy->regs.core + ACIOPHY_TOP_BIST_CIOPHY_CFG1);
1029
1030 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_TOP_PHY_STAT, reg,
1031 (reg & ACIOPHY_TOP_PHY_STAT_LN0_UNK0), 10, 10000);
1032 if (ret)
1033 dev_warn(atcphy->dev,
1034 "timed out waiting for ACIOPHY_TOP_PHY_STAT_LN0_UNK0\n");
1035
1036 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_TOP_PHY_STAT, reg,
1037 !(reg & ACIOPHY_TOP_PHY_STAT_LN0_UNK23), 10, 10000);
1038 if (ret)
1039 dev_warn(atcphy->dev,
1040 "timed out waiting for ACIOPHY_TOP_PHY_STAT_LN0_UNK23\n");
1041
1042 /* Clear reset for non-selected USB3 PHY (?) */
1043 mask32(atcphy->regs.pipehandler + PIPEHANDLER_NONSELECTED_OVERRIDE,
1044 PIPEHANDLER_NATIVE_POWER_DOWN, FIELD_PREP(PIPEHANDLER_NATIVE_POWER_DOWN, 3));
1045 clear32(atcphy->regs.pipehandler + PIPEHANDLER_NONSELECTED_OVERRIDE,
1046 PIPEHANDLER_NATIVE_RESET);
1047
1048 /* More BIST stuff (?) */
1049 writel(0, atcphy->regs.core + ACIOPHY_TOP_BIST_OV_CFG);
1050 core_set32(atcphy, ACIOPHY_TOP_BIST_CIOPHY_CFG1,
1051 ACIOPHY_TOP_BIST_CIOPHY_CFG1_CLK_EN);
1052 core_set32(atcphy, ACIOPHY_TOP_BIST_CIOPHY_CFG1,
1053 ACIOPHY_TOP_BIST_CIOPHY_CFG1_BIST_EN);
1054 }
1055
1056 /* Configure PIPE mux to USB3 PHY */
1057 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1058 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_OFF));
1059 udelay(10);
1060 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_DATA,
1061 FIELD_PREP(PIPEHANDLER_MUX_CTRL_DATA, PIPEHANDLER_MUX_CTRL_DATA_USB3));
1062 udelay(10);
1063 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1064 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_USB3));
1065 udelay(10);
1066
1067 /* Remove link detection override */
1068 clear32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE, PIPEHANDLER_OVERRIDE_RXVALID);
1069 clear32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE, PIPEHANDLER_OVERRIDE_RXDETECT);
1070
1071 /* Pipehandler was only locked when the BIST sequence was applied for host mode */
1072 if (host) {
1073 ret = atcphy_pipehandler_unlock(atcphy);
1074 if (ret)
1075 dev_warn(atcphy->dev, "Failed to unlock pipehandler");
1076 }
1077
1078 return 0;
1079 }
1080
atcphy_configure_pipehandler_dummy(struct apple_atcphy * atcphy)1081 static int atcphy_configure_pipehandler_dummy(struct apple_atcphy *atcphy)
1082 {
1083 int ret;
1084
1085 ret = atcphy_pipehandler_check(atcphy);
1086 if (ret)
1087 return ret;
1088
1089 /* Force disable link detection */
1090 clear32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE_VALUES,
1091 PIPEHANDLER_OVERRIDE_VAL_RXDETECT0 | PIPEHANDLER_OVERRIDE_VAL_RXDETECT1);
1092 set32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE, PIPEHANDLER_OVERRIDE_RXVALID);
1093 set32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE, PIPEHANDLER_OVERRIDE_RXDETECT);
1094
1095 ret = atcphy_pipehandler_lock(atcphy);
1096 if (ret)
1097 dev_warn(atcphy->dev, "Failed to lock pipehandler");
1098
1099 /* Switch to dummy PHY */
1100 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1101 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_OFF));
1102 udelay(10);
1103 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_DATA,
1104 FIELD_PREP(PIPEHANDLER_MUX_CTRL_DATA, PIPEHANDLER_MUX_CTRL_DATA_DUMMY));
1105 udelay(10);
1106 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1107 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_DUMMY));
1108 udelay(10);
1109
1110 ret = atcphy_pipehandler_unlock(atcphy);
1111 if (ret)
1112 dev_warn(atcphy->dev, "Failed to unlock pipehandler");
1113
1114 mask32(atcphy->regs.pipehandler + PIPEHANDLER_NONSELECTED_OVERRIDE,
1115 PIPEHANDLER_NATIVE_POWER_DOWN, FIELD_PREP(PIPEHANDLER_NATIVE_POWER_DOWN, 2));
1116 set32(atcphy->regs.pipehandler + PIPEHANDLER_NONSELECTED_OVERRIDE,
1117 PIPEHANDLER_NATIVE_RESET);
1118
1119 return 0;
1120 }
1121
atcphy_configure_pipehandler(struct apple_atcphy * atcphy,bool host)1122 static int atcphy_configure_pipehandler(struct apple_atcphy *atcphy, bool host)
1123 {
1124 int ret;
1125
1126 lockdep_assert_held(&atcphy->lock);
1127
1128 switch (atcphy_modes[atcphy->mode].pipehandler_state) {
1129 case ATCPHY_PIPEHANDLER_STATE_USB3:
1130 ret = atcphy_configure_pipehandler_usb3(atcphy, host);
1131 atcphy->pipehandler_up = true;
1132 break;
1133 case ATCPHY_PIPEHANDLER_STATE_USB4:
1134 dev_warn(atcphy->dev,
1135 "ATCPHY_PIPEHANDLER_STATE_USB4 not implemented; falling back to USB2\n");
1136 ret = atcphy_configure_pipehandler_dummy(atcphy);
1137 atcphy->pipehandler_up = false;
1138 break;
1139 default:
1140 ret = -EINVAL;
1141 }
1142
1143 return ret;
1144 }
1145
atcphy_setup_pipehandler(struct apple_atcphy * atcphy)1146 static void atcphy_setup_pipehandler(struct apple_atcphy *atcphy)
1147 {
1148 lockdep_assert_held(&atcphy->lock);
1149
1150 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1151 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_OFF));
1152 udelay(10);
1153 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_DATA,
1154 FIELD_PREP(PIPEHANDLER_MUX_CTRL_DATA, PIPEHANDLER_MUX_CTRL_DATA_DUMMY));
1155 udelay(10);
1156 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1157 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_DUMMY));
1158 udelay(10);
1159 }
1160
atcphy_configure_lanes(struct apple_atcphy * atcphy,enum atcphy_mode mode)1161 static void atcphy_configure_lanes(struct apple_atcphy *atcphy, enum atcphy_mode mode)
1162 {
1163 const struct atcphy_mode_configuration *mode_cfg = atcphy_get_mode_config(atcphy, mode);
1164
1165 core_mask32(atcphy, ACIOPHY_LANE_MODE, ACIOPHY_LANE_MODE_RX0,
1166 FIELD_PREP(ACIOPHY_LANE_MODE_RX0, mode_cfg->lane_mode[0]));
1167 core_mask32(atcphy, ACIOPHY_LANE_MODE, ACIOPHY_LANE_MODE_TX0,
1168 FIELD_PREP(ACIOPHY_LANE_MODE_TX0, mode_cfg->lane_mode[0]));
1169 core_mask32(atcphy, ACIOPHY_LANE_MODE, ACIOPHY_LANE_MODE_RX1,
1170 FIELD_PREP(ACIOPHY_LANE_MODE_RX1, mode_cfg->lane_mode[1]));
1171 core_mask32(atcphy, ACIOPHY_LANE_MODE, ACIOPHY_LANE_MODE_TX1,
1172 FIELD_PREP(ACIOPHY_LANE_MODE_TX1, mode_cfg->lane_mode[1]));
1173 core_mask32(atcphy, ACIOPHY_CROSSBAR, ACIOPHY_CROSSBAR_PROTOCOL,
1174 FIELD_PREP(ACIOPHY_CROSSBAR_PROTOCOL, mode_cfg->crossbar));
1175
1176 if (mode_cfg->set_swap)
1177 core_set32(atcphy, ATCPHY_MISC, ATCPHY_MISC_LANE_SWAP);
1178 else
1179 core_clear32(atcphy, ATCPHY_MISC, ATCPHY_MISC_LANE_SWAP);
1180
1181 core_mask32(atcphy, ACIOPHY_CROSSBAR, ACIOPHY_CROSSBAR_DP_SINGLE_PMA,
1182 FIELD_PREP(ACIOPHY_CROSSBAR_DP_SINGLE_PMA, mode_cfg->crossbar_dp_single_pma));
1183 if (mode_cfg->crossbar_dp_both_pma)
1184 core_set32(atcphy, ACIOPHY_CROSSBAR, ACIOPHY_CROSSBAR_DP_BOTH_PMA);
1185 else
1186 core_clear32(atcphy, ACIOPHY_CROSSBAR, ACIOPHY_CROSSBAR_DP_BOTH_PMA);
1187
1188 if (mode_cfg->dp_lane[0]) {
1189 core_set32(atcphy, LN0_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1190 LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV);
1191 udelay(10);
1192 core_clear32(atcphy, LN0_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1193 LN_AUSPMA_RX_TOP_PMAFSM_PCS_REQ);
1194 } else {
1195 core_clear32(atcphy, LN0_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1196 LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV);
1197 udelay(10);
1198 }
1199
1200 if (mode_cfg->dp_lane[1]) {
1201 core_set32(atcphy, LN1_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1202 LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV);
1203 udelay(10);
1204 core_clear32(atcphy, LN1_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1205 LN_AUSPMA_RX_TOP_PMAFSM_PCS_REQ);
1206 } else {
1207 core_clear32(atcphy, LN1_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1208 LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV);
1209 udelay(10);
1210 }
1211 }
1212
atcphy_enable_dp_aux(struct apple_atcphy * atcphy)1213 static void atcphy_enable_dp_aux(struct apple_atcphy *atcphy)
1214 {
1215 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTXPHY_PMA_LANE_RESET_N);
1216 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTXPHY_PMA_LANE_RESET_N_OV);
1217
1218 core_mask32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPRX_PCLK_SELECT,
1219 FIELD_PREP(DPRX_PCLK_SELECT, 1));
1220 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPRX_PCLK_ENABLE);
1221
1222 core_mask32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK1_SELECT,
1223 FIELD_PREP(DPTX_PCLK1_SELECT, 1));
1224 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK1_ENABLE);
1225
1226 core_mask32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK2_SELECT,
1227 FIELD_PREP(DPTX_PCLK2_SELECT, 1));
1228 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK2_ENABLE);
1229
1230 core_set32(atcphy, ACIOPHY_PLL_COMMON_CTRL,
1231 ACIOPHY_PLL_WAIT_FOR_CMN_READY_BEFORE_RESET_EXIT);
1232
1233 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_CLAMP_EN);
1234 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_SLEEP_B_SML_IN);
1235 udelay(10);
1236 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_SLEEP_B_BIG_IN);
1237 udelay(10);
1238 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_CLAMP_EN);
1239 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_PWN_DOWN);
1240 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_TXTERM_CODEMSB);
1241 mask32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_TXTERM_CODE,
1242 FIELD_PREP(LPDPTX_TXTERM_CODE, 0x16));
1243
1244 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_LDO_CTRL, 0x1c00);
1245 mask32(atcphy->regs.lpdptx + LPDPTX_AUX_SHM_CFG_BLK_AUX_CTRL_REG1, LPDPTX_CFG_PMA_PHYS_ADJ,
1246 FIELD_PREP(LPDPTX_CFG_PMA_PHYS_ADJ, 5));
1247 set32(atcphy->regs.lpdptx + LPDPTX_AUX_SHM_CFG_BLK_AUX_CTRL_REG1,
1248 LPDPTX_CFG_PMA_PHYS_ADJ_OV);
1249
1250 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_MARGIN,
1251 LPDPTX_MARGIN_RCAL_RXOFFSET_EN);
1252
1253 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_CTRL, LPDPTX_BLK_AUX_CTRL_PWRDN);
1254 set32(atcphy->regs.lpdptx + LPDPTX_AUX_SHM_CFG_BLK_AUX_CTRL_REG0,
1255 LPDPTX_CFG_PMA_AUX_SEL_LF_DATA);
1256 mask32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_CTRL, LPDPTX_BLK_AUX_RXOFFSET,
1257 FIELD_PREP(LPDPTX_BLK_AUX_RXOFFSET, 3));
1258
1259 mask32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_MARGIN, LPDPTX_AUX_MARGIN_RCAL_TXSWING,
1260 FIELD_PREP(LPDPTX_AUX_MARGIN_RCAL_TXSWING, 12));
1261
1262 atcphy->dp_link_rate = -1;
1263 }
1264
atcphy_disable_dp_aux(struct apple_atcphy * atcphy)1265 static void atcphy_disable_dp_aux(struct apple_atcphy *atcphy)
1266 {
1267 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_PWN_DOWN);
1268 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_CTRL, LPDPTX_BLK_AUX_CTRL_PWRDN);
1269 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_CLAMP_EN);
1270 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_SLEEP_B_SML_IN);
1271 udelay(10);
1272 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_SLEEP_B_BIG_IN);
1273 udelay(10);
1274
1275 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTXPHY_PMA_LANE_RESET_N);
1276 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPRX_PCLK_ENABLE);
1277 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK1_ENABLE);
1278 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK2_ENABLE);
1279 }
1280
atcphy_dp_configure_lane(struct apple_atcphy * atcphy,enum atcphy_lane lane,const struct atcphy_dp_link_rate_configuration * cfg)1281 static int atcphy_dp_configure_lane(struct apple_atcphy *atcphy, enum atcphy_lane lane,
1282 const struct atcphy_dp_link_rate_configuration *cfg)
1283 {
1284 void __iomem *tx_shm, *rx_shm, *rx_top;
1285 unsigned int tx_cal_code;
1286
1287 lockdep_assert_held(&atcphy->lock);
1288
1289 switch (lane) {
1290 case APPLE_ATCPHY_LANE_0:
1291 tx_shm = atcphy->regs.core + LN0_AUSPMA_TX_SHM;
1292 rx_shm = atcphy->regs.core + LN0_AUSPMA_RX_SHM;
1293 rx_top = atcphy->regs.core + LN0_AUSPMA_RX_TOP;
1294 break;
1295 case APPLE_ATCPHY_LANE_1:
1296 tx_shm = atcphy->regs.core + LN1_AUSPMA_TX_SHM;
1297 rx_shm = atcphy->regs.core + LN1_AUSPMA_RX_SHM;
1298 rx_top = atcphy->regs.core + LN1_AUSPMA_RX_TOP;
1299 break;
1300 default:
1301 return -EINVAL;
1302 }
1303
1304 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_EN_SML);
1305 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_EN_SML_OV);
1306 udelay(10);
1307
1308 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_EN_BIG);
1309 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_EN_BIG_OV);
1310 udelay(10);
1311
1312 if (cfg->txa_ldoclk_bypass) {
1313 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_SML);
1314 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_SML_OV);
1315 udelay(10);
1316
1317 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_BIG);
1318 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_BIG_OV);
1319 udelay(10);
1320 } else {
1321 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_SML);
1322 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_SML_OV);
1323 udelay(10);
1324
1325 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_BIG);
1326 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_BIG_OV);
1327 udelay(10);
1328 }
1329
1330 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_SEL_OV);
1331 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_EN);
1332 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_EN_OV);
1333 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_CLR);
1334 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_CLR_OV);
1335
1336 if (cfg->txa_div2_en)
1337 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_EN);
1338 else
1339 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_EN);
1340 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_EN_OV);
1341 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_CLK_EN);
1342 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_CLK_EN_OV);
1343 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_RESET);
1344 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_RESET_OV);
1345
1346 mask32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_CAL_CTRL_BASE,
1347 FIELD_PREP(LN_TXA_CAL_CTRL_BASE, 0xf));
1348 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_CAL_CTRL_BASE_OV);
1349
1350 tx_cal_code = FIELD_GET(AUS_UNK_A20_TX_CAL_CODE, readl(atcphy->regs.core + AUS_UNK_A20));
1351 mask32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_CAL_CTRL,
1352 FIELD_PREP(LN_TXA_CAL_CTRL, (1 << tx_cal_code) - 1));
1353 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_CAL_CTRL_OV);
1354
1355 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG2, LN_TXA_MARGIN);
1356 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG2, LN_TXA_MARGIN_OV);
1357 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG2, LN_TXA_MARGIN_2R);
1358 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG2, LN_TXA_MARGIN_2R_OV);
1359
1360 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST);
1361 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_OV);
1362 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_2R);
1363 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_2R_OV);
1364 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_4R);
1365 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_4R_OV);
1366 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE);
1367 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_OV);
1368 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_2R);
1369 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_2R_OV);
1370 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_4R);
1371 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_4R_OV);
1372
1373 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_HIZ);
1374 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_HIZ_OV);
1375
1376 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_AFE_CTRL1, LN_RX_DIV20_RESET_N);
1377 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_AFE_CTRL1, LN_RX_DIV20_RESET_N_OV);
1378 udelay(10);
1379
1380 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_AFE_CTRL1, LN_RX_DIV20_RESET_N);
1381
1382 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_BYTECLK_RESET_SYNC_EN);
1383 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_BYTECLK_RESET_SYNC_EN_OV);
1384
1385 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_TX_CAL_CODE,
1386 FIELD_PREP(LN_TX_CAL_CODE, tx_cal_code));
1387 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_TX_CAL_CODE_OV);
1388
1389 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DLY_CTRL_TAPGEN,
1390 FIELD_PREP(LN_TX_CLK_DLY_CTRL_TAPGEN, 3));
1391
1392 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL10, LN_DTVREG_ADJUST);
1393 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_DTVREG_ADJUST_OV);
1394
1395 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_RXTERM_EN);
1396 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_RXTERM_EN_OV);
1397
1398 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_TEST_EN);
1399 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_TEST_EN_OV);
1400
1401 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_TEST_RXLPBKDT_EN);
1402 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_TEST_RXLPBKDT_EN_OV);
1403 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_LPBKIN_DATA,
1404 FIELD_PREP(LN_VREF_LPBKIN_DATA, 3));
1405 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BIAS_SEL,
1406 FIELD_PREP(LN_VREF_BIAS_SEL, 2));
1407 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BIAS_SEL_OV);
1408 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_ADJUST_GRAY,
1409 FIELD_PREP(LN_VREF_ADJUST_GRAY, 0x18));
1410 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_ADJUST_GRAY_OV);
1411 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_EN);
1412 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_EN_OV);
1413 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BOOST_EN);
1414 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BOOST_EN_OV);
1415 udelay(10);
1416
1417 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BOOST_EN);
1418 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BOOST_EN_OV);
1419 udelay(10);
1420
1421 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_TX_PRE_EN);
1422 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_TX_PRE_EN_OV);
1423 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_TX_PST1_EN);
1424 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_TX_PST1_EN_OV);
1425
1426 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_PBIAS_EN);
1427 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_PBIAS_EN_OV);
1428
1429 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_RXTERM_PULLUP_LEAK_EN);
1430 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_RXTERM_PULLUP_LEAK_EN_OV);
1431
1432 set32(rx_top + LN_AUSPMA_RX_TOP_TJ_CFG_RX_TXMODE, LN_RX_TXMODE);
1433
1434 if (cfg->txa_div2_en)
1435 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_EN);
1436 else
1437 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_EN);
1438 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_EN_OV);
1439
1440 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_RST);
1441 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_RST_OV);
1442
1443 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_HRCLK_SEL);
1444 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_HRCLK_SEL_OV);
1445
1446 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN);
1447 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_OV);
1448 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_LSB);
1449 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_LSB_OV);
1450 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_P1);
1451 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_P1_OV);
1452 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_P1_LSB);
1453 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_P1_LSB_OV);
1454
1455 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_P1_CODE);
1456 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_P1_CODE_OV);
1457 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_P1_LSB_CODE);
1458 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_P1_LSB_CODE_OV);
1459 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_MARGIN_PRE);
1460 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_MARGIN_PRE_OV);
1461 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_MARGIN_PRE_LSB);
1462 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_MARGIN_PRE_LSB_OV);
1463 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_PRE_LSB_CODE);
1464 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_PRE_LSB_CODE_OV);
1465 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_PRE_CODE);
1466 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_PRE_CODE_OV);
1467
1468 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11, LN_DTVREG_SML_EN);
1469 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11, LN_DTVREG_SML_EN_OV);
1470 udelay(10);
1471
1472 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11, LN_DTVREG_BIG_EN);
1473 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11, LN_DTVREG_BIG_EN_OV);
1474 udelay(10);
1475
1476 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL10, LN_DTVREG_ADJUST,
1477 FIELD_PREP(LN_DTVREG_ADJUST, 0xa));
1478 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_DTVREG_ADJUST_OV);
1479 udelay(10);
1480
1481 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_EN);
1482 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_EN_OV);
1483 udelay(10);
1484
1485 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_CTLE_CTRL0, LN_TX_CLK_EN);
1486 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_CTLE_CTRL0, LN_TX_CLK_EN_OV);
1487
1488 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_BYTECLK_RESET_SYNC_CLR);
1489 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_BYTECLK_RESET_SYNC_CLR_OV);
1490
1491 return 0;
1492 }
1493
atcphy_auspll_apb_command(struct apple_atcphy * atcphy,u32 command)1494 static int atcphy_auspll_apb_command(struct apple_atcphy *atcphy, u32 command)
1495 {
1496 int ret;
1497 u32 reg;
1498
1499 reg = readl(atcphy->regs.core + AUSPLL_APB_CMD_OVERRIDE);
1500 reg &= ~AUSPLL_APB_CMD_OVERRIDE_CMD;
1501 reg |= FIELD_PREP(AUSPLL_APB_CMD_OVERRIDE_CMD, command);
1502 reg |= AUSPLL_APB_CMD_OVERRIDE_REQ;
1503 reg |= AUSPLL_APB_CMD_OVERRIDE_UNK28;
1504 writel(reg, atcphy->regs.core + AUSPLL_APB_CMD_OVERRIDE);
1505
1506 ret = readl_poll_timeout(atcphy->regs.core + AUSPLL_APB_CMD_OVERRIDE, reg,
1507 (reg & AUSPLL_APB_CMD_OVERRIDE_ACK), 10, 10000);
1508 if (ret)
1509 dev_warn(atcphy->dev, "AUSPLL APB command was not acked\n");
1510
1511 core_clear32(atcphy, AUSPLL_APB_CMD_OVERRIDE, AUSPLL_APB_CMD_OVERRIDE_REQ);
1512
1513 return 0;
1514 }
1515
atcphy_dp_configure(struct apple_atcphy * atcphy,enum atcphy_dp_link_rate lr)1516 static int atcphy_dp_configure(struct apple_atcphy *atcphy, enum atcphy_dp_link_rate lr)
1517 {
1518 const struct atcphy_dp_link_rate_configuration *cfg;
1519 const struct atcphy_mode_configuration *mode_cfg;
1520 int ret;
1521 u32 reg;
1522
1523 guard(mutex)(&atcphy->lock);
1524 mode_cfg = atcphy_get_mode_config(atcphy, atcphy->mode);
1525 cfg = &dp_lr_config[lr];
1526
1527 if (atcphy->dp_link_rate == lr)
1528 return 0;
1529
1530 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_CMN_SHM_STS_REG0, reg,
1531 (reg & ACIOPHY_CMN_SHM_STS_REG0_CMD_READY), 10, 10000);
1532 if (ret) {
1533 dev_err(atcphy->dev, "ACIOPHY_CMN_SHM_STS_REG0_CMD_READY not set.\n");
1534 return ret;
1535 }
1536
1537 core_clear32(atcphy, AUSPLL_FREQ_CFG, AUSPLL_FREQ_REFCLK);
1538
1539 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_FREQ_COUNT_TARGET,
1540 FIELD_PREP(AUSPLL_FD_FREQ_COUNT_TARGET, cfg->freqinit_count_target));
1541 core_clear32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_FBDIVN_HALF);
1542 core_clear32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_REV_DIVN);
1543 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KI_MAN, FIELD_PREP(AUSPLL_FD_KI_MAN, 8));
1544 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KI_EXP, FIELD_PREP(AUSPLL_FD_KI_EXP, 3));
1545 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KP_MAN, FIELD_PREP(AUSPLL_FD_KP_MAN, 8));
1546 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KP_EXP, FIELD_PREP(AUSPLL_FD_KP_EXP, 7));
1547 core_clear32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KPKI_SCALE_HBW);
1548
1549 core_mask32(atcphy, AUSPLL_FREQ_DESC_B, AUSPLL_FD_FBDIVN_FRAC_DEN,
1550 FIELD_PREP(AUSPLL_FD_FBDIVN_FRAC_DEN, cfg->fbdivn_frac_den));
1551 core_mask32(atcphy, AUSPLL_FREQ_DESC_B, AUSPLL_FD_FBDIVN_FRAC_NUM,
1552 FIELD_PREP(AUSPLL_FD_FBDIVN_FRAC_NUM, cfg->fbdivn_frac_num));
1553
1554 core_clear32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_SDM_SSC_STEP);
1555 core_clear32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_SDM_SSC_EN);
1556 core_mask32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_PCLK_DIV_SEL,
1557 FIELD_PREP(AUSPLL_FD_PCLK_DIV_SEL, cfg->pclk_div_sel));
1558 core_mask32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_LFSDM_DIV,
1559 FIELD_PREP(AUSPLL_FD_LFSDM_DIV, 1));
1560 core_mask32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_LFCLK_CTRL,
1561 FIELD_PREP(AUSPLL_FD_LFCLK_CTRL, cfg->lfclk_ctrl));
1562 core_mask32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_VCLK_OP_DIVN,
1563 FIELD_PREP(AUSPLL_FD_VCLK_OP_DIVN, cfg->vclk_op_divn));
1564 core_set32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_VCLK_PRE_DIVN);
1565
1566 core_mask32(atcphy, AUSPLL_CLKOUT_DIV, AUSPLL_CLKOUT_PLLA_REFBUFCLK_DI,
1567 FIELD_PREP(AUSPLL_CLKOUT_PLLA_REFBUFCLK_DI, 7));
1568
1569 if (cfg->plla_clkout_vreg_bypass)
1570 core_set32(atcphy, AUSPLL_CLKOUT_DTC_VREG, AUSPLL_DTC_VREG_BYPASS);
1571 else
1572 core_clear32(atcphy, AUSPLL_CLKOUT_DTC_VREG, AUSPLL_DTC_VREG_BYPASS);
1573
1574 core_set32(atcphy, AUSPLL_BGR, AUSPLL_BGR_CTRL_AVAIL);
1575
1576 core_set32(atcphy, AUSPLL_CLKOUT_MASTER, AUSPLL_CLKOUT_MASTER_PCLK_DRVR_EN);
1577 core_set32(atcphy, AUSPLL_CLKOUT_MASTER, AUSPLL_CLKOUT_MASTER_PCLK2_DRVR_EN);
1578 core_set32(atcphy, AUSPLL_CLKOUT_MASTER, AUSPLL_CLKOUT_MASTER_REFBUFCLK_DRVR_EN);
1579
1580 ret = atcphy_auspll_apb_command(atcphy, 0);
1581 if (ret)
1582 return ret;
1583
1584 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_DP_PCLK_STAT, reg,
1585 (reg & ACIOPHY_AUSPLL_LOCK), 10, 10000);
1586 if (ret) {
1587 dev_err(atcphy->dev, "ACIOPHY_DP_PCLK did not lock.\n");
1588 return ret;
1589 }
1590
1591 ret = atcphy_auspll_apb_command(atcphy, 0x2800);
1592 if (ret)
1593 return ret;
1594
1595 if (mode_cfg->dp_lane[0]) {
1596 ret = atcphy_dp_configure_lane(atcphy, APPLE_ATCPHY_LANE_0, cfg);
1597 if (ret)
1598 return ret;
1599 }
1600
1601 if (mode_cfg->dp_lane[1]) {
1602 ret = atcphy_dp_configure_lane(atcphy, APPLE_ATCPHY_LANE_1, cfg);
1603 if (ret)
1604 return ret;
1605 }
1606
1607 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DP_PMA_BYTECLK_RESET);
1608 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DP_MAC_DIV20_CLK_SEL);
1609
1610 atcphy->dp_link_rate = lr;
1611 return 0;
1612 }
1613
atcphy_usb2_power_off(struct apple_atcphy * atcphy)1614 static void atcphy_usb2_power_off(struct apple_atcphy *atcphy)
1615 {
1616 /* Disable the PHY, this clears USB2PHY_USBCTL_RUN */
1617 writel(USB2PHY_USBCTL_ISOLATION, atcphy->regs.usb2phy + USB2PHY_USBCTL);
1618 udelay(10);
1619
1620 /* Switch the PHY to low power mode */
1621 set32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_SIDDQ);
1622 udelay(10);
1623
1624 /* Enable all resets */
1625 set32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_PORT_RESET);
1626 udelay(10);
1627 set32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_RESET);
1628 udelay(10);
1629 clear32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_APB_RESET_N);
1630 udelay(10);
1631 set32(atcphy->regs.usb2phy + USB2PHY_MISCTUNE, USB2PHY_MISCTUNE_APBCLK_GATE_OFF);
1632 set32(atcphy->regs.usb2phy + USB2PHY_MISCTUNE, USB2PHY_MISCTUNE_REFCLK_GATE_OFF);
1633 }
1634
atcphy_power_off(struct apple_atcphy * atcphy)1635 static int atcphy_power_off(struct apple_atcphy *atcphy)
1636 {
1637 u32 reg;
1638 int ret;
1639
1640 atcphy_disable_dp_aux(atcphy);
1641
1642 /* Enable all reset lines */
1643 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_PHY_RESET_N);
1644 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_CLAMP_EN);
1645 core_clear32(atcphy, ATCPHY_MISC, ATCPHY_MISC_RESET_N | ATCPHY_MISC_LANE_SWAP);
1646 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_APB_RESET_N);
1647
1648 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_SLEEP_BIG);
1649 ret = readl_poll_timeout(atcphy->regs.core + ATCPHY_POWER_STAT, reg,
1650 !(reg & ATCPHY_POWER_SLEEP_BIG), 10, 1000);
1651 if (ret) {
1652 dev_err(atcphy->dev, "Failed to sleep atcphy \"big\"\n");
1653 return ret;
1654 }
1655
1656 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_SLEEP_SMALL);
1657 ret = readl_poll_timeout(atcphy->regs.core + ATCPHY_POWER_STAT, reg,
1658 !(reg & ATCPHY_POWER_SLEEP_SMALL), 10, 1000);
1659 if (ret) {
1660 dev_err(atcphy->dev, "Failed to sleep atcphy \"small\"\n");
1661 return ret;
1662 }
1663
1664 return 0;
1665 }
1666
atcphy_usb2_power_on(struct apple_atcphy * atcphy)1667 static void atcphy_usb2_power_on(struct apple_atcphy *atcphy)
1668 {
1669 set32(atcphy->regs.usb2phy + USB2PHY_SIG,
1670 USB2PHY_SIG_VBUSDET_FORCE_VAL | USB2PHY_SIG_VBUSDET_FORCE_EN |
1671 USB2PHY_SIG_VBUSVLDEXT_FORCE_VAL | USB2PHY_SIG_VBUSVLDEXT_FORCE_EN);
1672 udelay(10);
1673
1674 /* Take the PHY out of its low power state */
1675 clear32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_SIDDQ);
1676 udelay(10);
1677
1678 /* Release reset */
1679 clear32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_RESET);
1680 udelay(10);
1681 clear32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_PORT_RESET);
1682 udelay(10);
1683 set32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_APB_RESET_N);
1684 udelay(10);
1685 clear32(atcphy->regs.usb2phy + USB2PHY_MISCTUNE, USB2PHY_MISCTUNE_APBCLK_GATE_OFF);
1686 clear32(atcphy->regs.usb2phy + USB2PHY_MISCTUNE, USB2PHY_MISCTUNE_REFCLK_GATE_OFF);
1687
1688 /* Enable the PHY */
1689 writel(USB2PHY_USBCTL_RUN, atcphy->regs.usb2phy + USB2PHY_USBCTL);
1690 }
1691
atcphy_power_on(struct apple_atcphy * atcphy)1692 static int atcphy_power_on(struct apple_atcphy *atcphy)
1693 {
1694 u32 reg;
1695 int ret;
1696
1697 atcphy_usb2_power_on(atcphy);
1698
1699 core_set32(atcphy, ATCPHY_MISC, ATCPHY_MISC_RESET_N);
1700
1701 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_SLEEP_SMALL);
1702 ret = readl_poll_timeout(atcphy->regs.core + ATCPHY_POWER_STAT, reg,
1703 reg & ATCPHY_POWER_SLEEP_SMALL, 100, 100000);
1704 if (ret) {
1705 dev_err(atcphy->dev, "failed to wakeup atcphy \"small\"\n");
1706 return ret;
1707 }
1708
1709 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_SLEEP_BIG);
1710 ret = readl_poll_timeout(atcphy->regs.core + ATCPHY_POWER_STAT, reg,
1711 reg & ATCPHY_POWER_SLEEP_BIG, 100, 100000);
1712 if (ret) {
1713 dev_err(atcphy->dev, "failed to wakeup atcphy \"big\"\n");
1714 return ret;
1715 }
1716
1717 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_CLAMP_EN);
1718 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_APB_RESET_N);
1719
1720 return 0;
1721 }
1722
atcphy_configure(struct apple_atcphy * atcphy,enum atcphy_mode mode)1723 static int atcphy_configure(struct apple_atcphy *atcphy, enum atcphy_mode mode)
1724 {
1725 int ret = 0;
1726
1727 lockdep_assert_held(&atcphy->lock);
1728
1729 if (mode == APPLE_ATCPHY_MODE_OFF) {
1730 ret = atcphy_power_off(atcphy);
1731 atcphy->mode = mode;
1732 return ret;
1733 }
1734
1735 ret = atcphy_power_on(atcphy);
1736 if (ret)
1737 return ret;
1738
1739 atcphy_apply_tunables(atcphy, mode);
1740
1741 core_set32(atcphy, AUSPLL_FSM_CTRL, 0x1fe000);
1742 core_set32(atcphy, AUSPLL_APB_CMD_OVERRIDE, AUSPLL_APB_CMD_OVERRIDE_UNK28);
1743
1744 set32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_COMMON_SMALL_OV);
1745 udelay(10);
1746 set32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_COMMON_BIG_OV);
1747 udelay(10);
1748 set32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_COMMON_CLAMP_OV);
1749 udelay(10);
1750
1751 mask32(atcphy->regs.core + ACIOPHY_SLEEP_CTRL, ACIOPHY_SLEEP_CTRL_TX_SMALL_OV,
1752 FIELD_PREP(ACIOPHY_SLEEP_CTRL_TX_SMALL_OV, 3));
1753 udelay(10);
1754 mask32(atcphy->regs.core + ACIOPHY_SLEEP_CTRL, ACIOPHY_SLEEP_CTRL_TX_BIG_OV,
1755 FIELD_PREP(ACIOPHY_SLEEP_CTRL_TX_BIG_OV, 3));
1756 udelay(10);
1757 mask32(atcphy->regs.core + ACIOPHY_SLEEP_CTRL, ACIOPHY_SLEEP_CTRL_TX_CLAMP_OV,
1758 FIELD_PREP(ACIOPHY_SLEEP_CTRL_TX_CLAMP_OV, 3));
1759 udelay(10);
1760
1761 mask32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_RX_BIG_OV,
1762 FIELD_PREP(ACIOPHY_CFG0_RX_BIG_OV, 3));
1763 udelay(10);
1764 mask32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_RX_SMALL_OV,
1765 FIELD_PREP(ACIOPHY_CFG0_RX_SMALL_OV, 3));
1766 udelay(10);
1767 mask32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_RX_CLAMP_OV,
1768 FIELD_PREP(ACIOPHY_CFG0_RX_CLAMP_OV, 3));
1769 udelay(10);
1770
1771 /* Setup AUX channel if DP altmode is requested */
1772 if (atcphy_modes[mode].enable_dp_aux)
1773 atcphy_enable_dp_aux(atcphy);
1774
1775 /* Enable clocks and configure lanes */
1776 core_set32(atcphy, CIO3PLL_CLK_CTRL, CIO3PLL_CLK_PCLK_EN);
1777 core_set32(atcphy, CIO3PLL_CLK_CTRL, CIO3PLL_CLK_REFCLK_EN);
1778 atcphy_configure_lanes(atcphy, mode);
1779
1780 /* Take the USB3 PHY out of reset */
1781 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_PHY_RESET_N);
1782
1783 atcphy->mode = mode;
1784
1785 return 0;
1786 }
1787
atcphy_usb2_set_mode(struct phy * phy,enum phy_mode mode,int submode)1788 static int atcphy_usb2_set_mode(struct phy *phy, enum phy_mode mode, int submode)
1789 {
1790 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1791
1792 guard(mutex)(&atcphy->lock);
1793
1794 switch (mode) {
1795 case PHY_MODE_USB_HOST:
1796 set32(atcphy->regs.usb2phy + USB2PHY_SIG, USB2PHY_SIG_HOST);
1797 break;
1798 case PHY_MODE_USB_DEVICE:
1799 clear32(atcphy->regs.usb2phy + USB2PHY_SIG, USB2PHY_SIG_HOST);
1800 break;
1801 default:
1802 return -EINVAL;
1803 }
1804
1805 return 0;
1806 }
1807
1808 static const struct phy_ops apple_atc_usb2_phy_ops = {
1809 .owner = THIS_MODULE,
1810 .set_mode = atcphy_usb2_set_mode,
1811 };
1812
atcphy_usb3_power_off(struct phy * phy)1813 static int atcphy_usb3_power_off(struct phy *phy)
1814 {
1815 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1816 int ret;
1817
1818 guard(mutex)(&atcphy->lock);
1819
1820 ret = atcphy_configure_pipehandler_dummy(atcphy);
1821 if (ret)
1822 dev_warn(atcphy->dev, "Failed to switch pipe to dummy: %d", ret);
1823
1824 atcphy->pipehandler_up = false;
1825
1826 if (atcphy->mode != APPLE_ATCPHY_MODE_OFF)
1827 atcphy_configure(atcphy, APPLE_ATCPHY_MODE_OFF);
1828
1829 return 0;
1830 }
1831
atcphy_usb3_set_mode(struct phy * phy,enum phy_mode mode,int submode)1832 static int atcphy_usb3_set_mode(struct phy *phy, enum phy_mode mode, int submode)
1833 {
1834 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1835
1836 guard(mutex)(&atcphy->lock);
1837
1838 /*
1839 * We may get multiple calls to set_mode (for host mode e.g. at least one from the dwc3 glue
1840 * driver and then another one from the generic xhci code) but must only configure the
1841 * PIPE handler once.
1842 */
1843 if (atcphy->pipehandler_up)
1844 return 0;
1845
1846 switch (mode) {
1847 case PHY_MODE_USB_HOST:
1848 return atcphy_configure_pipehandler(atcphy, true);
1849 case PHY_MODE_USB_DEVICE:
1850 return atcphy_configure_pipehandler(atcphy, false);
1851 default:
1852 return -EINVAL;
1853 }
1854 }
1855
1856 static const struct phy_ops apple_atc_usb3_phy_ops = {
1857 .owner = THIS_MODULE,
1858 .power_off = atcphy_usb3_power_off,
1859 .set_mode = atcphy_usb3_set_mode,
1860 };
1861
atcphy_dpphy_set_mode(struct phy * phy,enum phy_mode mode,int submode)1862 static int atcphy_dpphy_set_mode(struct phy *phy, enum phy_mode mode, int submode)
1863 {
1864 /* Nothing to do here since the setup already happened in mux_set */
1865 if (mode == PHY_MODE_DP && submode == 0)
1866 return 0;
1867 return -EINVAL;
1868 }
1869
atcphy_dpphy_validate(struct phy * phy,enum phy_mode mode,int submode,union phy_configure_opts * opts_)1870 static int atcphy_dpphy_validate(struct phy *phy, enum phy_mode mode, int submode,
1871 union phy_configure_opts *opts_)
1872 {
1873 struct phy_configure_opts_dp *opts = &opts_->dp;
1874 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1875
1876 if (mode != PHY_MODE_DP)
1877 return -EINVAL;
1878 if (submode != 0)
1879 return -EINVAL;
1880
1881 switch (atcphy->mode) {
1882 case APPLE_ATCPHY_MODE_USB3_DP:
1883 opts->lanes = 2;
1884 break;
1885 case APPLE_ATCPHY_MODE_DP:
1886 opts->lanes = 4;
1887 break;
1888 default:
1889 opts->lanes = 0;
1890 }
1891
1892 return 0;
1893 }
1894
atcphy_dpphy_configure(struct phy * phy,union phy_configure_opts * opts_)1895 static int atcphy_dpphy_configure(struct phy *phy, union phy_configure_opts *opts_)
1896 {
1897 struct phy_configure_opts_dp *opts = &opts_->dp;
1898 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1899 enum atcphy_dp_link_rate link_rate;
1900
1901 if (opts->set_voltages)
1902 return -EINVAL;
1903 if (opts->set_lanes)
1904 return -EINVAL;
1905
1906 if (opts->set_rate) {
1907 switch (opts->link_rate) {
1908 case 1620:
1909 link_rate = ATCPHY_DP_LINK_RATE_RBR;
1910 break;
1911 case 2700:
1912 link_rate = ATCPHY_DP_LINK_RATE_HBR;
1913 break;
1914 case 5400:
1915 link_rate = ATCPHY_DP_LINK_RATE_HBR2;
1916 break;
1917 case 8100:
1918 link_rate = ATCPHY_DP_LINK_RATE_HBR3;
1919 break;
1920 case 0:
1921 return 0;
1922 default:
1923 dev_err(atcphy->dev, "Unsupported link rate: %d\n", opts->link_rate);
1924 return -EINVAL;
1925 }
1926
1927 return atcphy_dp_configure(atcphy, link_rate);
1928 }
1929
1930 return 0;
1931 }
1932
1933 static const struct phy_ops apple_atc_dp_phy_ops = {
1934 .owner = THIS_MODULE,
1935 .configure = atcphy_dpphy_configure,
1936 .validate = atcphy_dpphy_validate,
1937 .set_mode = atcphy_dpphy_set_mode,
1938 };
1939
atcphy_xlate(struct device * dev,const struct of_phandle_args * args)1940 static struct phy *atcphy_xlate(struct device *dev, const struct of_phandle_args *args)
1941 {
1942 struct apple_atcphy *atcphy = dev_get_drvdata(dev);
1943
1944 switch (args->args[0]) {
1945 case PHY_TYPE_USB2:
1946 return atcphy->phys.usb2;
1947 case PHY_TYPE_USB3:
1948 return atcphy->phys.usb3;
1949 case PHY_TYPE_DP:
1950 return atcphy->phys.dp;
1951 }
1952 return ERR_PTR(-ENODEV);
1953 }
1954
atcphy_probe_phy(struct apple_atcphy * atcphy)1955 static int atcphy_probe_phy(struct apple_atcphy *atcphy)
1956 {
1957 struct {
1958 struct phy **phy;
1959 const struct phy_ops *ops;
1960 } phys[] = {
1961 { &atcphy->phys.usb2, &apple_atc_usb2_phy_ops },
1962 { &atcphy->phys.usb3, &apple_atc_usb3_phy_ops },
1963 { &atcphy->phys.dp, &apple_atc_dp_phy_ops },
1964 };
1965
1966 for (int i = 0; i < ARRAY_SIZE(phys); i++) {
1967 *phys[i].phy = devm_phy_create(atcphy->dev, NULL, phys[i].ops);
1968 if (IS_ERR(*phys[i].phy))
1969 return PTR_ERR(*phys[i].phy);
1970 phy_set_drvdata(*phys[i].phy, atcphy);
1971 }
1972
1973 atcphy->phy_provider = devm_of_phy_provider_register(atcphy->dev, atcphy_xlate);
1974 if (IS_ERR(atcphy->phy_provider))
1975 return PTR_ERR(atcphy->phy_provider);
1976 return 0;
1977 }
1978
_atcphy_dwc3_reset_assert(struct apple_atcphy * atcphy)1979 static void _atcphy_dwc3_reset_assert(struct apple_atcphy *atcphy)
1980 {
1981 lockdep_assert_held(&atcphy->lock);
1982
1983 clear32(atcphy->regs.pipehandler + PIPEHANDLER_AON_GEN, PIPEHANDLER_AON_GEN_DWC3_RESET_N);
1984 set32(atcphy->regs.pipehandler + PIPEHANDLER_AON_GEN,
1985 PIPEHANDLER_AON_GEN_DWC3_FORCE_CLAMP_EN);
1986 }
1987
atcphy_dwc3_reset_assert(struct reset_controller_dev * rcdev,unsigned long id)1988 static int atcphy_dwc3_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
1989 {
1990 struct apple_atcphy *atcphy = container_of(rcdev, struct apple_atcphy, rcdev);
1991 int ret;
1992
1993 guard(mutex)(&atcphy->lock);
1994
1995 _atcphy_dwc3_reset_assert(atcphy);
1996
1997 if (atcphy->pipehandler_up) {
1998 ret = atcphy_configure_pipehandler_dummy(atcphy);
1999 if (ret)
2000 dev_warn(atcphy->dev, "Failed to switch PIPE to dummy: %d\n", ret);
2001 else
2002 atcphy->pipehandler_up = false;
2003 }
2004
2005 atcphy_usb2_power_off(atcphy);
2006
2007 return 0;
2008 }
2009
atcphy_dwc3_reset_deassert(struct reset_controller_dev * rcdev,unsigned long id)2010 static int atcphy_dwc3_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
2011 {
2012 struct apple_atcphy *atcphy = container_of(rcdev, struct apple_atcphy, rcdev);
2013
2014 guard(mutex)(&atcphy->lock);
2015
2016 clear32(atcphy->regs.pipehandler + PIPEHANDLER_AON_GEN,
2017 PIPEHANDLER_AON_GEN_DWC3_FORCE_CLAMP_EN);
2018 set32(atcphy->regs.pipehandler + PIPEHANDLER_AON_GEN, PIPEHANDLER_AON_GEN_DWC3_RESET_N);
2019
2020 return 0;
2021 }
2022
2023 static const struct reset_control_ops atcphy_dwc3_reset_ops = {
2024 .assert = atcphy_dwc3_reset_assert,
2025 .deassert = atcphy_dwc3_reset_deassert,
2026 };
2027
atcphy_reset_xlate(struct reset_controller_dev * rcdev,const struct of_phandle_args * reset_spec)2028 static int atcphy_reset_xlate(struct reset_controller_dev *rcdev,
2029 const struct of_phandle_args *reset_spec)
2030 {
2031 return 0;
2032 }
2033
atcphy_probe_rcdev(struct apple_atcphy * atcphy)2034 static int atcphy_probe_rcdev(struct apple_atcphy *atcphy)
2035 {
2036 atcphy->rcdev.owner = THIS_MODULE;
2037 atcphy->rcdev.nr_resets = 1;
2038 atcphy->rcdev.ops = &atcphy_dwc3_reset_ops;
2039 atcphy->rcdev.of_node = atcphy->dev->of_node;
2040 atcphy->rcdev.of_reset_n_cells = 0;
2041 atcphy->rcdev.of_xlate = atcphy_reset_xlate;
2042
2043 return devm_reset_controller_register(atcphy->dev, &atcphy->rcdev);
2044 }
2045
atcphy_sw_set(struct typec_switch_dev * sw,enum typec_orientation orientation)2046 static int atcphy_sw_set(struct typec_switch_dev *sw, enum typec_orientation orientation)
2047 {
2048 struct apple_atcphy *atcphy = typec_switch_get_drvdata(sw);
2049
2050 guard(mutex)(&atcphy->lock);
2051
2052 switch (orientation) {
2053 case TYPEC_ORIENTATION_NONE:
2054 break;
2055 case TYPEC_ORIENTATION_NORMAL:
2056 atcphy->swap_lanes = false;
2057 break;
2058 case TYPEC_ORIENTATION_REVERSE:
2059 atcphy->swap_lanes = true;
2060 break;
2061 }
2062
2063 return 0;
2064 }
2065
atcphy_typec_switch_unregister(void * data)2066 static void atcphy_typec_switch_unregister(void *data)
2067 {
2068 typec_switch_unregister(data);
2069 }
2070
atcphy_probe_switch(struct apple_atcphy * atcphy)2071 static int atcphy_probe_switch(struct apple_atcphy *atcphy)
2072 {
2073 struct typec_switch_dev *sw;
2074 struct typec_switch_desc sw_desc = {
2075 .drvdata = atcphy,
2076 .fwnode = atcphy->dev->fwnode,
2077 .set = atcphy_sw_set,
2078 };
2079
2080 sw = typec_switch_register(atcphy->dev, &sw_desc);
2081 if (IS_ERR(sw))
2082 return PTR_ERR(sw);
2083
2084 return devm_add_action_or_reset(atcphy->dev, atcphy_typec_switch_unregister, sw);
2085 }
2086
atcphy_mux_set(struct typec_mux_dev * mux,struct typec_mux_state * state)2087 static int atcphy_mux_set(struct typec_mux_dev *mux, struct typec_mux_state *state)
2088 {
2089 struct apple_atcphy *atcphy = typec_mux_get_drvdata(mux);
2090 enum atcphy_mode target_mode;
2091
2092 guard(mutex)(&atcphy->lock);
2093
2094 if (state->mode == TYPEC_STATE_SAFE) {
2095 target_mode = APPLE_ATCPHY_MODE_OFF;
2096 } else if (state->mode == TYPEC_STATE_USB) {
2097 target_mode = APPLE_ATCPHY_MODE_USB3;
2098 } else if (!state->alt && state->mode == TYPEC_MODE_USB4) {
2099 struct enter_usb_data *data = state->data;
2100 u32 eudo_usb_mode = FIELD_GET(EUDO_USB_MODE_MASK, data->eudo);
2101
2102 switch (eudo_usb_mode) {
2103 case EUDO_USB_MODE_USB2:
2104 target_mode = APPLE_ATCPHY_MODE_USB2;
2105 break;
2106 case EUDO_USB_MODE_USB3:
2107 target_mode = APPLE_ATCPHY_MODE_USB3;
2108 break;
2109 case EUDO_USB_MODE_USB4:
2110 target_mode = APPLE_ATCPHY_MODE_USB4;
2111 break;
2112 default:
2113 dev_warn(atcphy->dev, "Unsupported EUDO USB mode: 0x%x.\n", eudo_usb_mode);
2114 target_mode = APPLE_ATCPHY_MODE_OFF;
2115 }
2116 } else if (state->alt && state->alt->svid == USB_TYPEC_TBT_SID) {
2117 target_mode = APPLE_ATCPHY_MODE_TBT;
2118 } else if (state->alt && state->alt->svid == USB_TYPEC_DP_SID) {
2119 switch (state->mode) {
2120 case TYPEC_DP_STATE_C:
2121 case TYPEC_DP_STATE_E:
2122 target_mode = APPLE_ATCPHY_MODE_DP;
2123 break;
2124 case TYPEC_DP_STATE_D:
2125 target_mode = APPLE_ATCPHY_MODE_USB3_DP;
2126 break;
2127 default:
2128 dev_err(atcphy->dev,
2129 "Unsupported DP pin assignment: 0x%lx, your connected device will not work.\n",
2130 state->mode);
2131 target_mode = APPLE_ATCPHY_MODE_OFF;
2132 }
2133 } else if (state->alt) {
2134 dev_err(atcphy->dev,
2135 "Unknown alternate mode SVID: 0x%x, your connected device will not work.\n",
2136 state->alt->svid);
2137 target_mode = APPLE_ATCPHY_MODE_OFF;
2138 } else {
2139 dev_err(atcphy->dev, "Unknown mode: 0x%lx, your connected device will not work.\n",
2140 state->mode);
2141 target_mode = APPLE_ATCPHY_MODE_OFF;
2142 }
2143
2144 if (atcphy->mode == target_mode)
2145 return 0;
2146
2147 /*
2148 * If the pipehandler is still/already up here there's a bug somewhere so make sure to
2149 * complain loudly. We can still try to switch modes and hope for the best though,
2150 * in the worst case the hardware will fall back to USB2-only.
2151 */
2152 WARN_ON_ONCE(atcphy->pipehandler_up);
2153 return atcphy_configure(atcphy, target_mode);
2154 }
2155
atcphy_typec_mux_unregister(void * data)2156 static void atcphy_typec_mux_unregister(void *data)
2157 {
2158 typec_mux_unregister(data);
2159 }
2160
atcphy_probe_mux(struct apple_atcphy * atcphy)2161 static int atcphy_probe_mux(struct apple_atcphy *atcphy)
2162 {
2163 struct typec_mux_dev *mux;
2164 struct typec_mux_desc mux_desc = {
2165 .drvdata = atcphy,
2166 .fwnode = atcphy->dev->fwnode,
2167 .set = atcphy_mux_set,
2168 };
2169
2170 mux = typec_mux_register(atcphy->dev, &mux_desc);
2171 if (IS_ERR(mux))
2172 return PTR_ERR(mux);
2173
2174 return devm_add_action_or_reset(atcphy->dev, atcphy_typec_mux_unregister, mux);
2175 }
2176
atcphy_load_tunables(struct apple_atcphy * atcphy)2177 static int atcphy_load_tunables(struct apple_atcphy *atcphy)
2178 {
2179 struct {
2180 const char *dt_name;
2181 struct apple_tunable **tunable;
2182 struct resource *res;
2183 } tunables[] = {
2184 { "apple,tunable-axi2af", &atcphy->tunables.axi2af, atcphy->res.axi2af },
2185 { "apple,tunable-common-a", &atcphy->tunables.common[0], atcphy->res.core },
2186 { "apple,tunable-common-b", &atcphy->tunables.common[1], atcphy->res.core },
2187 { "apple,tunable-lane0-usb", &atcphy->tunables.lane_usb3[0], atcphy->res.core },
2188 { "apple,tunable-lane1-usb", &atcphy->tunables.lane_usb3[1], atcphy->res.core },
2189 { "apple,tunable-lane0-cio", &atcphy->tunables.lane_usb4[0], atcphy->res.core },
2190 { "apple,tunable-lane1-cio", &atcphy->tunables.lane_usb4[1], atcphy->res.core },
2191 { "apple,tunable-lane0-dp", &atcphy->tunables.lane_dp[0], atcphy->res.core },
2192 { "apple,tunable-lane1-dp", &atcphy->tunables.lane_dp[1], atcphy->res.core },
2193 };
2194
2195 for (int i = 0; i < ARRAY_SIZE(tunables); i++) {
2196 *tunables[i].tunable = devm_apple_tunable_parse(
2197 atcphy->dev, atcphy->np, tunables[i].dt_name, tunables[i].res);
2198 if (IS_ERR(*tunables[i].tunable)) {
2199 dev_err(atcphy->dev, "Failed to read tunable %s: %ld\n",
2200 tunables[i].dt_name, PTR_ERR(*tunables[i].tunable));
2201 return PTR_ERR(*tunables[i].tunable);
2202 }
2203 }
2204
2205 return 0;
2206 }
2207
atcphy_map_resources(struct platform_device * pdev,struct apple_atcphy * atcphy)2208 static int atcphy_map_resources(struct platform_device *pdev, struct apple_atcphy *atcphy)
2209 {
2210 struct {
2211 const char *name;
2212 void __iomem **addr;
2213 struct resource **res;
2214 } resources[] = {
2215 { "core", &atcphy->regs.core, &atcphy->res.core },
2216 { "lpdptx", &atcphy->regs.lpdptx, NULL },
2217 { "axi2af", &atcphy->regs.axi2af, &atcphy->res.axi2af },
2218 { "usb2phy", &atcphy->regs.usb2phy, NULL },
2219 { "pipehandler", &atcphy->regs.pipehandler, NULL },
2220 };
2221 struct resource *res;
2222 void __iomem *addr;
2223
2224 for (int i = 0; i < ARRAY_SIZE(resources); i++) {
2225 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, resources[i].name);
2226 addr = devm_ioremap_resource(&pdev->dev, res);
2227 if (IS_ERR(addr))
2228 return dev_err_probe(atcphy->dev, PTR_ERR(addr),
2229 "Unable to map %s regs", resources[i].name);
2230
2231 *resources[i].addr = addr;
2232 if (resources[i].res)
2233 *resources[i].res = res;
2234 }
2235
2236 return 0;
2237 }
2238
atcphy_probe_finalize(struct apple_atcphy * atcphy)2239 static int atcphy_probe_finalize(struct apple_atcphy *atcphy)
2240 {
2241 int ret;
2242
2243 guard(mutex)(&atcphy->lock);
2244
2245 /* Reset dwc3 on probe, let dwc3 (consumer) deassert it */
2246 _atcphy_dwc3_reset_assert(atcphy);
2247
2248 /* Reset atcphy to clear any state potentially left by the bootloader */
2249 atcphy_usb2_power_off(atcphy);
2250 atcphy_power_off(atcphy);
2251 atcphy_setup_pipehandler(atcphy);
2252
2253 ret = atcphy_probe_rcdev(atcphy);
2254 if (ret)
2255 return dev_err_probe(atcphy->dev, ret, "Probing rcdev failed");
2256 ret = atcphy_probe_mux(atcphy);
2257 if (ret)
2258 return dev_err_probe(atcphy->dev, ret, "Probing mux failed");
2259 ret = atcphy_probe_switch(atcphy);
2260 if (ret)
2261 return dev_err_probe(atcphy->dev, ret, "Probing switch failed");
2262 ret = atcphy_probe_phy(atcphy);
2263 if (ret)
2264 return dev_err_probe(atcphy->dev, ret, "Probing phy failed");
2265
2266 return 0;
2267 }
2268
atcphy_probe(struct platform_device * pdev)2269 static int atcphy_probe(struct platform_device *pdev)
2270 {
2271 struct apple_atcphy *atcphy;
2272 struct device *dev = &pdev->dev;
2273 int ret;
2274
2275 atcphy = devm_kzalloc(&pdev->dev, sizeof(*atcphy), GFP_KERNEL);
2276 if (!atcphy)
2277 return -ENOMEM;
2278
2279 atcphy->dev = dev;
2280 atcphy->np = dev->of_node;
2281 mutex_init(&atcphy->lock);
2282 platform_set_drvdata(pdev, atcphy);
2283
2284 ret = atcphy_map_resources(pdev, atcphy);
2285 if (ret)
2286 return ret;
2287 ret = atcphy_load_tunables(atcphy);
2288 if (ret)
2289 return ret;
2290
2291 atcphy->mode = APPLE_ATCPHY_MODE_OFF;
2292 atcphy->pipehandler_up = false;
2293
2294 return atcphy_probe_finalize(atcphy);
2295 }
2296
2297 static const struct of_device_id atcphy_match[] = {
2298 { .compatible = "apple,t8103-atcphy" },
2299 {},
2300 };
2301 MODULE_DEVICE_TABLE(of, atcphy_match);
2302
2303 static struct platform_driver atcphy_driver = {
2304 .driver = {
2305 .name = "phy-apple-atc",
2306 .of_match_table = atcphy_match,
2307 },
2308 .probe = atcphy_probe,
2309 };
2310 module_platform_driver(atcphy_driver);
2311
2312 MODULE_AUTHOR("Sven Peter <sven@kernel.org>");
2313 MODULE_DESCRIPTION("Apple Type-C PHY driver");
2314 MODULE_LICENSE("GPL");
2315