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_power_off(atcphy); 2231 atcphy_setup_pipehandler(atcphy); 2232 2233 ret = atcphy_probe_rcdev(atcphy); 2234 if (ret) 2235 return dev_err_probe(atcphy->dev, ret, "Probing rcdev failed"); 2236 ret = atcphy_probe_mux(atcphy); 2237 if (ret) 2238 return dev_err_probe(atcphy->dev, ret, "Probing mux failed"); 2239 ret = atcphy_probe_switch(atcphy); 2240 if (ret) 2241 return dev_err_probe(atcphy->dev, ret, "Probing switch failed"); 2242 ret = atcphy_probe_phy(atcphy); 2243 if (ret) 2244 return dev_err_probe(atcphy->dev, ret, "Probing phy failed"); 2245 2246 return 0; 2247 } 2248 2249 static int atcphy_probe(struct platform_device *pdev) 2250 { 2251 struct apple_atcphy *atcphy; 2252 struct device *dev = &pdev->dev; 2253 int ret; 2254 2255 atcphy = devm_kzalloc(&pdev->dev, sizeof(*atcphy), GFP_KERNEL); 2256 if (!atcphy) 2257 return -ENOMEM; 2258 2259 atcphy->dev = dev; 2260 atcphy->np = dev->of_node; 2261 mutex_init(&atcphy->lock); 2262 platform_set_drvdata(pdev, atcphy); 2263 2264 ret = atcphy_map_resources(pdev, atcphy); 2265 if (ret) 2266 return ret; 2267 ret = atcphy_load_tunables(atcphy); 2268 if (ret) 2269 return ret; 2270 2271 atcphy->mode = APPLE_ATCPHY_MODE_OFF; 2272 atcphy->pipehandler_up = false; 2273 2274 return atcphy_probe_finalize(atcphy); 2275 } 2276 2277 static const struct of_device_id atcphy_match[] = { 2278 { .compatible = "apple,t8103-atcphy" }, 2279 {}, 2280 }; 2281 MODULE_DEVICE_TABLE(of, atcphy_match); 2282 2283 static struct platform_driver atcphy_driver = { 2284 .driver = { 2285 .name = "phy-apple-atc", 2286 .of_match_table = atcphy_match, 2287 }, 2288 .probe = atcphy_probe, 2289 }; 2290 module_platform_driver(atcphy_driver); 2291 2292 MODULE_AUTHOR("Sven Peter <sven@kernel.org>"); 2293 MODULE_DESCRIPTION("Apple Type-C PHY driver"); 2294 MODULE_LICENSE("GPL"); 2295