phy-brcm-usb-init.c 34 KB

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