xref: /linux/drivers/phy/apple/atc.c (revision 9b725d5959a1d9bb670ccdb23add45f0eaafefb5)
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 
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 
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 
851 static inline void set32(void __iomem *reg, u32 set)
852 {
853 	mask32(reg, 0, set);
854 }
855 
856 static inline void core_set32(struct apple_atcphy *atcphy, u32 reg, u32 set)
857 {
858 	core_mask32(atcphy, reg, 0, set);
859 }
860 
861 static inline void clear32(void __iomem *reg, u32 clear)
862 {
863 	mask32(reg, clear, 0);
864 }
865 
866 static inline void core_clear32(struct apple_atcphy *atcphy, u32 reg, u32 clear)
867 {
868 	core_mask32(atcphy, reg, clear, 0);
869 }
870 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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