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