phy-brcm-usb-init.c 35 KB

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