1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * phy-brcm-usb-init.c - Broadcom USB Phy chip specific init functions 4 * 5 * Copyright (C) 2014-2017 Broadcom 6 */ 7 8 /* 9 * This module contains USB PHY initialization for power up and S3 resume 10 */ 11 12 #include <linux/delay.h> 13 #include <linux/io.h> 14 15 #include <linux/soc/brcmstb/brcmstb.h> 16 #include "phy-brcm-usb-init.h" 17 18 #define PHY_PORTS 2 19 #define PHY_PORT_SELECT_0 0 20 #define PHY_PORT_SELECT_1 0x1000 21 22 /* Register definitions for the USB CTRL block */ 23 #define USB_CTRL_SETUP 0x00 24 #define USB_CTRL_SETUP_BABO_MASK BIT(0) 25 #define USB_CTRL_SETUP_FNHW_MASK BIT(1) 26 #define USB_CTRL_SETUP_FNBO_MASK BIT(2) 27 #define USB_CTRL_SETUP_WABO_MASK BIT(3) 28 #define USB_CTRL_SETUP_IOC_MASK BIT(4) 29 #define USB_CTRL_SETUP_IPP_MASK BIT(5) 30 #define USB_CTRL_SETUP_SCB_CLIENT_SWAP_MASK BIT(13) /* option */ 31 #define USB_CTRL_SETUP_SCB1_EN_MASK BIT(14) /* option */ 32 #define USB_CTRL_SETUP_SCB2_EN_MASK BIT(15) /* option */ 33 #define USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK BIT(17) /* option */ 34 #define USB_CTRL_SETUP_SS_EHCI64BIT_EN_VAR_MASK BIT(16) /* option */ 35 #define USB_CTRL_SETUP_STRAP_IPP_SEL_MASK BIT(25) /* option */ 36 #define USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK BIT(26) /* option */ 37 #define USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK BIT(27) /* opt */ 38 #define USB_CTRL_SETUP_OC_DISABLE_PORT0_MASK BIT(28) 39 #define USB_CTRL_SETUP_OC_DISABLE_PORT1_MASK BIT(29) 40 #define USB_CTRL_SETUP_OC_DISABLE_MASK GENMASK(29, 28) /* option */ 41 #define USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK BIT(30) 42 #define USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK BIT(31) 43 #define USB_CTRL_SETUP_OC3_DISABLE_MASK GENMASK(31, 30) /* option */ 44 #define USB_CTRL_PLL_CTL 0x04 45 #define USB_CTRL_PLL_CTL_PLL_SUSPEND_EN_MASK BIT(27) 46 #define USB_CTRL_PLL_CTL_PLL_RESETB_MASK BIT(30) 47 #define USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK BIT(31) /* option */ 48 #define USB_CTRL_EBRIDGE 0x0c 49 #define USB_CTRL_EBRIDGE_EBR_SCB_SIZE_MASK GENMASK(11, 7) /* option */ 50 #define USB_CTRL_EBRIDGE_ESTOP_SCB_REQ_MASK BIT(17) /* option */ 51 #define USB_CTRL_OBRIDGE 0x10 52 #define USB_CTRL_OBRIDGE_LS_KEEP_ALIVE_MASK BIT(27) 53 #define USB_CTRL_MDIO 0x14 54 #define USB_CTRL_MDIO2 0x18 55 #define USB_CTRL_UTMI_CTL_1 0x2c 56 #define USB_CTRL_UTMI_CTL_1_POWER_UP_FSM_EN_MASK BIT(11) 57 #define USB_CTRL_UTMI_CTL_1_POWER_UP_FSM_EN_P1_MASK BIT(27) 58 #define USB_CTRL_USB_PM 0x34 59 #define USB_CTRL_USB_PM_RMTWKUP_EN_MASK BIT(0) 60 #define USB_CTRL_USB_PM_USB20_HC_RESETB_VAR_MASK GENMASK(21, 20) /* option */ 61 #define USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK BIT(22) /* option */ 62 #define USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK BIT(23) /* option */ 63 #define USB_CTRL_USB_PM_USB20_HC_RESETB_MASK GENMASK(29, 28) /* option */ 64 #define USB_CTRL_USB_PM_XHC_SOFT_RESETB_VAR_MASK BIT(30) /* option */ 65 #define USB_CTRL_USB_PM_SOFT_RESET_MASK BIT(30) /* option */ 66 #define USB_CTRL_USB_PM_USB_PWRDN_MASK BIT(31) /* option */ 67 #define USB_CTRL_USB_PM_STATUS 0x38 68 #define USB_CTRL_USB30_CTL1 0x60 69 #define USB_CTRL_USB30_CTL1_PHY3_PLL_SEQ_START_MASK BIT(4) 70 #define USB_CTRL_USB30_CTL1_PHY3_RESETB_MASK BIT(16) 71 #define USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK BIT(17) /* option */ 72 #define USB_CTRL_USB30_CTL1_USB3_IOC_MASK BIT(28) /* option */ 73 #define USB_CTRL_USB30_CTL1_USB3_IPP_MASK BIT(29) /* option */ 74 #define USB_CTRL_USB30_PCTL 0x70 75 #define USB_CTRL_USB30_PCTL_PHY3_SOFT_RESETB_MASK BIT(1) 76 #define USB_CTRL_USB30_PCTL_PHY3_IDDQ_OVERRIDE_MASK BIT(15) 77 #define USB_CTRL_USB30_PCTL_PHY3_SOFT_RESETB_P1_MASK BIT(17) 78 #define USB_CTRL_USB_DEVICE_CTL1 0x90 79 #define USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK GENMASK(1, 0) /* option */ 80 81 /* Register definitions for the XHCI EC block */ 82 #define USB_XHCI_EC_IRAADR 0x658 83 #define USB_XHCI_EC_IRADAT 0x65c 84 85 enum brcm_family_type { 86 BRCM_FAMILY_3390A0, 87 BRCM_FAMILY_4908, 88 BRCM_FAMILY_7250B0, 89 BRCM_FAMILY_7271A0, 90 BRCM_FAMILY_7364A0, 91 BRCM_FAMILY_7366C0, 92 BRCM_FAMILY_74371A0, 93 BRCM_FAMILY_7439B0, 94 BRCM_FAMILY_7445D0, 95 BRCM_FAMILY_7260A0, 96 BRCM_FAMILY_7278A0, 97 BRCM_FAMILY_COUNT, 98 }; 99 100 #define USB_BRCM_FAMILY(chip) \ 101 [BRCM_FAMILY_##chip] = __stringify(chip) 102 103 static const char *family_names[BRCM_FAMILY_COUNT] = { 104 USB_BRCM_FAMILY(3390A0), 105 USB_BRCM_FAMILY(4908), 106 USB_BRCM_FAMILY(7250B0), 107 USB_BRCM_FAMILY(7271A0), 108 USB_BRCM_FAMILY(7364A0), 109 USB_BRCM_FAMILY(7366C0), 110 USB_BRCM_FAMILY(74371A0), 111 USB_BRCM_FAMILY(7439B0), 112 USB_BRCM_FAMILY(7445D0), 113 USB_BRCM_FAMILY(7260A0), 114 USB_BRCM_FAMILY(7278A0), 115 }; 116 117 enum { 118 USB_CTRL_SETUP_SCB1_EN_SELECTOR, 119 USB_CTRL_SETUP_SCB2_EN_SELECTOR, 120 USB_CTRL_SETUP_SS_EHCI64BIT_EN_SELECTOR, 121 USB_CTRL_SETUP_STRAP_IPP_SEL_SELECTOR, 122 USB_CTRL_SETUP_OC3_DISABLE_PORT0_SELECTOR, 123 USB_CTRL_SETUP_OC3_DISABLE_PORT1_SELECTOR, 124 USB_CTRL_SETUP_OC3_DISABLE_SELECTOR, 125 USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_SELECTOR, 126 USB_CTRL_USB_PM_BDC_SOFT_RESETB_SELECTOR, 127 USB_CTRL_USB_PM_XHC_SOFT_RESETB_SELECTOR, 128 USB_CTRL_USB_PM_USB_PWRDN_SELECTOR, 129 USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_SELECTOR, 130 USB_CTRL_USB30_CTL1_USB3_IOC_SELECTOR, 131 USB_CTRL_USB30_CTL1_USB3_IPP_SELECTOR, 132 USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_SELECTOR, 133 USB_CTRL_USB_PM_SOFT_RESET_SELECTOR, 134 USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_SELECTOR, 135 USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_SELECTOR, 136 USB_CTRL_USB_PM_USB20_HC_RESETB_SELECTOR, 137 USB_CTRL_SETUP_ENDIAN_SELECTOR, 138 USB_CTRL_SELECTOR_COUNT, 139 }; 140 141 #define USB_CTRL_MASK_FAMILY(params, reg, field) \ 142 (params->usb_reg_bits_map[USB_CTRL_##reg##_##field##_SELECTOR]) 143 144 #define USB_CTRL_SET_FAMILY(params, reg, field) \ 145 usb_ctrl_set_family(params, USB_CTRL_##reg, \ 146 USB_CTRL_##reg##_##field##_SELECTOR) 147 #define USB_CTRL_UNSET_FAMILY(params, reg, field) \ 148 usb_ctrl_unset_family(params, USB_CTRL_##reg, \ 149 USB_CTRL_##reg##_##field##_SELECTOR) 150 151 #define MDIO_USB2 0 152 #define MDIO_USB3 BIT(31) 153 154 #define USB_CTRL_SETUP_ENDIAN_BITS ( \ 155 USB_CTRL_MASK(SETUP, BABO) | \ 156 USB_CTRL_MASK(SETUP, FNHW) | \ 157 USB_CTRL_MASK(SETUP, FNBO) | \ 158 USB_CTRL_MASK(SETUP, WABO)) 159 160 #ifdef __LITTLE_ENDIAN 161 #define ENDIAN_SETTINGS ( \ 162 USB_CTRL_MASK(SETUP, BABO) | \ 163 USB_CTRL_MASK(SETUP, FNHW)) 164 #else 165 #define ENDIAN_SETTINGS ( \ 166 USB_CTRL_MASK(SETUP, FNHW) | \ 167 USB_CTRL_MASK(SETUP, FNBO) | \ 168 USB_CTRL_MASK(SETUP, WABO)) 169 #endif 170 171 struct id_to_type { 172 u32 id; 173 int type; 174 }; 175 176 static const struct id_to_type id_to_type_table[] = { 177 { 0x33900000, BRCM_FAMILY_3390A0 }, 178 { 0x72500010, BRCM_FAMILY_7250B0 }, 179 { 0x72600000, BRCM_FAMILY_7260A0 }, 180 { 0x72550000, BRCM_FAMILY_7260A0 }, 181 { 0x72680000, BRCM_FAMILY_7271A0 }, 182 { 0x72710000, BRCM_FAMILY_7271A0 }, 183 { 0x73640000, BRCM_FAMILY_7364A0 }, 184 { 0x73660020, BRCM_FAMILY_7366C0 }, 185 { 0x07437100, BRCM_FAMILY_74371A0 }, 186 { 0x74390010, BRCM_FAMILY_7439B0 }, 187 { 0x74450030, BRCM_FAMILY_7445D0 }, 188 { 0x72780000, BRCM_FAMILY_7278A0 }, 189 { 0, BRCM_FAMILY_7271A0 }, /* default */ 190 }; 191 192 static const u32 193 usb_reg_bits_map_table[BRCM_FAMILY_COUNT][USB_CTRL_SELECTOR_COUNT] = { 194 /* 3390B0 */ 195 [BRCM_FAMILY_3390A0] = { 196 USB_CTRL_SETUP_SCB1_EN_MASK, 197 USB_CTRL_SETUP_SCB2_EN_MASK, 198 USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK, 199 USB_CTRL_SETUP_STRAP_IPP_SEL_MASK, 200 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 201 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 202 USB_CTRL_SETUP_OC3_DISABLE_MASK, 203 0, /* USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK */ 204 0, /* USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK */ 205 USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK, 206 USB_CTRL_USB_PM_USB_PWRDN_MASK, 207 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 208 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 209 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 210 USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK, 211 0, /* USB_CTRL_USB_PM_SOFT_RESET_MASK */ 212 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 213 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 214 USB_CTRL_USB_PM_USB20_HC_RESETB_VAR_MASK, 215 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 216 }, 217 /* 4908 */ 218 [BRCM_FAMILY_4908] = { 219 0, /* USB_CTRL_SETUP_SCB1_EN_MASK */ 220 0, /* USB_CTRL_SETUP_SCB2_EN_MASK */ 221 0, /* USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK */ 222 0, /* USB_CTRL_SETUP_STRAP_IPP_SEL_MASK */ 223 0, /* USB_CTRL_SETUP_OC3_DISABLE_MASK */ 224 0, /* USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK */ 225 0, /* USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK */ 226 USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK, 227 USB_CTRL_USB_PM_USB_PWRDN_MASK, 228 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 229 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 230 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 231 0, /* USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK */ 232 0, /* USB_CTRL_USB_PM_SOFT_RESET_MASK */ 233 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 234 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 235 0, /* USB_CTRL_USB_PM_USB20_HC_RESETB_VAR_MASK */ 236 0, /* USB_CTRL_SETUP ENDIAN bits */ 237 }, 238 /* 7250b0 */ 239 [BRCM_FAMILY_7250B0] = { 240 USB_CTRL_SETUP_SCB1_EN_MASK, 241 USB_CTRL_SETUP_SCB2_EN_MASK, 242 USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK, 243 0, /* USB_CTRL_SETUP_STRAP_IPP_SEL_MASK */ 244 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 245 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 246 USB_CTRL_SETUP_OC3_DISABLE_MASK, 247 USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK, 248 0, /* USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK */ 249 USB_CTRL_USB_PM_XHC_SOFT_RESETB_VAR_MASK, 250 0, /* USB_CTRL_USB_PM_USB_PWRDN_MASK */ 251 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 252 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 253 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 254 0, /* USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK */ 255 0, /* USB_CTRL_USB_PM_SOFT_RESET_MASK */ 256 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 257 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 258 USB_CTRL_USB_PM_USB20_HC_RESETB_MASK, 259 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 260 }, 261 /* 7271a0 */ 262 [BRCM_FAMILY_7271A0] = { 263 0, /* USB_CTRL_SETUP_SCB1_EN_MASK */ 264 0, /* USB_CTRL_SETUP_SCB2_EN_MASK */ 265 USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK, 266 USB_CTRL_SETUP_STRAP_IPP_SEL_MASK, 267 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 268 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 269 USB_CTRL_SETUP_OC3_DISABLE_MASK, 270 0, /* USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK */ 271 USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK, 272 USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK, 273 USB_CTRL_USB_PM_USB_PWRDN_MASK, 274 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 275 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 276 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 277 USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK, 278 USB_CTRL_USB_PM_SOFT_RESET_MASK, 279 USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK, 280 USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK, 281 USB_CTRL_USB_PM_USB20_HC_RESETB_VAR_MASK, 282 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 283 }, 284 /* 7364a0 */ 285 [BRCM_FAMILY_7364A0] = { 286 USB_CTRL_SETUP_SCB1_EN_MASK, 287 USB_CTRL_SETUP_SCB2_EN_MASK, 288 USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK, 289 0, /* USB_CTRL_SETUP_STRAP_IPP_SEL_MASK */ 290 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 291 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 292 USB_CTRL_SETUP_OC3_DISABLE_MASK, 293 USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK, 294 0, /* USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK */ 295 USB_CTRL_USB_PM_XHC_SOFT_RESETB_VAR_MASK, 296 0, /* USB_CTRL_USB_PM_USB_PWRDN_MASK */ 297 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 298 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 299 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 300 0, /* USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK */ 301 0, /* USB_CTRL_USB_PM_SOFT_RESET_MASK */ 302 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 303 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 304 USB_CTRL_USB_PM_USB20_HC_RESETB_MASK, 305 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 306 }, 307 /* 7366c0 */ 308 [BRCM_FAMILY_7366C0] = { 309 USB_CTRL_SETUP_SCB1_EN_MASK, 310 USB_CTRL_SETUP_SCB2_EN_MASK, 311 USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK, 312 0, /* USB_CTRL_SETUP_STRAP_IPP_SEL_MASK */ 313 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 314 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 315 USB_CTRL_SETUP_OC3_DISABLE_MASK, 316 0, /* USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK */ 317 0, /* USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK */ 318 USB_CTRL_USB_PM_XHC_SOFT_RESETB_VAR_MASK, 319 USB_CTRL_USB_PM_USB_PWRDN_MASK, 320 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 321 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 322 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 323 0, /* USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK */ 324 0, /* USB_CTRL_USB_PM_SOFT_RESET_MASK */ 325 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 326 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 327 USB_CTRL_USB_PM_USB20_HC_RESETB_MASK, 328 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 329 }, 330 /* 74371A0 */ 331 [BRCM_FAMILY_74371A0] = { 332 USB_CTRL_SETUP_SCB1_EN_MASK, 333 USB_CTRL_SETUP_SCB2_EN_MASK, 334 USB_CTRL_SETUP_SS_EHCI64BIT_EN_VAR_MASK, 335 0, /* USB_CTRL_SETUP_STRAP_IPP_SEL_MASK */ 336 0, /* USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK */ 337 0, /* USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK */ 338 0, /* USB_CTRL_SETUP_OC3_DISABLE_MASK */ 339 USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK, 340 0, /* USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK */ 341 0, /* USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK */ 342 0, /* USB_CTRL_USB_PM_USB_PWRDN_MASK */ 343 USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK, 344 USB_CTRL_USB30_CTL1_USB3_IOC_MASK, 345 USB_CTRL_USB30_CTL1_USB3_IPP_MASK, 346 0, /* USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK */ 347 0, /* USB_CTRL_USB_PM_SOFT_RESET_MASK */ 348 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 349 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 350 0, /* USB_CTRL_USB_PM_USB20_HC_RESETB_MASK */ 351 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 352 }, 353 /* 7439B0 */ 354 [BRCM_FAMILY_7439B0] = { 355 USB_CTRL_SETUP_SCB1_EN_MASK, 356 USB_CTRL_SETUP_SCB2_EN_MASK, 357 USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK, 358 USB_CTRL_SETUP_STRAP_IPP_SEL_MASK, 359 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 360 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 361 USB_CTRL_SETUP_OC3_DISABLE_MASK, 362 0, /* USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK */ 363 USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK, 364 USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK, 365 USB_CTRL_USB_PM_USB_PWRDN_MASK, 366 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 367 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 368 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 369 USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK, 370 0, /* USB_CTRL_USB_PM_SOFT_RESET_MASK */ 371 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 372 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 373 USB_CTRL_USB_PM_USB20_HC_RESETB_VAR_MASK, 374 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 375 }, 376 /* 7445d0 */ 377 [BRCM_FAMILY_7445D0] = { 378 USB_CTRL_SETUP_SCB1_EN_MASK, 379 USB_CTRL_SETUP_SCB2_EN_MASK, 380 USB_CTRL_SETUP_SS_EHCI64BIT_EN_VAR_MASK, 381 0, /* USB_CTRL_SETUP_STRAP_IPP_SEL_MASK */ 382 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 383 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 384 USB_CTRL_SETUP_OC3_DISABLE_MASK, 385 USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK, 386 0, /* USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK */ 387 0, /* USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK */ 388 0, /* USB_CTRL_USB_PM_USB_PWRDN_MASK */ 389 USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK, 390 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 391 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 392 0, /* USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK */ 393 0, /* USB_CTRL_USB_PM_SOFT_RESET_MASK */ 394 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 395 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 396 USB_CTRL_USB_PM_USB20_HC_RESETB_VAR_MASK, 397 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 398 }, 399 /* 7260a0 */ 400 [BRCM_FAMILY_7260A0] = { 401 0, /* USB_CTRL_SETUP_SCB1_EN_MASK */ 402 0, /* USB_CTRL_SETUP_SCB2_EN_MASK */ 403 USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK, 404 USB_CTRL_SETUP_STRAP_IPP_SEL_MASK, 405 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 406 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 407 USB_CTRL_SETUP_OC3_DISABLE_MASK, 408 0, /* USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK */ 409 USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK, 410 USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK, 411 USB_CTRL_USB_PM_USB_PWRDN_MASK, 412 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 413 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 414 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 415 USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK, 416 USB_CTRL_USB_PM_SOFT_RESET_MASK, 417 USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK, 418 USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK, 419 USB_CTRL_USB_PM_USB20_HC_RESETB_VAR_MASK, 420 ENDIAN_SETTINGS, /* USB_CTRL_SETUP ENDIAN bits */ 421 }, 422 /* 7278a0 */ 423 [BRCM_FAMILY_7278A0] = { 424 0, /* USB_CTRL_SETUP_SCB1_EN_MASK */ 425 0, /* USB_CTRL_SETUP_SCB2_EN_MASK */ 426 0, /*USB_CTRL_SETUP_SS_EHCI64BIT_EN_MASK */ 427 USB_CTRL_SETUP_STRAP_IPP_SEL_MASK, 428 USB_CTRL_SETUP_OC3_DISABLE_PORT0_MASK, 429 USB_CTRL_SETUP_OC3_DISABLE_PORT1_MASK, 430 USB_CTRL_SETUP_OC3_DISABLE_MASK, 431 0, /* USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK */ 432 USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK, 433 USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK, 434 USB_CTRL_USB_PM_USB_PWRDN_MASK, 435 0, /* USB_CTRL_USB30_CTL1_XHC_SOFT_RESETB_MASK */ 436 0, /* USB_CTRL_USB30_CTL1_USB3_IOC_MASK */ 437 0, /* USB_CTRL_USB30_CTL1_USB3_IPP_MASK */ 438 USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK, 439 USB_CTRL_USB_PM_SOFT_RESET_MASK, 440 0, /* USB_CTRL_SETUP_CC_DRD_MODE_ENABLE_MASK */ 441 0, /* USB_CTRL_SETUP_STRAP_CC_DRD_MODE_ENABLE_SEL_MASK */ 442 0, /* USB_CTRL_USB_PM_USB20_HC_RESETB_MASK */ 443 0, /* USB_CTRL_SETUP ENDIAN bits */ 444 }, 445 }; 446 447 static inline 448 void usb_ctrl_unset_family(struct brcm_usb_init_params *params, 449 u32 reg_offset, u32 field) 450 { 451 u32 mask; 452 453 mask = params->usb_reg_bits_map[field]; 454 brcm_usb_ctrl_unset(params->regs[BRCM_REGS_CTRL] + reg_offset, mask); 455 }; 456 457 static inline 458 void usb_ctrl_set_family(struct brcm_usb_init_params *params, 459 u32 reg_offset, u32 field) 460 { 461 u32 mask; 462 463 mask = params->usb_reg_bits_map[field]; 464 brcm_usb_ctrl_set(params->regs[BRCM_REGS_CTRL] + reg_offset, mask); 465 }; 466 467 static u32 brcmusb_usb_mdio_read(void __iomem *ctrl_base, u32 reg, int mode) 468 { 469 u32 data; 470 471 data = (reg << 16) | mode; 472 brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); 473 data |= (1 << 24); 474 brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); 475 data &= ~(1 << 24); 476 /* wait for the 60MHz parallel to serial shifter */ 477 usleep_range(10, 20); 478 brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); 479 /* wait for the 60MHz parallel to serial shifter */ 480 usleep_range(10, 20); 481 482 return brcm_usb_readl(USB_CTRL_REG(ctrl_base, MDIO2)) & 0xffff; 483 } 484 485 static void brcmusb_usb_mdio_write(void __iomem *ctrl_base, u32 reg, 486 u32 val, int mode) 487 { 488 u32 data; 489 490 data = (reg << 16) | val | mode; 491 brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); 492 data |= (1 << 25); 493 brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); 494 data &= ~(1 << 25); 495 496 /* wait for the 60MHz parallel to serial shifter */ 497 usleep_range(10, 20); 498 brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); 499 /* wait for the 60MHz parallel to serial shifter */ 500 usleep_range(10, 20); 501 } 502 503 static void brcmusb_usb_phy_ldo_fix(void __iomem *ctrl_base) 504 { 505 /* first disable FSM but also leave it that way */ 506 /* to allow normal suspend/resume */ 507 USB_CTRL_UNSET(ctrl_base, UTMI_CTL_1, POWER_UP_FSM_EN); 508 USB_CTRL_UNSET(ctrl_base, UTMI_CTL_1, POWER_UP_FSM_EN_P1); 509 510 /* reset USB 2.0 PLL */ 511 USB_CTRL_UNSET(ctrl_base, PLL_CTL, PLL_RESETB); 512 /* PLL reset period */ 513 udelay(1); 514 USB_CTRL_SET(ctrl_base, PLL_CTL, PLL_RESETB); 515 /* Give PLL enough time to lock */ 516 usleep_range(1000, 2000); 517 } 518 519 static void brcmusb_usb2_eye_fix(void __iomem *ctrl_base) 520 { 521 /* Increase USB 2.0 TX level to meet spec requirement */ 522 brcmusb_usb_mdio_write(ctrl_base, 0x1f, 0x80a0, MDIO_USB2); 523 brcmusb_usb_mdio_write(ctrl_base, 0x0a, 0xc6a0, MDIO_USB2); 524 } 525 526 static void brcmusb_usb3_pll_fix(void __iomem *ctrl_base) 527 { 528 /* Set correct window for PLL lock detect */ 529 brcmusb_usb_mdio_write(ctrl_base, 0x1f, 0x8000, MDIO_USB3); 530 brcmusb_usb_mdio_write(ctrl_base, 0x07, 0x1503, MDIO_USB3); 531 } 532 533 static void brcmusb_usb3_enable_pipe_reset(void __iomem *ctrl_base) 534 { 535 u32 val; 536 537 /* Re-enable USB 3.0 pipe reset */ 538 brcmusb_usb_mdio_write(ctrl_base, 0x1f, 0x8000, MDIO_USB3); 539 val = brcmusb_usb_mdio_read(ctrl_base, 0x0f, MDIO_USB3) | 0x200; 540 brcmusb_usb_mdio_write(ctrl_base, 0x0f, val, MDIO_USB3); 541 } 542 543 static void brcmusb_usb3_enable_sigdet(void __iomem *ctrl_base) 544 { 545 u32 val, ofs; 546 int ii; 547 548 ofs = 0; 549 for (ii = 0; ii < PHY_PORTS; ++ii) { 550 /* Set correct default for sigdet */ 551 brcmusb_usb_mdio_write(ctrl_base, 0x1f, (0x8080 + ofs), 552 MDIO_USB3); 553 val = brcmusb_usb_mdio_read(ctrl_base, 0x05, MDIO_USB3); 554 val = (val & ~0x800f) | 0x800d; 555 brcmusb_usb_mdio_write(ctrl_base, 0x05, val, MDIO_USB3); 556 ofs = PHY_PORT_SELECT_1; 557 } 558 } 559 560 static void brcmusb_usb3_enable_skip_align(void __iomem *ctrl_base) 561 { 562 u32 val, ofs; 563 int ii; 564 565 ofs = 0; 566 for (ii = 0; ii < PHY_PORTS; ++ii) { 567 /* Set correct default for SKIP align */ 568 brcmusb_usb_mdio_write(ctrl_base, 0x1f, (0x8060 + ofs), 569 MDIO_USB3); 570 val = brcmusb_usb_mdio_read(ctrl_base, 0x01, MDIO_USB3) | 0x200; 571 brcmusb_usb_mdio_write(ctrl_base, 0x01, val, MDIO_USB3); 572 ofs = PHY_PORT_SELECT_1; 573 } 574 } 575 576 static void brcmusb_usb3_unfreeze_aeq(void __iomem *ctrl_base) 577 { 578 u32 val, ofs; 579 int ii; 580 581 ofs = 0; 582 for (ii = 0; ii < PHY_PORTS; ++ii) { 583 /* Let EQ freeze after TSEQ */ 584 brcmusb_usb_mdio_write(ctrl_base, 0x1f, (0x80e0 + ofs), 585 MDIO_USB3); 586 val = brcmusb_usb_mdio_read(ctrl_base, 0x01, MDIO_USB3); 587 val &= ~0x0008; 588 brcmusb_usb_mdio_write(ctrl_base, 0x01, val, MDIO_USB3); 589 ofs = PHY_PORT_SELECT_1; 590 } 591 } 592 593 static void brcmusb_usb3_pll_54mhz(struct brcm_usb_init_params *params) 594 { 595 u32 ofs; 596 int ii; 597 void __iomem *ctrl_base = params->regs[BRCM_REGS_CTRL]; 598 599 /* 600 * On newer B53 based SoC's, the reference clock for the 601 * 3.0 PLL has been changed from 50MHz to 54MHz so the 602 * PLL needs to be reprogrammed. 603 * See SWLINUX-4006. 604 * 605 * On the 7364C0, the reference clock for the 606 * 3.0 PLL has been changed from 50MHz to 54MHz to 607 * work around a MOCA issue. 608 * See SWLINUX-4169. 609 */ 610 switch (params->selected_family) { 611 case BRCM_FAMILY_3390A0: 612 case BRCM_FAMILY_4908: 613 case BRCM_FAMILY_7250B0: 614 case BRCM_FAMILY_7366C0: 615 case BRCM_FAMILY_74371A0: 616 case BRCM_FAMILY_7439B0: 617 case BRCM_FAMILY_7445D0: 618 case BRCM_FAMILY_7260A0: 619 return; 620 case BRCM_FAMILY_7364A0: 621 if (BRCM_REV(params->family_id) < 0x20) 622 return; 623 break; 624 } 625 626 /* set USB 3.0 PLL to accept 54Mhz reference clock */ 627 USB_CTRL_UNSET(ctrl_base, USB30_CTL1, PHY3_PLL_SEQ_START); 628 629 brcmusb_usb_mdio_write(ctrl_base, 0x1f, 0x8000, MDIO_USB3); 630 brcmusb_usb_mdio_write(ctrl_base, 0x10, 0x5784, MDIO_USB3); 631 brcmusb_usb_mdio_write(ctrl_base, 0x11, 0x01d0, MDIO_USB3); 632 brcmusb_usb_mdio_write(ctrl_base, 0x12, 0x1DE8, MDIO_USB3); 633 brcmusb_usb_mdio_write(ctrl_base, 0x13, 0xAA80, MDIO_USB3); 634 brcmusb_usb_mdio_write(ctrl_base, 0x14, 0x8826, MDIO_USB3); 635 brcmusb_usb_mdio_write(ctrl_base, 0x15, 0x0044, MDIO_USB3); 636 brcmusb_usb_mdio_write(ctrl_base, 0x16, 0x8000, MDIO_USB3); 637 brcmusb_usb_mdio_write(ctrl_base, 0x17, 0x0851, MDIO_USB3); 638 brcmusb_usb_mdio_write(ctrl_base, 0x18, 0x0000, MDIO_USB3); 639 640 /* both ports */ 641 ofs = 0; 642 for (ii = 0; ii < PHY_PORTS; ++ii) { 643 brcmusb_usb_mdio_write(ctrl_base, 0x1f, (0x8040 + ofs), 644 MDIO_USB3); 645 brcmusb_usb_mdio_write(ctrl_base, 0x03, 0x0090, MDIO_USB3); 646 brcmusb_usb_mdio_write(ctrl_base, 0x04, 0x0134, MDIO_USB3); 647 brcmusb_usb_mdio_write(ctrl_base, 0x1f, (0x8020 + ofs), 648 MDIO_USB3); 649 brcmusb_usb_mdio_write(ctrl_base, 0x01, 0x00e2, MDIO_USB3); 650 ofs = PHY_PORT_SELECT_1; 651 } 652 653 /* restart PLL sequence */ 654 USB_CTRL_SET(ctrl_base, USB30_CTL1, PHY3_PLL_SEQ_START); 655 /* Give PLL enough time to lock */ 656 usleep_range(1000, 2000); 657 } 658 659 static void brcmusb_usb3_ssc_enable(void __iomem *ctrl_base) 660 { 661 u32 val; 662 663 /* Enable USB 3.0 TX spread spectrum */ 664 brcmusb_usb_mdio_write(ctrl_base, 0x1f, 0x8040, MDIO_USB3); 665 val = brcmusb_usb_mdio_read(ctrl_base, 0x01, MDIO_USB3) | 0xf; 666 brcmusb_usb_mdio_write(ctrl_base, 0x01, val, MDIO_USB3); 667 668 /* Currently, USB 3.0 SSC is enabled via port 0 MDIO registers, 669 * which should have been adequate. However, due to a bug in the 670 * USB 3.0 PHY, it must be enabled via both ports (HWUSB3DVT-26). 671 */ 672 brcmusb_usb_mdio_write(ctrl_base, 0x1f, 0x9040, MDIO_USB3); 673 val = brcmusb_usb_mdio_read(ctrl_base, 0x01, MDIO_USB3) | 0xf; 674 brcmusb_usb_mdio_write(ctrl_base, 0x01, val, MDIO_USB3); 675 } 676 677 static void brcmusb_usb3_phy_workarounds(struct brcm_usb_init_params *params) 678 { 679 void __iomem *ctrl_base = params->regs[BRCM_REGS_CTRL]; 680 681 brcmusb_usb3_pll_fix(ctrl_base); 682 brcmusb_usb3_pll_54mhz(params); 683 brcmusb_usb3_ssc_enable(ctrl_base); 684 brcmusb_usb3_enable_pipe_reset(ctrl_base); 685 brcmusb_usb3_enable_sigdet(ctrl_base); 686 brcmusb_usb3_enable_skip_align(ctrl_base); 687 brcmusb_usb3_unfreeze_aeq(ctrl_base); 688 } 689 690 static void brcmusb_memc_fix(struct brcm_usb_init_params *params) 691 { 692 u32 prid; 693 694 if (params->selected_family != BRCM_FAMILY_7445D0) 695 return; 696 /* 697 * This is a workaround for HW7445-1869 where a DMA write ends up 698 * doing a read pre-fetch after the end of the DMA buffer. This 699 * causes a problem when the DMA buffer is at the end of physical 700 * memory, causing the pre-fetch read to access non-existent memory, 701 * and the chip bondout has MEMC2 disabled. When the pre-fetch read 702 * tries to use the disabled MEMC2, it hangs the bus. The workaround 703 * is to disable MEMC2 access in the usb controller which avoids 704 * the hang. 705 */ 706 707 prid = params->product_id & 0xfffff000; 708 switch (prid) { 709 case 0x72520000: 710 case 0x74480000: 711 case 0x74490000: 712 case 0x07252000: 713 case 0x07448000: 714 case 0x07449000: 715 USB_CTRL_UNSET_FAMILY(params, SETUP, SCB2_EN); 716 } 717 } 718 719 static void brcmusb_usb3_otp_fix(struct brcm_usb_init_params *params) 720 { 721 void __iomem *xhci_ec_base = params->regs[BRCM_REGS_XHCI_EC]; 722 u32 val; 723 724 if (params->family_id != 0x74371000 || !xhci_ec_base) 725 return; 726 brcm_usb_writel(0xa20c, USB_XHCI_EC_REG(xhci_ec_base, IRAADR)); 727 val = brcm_usb_readl(USB_XHCI_EC_REG(xhci_ec_base, IRADAT)); 728 729 /* set cfg_pick_ss_lock */ 730 val |= (1 << 27); 731 brcm_usb_writel(val, USB_XHCI_EC_REG(xhci_ec_base, IRADAT)); 732 733 /* Reset USB 3.0 PHY for workaround to take effect */ 734 USB_CTRL_UNSET(params->regs[BRCM_REGS_CTRL], USB30_CTL1, PHY3_RESETB); 735 USB_CTRL_SET(params->regs[BRCM_REGS_CTRL], USB30_CTL1, PHY3_RESETB); 736 } 737 738 static void brcmusb_xhci_soft_reset(struct brcm_usb_init_params *params, 739 int on_off) 740 { 741 /* Assert reset */ 742 if (on_off) { 743 if (USB_CTRL_MASK_FAMILY(params, USB_PM, XHC_SOFT_RESETB)) 744 USB_CTRL_UNSET_FAMILY(params, USB_PM, XHC_SOFT_RESETB); 745 else 746 USB_CTRL_UNSET_FAMILY(params, 747 USB30_CTL1, XHC_SOFT_RESETB); 748 } else { /* De-assert reset */ 749 if (USB_CTRL_MASK_FAMILY(params, USB_PM, XHC_SOFT_RESETB)) 750 USB_CTRL_SET_FAMILY(params, USB_PM, XHC_SOFT_RESETB); 751 else 752 USB_CTRL_SET_FAMILY(params, USB30_CTL1, 753 XHC_SOFT_RESETB); 754 } 755 } 756 757 /* 758 * Return the best map table family. The order is: 759 * - exact match of chip and major rev 760 * - exact match of chip and closest older major rev 761 * - default chip/rev. 762 * NOTE: The minor rev is always ignored. 763 */ 764 static enum brcm_family_type get_family_type( 765 struct brcm_usb_init_params *params) 766 { 767 int last_type = -1; 768 u32 last_family = 0; 769 u32 family_no_major; 770 unsigned int x; 771 u32 family; 772 773 family = params->family_id & 0xfffffff0; 774 family_no_major = params->family_id & 0xffffff00; 775 for (x = 0; id_to_type_table[x].id; x++) { 776 if (family == id_to_type_table[x].id) 777 return id_to_type_table[x].type; 778 if (family_no_major == (id_to_type_table[x].id & 0xffffff00)) 779 if (family > id_to_type_table[x].id && 780 last_family < id_to_type_table[x].id) { 781 last_family = id_to_type_table[x].id; 782 last_type = id_to_type_table[x].type; 783 } 784 } 785 786 /* If no match, return the default family */ 787 if (last_type == -1) 788 return id_to_type_table[x].type; 789 return last_type; 790 } 791 792 static void usb_init_ipp(struct brcm_usb_init_params *params) 793 { 794 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 795 u32 reg; 796 u32 orig_reg; 797 798 /* Starting with the 7445d0, there are no longer separate 3.0 799 * versions of IOC and IPP. 800 */ 801 if (USB_CTRL_MASK_FAMILY(params, USB30_CTL1, USB3_IOC)) { 802 if (params->ioc) 803 USB_CTRL_SET_FAMILY(params, USB30_CTL1, USB3_IOC); 804 if (params->ipp == 1) 805 USB_CTRL_SET_FAMILY(params, USB30_CTL1, USB3_IPP); 806 } 807 808 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP)); 809 orig_reg = reg; 810 if (USB_CTRL_MASK_FAMILY(params, SETUP, STRAP_CC_DRD_MODE_ENABLE_SEL)) 811 /* Never use the strap, it's going away. */ 812 reg &= ~(USB_CTRL_MASK_FAMILY(params, 813 SETUP, 814 STRAP_CC_DRD_MODE_ENABLE_SEL)); 815 if (USB_CTRL_MASK_FAMILY(params, SETUP, STRAP_IPP_SEL)) 816 /* override ipp strap pin (if it exits) */ 817 if (params->ipp != 2) 818 reg &= ~(USB_CTRL_MASK_FAMILY(params, SETUP, 819 STRAP_IPP_SEL)); 820 821 /* Override the default OC and PP polarity */ 822 reg &= ~(USB_CTRL_MASK(SETUP, IPP) | USB_CTRL_MASK(SETUP, IOC)); 823 if (params->ioc) 824 reg |= USB_CTRL_MASK(SETUP, IOC); 825 if (params->ipp == 1) 826 reg |= USB_CTRL_MASK(SETUP, IPP); 827 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); 828 829 /* 830 * If we're changing IPP, make sure power is off long enough 831 * to turn off any connected devices. 832 */ 833 if ((reg ^ orig_reg) & USB_CTRL_MASK(SETUP, IPP)) 834 msleep(50); 835 } 836 837 static void usb_wake_enable(struct brcm_usb_init_params *params, 838 bool enable) 839 { 840 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 841 842 if (enable) 843 USB_CTRL_SET(ctrl, USB_PM, RMTWKUP_EN); 844 else 845 USB_CTRL_UNSET(ctrl, USB_PM, RMTWKUP_EN); 846 } 847 848 static void usb_init_common(struct brcm_usb_init_params *params) 849 { 850 u32 reg; 851 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 852 853 /* Clear any pending wake conditions */ 854 usb_wake_enable(params, false); 855 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM_STATUS)); 856 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_PM_STATUS)); 857 858 /* Take USB out of power down */ 859 if (USB_CTRL_MASK_FAMILY(params, PLL_CTL, PLL_IDDQ_PWRDN)) { 860 USB_CTRL_UNSET_FAMILY(params, PLL_CTL, PLL_IDDQ_PWRDN); 861 /* 1 millisecond - for USB clocks to settle down */ 862 usleep_range(1000, 2000); 863 } 864 865 if (USB_CTRL_MASK_FAMILY(params, USB_PM, USB_PWRDN)) { 866 USB_CTRL_UNSET_FAMILY(params, USB_PM, USB_PWRDN); 867 /* 1 millisecond - for USB clocks to settle down */ 868 usleep_range(1000, 2000); 869 } 870 871 if (params->selected_family != BRCM_FAMILY_74371A0 && 872 (BRCM_ID(params->family_id) != 0x7364)) 873 /* 874 * HW7439-637: 7439a0 and its derivatives do not have large 875 * enough descriptor storage for this. 876 */ 877 USB_CTRL_SET_FAMILY(params, SETUP, SS_EHCI64BIT_EN); 878 879 /* Block auto PLL suspend by USB2 PHY (Sasi) */ 880 USB_CTRL_SET(ctrl, PLL_CTL, PLL_SUSPEND_EN); 881 882 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP)); 883 if (params->selected_family == BRCM_FAMILY_7364A0) 884 /* Suppress overcurrent indication from USB30 ports for A0 */ 885 reg |= USB_CTRL_MASK_FAMILY(params, SETUP, OC3_DISABLE); 886 887 brcmusb_usb_phy_ldo_fix(ctrl); 888 brcmusb_usb2_eye_fix(ctrl); 889 890 /* 891 * Make sure the second and third memory controller 892 * interfaces are enabled if they exist. 893 */ 894 if (USB_CTRL_MASK_FAMILY(params, SETUP, SCB1_EN)) 895 reg |= USB_CTRL_MASK_FAMILY(params, SETUP, SCB1_EN); 896 if (USB_CTRL_MASK_FAMILY(params, SETUP, SCB2_EN)) 897 reg |= USB_CTRL_MASK_FAMILY(params, SETUP, SCB2_EN); 898 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); 899 900 brcmusb_memc_fix(params); 901 902 /* Workaround for false positive OC for 7439b2 in DRD/Device mode */ 903 if ((params->family_id == 0x74390012) && 904 (params->supported_port_modes != USB_CTLR_MODE_HOST)) { 905 USB_CTRL_SET(ctrl, SETUP, OC_DISABLE_PORT1); 906 USB_CTRL_SET_FAMILY(params, SETUP, OC3_DISABLE_PORT1); 907 } 908 909 if (USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, PORT_MODE)) { 910 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 911 reg &= ~USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, 912 PORT_MODE); 913 reg |= params->port_mode; 914 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 915 } 916 if (USB_CTRL_MASK_FAMILY(params, USB_PM, BDC_SOFT_RESETB)) { 917 switch (params->supported_port_modes) { 918 case USB_CTLR_MODE_HOST: 919 USB_CTRL_UNSET_FAMILY(params, USB_PM, BDC_SOFT_RESETB); 920 break; 921 default: 922 USB_CTRL_UNSET_FAMILY(params, USB_PM, BDC_SOFT_RESETB); 923 USB_CTRL_SET_FAMILY(params, USB_PM, BDC_SOFT_RESETB); 924 break; 925 } 926 } 927 if (USB_CTRL_MASK_FAMILY(params, SETUP, CC_DRD_MODE_ENABLE)) { 928 if (params->supported_port_modes == USB_CTLR_MODE_TYPEC_PD) 929 USB_CTRL_SET_FAMILY(params, SETUP, CC_DRD_MODE_ENABLE); 930 else 931 USB_CTRL_UNSET_FAMILY(params, SETUP, 932 CC_DRD_MODE_ENABLE); 933 } 934 } 935 936 static void usb_init_eohci(struct brcm_usb_init_params *params) 937 { 938 u32 reg; 939 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 940 941 if (USB_CTRL_MASK_FAMILY(params, USB_PM, USB20_HC_RESETB)) 942 USB_CTRL_SET_FAMILY(params, USB_PM, USB20_HC_RESETB); 943 944 if (params->selected_family == BRCM_FAMILY_7366C0) 945 /* 946 * Don't enable this so the memory controller doesn't read 947 * into memory holes. NOTE: This bit is low true on 7366C0. 948 */ 949 USB_CTRL_SET(ctrl, EBRIDGE, ESTOP_SCB_REQ); 950 951 /* Setup the endian bits */ 952 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP)); 953 reg &= ~USB_CTRL_SETUP_ENDIAN_BITS; 954 reg |= USB_CTRL_MASK_FAMILY(params, SETUP, ENDIAN); 955 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); 956 957 if (params->selected_family == BRCM_FAMILY_7271A0) 958 /* Enable LS keep alive fix for certain keyboards */ 959 USB_CTRL_SET(ctrl, OBRIDGE, LS_KEEP_ALIVE); 960 961 if (params->family_id == 0x72550000) { 962 /* 963 * Make the burst size 512 bytes to fix a hardware bug 964 * on the 7255a0. See HW7255-24. 965 */ 966 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, EBRIDGE)); 967 reg &= ~USB_CTRL_MASK(EBRIDGE, EBR_SCB_SIZE); 968 reg |= 0x800; 969 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, EBRIDGE)); 970 } 971 } 972 973 static void usb_init_xhci(struct brcm_usb_init_params *params) 974 { 975 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 976 977 USB_CTRL_UNSET(ctrl, USB30_PCTL, PHY3_IDDQ_OVERRIDE); 978 /* 1 millisecond - for USB clocks to settle down */ 979 usleep_range(1000, 2000); 980 981 if (BRCM_ID(params->family_id) == 0x7366) { 982 /* 983 * The PHY3_SOFT_RESETB bits default to the wrong state. 984 */ 985 USB_CTRL_SET(ctrl, USB30_PCTL, PHY3_SOFT_RESETB); 986 USB_CTRL_SET(ctrl, USB30_PCTL, PHY3_SOFT_RESETB_P1); 987 } 988 989 /* 990 * Kick start USB3 PHY 991 * Make sure it's low to insure a rising edge. 992 */ 993 USB_CTRL_UNSET(ctrl, USB30_CTL1, PHY3_PLL_SEQ_START); 994 USB_CTRL_SET(ctrl, USB30_CTL1, PHY3_PLL_SEQ_START); 995 996 brcmusb_usb3_phy_workarounds(params); 997 brcmusb_xhci_soft_reset(params, 0); 998 brcmusb_usb3_otp_fix(params); 999 } 1000 1001 static void usb_uninit_common(struct brcm_usb_init_params *params) 1002 { 1003 if (USB_CTRL_MASK_FAMILY(params, USB_PM, USB_PWRDN)) 1004 USB_CTRL_SET_FAMILY(params, USB_PM, USB_PWRDN); 1005 1006 if (USB_CTRL_MASK_FAMILY(params, PLL_CTL, PLL_IDDQ_PWRDN)) 1007 USB_CTRL_SET_FAMILY(params, PLL_CTL, PLL_IDDQ_PWRDN); 1008 if (params->wake_enabled) 1009 usb_wake_enable(params, true); 1010 } 1011 1012 static void usb_uninit_eohci(struct brcm_usb_init_params *params) 1013 { 1014 } 1015 1016 static void usb_uninit_xhci(struct brcm_usb_init_params *params) 1017 { 1018 brcmusb_xhci_soft_reset(params, 1); 1019 USB_CTRL_SET(params->regs[BRCM_REGS_CTRL], USB30_PCTL, 1020 PHY3_IDDQ_OVERRIDE); 1021 } 1022 1023 static int usb_get_dual_select(struct brcm_usb_init_params *params) 1024 { 1025 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 1026 u32 reg = 0; 1027 1028 pr_debug("%s\n", __func__); 1029 if (USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, PORT_MODE)) { 1030 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 1031 reg &= USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, 1032 PORT_MODE); 1033 } 1034 return reg; 1035 } 1036 1037 static void usb_set_dual_select(struct brcm_usb_init_params *params) 1038 { 1039 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 1040 u32 reg; 1041 1042 pr_debug("%s\n", __func__); 1043 1044 if (USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, PORT_MODE)) { 1045 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 1046 reg &= ~USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, 1047 PORT_MODE); 1048 reg |= params->port_mode; 1049 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 1050 } 1051 } 1052 1053 static const struct brcm_usb_init_ops bcm7445_ops = { 1054 .init_ipp = usb_init_ipp, 1055 .init_common = usb_init_common, 1056 .init_eohci = usb_init_eohci, 1057 .init_xhci = usb_init_xhci, 1058 .uninit_common = usb_uninit_common, 1059 .uninit_eohci = usb_uninit_eohci, 1060 .uninit_xhci = usb_uninit_xhci, 1061 .get_dual_select = usb_get_dual_select, 1062 .set_dual_select = usb_set_dual_select, 1063 }; 1064 1065 void brcm_usb_dvr_init_4908(struct brcm_usb_init_params *params) 1066 { 1067 int fam; 1068 1069 fam = BRCM_FAMILY_4908; 1070 params->selected_family = fam; 1071 params->usb_reg_bits_map = 1072 &usb_reg_bits_map_table[fam][0]; 1073 params->family_name = family_names[fam]; 1074 params->ops = &bcm7445_ops; 1075 } 1076 1077 void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params) 1078 { 1079 int fam; 1080 1081 pr_debug("%s\n", __func__); 1082 1083 fam = get_family_type(params); 1084 params->selected_family = fam; 1085 params->usb_reg_bits_map = 1086 &usb_reg_bits_map_table[fam][0]; 1087 params->family_name = family_names[fam]; 1088 params->ops = &bcm7445_ops; 1089 } 1090