phy-brcm-usb-init.c 35 KB

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