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 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 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 848 static inline void set32(void __iomem *reg, u32 set) 849 { 850 mask32(reg, 0, set); 851 } 852 853 static inline void core_set32(struct apple_atcphy *atcphy, u32 reg, u32 set) 854 { 855 core_mask32(atcphy, reg, 0, set); 856 } 857 858 static inline void clear32(void __iomem *reg, u32 clear) 859 { 860 mask32(reg, clear, 0); 861 } 862 863 static inline void core_clear32(struct apple_atcphy *atcphy, u32 reg, u32 clear) 864 { 865 core_mask32(atcphy, reg, clear, 0); 866 } 867 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 2066 static void atcphy_typec_switch_unregister(void *data) 2067 { 2068 typec_switch_unregister(data); 2069 } 2070 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 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 2156 static void atcphy_typec_mux_unregister(void *data) 2157 { 2158 typec_mux_unregister(data); 2159 } 2160 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 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 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 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 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