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 typec_switch *sw;
632 struct typec_mux *mux;
633
634 struct mutex lock;
635 };
636
637 static const struct {
638 const struct atcphy_mode_configuration normal;
639 const struct atcphy_mode_configuration swapped;
640 bool enable_dp_aux;
641 enum atcphy_pipehandler_state pipehandler_state;
642 } atcphy_modes[] = {
643 [APPLE_ATCPHY_MODE_OFF] = {
644 .normal = {
645 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3,
646 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
647 .crossbar_dp_both_pma = false,
648 .lane_mode = {ACIOPHY_LANE_MODE_OFF, ACIOPHY_LANE_MODE_OFF},
649 .dp_lane = {false, false},
650 .set_swap = false,
651 },
652 .swapped = {
653 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_SWAPPED,
654 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
655 .crossbar_dp_both_pma = false,
656 .lane_mode = {ACIOPHY_LANE_MODE_OFF, ACIOPHY_LANE_MODE_OFF},
657 .dp_lane = {false, false},
658 .set_swap = false, /* doesn't matter since the SS lanes are off */
659 },
660 .enable_dp_aux = false,
661 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_DUMMY,
662 },
663 [APPLE_ATCPHY_MODE_USB2] = {
664 .normal = {
665 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3,
666 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
667 .crossbar_dp_both_pma = false,
668 .lane_mode = {ACIOPHY_LANE_MODE_OFF, ACIOPHY_LANE_MODE_OFF},
669 .dp_lane = {false, false},
670 .set_swap = false,
671 },
672 .swapped = {
673 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_SWAPPED,
674 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
675 .crossbar_dp_both_pma = false,
676 .lane_mode = {ACIOPHY_LANE_MODE_OFF, ACIOPHY_LANE_MODE_OFF},
677 .dp_lane = {false, false},
678 .set_swap = false, /* doesn't matter since the SS lanes are off */
679 },
680 .enable_dp_aux = false,
681 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_DUMMY,
682 },
683 [APPLE_ATCPHY_MODE_USB3] = {
684 /*
685 * Setting up the lanes as DP/USB3 is intentional here, USB3/USB3 does not work
686 * and isn't required since this PHY does not support 20GBps mode anyway.
687 * The only difference to APPLE_ATCPHY_MODE_USB3_DP is that DP Aux is not enabled.
688 */
689 .normal = {
690 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP,
691 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
692 .crossbar_dp_both_pma = false,
693 .lane_mode = {ACIOPHY_LANE_MODE_USB3, ACIOPHY_LANE_MODE_DP},
694 .dp_lane = {false, true},
695 .set_swap = false,
696 },
697 .swapped = {
698 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP_SWAPPED,
699 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
700 .crossbar_dp_both_pma = false,
701 .lane_mode = {ACIOPHY_LANE_MODE_DP, ACIOPHY_LANE_MODE_USB3},
702 .dp_lane = {true, false},
703 .set_swap = true,
704 },
705 .enable_dp_aux = false,
706 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_USB3,
707 },
708 [APPLE_ATCPHY_MODE_USB3_DP] = {
709 .normal = {
710 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP,
711 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
712 .crossbar_dp_both_pma = false,
713 .lane_mode = {ACIOPHY_LANE_MODE_USB3, ACIOPHY_LANE_MODE_DP},
714 .dp_lane = {false, true},
715 .set_swap = false,
716 },
717 .swapped = {
718 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB3_DP_SWAPPED,
719 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
720 .crossbar_dp_both_pma = false,
721 .lane_mode = {ACIOPHY_LANE_MODE_DP, ACIOPHY_LANE_MODE_USB3},
722 .dp_lane = {true, false},
723 .set_swap = true,
724 },
725 .enable_dp_aux = true,
726 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_USB3,
727 },
728 [APPLE_ATCPHY_MODE_TBT] = {
729 .normal = {
730 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB4,
731 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
732 .crossbar_dp_both_pma = false,
733 .lane_mode = {ACIOPHY_LANE_MODE_USB4, ACIOPHY_LANE_MODE_USB4},
734 .dp_lane = {false, false},
735 .set_swap = false,
736 },
737 .swapped = {
738 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB4_SWAPPED,
739 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
740 .crossbar_dp_both_pma = false,
741 .lane_mode = {ACIOPHY_LANE_MODE_USB4, ACIOPHY_LANE_MODE_USB4},
742 .dp_lane = {false, false},
743 .set_swap = false, /* intentionally false */
744 },
745 .enable_dp_aux = false,
746 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_DUMMY,
747 },
748 [APPLE_ATCPHY_MODE_USB4] = {
749 .normal = {
750 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB4,
751 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
752 .crossbar_dp_both_pma = false,
753 .lane_mode = {ACIOPHY_LANE_MODE_USB4, ACIOPHY_LANE_MODE_USB4},
754 .dp_lane = {false, false},
755 .set_swap = false,
756 },
757 .swapped = {
758 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_USB4_SWAPPED,
759 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_NONE,
760 .crossbar_dp_both_pma = false,
761 .lane_mode = {ACIOPHY_LANE_MODE_USB4, ACIOPHY_LANE_MODE_USB4},
762 .dp_lane = {false, false},
763 .set_swap = false, /* intentionally false */
764 },
765 .enable_dp_aux = false,
766 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_USB4,
767 },
768 [APPLE_ATCPHY_MODE_DP] = {
769 .normal = {
770 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_DP,
771 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK100,
772 .crossbar_dp_both_pma = true,
773 .lane_mode = {ACIOPHY_LANE_MODE_DP, ACIOPHY_LANE_MODE_DP},
774 .dp_lane = {true, true},
775 .set_swap = false,
776 },
777 .swapped = {
778 .crossbar = ACIOPHY_CROSSBAR_PROTOCOL_DP,
779 .crossbar_dp_single_pma = ACIOPHY_CROSSBAR_DP_SINGLE_PMA_UNK008,
780 .crossbar_dp_both_pma = false, /* intentionally false */
781 .lane_mode = {ACIOPHY_LANE_MODE_DP, ACIOPHY_LANE_MODE_DP},
782 .dp_lane = {true, true},
783 .set_swap = false, /* intentionally false */
784 },
785 .enable_dp_aux = true,
786 .pipehandler_state = ATCPHY_PIPEHANDLER_STATE_DUMMY,
787 },
788 };
789
790 static const struct atcphy_dp_link_rate_configuration dp_lr_config[] = {
791 [ATCPHY_DP_LINK_RATE_RBR] = {
792 .freqinit_count_target = 0x21c,
793 .fbdivn_frac_den = 0x0,
794 .fbdivn_frac_num = 0x0,
795 .pclk_div_sel = 0x13,
796 .lfclk_ctrl = 0x5,
797 .vclk_op_divn = 0x2,
798 .plla_clkout_vreg_bypass = true,
799 .txa_ldoclk_bypass = true,
800 .txa_div2_en = true,
801 },
802 [ATCPHY_DP_LINK_RATE_HBR] = {
803 .freqinit_count_target = 0x1c2,
804 .fbdivn_frac_den = 0x3ffe,
805 .fbdivn_frac_num = 0x1fff,
806 .pclk_div_sel = 0x9,
807 .lfclk_ctrl = 0x5,
808 .vclk_op_divn = 0x2,
809 .plla_clkout_vreg_bypass = true,
810 .txa_ldoclk_bypass = true,
811 .txa_div2_en = false,
812 },
813 [ATCPHY_DP_LINK_RATE_HBR2] = {
814 .freqinit_count_target = 0x1c2,
815 .fbdivn_frac_den = 0x3ffe,
816 .fbdivn_frac_num = 0x1fff,
817 .pclk_div_sel = 0x4,
818 .lfclk_ctrl = 0x5,
819 .vclk_op_divn = 0x0,
820 .plla_clkout_vreg_bypass = true,
821 .txa_ldoclk_bypass = true,
822 .txa_div2_en = false,
823 },
824 [ATCPHY_DP_LINK_RATE_HBR3] = {
825 .freqinit_count_target = 0x2a3,
826 .fbdivn_frac_den = 0x3ffc,
827 .fbdivn_frac_num = 0x2ffd,
828 .pclk_div_sel = 0x4,
829 .lfclk_ctrl = 0x6,
830 .vclk_op_divn = 0x0,
831 .plla_clkout_vreg_bypass = false,
832 .txa_ldoclk_bypass = false,
833 .txa_div2_en = false,
834 },
835 };
836
mask32(void __iomem * reg,u32 mask,u32 set)837 static inline void mask32(void __iomem *reg, u32 mask, u32 set)
838 {
839 u32 value = readl(reg);
840
841 value &= ~mask;
842 value |= set;
843 writel(value, reg);
844 }
845
core_mask32(struct apple_atcphy * atcphy,u32 reg,u32 mask,u32 set)846 static inline void core_mask32(struct apple_atcphy *atcphy, u32 reg, u32 mask, u32 set)
847 {
848 mask32(atcphy->regs.core + reg, mask, set);
849 }
850
set32(void __iomem * reg,u32 set)851 static inline void set32(void __iomem *reg, u32 set)
852 {
853 mask32(reg, 0, set);
854 }
855
core_set32(struct apple_atcphy * atcphy,u32 reg,u32 set)856 static inline void core_set32(struct apple_atcphy *atcphy, u32 reg, u32 set)
857 {
858 core_mask32(atcphy, reg, 0, set);
859 }
860
clear32(void __iomem * reg,u32 clear)861 static inline void clear32(void __iomem *reg, u32 clear)
862 {
863 mask32(reg, clear, 0);
864 }
865
core_clear32(struct apple_atcphy * atcphy,u32 reg,u32 clear)866 static inline void core_clear32(struct apple_atcphy *atcphy, u32 reg, u32 clear)
867 {
868 core_mask32(atcphy, reg, clear, 0);
869 }
870
atcphy_get_mode_config(struct apple_atcphy * atcphy,enum atcphy_mode mode)871 static const struct atcphy_mode_configuration *atcphy_get_mode_config(struct apple_atcphy *atcphy,
872 enum atcphy_mode mode)
873 {
874 if (atcphy->swap_lanes)
875 return &atcphy_modes[mode].swapped;
876 else
877 return &atcphy_modes[mode].normal;
878 }
879
atcphy_apply_tunables(struct apple_atcphy * atcphy,enum atcphy_mode mode)880 static void atcphy_apply_tunables(struct apple_atcphy *atcphy, enum atcphy_mode mode)
881 {
882 const int lane0 = atcphy->swap_lanes ? 1 : 0;
883 const int lane1 = atcphy->swap_lanes ? 0 : 1;
884
885 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.common[0]);
886 apple_tunable_apply(atcphy->regs.axi2af, atcphy->tunables.axi2af);
887 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.common[1]);
888
889 switch (mode) {
890 /*
891 * USB 3.2 Gen 2x2 / SuperSpeed 20Gbps is not supported by this hardware and applying USB3
892 * tunables to both lanes does not result in a working PHY configuration. Thus, both
893 * USB3-only and USB3/DP get the same tunable setup here.
894 */
895 case APPLE_ATCPHY_MODE_USB3:
896 case APPLE_ATCPHY_MODE_USB3_DP:
897 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_usb3[lane0]);
898 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_dp[lane1]);
899 break;
900
901 case APPLE_ATCPHY_MODE_DP:
902 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_dp[lane0]);
903 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_dp[lane1]);
904 break;
905
906 /*
907 * Even though the various Thunderbolt versions and USB4 are different protocols they need
908 * the same tunables. The actual protocol-specific setup happens inside the Thunderbolt/USB4
909 * native host interface.
910 */
911 case APPLE_ATCPHY_MODE_TBT:
912 case APPLE_ATCPHY_MODE_USB4:
913 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_usb4[lane0]);
914 apple_tunable_apply(atcphy->regs.core, atcphy->tunables.lane_usb4[lane1]);
915 break;
916
917 case APPLE_ATCPHY_MODE_OFF:
918 case APPLE_ATCPHY_MODE_USB2:
919 break;
920 }
921 }
922
atcphy_pipehandler_lock(struct apple_atcphy * atcphy)923 static int atcphy_pipehandler_lock(struct apple_atcphy *atcphy)
924 {
925 int ret;
926 u32 reg;
927
928 if (readl(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_REQ) & PIPEHANDLER_LOCK_EN) {
929 dev_warn(atcphy->dev, "Pipehandler already locked\n");
930 return 0;
931 }
932
933 set32(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_REQ, PIPEHANDLER_LOCK_EN);
934
935 ret = readl_poll_timeout(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_ACK, reg,
936 reg & PIPEHANDLER_LOCK_EN, 10, PIPEHANDLER_LOCK_ACK_TIMEOUT_US);
937 if (ret) {
938 clear32(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_REQ, 1);
939 dev_warn(atcphy->dev, "Pipehandler lock not acked.\n");
940 }
941
942 return ret;
943 }
944
atcphy_pipehandler_unlock(struct apple_atcphy * atcphy)945 static int atcphy_pipehandler_unlock(struct apple_atcphy *atcphy)
946 {
947 int ret;
948 u32 reg;
949
950 clear32(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_REQ, PIPEHANDLER_LOCK_EN);
951 ret = readl_poll_timeout(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_ACK, reg,
952 !(reg & PIPEHANDLER_LOCK_EN), 10, PIPEHANDLER_LOCK_ACK_TIMEOUT_US);
953 if (ret)
954 dev_warn(atcphy->dev, "Pipehandler lock release not acked.\n");
955
956 return ret;
957 }
958
atcphy_pipehandler_check(struct apple_atcphy * atcphy)959 static int atcphy_pipehandler_check(struct apple_atcphy *atcphy)
960 {
961 int ret;
962
963 lockdep_assert_held(&atcphy->lock);
964
965 if (readl(atcphy->regs.pipehandler + PIPEHANDLER_LOCK_ACK) & PIPEHANDLER_LOCK_EN) {
966 dev_warn(atcphy->dev, "Pipehandler already locked\n");
967
968 ret = atcphy_pipehandler_unlock(atcphy);
969 if (ret) {
970 dev_err(atcphy->dev, "Failed to unlock pipehandler\n");
971 return ret;
972 }
973 }
974
975 return 0;
976 }
977
atcphy_configure_pipehandler_usb3(struct apple_atcphy * atcphy,bool host)978 static int atcphy_configure_pipehandler_usb3(struct apple_atcphy *atcphy, bool host)
979 {
980 int ret;
981 u32 reg;
982
983 ret = atcphy_pipehandler_check(atcphy);
984 if (ret)
985 return ret;
986
987 /*
988 * Only host mode requires this unknown BIST sequence to work correctly, possibly due to
989 * some hardware quirk. Guest mode breaks if we try to apply this sequence.
990 */
991 if (host) {
992 /* Force disable link detection */
993 clear32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE_VALUES,
994 PIPEHANDLER_OVERRIDE_VAL_RXDETECT0 | PIPEHANDLER_OVERRIDE_VAL_RXDETECT1);
995 set32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE,
996 PIPEHANDLER_OVERRIDE_RXVALID);
997 set32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE,
998 PIPEHANDLER_OVERRIDE_RXDETECT);
999
1000 ret = atcphy_pipehandler_lock(atcphy);
1001 if (ret) {
1002 dev_err(atcphy->dev, "Failed to lock pipehandler");
1003 return ret;
1004 }
1005
1006 /* BIST dance */
1007 core_set32(atcphy, ACIOPHY_TOP_BIST_PHY_CFG0,
1008 ACIOPHY_TOP_BIST_PHY_CFG0_LN0_RESET_N);
1009 core_set32(atcphy, ACIOPHY_TOP_BIST_OV_CFG, ACIOPHY_TOP_BIST_OV_CFG_LN0_RESET_N_OV);
1010 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_TOP_PHY_STAT, reg,
1011 !(reg & ACIOPHY_TOP_PHY_STAT_LN0_UNK23), 10, 10000);
1012 if (ret)
1013 dev_warn(atcphy->dev,
1014 "Timed out waiting for ACIOPHY_TOP_PHY_STAT_LN0_UNK23\n");
1015
1016 core_set32(atcphy, ACIOPHY_TOP_BIST_READ_CTRL,
1017 ACIOPHY_TOP_BIST_READ_CTRL_LN0_PHY_STATUS_RE);
1018 core_clear32(atcphy, ACIOPHY_TOP_BIST_READ_CTRL,
1019 ACIOPHY_TOP_BIST_READ_CTRL_LN0_PHY_STATUS_RE);
1020
1021 core_mask32(atcphy, ACIOPHY_TOP_BIST_PHY_CFG1,
1022 ACIOPHY_TOP_BIST_PHY_CFG1_LN0_PWR_DOWN,
1023 FIELD_PREP(ACIOPHY_TOP_BIST_PHY_CFG1_LN0_PWR_DOWN, 3));
1024
1025 core_set32(atcphy, ACIOPHY_TOP_BIST_OV_CFG,
1026 ACIOPHY_TOP_BIST_OV_CFG_LN0_PWR_DOWN_OV);
1027 core_set32(atcphy, ACIOPHY_TOP_BIST_CIOPHY_CFG1,
1028 ACIOPHY_TOP_BIST_CIOPHY_CFG1_CLK_EN);
1029 core_set32(atcphy, ACIOPHY_TOP_BIST_CIOPHY_CFG1,
1030 ACIOPHY_TOP_BIST_CIOPHY_CFG1_BIST_EN);
1031 writel(0, atcphy->regs.core + ACIOPHY_TOP_BIST_CIOPHY_CFG1);
1032
1033 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_TOP_PHY_STAT, reg,
1034 (reg & ACIOPHY_TOP_PHY_STAT_LN0_UNK0), 10, 10000);
1035 if (ret)
1036 dev_warn(atcphy->dev,
1037 "timed out waiting for ACIOPHY_TOP_PHY_STAT_LN0_UNK0\n");
1038
1039 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_TOP_PHY_STAT, reg,
1040 !(reg & ACIOPHY_TOP_PHY_STAT_LN0_UNK23), 10, 10000);
1041 if (ret)
1042 dev_warn(atcphy->dev,
1043 "timed out waiting for ACIOPHY_TOP_PHY_STAT_LN0_UNK23\n");
1044
1045 /* Clear reset for non-selected USB3 PHY (?) */
1046 mask32(atcphy->regs.pipehandler + PIPEHANDLER_NONSELECTED_OVERRIDE,
1047 PIPEHANDLER_NATIVE_POWER_DOWN, FIELD_PREP(PIPEHANDLER_NATIVE_POWER_DOWN, 3));
1048 clear32(atcphy->regs.pipehandler + PIPEHANDLER_NONSELECTED_OVERRIDE,
1049 PIPEHANDLER_NATIVE_RESET);
1050
1051 /* More BIST stuff (?) */
1052 writel(0, atcphy->regs.core + ACIOPHY_TOP_BIST_OV_CFG);
1053 core_set32(atcphy, ACIOPHY_TOP_BIST_CIOPHY_CFG1,
1054 ACIOPHY_TOP_BIST_CIOPHY_CFG1_CLK_EN);
1055 core_set32(atcphy, ACIOPHY_TOP_BIST_CIOPHY_CFG1,
1056 ACIOPHY_TOP_BIST_CIOPHY_CFG1_BIST_EN);
1057 }
1058
1059 /* Configure PIPE mux to USB3 PHY */
1060 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1061 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_OFF));
1062 udelay(10);
1063 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_DATA,
1064 FIELD_PREP(PIPEHANDLER_MUX_CTRL_DATA, PIPEHANDLER_MUX_CTRL_DATA_USB3));
1065 udelay(10);
1066 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1067 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_USB3));
1068 udelay(10);
1069
1070 /* Remove link detection override */
1071 clear32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE, PIPEHANDLER_OVERRIDE_RXVALID);
1072 clear32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE, PIPEHANDLER_OVERRIDE_RXDETECT);
1073
1074 /* Pipehandler was only locked when the BIST sequence was applied for host mode */
1075 if (host) {
1076 ret = atcphy_pipehandler_unlock(atcphy);
1077 if (ret)
1078 dev_warn(atcphy->dev, "Failed to unlock pipehandler");
1079 }
1080
1081 return 0;
1082 }
1083
atcphy_configure_pipehandler_dummy(struct apple_atcphy * atcphy)1084 static int atcphy_configure_pipehandler_dummy(struct apple_atcphy *atcphy)
1085 {
1086 int ret;
1087
1088 ret = atcphy_pipehandler_check(atcphy);
1089 if (ret)
1090 return ret;
1091
1092 /* Force disable link detection */
1093 clear32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE_VALUES,
1094 PIPEHANDLER_OVERRIDE_VAL_RXDETECT0 | PIPEHANDLER_OVERRIDE_VAL_RXDETECT1);
1095 set32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE, PIPEHANDLER_OVERRIDE_RXVALID);
1096 set32(atcphy->regs.pipehandler + PIPEHANDLER_OVERRIDE, PIPEHANDLER_OVERRIDE_RXDETECT);
1097
1098 ret = atcphy_pipehandler_lock(atcphy);
1099 if (ret)
1100 dev_warn(atcphy->dev, "Failed to lock pipehandler");
1101
1102 /* Switch to dummy PHY */
1103 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1104 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_OFF));
1105 udelay(10);
1106 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_DATA,
1107 FIELD_PREP(PIPEHANDLER_MUX_CTRL_DATA, PIPEHANDLER_MUX_CTRL_DATA_DUMMY));
1108 udelay(10);
1109 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1110 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_DUMMY));
1111 udelay(10);
1112
1113 ret = atcphy_pipehandler_unlock(atcphy);
1114 if (ret)
1115 dev_warn(atcphy->dev, "Failed to unlock pipehandler");
1116
1117 mask32(atcphy->regs.pipehandler + PIPEHANDLER_NONSELECTED_OVERRIDE,
1118 PIPEHANDLER_NATIVE_POWER_DOWN, FIELD_PREP(PIPEHANDLER_NATIVE_POWER_DOWN, 2));
1119 set32(atcphy->regs.pipehandler + PIPEHANDLER_NONSELECTED_OVERRIDE,
1120 PIPEHANDLER_NATIVE_RESET);
1121
1122 return 0;
1123 }
1124
atcphy_configure_pipehandler(struct apple_atcphy * atcphy,bool host)1125 static int atcphy_configure_pipehandler(struct apple_atcphy *atcphy, bool host)
1126 {
1127 int ret;
1128
1129 lockdep_assert_held(&atcphy->lock);
1130
1131 switch (atcphy_modes[atcphy->mode].pipehandler_state) {
1132 case ATCPHY_PIPEHANDLER_STATE_USB3:
1133 ret = atcphy_configure_pipehandler_usb3(atcphy, host);
1134 atcphy->pipehandler_up = true;
1135 break;
1136 case ATCPHY_PIPEHANDLER_STATE_USB4:
1137 dev_warn(atcphy->dev,
1138 "ATCPHY_PIPEHANDLER_STATE_USB4 not implemented; falling back to USB2\n");
1139 ret = atcphy_configure_pipehandler_dummy(atcphy);
1140 atcphy->pipehandler_up = false;
1141 break;
1142 default:
1143 ret = -EINVAL;
1144 }
1145
1146 return ret;
1147 }
1148
atcphy_setup_pipehandler(struct apple_atcphy * atcphy)1149 static void atcphy_setup_pipehandler(struct apple_atcphy *atcphy)
1150 {
1151 lockdep_assert_held(&atcphy->lock);
1152
1153 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1154 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_OFF));
1155 udelay(10);
1156 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_DATA,
1157 FIELD_PREP(PIPEHANDLER_MUX_CTRL_DATA, PIPEHANDLER_MUX_CTRL_DATA_DUMMY));
1158 udelay(10);
1159 mask32(atcphy->regs.pipehandler + PIPEHANDLER_MUX_CTRL, PIPEHANDLER_MUX_CTRL_CLK,
1160 FIELD_PREP(PIPEHANDLER_MUX_CTRL_CLK, PIPEHANDLER_MUX_CTRL_CLK_DUMMY));
1161 udelay(10);
1162 }
1163
atcphy_configure_lanes(struct apple_atcphy * atcphy,enum atcphy_mode mode)1164 static void atcphy_configure_lanes(struct apple_atcphy *atcphy, enum atcphy_mode mode)
1165 {
1166 const struct atcphy_mode_configuration *mode_cfg = atcphy_get_mode_config(atcphy, mode);
1167
1168 core_mask32(atcphy, ACIOPHY_LANE_MODE, ACIOPHY_LANE_MODE_RX0,
1169 FIELD_PREP(ACIOPHY_LANE_MODE_RX0, mode_cfg->lane_mode[0]));
1170 core_mask32(atcphy, ACIOPHY_LANE_MODE, ACIOPHY_LANE_MODE_TX0,
1171 FIELD_PREP(ACIOPHY_LANE_MODE_TX0, mode_cfg->lane_mode[0]));
1172 core_mask32(atcphy, ACIOPHY_LANE_MODE, ACIOPHY_LANE_MODE_RX1,
1173 FIELD_PREP(ACIOPHY_LANE_MODE_RX1, mode_cfg->lane_mode[1]));
1174 core_mask32(atcphy, ACIOPHY_LANE_MODE, ACIOPHY_LANE_MODE_TX1,
1175 FIELD_PREP(ACIOPHY_LANE_MODE_TX1, mode_cfg->lane_mode[1]));
1176 core_mask32(atcphy, ACIOPHY_CROSSBAR, ACIOPHY_CROSSBAR_PROTOCOL,
1177 FIELD_PREP(ACIOPHY_CROSSBAR_PROTOCOL, mode_cfg->crossbar));
1178
1179 if (mode_cfg->set_swap)
1180 core_set32(atcphy, ATCPHY_MISC, ATCPHY_MISC_LANE_SWAP);
1181 else
1182 core_clear32(atcphy, ATCPHY_MISC, ATCPHY_MISC_LANE_SWAP);
1183
1184 core_mask32(atcphy, ACIOPHY_CROSSBAR, ACIOPHY_CROSSBAR_DP_SINGLE_PMA,
1185 FIELD_PREP(ACIOPHY_CROSSBAR_DP_SINGLE_PMA, mode_cfg->crossbar_dp_single_pma));
1186 if (mode_cfg->crossbar_dp_both_pma)
1187 core_set32(atcphy, ACIOPHY_CROSSBAR, ACIOPHY_CROSSBAR_DP_BOTH_PMA);
1188 else
1189 core_clear32(atcphy, ACIOPHY_CROSSBAR, ACIOPHY_CROSSBAR_DP_BOTH_PMA);
1190
1191 if (mode_cfg->dp_lane[0]) {
1192 core_set32(atcphy, LN0_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1193 LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV);
1194 udelay(10);
1195 core_clear32(atcphy, LN0_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1196 LN_AUSPMA_RX_TOP_PMAFSM_PCS_REQ);
1197 } else {
1198 core_clear32(atcphy, LN0_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1199 LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV);
1200 udelay(10);
1201 }
1202
1203 if (mode_cfg->dp_lane[1]) {
1204 core_set32(atcphy, LN1_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1205 LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV);
1206 udelay(10);
1207 core_clear32(atcphy, LN1_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1208 LN_AUSPMA_RX_TOP_PMAFSM_PCS_REQ);
1209 } else {
1210 core_clear32(atcphy, LN1_AUSPMA_RX_TOP + LN_AUSPMA_RX_TOP_PMAFSM,
1211 LN_AUSPMA_RX_TOP_PMAFSM_PCS_OV);
1212 udelay(10);
1213 }
1214 }
1215
atcphy_enable_dp_aux(struct apple_atcphy * atcphy)1216 static void atcphy_enable_dp_aux(struct apple_atcphy *atcphy)
1217 {
1218 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTXPHY_PMA_LANE_RESET_N);
1219 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTXPHY_PMA_LANE_RESET_N_OV);
1220
1221 core_mask32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPRX_PCLK_SELECT,
1222 FIELD_PREP(DPRX_PCLK_SELECT, 1));
1223 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPRX_PCLK_ENABLE);
1224
1225 core_mask32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK1_SELECT,
1226 FIELD_PREP(DPTX_PCLK1_SELECT, 1));
1227 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK1_ENABLE);
1228
1229 core_mask32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK2_SELECT,
1230 FIELD_PREP(DPTX_PCLK2_SELECT, 1));
1231 core_set32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK2_ENABLE);
1232
1233 core_set32(atcphy, ACIOPHY_PLL_COMMON_CTRL,
1234 ACIOPHY_PLL_WAIT_FOR_CMN_READY_BEFORE_RESET_EXIT);
1235
1236 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_CLAMP_EN);
1237 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_SLEEP_B_SML_IN);
1238 udelay(10);
1239 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_SLEEP_B_BIG_IN);
1240 udelay(10);
1241 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_CLAMP_EN);
1242 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_PWN_DOWN);
1243 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_TXTERM_CODEMSB);
1244 mask32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_TXTERM_CODE,
1245 FIELD_PREP(LPDPTX_TXTERM_CODE, 0x16));
1246
1247 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_LDO_CTRL, 0x1c00);
1248 mask32(atcphy->regs.lpdptx + LPDPTX_AUX_SHM_CFG_BLK_AUX_CTRL_REG1, LPDPTX_CFG_PMA_PHYS_ADJ,
1249 FIELD_PREP(LPDPTX_CFG_PMA_PHYS_ADJ, 5));
1250 set32(atcphy->regs.lpdptx + LPDPTX_AUX_SHM_CFG_BLK_AUX_CTRL_REG1,
1251 LPDPTX_CFG_PMA_PHYS_ADJ_OV);
1252
1253 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_MARGIN,
1254 LPDPTX_MARGIN_RCAL_RXOFFSET_EN);
1255
1256 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_CTRL, LPDPTX_BLK_AUX_CTRL_PWRDN);
1257 set32(atcphy->regs.lpdptx + LPDPTX_AUX_SHM_CFG_BLK_AUX_CTRL_REG0,
1258 LPDPTX_CFG_PMA_AUX_SEL_LF_DATA);
1259 mask32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_CTRL, LPDPTX_BLK_AUX_RXOFFSET,
1260 FIELD_PREP(LPDPTX_BLK_AUX_RXOFFSET, 3));
1261
1262 mask32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_MARGIN, LPDPTX_AUX_MARGIN_RCAL_TXSWING,
1263 FIELD_PREP(LPDPTX_AUX_MARGIN_RCAL_TXSWING, 12));
1264
1265 atcphy->dp_link_rate = -1;
1266 }
1267
atcphy_disable_dp_aux(struct apple_atcphy * atcphy)1268 static void atcphy_disable_dp_aux(struct apple_atcphy *atcphy)
1269 {
1270 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_PWN_DOWN);
1271 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CFG_BLK_AUX_CTRL, LPDPTX_BLK_AUX_CTRL_PWRDN);
1272 set32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_AUX_CLAMP_EN);
1273 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_SLEEP_B_SML_IN);
1274 udelay(10);
1275 clear32(atcphy->regs.lpdptx + LPDPTX_AUX_CONTROL, LPDPTX_SLEEP_B_BIG_IN);
1276 udelay(10);
1277
1278 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTXPHY_PMA_LANE_RESET_N);
1279 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPRX_PCLK_ENABLE);
1280 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK1_ENABLE);
1281 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DPTX_PCLK2_ENABLE);
1282 }
1283
atcphy_dp_configure_lane(struct apple_atcphy * atcphy,enum atcphy_lane lane,const struct atcphy_dp_link_rate_configuration * cfg)1284 static int atcphy_dp_configure_lane(struct apple_atcphy *atcphy, enum atcphy_lane lane,
1285 const struct atcphy_dp_link_rate_configuration *cfg)
1286 {
1287 void __iomem *tx_shm, *rx_shm, *rx_top;
1288 unsigned int tx_cal_code;
1289
1290 lockdep_assert_held(&atcphy->lock);
1291
1292 switch (lane) {
1293 case APPLE_ATCPHY_LANE_0:
1294 tx_shm = atcphy->regs.core + LN0_AUSPMA_TX_SHM;
1295 rx_shm = atcphy->regs.core + LN0_AUSPMA_RX_SHM;
1296 rx_top = atcphy->regs.core + LN0_AUSPMA_RX_TOP;
1297 break;
1298 case APPLE_ATCPHY_LANE_1:
1299 tx_shm = atcphy->regs.core + LN1_AUSPMA_TX_SHM;
1300 rx_shm = atcphy->regs.core + LN1_AUSPMA_RX_SHM;
1301 rx_top = atcphy->regs.core + LN1_AUSPMA_RX_TOP;
1302 break;
1303 default:
1304 return -EINVAL;
1305 }
1306
1307 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_EN_SML);
1308 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_EN_SML_OV);
1309 udelay(10);
1310
1311 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_EN_BIG);
1312 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_EN_BIG_OV);
1313 udelay(10);
1314
1315 if (cfg->txa_ldoclk_bypass) {
1316 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_SML);
1317 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_SML_OV);
1318 udelay(10);
1319
1320 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_BIG);
1321 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_BIG_OV);
1322 udelay(10);
1323 } else {
1324 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_SML);
1325 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_SML_OV);
1326 udelay(10);
1327
1328 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_BIG);
1329 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_LDOCLK, LN_LDOCLK_BYPASS_BIG_OV);
1330 udelay(10);
1331 }
1332
1333 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_SEL_OV);
1334 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_EN);
1335 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_EN_OV);
1336 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_CLR);
1337 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG0, LN_BYTECLK_RESET_SYNC_CLR_OV);
1338
1339 if (cfg->txa_div2_en)
1340 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_EN);
1341 else
1342 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_EN);
1343 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_EN_OV);
1344 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_CLK_EN);
1345 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_CLK_EN_OV);
1346 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_RESET);
1347 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_CFG_MAIN_REG1, LN_TXA_DIV2_RESET_OV);
1348
1349 mask32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_CAL_CTRL_BASE,
1350 FIELD_PREP(LN_TXA_CAL_CTRL_BASE, 0xf));
1351 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_CAL_CTRL_BASE_OV);
1352
1353 tx_cal_code = FIELD_GET(AUS_UNK_A20_TX_CAL_CODE, readl(atcphy->regs.core + AUS_UNK_A20));
1354 mask32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_CAL_CTRL,
1355 FIELD_PREP(LN_TXA_CAL_CTRL, (1 << tx_cal_code) - 1));
1356 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_CAL_CTRL_OV);
1357
1358 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG2, LN_TXA_MARGIN);
1359 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG2, LN_TXA_MARGIN_OV);
1360 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG2, LN_TXA_MARGIN_2R);
1361 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG2, LN_TXA_MARGIN_2R_OV);
1362
1363 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST);
1364 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_OV);
1365 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_2R);
1366 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_2R_OV);
1367 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_4R);
1368 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_POST_4R_OV);
1369 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE);
1370 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_OV);
1371 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_2R);
1372 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_2R_OV);
1373 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_4R);
1374 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG3, LN_TXA_MARGIN_PRE_4R_OV);
1375
1376 clear32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_HIZ);
1377 set32(tx_shm + LN_AUSPMA_TX_SHM_TXA_IMP_REG0, LN_TXA_HIZ_OV);
1378
1379 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_AFE_CTRL1, LN_RX_DIV20_RESET_N);
1380 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_AFE_CTRL1, LN_RX_DIV20_RESET_N_OV);
1381 udelay(10);
1382
1383 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_AFE_CTRL1, LN_RX_DIV20_RESET_N);
1384
1385 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_BYTECLK_RESET_SYNC_EN);
1386 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_BYTECLK_RESET_SYNC_EN_OV);
1387
1388 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_TX_CAL_CODE,
1389 FIELD_PREP(LN_TX_CAL_CODE, tx_cal_code));
1390 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_TX_CAL_CODE_OV);
1391
1392 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DLY_CTRL_TAPGEN,
1393 FIELD_PREP(LN_TX_CLK_DLY_CTRL_TAPGEN, 3));
1394
1395 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL10, LN_DTVREG_ADJUST);
1396 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_DTVREG_ADJUST_OV);
1397
1398 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_RXTERM_EN);
1399 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_RXTERM_EN_OV);
1400
1401 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_TEST_EN);
1402 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_TEST_EN_OV);
1403
1404 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_TEST_RXLPBKDT_EN);
1405 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_TEST_RXLPBKDT_EN_OV);
1406 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_LPBKIN_DATA,
1407 FIELD_PREP(LN_VREF_LPBKIN_DATA, 3));
1408 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BIAS_SEL,
1409 FIELD_PREP(LN_VREF_BIAS_SEL, 2));
1410 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BIAS_SEL_OV);
1411 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_ADJUST_GRAY,
1412 FIELD_PREP(LN_VREF_ADJUST_GRAY, 0x18));
1413 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_ADJUST_GRAY_OV);
1414 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_EN);
1415 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_EN_OV);
1416 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BOOST_EN);
1417 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BOOST_EN_OV);
1418 udelay(10);
1419
1420 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BOOST_EN);
1421 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_VREF_CTRL22, LN_VREF_BOOST_EN_OV);
1422 udelay(10);
1423
1424 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_TX_PRE_EN);
1425 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_TX_PRE_EN_OV);
1426 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_TX_PST1_EN);
1427 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_TX_PST1_EN_OV);
1428
1429 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_PBIAS_EN);
1430 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_PBIAS_EN_OV);
1431
1432 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_RXTERM_PULLUP_LEAK_EN);
1433 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_SAVOS_CTRL16, LN_RXTERM_PULLUP_LEAK_EN_OV);
1434
1435 set32(rx_top + LN_AUSPMA_RX_TOP_TJ_CFG_RX_TXMODE, LN_RX_TXMODE);
1436
1437 if (cfg->txa_div2_en)
1438 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_EN);
1439 else
1440 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_EN);
1441 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_EN_OV);
1442
1443 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_RST);
1444 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_CLK_DIV2_RST_OV);
1445
1446 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_HRCLK_SEL);
1447 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_HRCLK_SEL_OV);
1448
1449 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN);
1450 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_OV);
1451 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_LSB);
1452 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_LSB_OV);
1453 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_P1);
1454 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_P1_OV);
1455 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_P1_LSB);
1456 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL17, LN_TX_MARGIN_P1_LSB_OV);
1457
1458 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_P1_CODE);
1459 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_P1_CODE_OV);
1460 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_P1_LSB_CODE);
1461 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_P1_LSB_CODE_OV);
1462 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_MARGIN_PRE);
1463 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_MARGIN_PRE_OV);
1464 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_MARGIN_PRE_LSB);
1465 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_MARGIN_PRE_LSB_OV);
1466 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_PRE_LSB_CODE);
1467 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_PRE_LSB_CODE_OV);
1468 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_PRE_CODE);
1469 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TX_CTRL18, LN_TX_PRE_CODE_OV);
1470
1471 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11, LN_DTVREG_SML_EN);
1472 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11, LN_DTVREG_SML_EN_OV);
1473 udelay(10);
1474
1475 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11, LN_DTVREG_BIG_EN);
1476 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL11, LN_DTVREG_BIG_EN_OV);
1477 udelay(10);
1478
1479 mask32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL10, LN_DTVREG_ADJUST,
1480 FIELD_PREP(LN_DTVREG_ADJUST, 0xa));
1481 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL13, LN_DTVREG_ADJUST_OV);
1482 udelay(10);
1483
1484 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_EN);
1485 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_TERM_CTRL19, LN_TX_EN_OV);
1486 udelay(10);
1487
1488 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_CTLE_CTRL0, LN_TX_CLK_EN);
1489 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_CTLE_CTRL0, LN_TX_CLK_EN_OV);
1490
1491 clear32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_BYTECLK_RESET_SYNC_CLR);
1492 set32(rx_shm + LN_AUSPMA_RX_SHM_TJ_RXA_DFE_CTRL12, LN_TX_BYTECLK_RESET_SYNC_CLR_OV);
1493
1494 return 0;
1495 }
1496
atcphy_auspll_apb_command(struct apple_atcphy * atcphy,u32 command)1497 static int atcphy_auspll_apb_command(struct apple_atcphy *atcphy, u32 command)
1498 {
1499 int ret;
1500 u32 reg;
1501
1502 reg = readl(atcphy->regs.core + AUSPLL_APB_CMD_OVERRIDE);
1503 reg &= ~AUSPLL_APB_CMD_OVERRIDE_CMD;
1504 reg |= FIELD_PREP(AUSPLL_APB_CMD_OVERRIDE_CMD, command);
1505 reg |= AUSPLL_APB_CMD_OVERRIDE_REQ;
1506 reg |= AUSPLL_APB_CMD_OVERRIDE_UNK28;
1507 writel(reg, atcphy->regs.core + AUSPLL_APB_CMD_OVERRIDE);
1508
1509 ret = readl_poll_timeout(atcphy->regs.core + AUSPLL_APB_CMD_OVERRIDE, reg,
1510 (reg & AUSPLL_APB_CMD_OVERRIDE_ACK), 10, 10000);
1511 if (ret)
1512 dev_warn(atcphy->dev, "AUSPLL APB command was not acked\n");
1513
1514 core_clear32(atcphy, AUSPLL_APB_CMD_OVERRIDE, AUSPLL_APB_CMD_OVERRIDE_REQ);
1515
1516 return 0;
1517 }
1518
atcphy_dp_configure(struct apple_atcphy * atcphy,enum atcphy_dp_link_rate lr)1519 static int atcphy_dp_configure(struct apple_atcphy *atcphy, enum atcphy_dp_link_rate lr)
1520 {
1521 const struct atcphy_dp_link_rate_configuration *cfg;
1522 const struct atcphy_mode_configuration *mode_cfg;
1523 int ret;
1524 u32 reg;
1525
1526 guard(mutex)(&atcphy->lock);
1527 mode_cfg = atcphy_get_mode_config(atcphy, atcphy->mode);
1528 cfg = &dp_lr_config[lr];
1529
1530 if (atcphy->dp_link_rate == lr)
1531 return 0;
1532
1533 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_CMN_SHM_STS_REG0, reg,
1534 (reg & ACIOPHY_CMN_SHM_STS_REG0_CMD_READY), 10, 10000);
1535 if (ret) {
1536 dev_err(atcphy->dev, "ACIOPHY_CMN_SHM_STS_REG0_CMD_READY not set.\n");
1537 return ret;
1538 }
1539
1540 core_clear32(atcphy, AUSPLL_FREQ_CFG, AUSPLL_FREQ_REFCLK);
1541
1542 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_FREQ_COUNT_TARGET,
1543 FIELD_PREP(AUSPLL_FD_FREQ_COUNT_TARGET, cfg->freqinit_count_target));
1544 core_clear32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_FBDIVN_HALF);
1545 core_clear32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_REV_DIVN);
1546 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KI_MAN, FIELD_PREP(AUSPLL_FD_KI_MAN, 8));
1547 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KI_EXP, FIELD_PREP(AUSPLL_FD_KI_EXP, 3));
1548 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KP_MAN, FIELD_PREP(AUSPLL_FD_KP_MAN, 8));
1549 core_mask32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KP_EXP, FIELD_PREP(AUSPLL_FD_KP_EXP, 7));
1550 core_clear32(atcphy, AUSPLL_FREQ_DESC_A, AUSPLL_FD_KPKI_SCALE_HBW);
1551
1552 core_mask32(atcphy, AUSPLL_FREQ_DESC_B, AUSPLL_FD_FBDIVN_FRAC_DEN,
1553 FIELD_PREP(AUSPLL_FD_FBDIVN_FRAC_DEN, cfg->fbdivn_frac_den));
1554 core_mask32(atcphy, AUSPLL_FREQ_DESC_B, AUSPLL_FD_FBDIVN_FRAC_NUM,
1555 FIELD_PREP(AUSPLL_FD_FBDIVN_FRAC_NUM, cfg->fbdivn_frac_num));
1556
1557 core_clear32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_SDM_SSC_STEP);
1558 core_clear32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_SDM_SSC_EN);
1559 core_mask32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_PCLK_DIV_SEL,
1560 FIELD_PREP(AUSPLL_FD_PCLK_DIV_SEL, cfg->pclk_div_sel));
1561 core_mask32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_LFSDM_DIV,
1562 FIELD_PREP(AUSPLL_FD_LFSDM_DIV, 1));
1563 core_mask32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_LFCLK_CTRL,
1564 FIELD_PREP(AUSPLL_FD_LFCLK_CTRL, cfg->lfclk_ctrl));
1565 core_mask32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_VCLK_OP_DIVN,
1566 FIELD_PREP(AUSPLL_FD_VCLK_OP_DIVN, cfg->vclk_op_divn));
1567 core_set32(atcphy, AUSPLL_FREQ_DESC_C, AUSPLL_FD_VCLK_PRE_DIVN);
1568
1569 core_mask32(atcphy, AUSPLL_CLKOUT_DIV, AUSPLL_CLKOUT_PLLA_REFBUFCLK_DI,
1570 FIELD_PREP(AUSPLL_CLKOUT_PLLA_REFBUFCLK_DI, 7));
1571
1572 if (cfg->plla_clkout_vreg_bypass)
1573 core_set32(atcphy, AUSPLL_CLKOUT_DTC_VREG, AUSPLL_DTC_VREG_BYPASS);
1574 else
1575 core_clear32(atcphy, AUSPLL_CLKOUT_DTC_VREG, AUSPLL_DTC_VREG_BYPASS);
1576
1577 core_set32(atcphy, AUSPLL_BGR, AUSPLL_BGR_CTRL_AVAIL);
1578
1579 core_set32(atcphy, AUSPLL_CLKOUT_MASTER, AUSPLL_CLKOUT_MASTER_PCLK_DRVR_EN);
1580 core_set32(atcphy, AUSPLL_CLKOUT_MASTER, AUSPLL_CLKOUT_MASTER_PCLK2_DRVR_EN);
1581 core_set32(atcphy, AUSPLL_CLKOUT_MASTER, AUSPLL_CLKOUT_MASTER_REFBUFCLK_DRVR_EN);
1582
1583 ret = atcphy_auspll_apb_command(atcphy, 0);
1584 if (ret)
1585 return ret;
1586
1587 ret = readl_poll_timeout(atcphy->regs.core + ACIOPHY_DP_PCLK_STAT, reg,
1588 (reg & ACIOPHY_AUSPLL_LOCK), 10, 10000);
1589 if (ret) {
1590 dev_err(atcphy->dev, "ACIOPHY_DP_PCLK did not lock.\n");
1591 return ret;
1592 }
1593
1594 ret = atcphy_auspll_apb_command(atcphy, 0x2800);
1595 if (ret)
1596 return ret;
1597
1598 if (mode_cfg->dp_lane[0]) {
1599 ret = atcphy_dp_configure_lane(atcphy, APPLE_ATCPHY_LANE_0, cfg);
1600 if (ret)
1601 return ret;
1602 }
1603
1604 if (mode_cfg->dp_lane[1]) {
1605 ret = atcphy_dp_configure_lane(atcphy, APPLE_ATCPHY_LANE_1, cfg);
1606 if (ret)
1607 return ret;
1608 }
1609
1610 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DP_PMA_BYTECLK_RESET);
1611 core_clear32(atcphy, ACIOPHY_LANE_DP_CFG_BLK_TX_DP_CTRL0, DP_MAC_DIV20_CLK_SEL);
1612
1613 atcphy->dp_link_rate = lr;
1614 return 0;
1615 }
1616
atcphy_usb2_power_off(struct apple_atcphy * atcphy)1617 static void atcphy_usb2_power_off(struct apple_atcphy *atcphy)
1618 {
1619 /* Disable the PHY, this clears USB2PHY_USBCTL_RUN */
1620 writel(USB2PHY_USBCTL_ISOLATION, atcphy->regs.usb2phy + USB2PHY_USBCTL);
1621 udelay(10);
1622
1623 /* Switch the PHY to low power mode */
1624 set32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_SIDDQ);
1625 udelay(10);
1626
1627 /* Enable all resets */
1628 set32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_PORT_RESET);
1629 udelay(10);
1630 set32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_RESET);
1631 udelay(10);
1632 clear32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_APB_RESET_N);
1633 udelay(10);
1634 set32(atcphy->regs.usb2phy + USB2PHY_MISCTUNE, USB2PHY_MISCTUNE_APBCLK_GATE_OFF);
1635 set32(atcphy->regs.usb2phy + USB2PHY_MISCTUNE, USB2PHY_MISCTUNE_REFCLK_GATE_OFF);
1636 }
1637
atcphy_power_off(struct apple_atcphy * atcphy)1638 static int atcphy_power_off(struct apple_atcphy *atcphy)
1639 {
1640 u32 reg;
1641 int ret;
1642
1643 atcphy_disable_dp_aux(atcphy);
1644
1645 /* Enable all reset lines */
1646 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_PHY_RESET_N);
1647 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_CLAMP_EN);
1648 core_clear32(atcphy, ATCPHY_MISC, ATCPHY_MISC_RESET_N | ATCPHY_MISC_LANE_SWAP);
1649 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_APB_RESET_N);
1650
1651 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_SLEEP_BIG);
1652 ret = readl_poll_timeout(atcphy->regs.core + ATCPHY_POWER_STAT, reg,
1653 !(reg & ATCPHY_POWER_SLEEP_BIG), 10, 1000);
1654 if (ret) {
1655 dev_err(atcphy->dev, "Failed to sleep atcphy \"big\"\n");
1656 return ret;
1657 }
1658
1659 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_SLEEP_SMALL);
1660 ret = readl_poll_timeout(atcphy->regs.core + ATCPHY_POWER_STAT, reg,
1661 !(reg & ATCPHY_POWER_SLEEP_SMALL), 10, 1000);
1662 if (ret) {
1663 dev_err(atcphy->dev, "Failed to sleep atcphy \"small\"\n");
1664 return ret;
1665 }
1666
1667 return 0;
1668 }
1669
atcphy_usb2_power_on(struct apple_atcphy * atcphy)1670 static void atcphy_usb2_power_on(struct apple_atcphy *atcphy)
1671 {
1672 set32(atcphy->regs.usb2phy + USB2PHY_SIG,
1673 USB2PHY_SIG_VBUSDET_FORCE_VAL | USB2PHY_SIG_VBUSDET_FORCE_EN |
1674 USB2PHY_SIG_VBUSVLDEXT_FORCE_VAL | USB2PHY_SIG_VBUSVLDEXT_FORCE_EN);
1675 udelay(10);
1676
1677 /* Take the PHY out of its low power state */
1678 clear32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_SIDDQ);
1679 udelay(10);
1680
1681 /* Release reset */
1682 clear32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_RESET);
1683 udelay(10);
1684 clear32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_PORT_RESET);
1685 udelay(10);
1686 set32(atcphy->regs.usb2phy + USB2PHY_CTL, USB2PHY_CTL_APB_RESET_N);
1687 udelay(10);
1688 clear32(atcphy->regs.usb2phy + USB2PHY_MISCTUNE, USB2PHY_MISCTUNE_APBCLK_GATE_OFF);
1689 clear32(atcphy->regs.usb2phy + USB2PHY_MISCTUNE, USB2PHY_MISCTUNE_REFCLK_GATE_OFF);
1690
1691 /* Enable the PHY */
1692 writel(USB2PHY_USBCTL_RUN, atcphy->regs.usb2phy + USB2PHY_USBCTL);
1693 }
1694
atcphy_power_on(struct apple_atcphy * atcphy)1695 static int atcphy_power_on(struct apple_atcphy *atcphy)
1696 {
1697 u32 reg;
1698 int ret;
1699
1700 atcphy_usb2_power_on(atcphy);
1701
1702 core_set32(atcphy, ATCPHY_MISC, ATCPHY_MISC_RESET_N);
1703
1704 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_SLEEP_SMALL);
1705 ret = readl_poll_timeout(atcphy->regs.core + ATCPHY_POWER_STAT, reg,
1706 reg & ATCPHY_POWER_SLEEP_SMALL, 100, 100000);
1707 if (ret) {
1708 dev_err(atcphy->dev, "failed to wakeup atcphy \"small\"\n");
1709 return ret;
1710 }
1711
1712 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_SLEEP_BIG);
1713 ret = readl_poll_timeout(atcphy->regs.core + ATCPHY_POWER_STAT, reg,
1714 reg & ATCPHY_POWER_SLEEP_BIG, 100, 100000);
1715 if (ret) {
1716 dev_err(atcphy->dev, "failed to wakeup atcphy \"big\"\n");
1717 return ret;
1718 }
1719
1720 core_clear32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_CLAMP_EN);
1721 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_APB_RESET_N);
1722
1723 return 0;
1724 }
1725
atcphy_configure(struct apple_atcphy * atcphy,enum atcphy_mode mode)1726 static int atcphy_configure(struct apple_atcphy *atcphy, enum atcphy_mode mode)
1727 {
1728 int ret = 0;
1729
1730 lockdep_assert_held(&atcphy->lock);
1731
1732 if (mode == APPLE_ATCPHY_MODE_OFF) {
1733 ret = atcphy_power_off(atcphy);
1734 atcphy->mode = mode;
1735 return ret;
1736 }
1737
1738 ret = atcphy_power_on(atcphy);
1739 if (ret)
1740 return ret;
1741
1742 atcphy_apply_tunables(atcphy, mode);
1743
1744 core_set32(atcphy, AUSPLL_FSM_CTRL, 0x1fe000);
1745 core_set32(atcphy, AUSPLL_APB_CMD_OVERRIDE, AUSPLL_APB_CMD_OVERRIDE_UNK28);
1746
1747 set32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_COMMON_SMALL_OV);
1748 udelay(10);
1749 set32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_COMMON_BIG_OV);
1750 udelay(10);
1751 set32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_COMMON_CLAMP_OV);
1752 udelay(10);
1753
1754 mask32(atcphy->regs.core + ACIOPHY_SLEEP_CTRL, ACIOPHY_SLEEP_CTRL_TX_SMALL_OV,
1755 FIELD_PREP(ACIOPHY_SLEEP_CTRL_TX_SMALL_OV, 3));
1756 udelay(10);
1757 mask32(atcphy->regs.core + ACIOPHY_SLEEP_CTRL, ACIOPHY_SLEEP_CTRL_TX_BIG_OV,
1758 FIELD_PREP(ACIOPHY_SLEEP_CTRL_TX_BIG_OV, 3));
1759 udelay(10);
1760 mask32(atcphy->regs.core + ACIOPHY_SLEEP_CTRL, ACIOPHY_SLEEP_CTRL_TX_CLAMP_OV,
1761 FIELD_PREP(ACIOPHY_SLEEP_CTRL_TX_CLAMP_OV, 3));
1762 udelay(10);
1763
1764 mask32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_RX_BIG_OV,
1765 FIELD_PREP(ACIOPHY_CFG0_RX_BIG_OV, 3));
1766 udelay(10);
1767 mask32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_RX_SMALL_OV,
1768 FIELD_PREP(ACIOPHY_CFG0_RX_SMALL_OV, 3));
1769 udelay(10);
1770 mask32(atcphy->regs.core + ACIOPHY_CFG0, ACIOPHY_CFG0_RX_CLAMP_OV,
1771 FIELD_PREP(ACIOPHY_CFG0_RX_CLAMP_OV, 3));
1772 udelay(10);
1773
1774 /* Setup AUX channel if DP altmode is requested */
1775 if (atcphy_modes[mode].enable_dp_aux)
1776 atcphy_enable_dp_aux(atcphy);
1777
1778 /* Enable clocks and configure lanes */
1779 core_set32(atcphy, CIO3PLL_CLK_CTRL, CIO3PLL_CLK_PCLK_EN);
1780 core_set32(atcphy, CIO3PLL_CLK_CTRL, CIO3PLL_CLK_REFCLK_EN);
1781 atcphy_configure_lanes(atcphy, mode);
1782
1783 /* Take the USB3 PHY out of reset */
1784 core_set32(atcphy, ATCPHY_POWER_CTRL, ATCPHY_POWER_PHY_RESET_N);
1785
1786 atcphy->mode = mode;
1787
1788 return 0;
1789 }
1790
atcphy_usb2_set_mode(struct phy * phy,enum phy_mode mode,int submode)1791 static int atcphy_usb2_set_mode(struct phy *phy, enum phy_mode mode, int submode)
1792 {
1793 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1794
1795 guard(mutex)(&atcphy->lock);
1796
1797 switch (mode) {
1798 case PHY_MODE_USB_HOST:
1799 set32(atcphy->regs.usb2phy + USB2PHY_SIG, USB2PHY_SIG_HOST);
1800 break;
1801 case PHY_MODE_USB_DEVICE:
1802 clear32(atcphy->regs.usb2phy + USB2PHY_SIG, USB2PHY_SIG_HOST);
1803 break;
1804 default:
1805 return -EINVAL;
1806 }
1807
1808 return 0;
1809 }
1810
1811 static const struct phy_ops apple_atc_usb2_phy_ops = {
1812 .owner = THIS_MODULE,
1813 .set_mode = atcphy_usb2_set_mode,
1814 };
1815
atcphy_usb3_power_off(struct phy * phy)1816 static int atcphy_usb3_power_off(struct phy *phy)
1817 {
1818 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1819 int ret;
1820
1821 guard(mutex)(&atcphy->lock);
1822
1823 ret = atcphy_configure_pipehandler_dummy(atcphy);
1824 if (ret)
1825 dev_warn(atcphy->dev, "Failed to switch pipe to dummy: %d", ret);
1826
1827 atcphy->pipehandler_up = false;
1828
1829 if (atcphy->mode != APPLE_ATCPHY_MODE_OFF)
1830 atcphy_configure(atcphy, APPLE_ATCPHY_MODE_OFF);
1831
1832 return 0;
1833 }
1834
atcphy_usb3_set_mode(struct phy * phy,enum phy_mode mode,int submode)1835 static int atcphy_usb3_set_mode(struct phy *phy, enum phy_mode mode, int submode)
1836 {
1837 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1838
1839 guard(mutex)(&atcphy->lock);
1840
1841 /*
1842 * We may get multiple calls to set_mode (for host mode e.g. at least one from the dwc3 glue
1843 * driver and then another one from the generic xhci code) but must only configure the
1844 * PIPE handler once.
1845 */
1846 if (atcphy->pipehandler_up)
1847 return 0;
1848
1849 switch (mode) {
1850 case PHY_MODE_USB_HOST:
1851 return atcphy_configure_pipehandler(atcphy, true);
1852 case PHY_MODE_USB_DEVICE:
1853 return atcphy_configure_pipehandler(atcphy, false);
1854 default:
1855 return -EINVAL;
1856 }
1857 }
1858
1859 static const struct phy_ops apple_atc_usb3_phy_ops = {
1860 .owner = THIS_MODULE,
1861 .power_off = atcphy_usb3_power_off,
1862 .set_mode = atcphy_usb3_set_mode,
1863 };
1864
atcphy_dpphy_set_mode(struct phy * phy,enum phy_mode mode,int submode)1865 static int atcphy_dpphy_set_mode(struct phy *phy, enum phy_mode mode, int submode)
1866 {
1867 /* Nothing to do here since the setup already happened in mux_set */
1868 if (mode == PHY_MODE_DP && submode == 0)
1869 return 0;
1870 return -EINVAL;
1871 }
1872
atcphy_dpphy_validate(struct phy * phy,enum phy_mode mode,int submode,union phy_configure_opts * opts_)1873 static int atcphy_dpphy_validate(struct phy *phy, enum phy_mode mode, int submode,
1874 union phy_configure_opts *opts_)
1875 {
1876 struct phy_configure_opts_dp *opts = &opts_->dp;
1877 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1878
1879 if (mode != PHY_MODE_DP)
1880 return -EINVAL;
1881 if (submode != 0)
1882 return -EINVAL;
1883
1884 switch (atcphy->mode) {
1885 case APPLE_ATCPHY_MODE_USB3_DP:
1886 opts->lanes = 2;
1887 break;
1888 case APPLE_ATCPHY_MODE_DP:
1889 opts->lanes = 4;
1890 break;
1891 default:
1892 opts->lanes = 0;
1893 }
1894
1895 return 0;
1896 }
1897
atcphy_dpphy_configure(struct phy * phy,union phy_configure_opts * opts_)1898 static int atcphy_dpphy_configure(struct phy *phy, union phy_configure_opts *opts_)
1899 {
1900 struct phy_configure_opts_dp *opts = &opts_->dp;
1901 struct apple_atcphy *atcphy = phy_get_drvdata(phy);
1902 enum atcphy_dp_link_rate link_rate;
1903
1904 if (opts->set_voltages)
1905 return -EINVAL;
1906 if (opts->set_lanes)
1907 return -EINVAL;
1908
1909 if (opts->set_rate) {
1910 switch (opts->link_rate) {
1911 case 1620:
1912 link_rate = ATCPHY_DP_LINK_RATE_RBR;
1913 break;
1914 case 2700:
1915 link_rate = ATCPHY_DP_LINK_RATE_HBR;
1916 break;
1917 case 5400:
1918 link_rate = ATCPHY_DP_LINK_RATE_HBR2;
1919 break;
1920 case 8100:
1921 link_rate = ATCPHY_DP_LINK_RATE_HBR3;
1922 break;
1923 case 0:
1924 return 0;
1925 default:
1926 dev_err(atcphy->dev, "Unsupported link rate: %d\n", opts->link_rate);
1927 return -EINVAL;
1928 }
1929
1930 return atcphy_dp_configure(atcphy, link_rate);
1931 }
1932
1933 return 0;
1934 }
1935
1936 static const struct phy_ops apple_atc_dp_phy_ops = {
1937 .owner = THIS_MODULE,
1938 .configure = atcphy_dpphy_configure,
1939 .validate = atcphy_dpphy_validate,
1940 .set_mode = atcphy_dpphy_set_mode,
1941 };
1942
atcphy_xlate(struct device * dev,const struct of_phandle_args * args)1943 static struct phy *atcphy_xlate(struct device *dev, const struct of_phandle_args *args)
1944 {
1945 struct apple_atcphy *atcphy = dev_get_drvdata(dev);
1946
1947 switch (args->args[0]) {
1948 case PHY_TYPE_USB2:
1949 return atcphy->phys.usb2;
1950 case PHY_TYPE_USB3:
1951 return atcphy->phys.usb3;
1952 case PHY_TYPE_DP:
1953 return atcphy->phys.dp;
1954 }
1955 return ERR_PTR(-ENODEV);
1956 }
1957
atcphy_probe_phy(struct apple_atcphy * atcphy)1958 static int atcphy_probe_phy(struct apple_atcphy *atcphy)
1959 {
1960 struct {
1961 struct phy **phy;
1962 const struct phy_ops *ops;
1963 } phys[] = {
1964 { &atcphy->phys.usb2, &apple_atc_usb2_phy_ops },
1965 { &atcphy->phys.usb3, &apple_atc_usb3_phy_ops },
1966 { &atcphy->phys.dp, &apple_atc_dp_phy_ops },
1967 };
1968
1969 for (int i = 0; i < ARRAY_SIZE(phys); i++) {
1970 *phys[i].phy = devm_phy_create(atcphy->dev, NULL, phys[i].ops);
1971 if (IS_ERR(*phys[i].phy))
1972 return PTR_ERR(*phys[i].phy);
1973 phy_set_drvdata(*phys[i].phy, atcphy);
1974 }
1975
1976 atcphy->phy_provider = devm_of_phy_provider_register(atcphy->dev, atcphy_xlate);
1977 if (IS_ERR(atcphy->phy_provider))
1978 return PTR_ERR(atcphy->phy_provider);
1979 return 0;
1980 }
1981
_atcphy_dwc3_reset_assert(struct apple_atcphy * atcphy)1982 static void _atcphy_dwc3_reset_assert(struct apple_atcphy *atcphy)
1983 {
1984 lockdep_assert_held(&atcphy->lock);
1985
1986 clear32(atcphy->regs.pipehandler + PIPEHANDLER_AON_GEN, PIPEHANDLER_AON_GEN_DWC3_RESET_N);
1987 set32(atcphy->regs.pipehandler + PIPEHANDLER_AON_GEN,
1988 PIPEHANDLER_AON_GEN_DWC3_FORCE_CLAMP_EN);
1989 }
1990
atcphy_dwc3_reset_assert(struct reset_controller_dev * rcdev,unsigned long id)1991 static int atcphy_dwc3_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
1992 {
1993 struct apple_atcphy *atcphy = container_of(rcdev, struct apple_atcphy, rcdev);
1994 int ret;
1995
1996 guard(mutex)(&atcphy->lock);
1997
1998 _atcphy_dwc3_reset_assert(atcphy);
1999
2000 if (atcphy->pipehandler_up) {
2001 ret = atcphy_configure_pipehandler_dummy(atcphy);
2002 if (ret)
2003 dev_warn(atcphy->dev, "Failed to switch PIPE to dummy: %d\n", ret);
2004 else
2005 atcphy->pipehandler_up = false;
2006 }
2007
2008 atcphy_usb2_power_off(atcphy);
2009
2010 return 0;
2011 }
2012
atcphy_dwc3_reset_deassert(struct reset_controller_dev * rcdev,unsigned long id)2013 static int atcphy_dwc3_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
2014 {
2015 struct apple_atcphy *atcphy = container_of(rcdev, struct apple_atcphy, rcdev);
2016
2017 guard(mutex)(&atcphy->lock);
2018
2019 clear32(atcphy->regs.pipehandler + PIPEHANDLER_AON_GEN,
2020 PIPEHANDLER_AON_GEN_DWC3_FORCE_CLAMP_EN);
2021 set32(atcphy->regs.pipehandler + PIPEHANDLER_AON_GEN, PIPEHANDLER_AON_GEN_DWC3_RESET_N);
2022
2023 return 0;
2024 }
2025
2026 const struct reset_control_ops atcphy_dwc3_reset_ops = {
2027 .assert = atcphy_dwc3_reset_assert,
2028 .deassert = atcphy_dwc3_reset_deassert,
2029 };
2030
atcphy_reset_xlate(struct reset_controller_dev * rcdev,const struct of_phandle_args * reset_spec)2031 static int atcphy_reset_xlate(struct reset_controller_dev *rcdev,
2032 const struct of_phandle_args *reset_spec)
2033 {
2034 return 0;
2035 }
2036
atcphy_probe_rcdev(struct apple_atcphy * atcphy)2037 static int atcphy_probe_rcdev(struct apple_atcphy *atcphy)
2038 {
2039 atcphy->rcdev.owner = THIS_MODULE;
2040 atcphy->rcdev.nr_resets = 1;
2041 atcphy->rcdev.ops = &atcphy_dwc3_reset_ops;
2042 atcphy->rcdev.of_node = atcphy->dev->of_node;
2043 atcphy->rcdev.of_reset_n_cells = 0;
2044 atcphy->rcdev.of_xlate = atcphy_reset_xlate;
2045
2046 return devm_reset_controller_register(atcphy->dev, &atcphy->rcdev);
2047 }
2048
atcphy_sw_set(struct typec_switch_dev * sw,enum typec_orientation orientation)2049 static int atcphy_sw_set(struct typec_switch_dev *sw, enum typec_orientation orientation)
2050 {
2051 struct apple_atcphy *atcphy = typec_switch_get_drvdata(sw);
2052
2053 guard(mutex)(&atcphy->lock);
2054
2055 switch (orientation) {
2056 case TYPEC_ORIENTATION_NONE:
2057 break;
2058 case TYPEC_ORIENTATION_NORMAL:
2059 atcphy->swap_lanes = false;
2060 break;
2061 case TYPEC_ORIENTATION_REVERSE:
2062 atcphy->swap_lanes = true;
2063 break;
2064 }
2065
2066 return 0;
2067 }
2068
atcphy_probe_switch(struct apple_atcphy * atcphy)2069 static int atcphy_probe_switch(struct apple_atcphy *atcphy)
2070 {
2071 struct typec_switch_desc sw_desc = {
2072 .drvdata = atcphy,
2073 .fwnode = atcphy->dev->fwnode,
2074 .set = atcphy_sw_set,
2075 };
2076
2077 return PTR_ERR_OR_ZERO(typec_switch_register(atcphy->dev, &sw_desc));
2078 }
2079
atcphy_mux_set(struct typec_mux_dev * mux,struct typec_mux_state * state)2080 static int atcphy_mux_set(struct typec_mux_dev *mux, struct typec_mux_state *state)
2081 {
2082 struct apple_atcphy *atcphy = typec_mux_get_drvdata(mux);
2083 enum atcphy_mode target_mode;
2084
2085 guard(mutex)(&atcphy->lock);
2086
2087 if (state->mode == TYPEC_STATE_SAFE) {
2088 target_mode = APPLE_ATCPHY_MODE_OFF;
2089 } else if (state->mode == TYPEC_STATE_USB) {
2090 target_mode = APPLE_ATCPHY_MODE_USB3;
2091 } else if (!state->alt && state->mode == TYPEC_MODE_USB4) {
2092 struct enter_usb_data *data = state->data;
2093 u32 eudo_usb_mode = FIELD_GET(EUDO_USB_MODE_MASK, data->eudo);
2094
2095 switch (eudo_usb_mode) {
2096 case EUDO_USB_MODE_USB2:
2097 target_mode = APPLE_ATCPHY_MODE_USB2;
2098 break;
2099 case EUDO_USB_MODE_USB3:
2100 target_mode = APPLE_ATCPHY_MODE_USB3;
2101 break;
2102 case EUDO_USB_MODE_USB4:
2103 target_mode = APPLE_ATCPHY_MODE_USB4;
2104 break;
2105 default:
2106 dev_warn(atcphy->dev, "Unsupported EUDO USB mode: 0x%x.\n", eudo_usb_mode);
2107 target_mode = APPLE_ATCPHY_MODE_OFF;
2108 }
2109 } else if (state->alt && state->alt->svid == USB_TYPEC_TBT_SID) {
2110 target_mode = APPLE_ATCPHY_MODE_TBT;
2111 } else if (state->alt && state->alt->svid == USB_TYPEC_DP_SID) {
2112 switch (state->mode) {
2113 case TYPEC_DP_STATE_C:
2114 case TYPEC_DP_STATE_E:
2115 target_mode = APPLE_ATCPHY_MODE_DP;
2116 break;
2117 case TYPEC_DP_STATE_D:
2118 target_mode = APPLE_ATCPHY_MODE_USB3_DP;
2119 break;
2120 default:
2121 dev_err(atcphy->dev,
2122 "Unsupported DP pin assignment: 0x%lx, your connected device will not work.\n",
2123 state->mode);
2124 target_mode = APPLE_ATCPHY_MODE_OFF;
2125 }
2126 } else if (state->alt) {
2127 dev_err(atcphy->dev,
2128 "Unknown alternate mode SVID: 0x%x, your connected device will not work.\n",
2129 state->alt->svid);
2130 target_mode = APPLE_ATCPHY_MODE_OFF;
2131 } else {
2132 dev_err(atcphy->dev, "Unknown mode: 0x%lx, your connected device will not work.\n",
2133 state->mode);
2134 target_mode = APPLE_ATCPHY_MODE_OFF;
2135 }
2136
2137 if (atcphy->mode == target_mode)
2138 return 0;
2139
2140 /*
2141 * If the pipehandler is still/already up here there's a bug somewhere so make sure to
2142 * complain loudly. We can still try to switch modes and hope for the best though,
2143 * in the worst case the hardware will fall back to USB2-only.
2144 */
2145 WARN_ON_ONCE(atcphy->pipehandler_up);
2146 return atcphy_configure(atcphy, target_mode);
2147 }
2148
atcphy_probe_mux(struct apple_atcphy * atcphy)2149 static int atcphy_probe_mux(struct apple_atcphy *atcphy)
2150 {
2151 struct typec_mux_desc mux_desc = {
2152 .drvdata = atcphy,
2153 .fwnode = atcphy->dev->fwnode,
2154 .set = atcphy_mux_set,
2155 };
2156
2157 return PTR_ERR_OR_ZERO(typec_mux_register(atcphy->dev, &mux_desc));
2158 }
2159
atcphy_load_tunables(struct apple_atcphy * atcphy)2160 static int atcphy_load_tunables(struct apple_atcphy *atcphy)
2161 {
2162 struct {
2163 const char *dt_name;
2164 struct apple_tunable **tunable;
2165 struct resource *res;
2166 } tunables[] = {
2167 { "apple,tunable-axi2af", &atcphy->tunables.axi2af, atcphy->res.axi2af },
2168 { "apple,tunable-common-a", &atcphy->tunables.common[0], atcphy->res.core },
2169 { "apple,tunable-common-b", &atcphy->tunables.common[1], atcphy->res.core },
2170 { "apple,tunable-lane0-usb", &atcphy->tunables.lane_usb3[0], atcphy->res.core },
2171 { "apple,tunable-lane1-usb", &atcphy->tunables.lane_usb3[1], atcphy->res.core },
2172 { "apple,tunable-lane0-cio", &atcphy->tunables.lane_usb4[0], atcphy->res.core },
2173 { "apple,tunable-lane1-cio", &atcphy->tunables.lane_usb4[1], atcphy->res.core },
2174 { "apple,tunable-lane0-dp", &atcphy->tunables.lane_dp[0], atcphy->res.core },
2175 { "apple,tunable-lane1-dp", &atcphy->tunables.lane_dp[1], atcphy->res.core },
2176 };
2177
2178 for (int i = 0; i < ARRAY_SIZE(tunables); i++) {
2179 *tunables[i].tunable = devm_apple_tunable_parse(
2180 atcphy->dev, atcphy->np, tunables[i].dt_name, tunables[i].res);
2181 if (IS_ERR(*tunables[i].tunable)) {
2182 dev_err(atcphy->dev, "Failed to read tunable %s: %ld\n",
2183 tunables[i].dt_name, PTR_ERR(*tunables[i].tunable));
2184 return PTR_ERR(*tunables[i].tunable);
2185 }
2186 }
2187
2188 return 0;
2189 }
2190
atcphy_map_resources(struct platform_device * pdev,struct apple_atcphy * atcphy)2191 static int atcphy_map_resources(struct platform_device *pdev, struct apple_atcphy *atcphy)
2192 {
2193 struct {
2194 const char *name;
2195 void __iomem **addr;
2196 struct resource **res;
2197 } resources[] = {
2198 { "core", &atcphy->regs.core, &atcphy->res.core },
2199 { "lpdptx", &atcphy->regs.lpdptx, NULL },
2200 { "axi2af", &atcphy->regs.axi2af, &atcphy->res.axi2af },
2201 { "usb2phy", &atcphy->regs.usb2phy, NULL },
2202 { "pipehandler", &atcphy->regs.pipehandler, NULL },
2203 };
2204 struct resource *res;
2205
2206 for (int i = 0; i < ARRAY_SIZE(resources); i++) {
2207 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, resources[i].name);
2208 *resources[i].addr = devm_ioremap_resource(&pdev->dev, res);
2209 if (IS_ERR(resources[i].addr))
2210 return dev_err_probe(atcphy->dev, PTR_ERR(resources[i].addr),
2211 "Unable to map %s regs", resources[i].name);
2212
2213 if (resources[i].res)
2214 *resources[i].res = res;
2215 }
2216
2217 return 0;
2218 }
2219
atcphy_probe_finalize(struct apple_atcphy * atcphy)2220 static int atcphy_probe_finalize(struct apple_atcphy *atcphy)
2221 {
2222 int ret;
2223
2224 guard(mutex)(&atcphy->lock);
2225
2226 /* Reset dwc3 on probe, let dwc3 (consumer) deassert it */
2227 _atcphy_dwc3_reset_assert(atcphy);
2228
2229 /* Reset atcphy to clear any state potentially left by the bootloader */
2230 atcphy_usb2_power_off(atcphy);
2231 atcphy_power_off(atcphy);
2232 atcphy_setup_pipehandler(atcphy);
2233
2234 ret = atcphy_probe_rcdev(atcphy);
2235 if (ret)
2236 return dev_err_probe(atcphy->dev, ret, "Probing rcdev failed");
2237 ret = atcphy_probe_mux(atcphy);
2238 if (ret)
2239 return dev_err_probe(atcphy->dev, ret, "Probing mux failed");
2240 ret = atcphy_probe_switch(atcphy);
2241 if (ret)
2242 return dev_err_probe(atcphy->dev, ret, "Probing switch failed");
2243 ret = atcphy_probe_phy(atcphy);
2244 if (ret)
2245 return dev_err_probe(atcphy->dev, ret, "Probing phy failed");
2246
2247 return 0;
2248 }
2249
atcphy_probe(struct platform_device * pdev)2250 static int atcphy_probe(struct platform_device *pdev)
2251 {
2252 struct apple_atcphy *atcphy;
2253 struct device *dev = &pdev->dev;
2254 int ret;
2255
2256 atcphy = devm_kzalloc(&pdev->dev, sizeof(*atcphy), GFP_KERNEL);
2257 if (!atcphy)
2258 return -ENOMEM;
2259
2260 atcphy->dev = dev;
2261 atcphy->np = dev->of_node;
2262 mutex_init(&atcphy->lock);
2263 platform_set_drvdata(pdev, atcphy);
2264
2265 ret = atcphy_map_resources(pdev, atcphy);
2266 if (ret)
2267 return ret;
2268 ret = atcphy_load_tunables(atcphy);
2269 if (ret)
2270 return ret;
2271
2272 atcphy->mode = APPLE_ATCPHY_MODE_OFF;
2273 atcphy->pipehandler_up = false;
2274
2275 return atcphy_probe_finalize(atcphy);
2276 }
2277
2278 static const struct of_device_id atcphy_match[] = {
2279 { .compatible = "apple,t8103-atcphy" },
2280 {},
2281 };
2282 MODULE_DEVICE_TABLE(of, atcphy_match);
2283
2284 static struct platform_driver atcphy_driver = {
2285 .driver = {
2286 .name = "phy-apple-atc",
2287 .of_match_table = atcphy_match,
2288 },
2289 .probe = atcphy_probe,
2290 };
2291 module_platform_driver(atcphy_driver);
2292
2293 MODULE_AUTHOR("Sven Peter <sven@kernel.org>");
2294 MODULE_DESCRIPTION("Apple Type-C PHY driver");
2295 MODULE_LICENSE("GPL");
2296