mu3d_hal_usb_drv.c 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751
  1. #include "mu3d_hal_osal.h"
  2. #define _MTK_USB_DRV_EXT_
  3. #include "mu3d_hal_usb_drv.h"
  4. #undef _MTK_USB_DRV_EXT_
  5. #include "mu3d_hal_hw.h"
  6. #include "mu3d_hal_qmu_drv.h"
  7. #include "mu3d_hal_comm.h"
  8. #include "mtk-phy.h"
  9. struct USB_REQ *mu3d_hal_get_req(DEV_INT32 ep_num, USB_DIR dir)
  10. {
  11. DEV_INT32 ep_index = 0;
  12. if (dir == USB_TX)
  13. ep_index = ep_num;
  14. else if (dir == USB_RX)
  15. ep_index = ep_num + MAX_EP_NUM;
  16. else
  17. BUG_ON(1);
  18. return &g_u3d_req[ep_index];
  19. }
  20. /**
  21. * mu3d_hal_pdn_dis - disable ssusb power down & clock gated
  22. *
  23. */
  24. void mu3d_hal_pdn_dis(void)
  25. {
  26. os_clrmsk(U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
  27. #ifdef SUPPORT_U3
  28. os_clrmsk(U3D_SSUSB_U3_CTRL_0P,
  29. (SSUSB_U3_PORT_DIS | SSUSB_U3_PORT_PDN | SSUSB_U3_PORT_U2_CG_EN));
  30. #endif
  31. os_clrmsk(U3D_SSUSB_U2_CTRL_0P,
  32. (SSUSB_U2_PORT_DIS | SSUSB_U2_PORT_PDN | SSUSB_U2_PORT_U2_CG_EN));
  33. }
  34. /**
  35. * mu3d_hal_ssusb_en - disable ssusb power down & enable u2/u3 ports
  36. *
  37. */
  38. void mu3d_hal_ssusb_en(void)
  39. {
  40. os_printk(K_INFO, "%s\n", __func__);
  41. os_clrmsk(U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST);
  42. os_clrmsk(U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
  43. #ifdef SUPPORT_U3
  44. os_clrmsk(U3D_SSUSB_U3_CTRL_0P,
  45. (SSUSB_U3_PORT_DIS | SSUSB_U3_PORT_PDN | SSUSB_U3_PORT_HOST_SEL));
  46. #endif
  47. #ifdef SUPPORT_OTG
  48. os_setmsk(U3D_SSUSB_U2_CTRL_0P, (SSUSB_U2_PORT_OTG_MAC_AUTO_SEL | SSUSB_U2_PORT_OTG_SEL));
  49. os_clrmsk(U3D_SSUSB_U2_CTRL_0P, (SSUSB_U2_PORT_DIS | SSUSB_U2_PORT_PDN));
  50. #else
  51. os_clrmsk(U3D_SSUSB_U2_CTRL_0P,
  52. (SSUSB_U2_PORT_DIS | SSUSB_U2_PORT_PDN | SSUSB_U2_PORT_HOST_SEL));
  53. #endif
  54. os_setmsk(U3D_SSUSB_REF_CK_CTRL,
  55. (SSUSB_REF_MAC_CK_GATE_EN | SSUSB_REF_PHY_CK_GATE_EN | SSUSB_REF_CK_GATE_EN |
  56. SSUSB_REF_MAC3_CK_GATE_EN));
  57. /* check U3D sys125,u3 mac,u2 mac clock status. */
  58. mu3d_hal_check_clk_sts();
  59. }
  60. void _ex_mu3d_hal_ssusb_en(void)
  61. {
  62. os_printk(K_INFO, "%s\n", __func__);
  63. os_clrmsk(U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST);
  64. os_clrmsk(U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
  65. #ifdef SUPPORT_U3
  66. os_clrmsk(U3D_SSUSB_U3_CTRL_0P,
  67. (SSUSB_U3_PORT_DIS | SSUSB_U3_PORT_PDN | SSUSB_U3_PORT_HOST_SEL));
  68. #endif
  69. os_clrmsk(U3D_SSUSB_U2_CTRL_0P,
  70. (SSUSB_U2_PORT_DIS | SSUSB_U2_PORT_PDN | SSUSB_U2_PORT_HOST_SEL));
  71. os_setmsk(U3D_SSUSB_REF_CK_CTRL,
  72. (SSUSB_REF_MAC_CK_GATE_EN | SSUSB_REF_PHY_CK_GATE_EN | SSUSB_REF_CK_GATE_EN |
  73. SSUSB_REF_MAC3_CK_GATE_EN));
  74. /* check U3D sys125,u3 mac,u2 mac clock status. */
  75. mu3d_hal_check_clk_sts();
  76. }
  77. /**
  78. * mu3d_hal_dft_reg - apply default register settings
  79. */
  80. void mu3d_hal_dft_reg(void)
  81. {
  82. DEV_UINT32 tmp;
  83. /* set sys_ck related registers */
  84. #ifdef NEVER
  85. /* sys_ck = OSC 125MHz/2 = 62.5MHz */
  86. os_setmsk(U3D_SSUSB_SYS_CK_CTRL, SSUSB_SYS_CK_DIV2_EN);
  87. /* U2 MAC sys_ck = ceil(62.5) = 63 */
  88. os_writelmsk(U3D_USB20_TIMING_PARAMETER, 63, TIME_VALUE_1US);
  89. #ifdef SUPPORT_U3
  90. /* U3 MAC sys_ck = ceil(62.5) = 63 */
  91. os_writelmsk(U3D_TIMING_PULSE_CTRL, 63, CNT_1US_VALUE);
  92. #endif
  93. #endif
  94. /* USB 2.0 related */
  95. /* sys_ck */
  96. os_writelmsk(U3D_USB20_TIMING_PARAMETER, U3D_MAC_SYS_CK, TIME_VALUE_1US);
  97. /* ref_ck */
  98. os_writelmsk(U3D_SSUSB_U2_PHY_PLL, U3D_MAC_REF_CK, SSUSB_U2_PORT_1US_TIMER);
  99. /* spec: >600ns */
  100. tmp = div_and_rnd_up(600, (1000 / U3D_MAC_REF_CK)) + 1;
  101. os_writelmsk(U3D_SSUSB_IP_PW_CTRL0,
  102. (tmp << SSUSB_IP_U2_ENTER_SLEEP_CNT_OFST), SSUSB_IP_U2_ENTER_SLEEP_CNT);
  103. /* USB 3.0 related */
  104. #ifdef SUPPORT_U3
  105. /* sys_ck */
  106. os_writelmsk(U3D_TIMING_PULSE_CTRL, U3D_MAC_SYS_CK, CNT_1US_VALUE);
  107. /* ref_ck */
  108. os_writelmsk(U3D_REF_CK_PARAMETER, U3D_MAC_REF_CK, REF_1000NS);
  109. /* spec: >=300ns */
  110. tmp = div_and_rnd_up(300, (1000 / U3D_MAC_REF_CK));
  111. os_writelmsk(U3D_UX_EXIT_LFPS_TIMING_PARAMETER,
  112. (tmp << RX_UX_EXIT_LFPS_REF_OFST), RX_UX_EXIT_LFPS_REF);
  113. #endif
  114. #ifdef NEVER
  115. /* set ref_ck related registers */
  116. /* U2 ref_ck = OSC 20MHz/2 = 10MHz */
  117. os_writelmsk(U3D_SSUSB_U2_PHY_PLL, 10, SSUSB_U2_PORT_1US_TIMER);
  118. /* >600ns */
  119. os_writelmsk(U3D_SSUSB_IP_PW_CTRL0,
  120. (7 << SSUSB_IP_U2_ENTER_SLEEP_CNT_OFST), SSUSB_IP_U2_ENTER_SLEEP_CNT);
  121. #ifdef SUPPORT_U3
  122. /* U3 ref_ck = 20MHz/2 = 10MHz */
  123. os_writelmsk(U3D_REF_CK_PARAMETER, 10, REF_1000NS);
  124. /* >=300ns */
  125. os_writelmsk(U3D_UX_EXIT_LFPS_TIMING_PARAMETER,
  126. (3 << RX_UX_EXIT_LFPS_REF_OFST), RX_UX_EXIT_LFPS_REF);
  127. #endif
  128. #endif /* NEVER */
  129. /* code to override HW default values, FPGA ONLY */
  130. #ifndef CONFIG_MTK_FPGA
  131. /* enable debug probe */
  132. os_writel(U3D_SSUSB_PRB_CTRL0, 0xffff);
  133. #endif
  134. /* USB 2.0 related */
  135. /* response STALL to host if LPM BESL value is not in supporting range */
  136. os_setmsk(U3D_POWER_MANAGEMENT, (LPM_BESL_STALL | LPM_BESLD_STALL));
  137. /* USB 3.0 related */
  138. #ifdef SUPPORT_U3
  139. #ifdef U2_U3_SWITCH_AUTO
  140. os_setmsk(U3D_USB2_TEST_MODE, U2U3_AUTO_SWITCH);
  141. #endif
  142. /* device responses to u3_exit from host automatically */
  143. os_writel(U3D_LTSSM_CTRL, os_readl(U3D_LTSSM_CTRL) & ~SOFT_U3_EXIT_EN);
  144. #ifndef CONFIG_MTK_FPGA
  145. os_writel(U3D_PIPE_LATCH_SELECT, 0);
  146. #endif
  147. #endif
  148. #if ISO_UPDATE_TEST & ISO_UPDATE_MODE
  149. os_setmsk(U3D_POWER_MANAGEMENT, ISO_UPDATE);
  150. #else
  151. os_clrmsk(U3D_POWER_MANAGEMENT, ISO_UPDATE);
  152. #endif
  153. #ifdef DIS_ZLP_CHECK_CRC32
  154. /* disable CRC check of ZLP, for compatibility concern */
  155. os_writel(U3D_LINK_CAPABILITY_CTRL, ZLP_CRC32_CHK_DIS);
  156. #endif
  157. }
  158. /**
  159. * mu3d_hal_rst_dev - reset all device modules
  160. *
  161. */
  162. void mu3d_hal_rst_dev(void)
  163. {
  164. DEV_INT32 ret;
  165. os_printk(K_ERR, "%s\n", __func__);
  166. #if 0
  167. os_writel(U3D_SSUSB_DEV_RST_CTRL,
  168. SSUSB_DEV_SW_RST | SSUSB_DEV_SW_BMU_RST | SSUSB_DEV_SW_QMU_RST |
  169. SSUSB_DEV_SW_DRAM_RST);
  170. os_writel(U3D_SSUSB_DEV_RST_CTRL, 0);
  171. #else
  172. os_writel(U3D_SSUSB_DEV_RST_CTRL, SSUSB_DEV_SW_RST);
  173. os_writel(U3D_SSUSB_DEV_RST_CTRL, 0);
  174. #endif
  175. mu3d_hal_check_clk_sts();
  176. ret =
  177. wait_for_value(U3D_SSUSB_IP_PW_STS1, SSUSB_DEV_QMU_RST_B_STS, SSUSB_DEV_QMU_RST_B_STS,
  178. 1, 10);
  179. if (ret == RET_FAIL)
  180. os_printk(K_ERR, "SSUSB_DEV_QMU_RST_B_STS NG\n");
  181. ret =
  182. wait_for_value(U3D_SSUSB_IP_PW_STS1, SSUSB_DEV_BMU_RST_B_STS, SSUSB_DEV_BMU_RST_B_STS,
  183. 1, 10);
  184. if (ret == RET_FAIL)
  185. os_printk(K_ERR, "SSUSB_DEV_BMU_RST_B_STS NG\n");
  186. ret = wait_for_value(U3D_SSUSB_IP_PW_STS1, SSUSB_DEV_RST_B_STS, SSUSB_DEV_RST_B_STS, 1, 10);
  187. if (ret == RET_FAIL)
  188. os_printk(K_ERR, "SSUSB_DEV_RST_B_STS NG\n");
  189. }
  190. /**
  191. * mu3d_hal_check_clk_sts - check sys125,u3 mac,u2 mac clock status
  192. *
  193. */
  194. DEV_INT32 mu3d_hal_check_clk_sts(void)
  195. {
  196. DEV_INT32 ret;
  197. os_printk(K_ERR, "%s\n", __func__);
  198. ret =
  199. wait_for_value(U3D_SSUSB_IP_PW_STS1, SSUSB_SYS125_RST_B_STS, SSUSB_SYS125_RST_B_STS, 1,
  200. 10);
  201. if (ret == RET_FAIL)
  202. os_printk(K_ERR, "SSUSB_SYS125_RST_B_STS NG\n");
  203. /* do not check when SSUSB_U2_PORT_PDN = 1, because U2 port stays in reset state */
  204. if (!(os_readl(U3D_SSUSB_U2_CTRL_0P) & SSUSB_U2_PORT_PDN)) {
  205. ret =
  206. wait_for_value(U3D_SSUSB_IP_PW_STS2, SSUSB_U2_MAC_SYS_RST_B_STS,
  207. SSUSB_U2_MAC_SYS_RST_B_STS, 1, 10);
  208. if (ret == RET_FAIL)
  209. os_printk(K_ERR, "SSUSB_U2_MAC_SYS_RST_B_STS NG\n");
  210. }
  211. #ifdef SUPPORT_U3
  212. /* do not check when SSUSB_U3_PORT_PDN = 1, because U3 port stays in reset state */
  213. if (!(os_readl(U3D_SSUSB_U3_CTRL_0P) & SSUSB_U3_PORT_PDN)) {
  214. ret =
  215. wait_for_value(U3D_SSUSB_IP_PW_STS1, SSUSB_U3_MAC_RST_B_STS,
  216. SSUSB_U3_MAC_RST_B_STS, 1, 100);
  217. if (ret == RET_FAIL)
  218. os_printk(K_ERR,
  219. "SSUSB_U3_MAC_RST_B_STS NG, U3D_SSUSB_IP_PW_STS1 is 0x%x\n",
  220. os_readl(U3D_SSUSB_IP_PW_STS1));
  221. }
  222. #endif
  223. os_printk(K_CRIT, "check clk pass!!\n");
  224. return RET_SUCCESS;
  225. }
  226. /**
  227. * mu3d_hal_link_up - u3d link up
  228. *
  229. */
  230. DEV_INT32 mu3d_hal_link_up(DEV_INT32 latch_val)
  231. {
  232. mu3d_hal_ssusb_en();
  233. mu3d_hal_rst_dev();
  234. os_ms_delay(50);
  235. os_writel(U3D_USB3_CONFIG, USB3_EN);
  236. os_writel(U3D_PIPE_LATCH_SELECT, latch_val); /* set tx/rx latch sel */
  237. return 0;
  238. }
  239. /**
  240. * mu3d_hal_initr_dis - disable all interrupts
  241. *
  242. */
  243. void mu3d_hal_initr_dis(void)
  244. {
  245. /* Disable Level 1 interrupts */
  246. os_writel(U3D_LV1IECR, 0xFFFFFFFF);
  247. /* Disable Endpoint interrupts */
  248. os_writel(U3D_EPIECR, 0xFFFFFFFF);
  249. /* Disable DMA interrupts */
  250. os_writel(U3D_DMAIECR, 0xFFFFFFFF);
  251. #ifdef SUPPORT_OTG
  252. /* Disable TxQ/RxQ Done interrupts */
  253. os_writel(U3D_QIECR0, 0xFFFFFFFF);
  254. /* Disable TxQ/RxQ Empty/Checksum/Length/ZLP Error indication */
  255. os_writel(U3D_QIECR1, 0xFFFFFFFF);
  256. /* Disable TxQ/RxQ Empty Indication */
  257. os_writel(U3D_QEMIECR, 0xFFFFFFFF);
  258. /* Disable Interrupt of TxQ GPD Checksum/Data Buffer Length Error */
  259. os_writel(U3D_TQERRIECR0, 0xFFFFFFFF);
  260. /* Disable Interrupt of RxQ GPD Checksum/Data Buffer Length Error */
  261. os_writel(U3D_RQERRIECR0, 0xFFFFFFFF);
  262. /* Disable RxQ ZLP Error indication */
  263. os_writel(U3D_RQERRIECR1, 0xFFFFFFFF);
  264. #endif
  265. }
  266. void mu3d_hal_clear_intr(void)
  267. {
  268. os_printk(K_ERR, "%s\n", __func__);
  269. /* Clear EP0 and Tx/Rx EPn interrupts status */
  270. os_writel(U3D_EPISR, 0xFFFFFFFF);
  271. /* Clear EP0 and Tx/Rx EPn DMA interrupts status */
  272. os_writel(U3D_DMAISR, 0xFFFFFFFF);
  273. #ifdef SUPPORT_OTG
  274. /* Clear TxQ/RxQ Done interrupts status */
  275. os_writel(U3D_QISAR0, 0xFFFFFFFF);
  276. /* Clear TxQ/RxQ Empty/Checksum/Length/ZLP Error indication status */
  277. os_writel(U3D_QISAR1, 0xFFFFFFFF);
  278. /* Clear TxQ/RxQ Empty indication */
  279. os_writel(U3D_QEMIR, 0xFFFFFFFF);
  280. /* Clear Interrupt of RxQ GPD Checksum/Data Buffer Length Error */
  281. os_writel(U3D_TQERRIR0, 0xFFFFFFFF);
  282. /* Clear Interrupt of RxQ GPD Checksum/Data Buffer Length Error */
  283. os_writel(U3D_RQERRIR0, 0xFFFFFFFF);
  284. /* Clear RxQ ZLP Error indication */
  285. os_writel(U3D_RQERRIR1, 0xFFFFFFFF);
  286. #endif
  287. /* Clear speed change event */
  288. os_writel(U3D_DEV_LINK_INTR, 0xFFFFFFFF);
  289. /* Clear U2 USB common interrupt status */
  290. os_writel(U3D_COMMON_USB_INTR, 0xFFFFFFFF);
  291. /* Clear U3 LTSSM interrupt status */
  292. os_writel(U3D_LTSSM_INTR, 0xFFFFFFFF);
  293. }
  294. /**
  295. * mu3d_hal_system_intr_en - enable system global interrupt
  296. *
  297. */
  298. void mu3d_hal_system_intr_en(void)
  299. {
  300. DEV_UINT16 int_en;
  301. DEV_UINT32 ltssm_int_en;
  302. os_printk(K_ERR, "%s\n", __func__);
  303. /* Disable All endpoint interrupt */
  304. os_writel(U3D_EPIECR, os_readl(U3D_EPIER));
  305. /* Disable All DMA interrput */
  306. os_writel(U3D_DMAIECR, os_readl(U3D_DMAIER));
  307. /* Disable U2 common USB interrupts */
  308. os_writel(U3D_COMMON_USB_INTR_ENABLE, 0x00);
  309. /* Clear U2 common USB interrupts status */
  310. os_writel(U3D_COMMON_USB_INTR, os_readl(U3D_COMMON_USB_INTR));
  311. /* Enable U2 common USB interrupt */
  312. int_en = SUSPEND_INTR_EN | RESUME_INTR_EN | RESET_INTR_EN | CONN_INTR_EN | DISCONN_INTR_EN
  313. | VBUSERR_INTR_EN | LPM_INTR_EN | LPM_RESUME_INTR_EN;
  314. os_writel(U3D_COMMON_USB_INTR_ENABLE, int_en);
  315. #ifdef SUPPORT_U3
  316. /* Disable U3 LTSSM interrupts */
  317. os_writel(U3D_LTSSM_INTR_ENABLE, 0x00);
  318. os_printk(K_ERR, "U3D_LTSSM_INTR: %x\n", os_readl(U3D_LTSSM_INTR));
  319. /* Clear U3 LTSSM interrupts */
  320. os_writel(U3D_LTSSM_INTR, os_readl(U3D_LTSSM_INTR));
  321. /* Enable U3 LTSSM interrupts */
  322. ltssm_int_en =
  323. SS_INACTIVE_INTR_EN | SS_DISABLE_INTR_EN | COMPLIANCE_INTR_EN | LOOPBACK_INTR_EN |
  324. HOT_RST_INTR_EN | WARM_RST_INTR_EN | RECOVERY_INTR_EN | ENTER_U0_INTR_EN |
  325. ENTER_U1_INTR_EN | ENTER_U2_INTR_EN | ENTER_U3_INTR_EN | EXIT_U1_INTR_EN |
  326. EXIT_U2_INTR_EN | EXIT_U3_INTR_EN | RXDET_SUCCESS_INTR_EN | VBUS_RISE_INTR_EN |
  327. VBUS_FALL_INTR_EN | U3_LFPS_TMOUT_INTR_EN | U3_RESUME_INTR_EN;
  328. os_writel(U3D_LTSSM_INTR_ENABLE, ltssm_int_en);
  329. #endif
  330. #ifdef SUPPORT_OTG
  331. /* os_writel(U3D_SSUSB_OTG_INT_EN, 0x0); */
  332. os_printk(K_ERR, "U3D_SSUSB_OTG_STS: %x\n", os_readl(U3D_SSUSB_OTG_STS));
  333. os_writel(U3D_SSUSB_OTG_STS_CLR, os_readl(U3D_SSUSB_OTG_STS));
  334. os_writel(U3D_SSUSB_OTG_INT_EN,
  335. os_readl(U3D_SSUSB_OTG_INT_EN) | SSUSB_VBUS_CHG_INT_B_EN |
  336. SSUSB_CHG_B_ROLE_B_INT_EN | SSUSB_CHG_A_ROLE_B_INT_EN |
  337. SSUSB_ATTACH_B_ROLE_INT_EN);
  338. #endif
  339. #ifdef USE_SSUSB_QMU
  340. /* Enable QMU interrupt. */
  341. os_writel(U3D_QIESR1, TXQ_EMPTY_IESR | TXQ_CSERR_IESR | TXQ_LENERR_IESR |
  342. RXQ_EMPTY_IESR | RXQ_CSERR_IESR | RXQ_LENERR_IESR | RXQ_ZLPERR_IESR);
  343. #endif
  344. /* Enable EP0 DMA interrupt */
  345. os_writel(U3D_DMAIESR, EP0DMAIESR);
  346. /* Enable speed change interrupt */
  347. os_writel(U3D_DEV_LINK_INTR_ENABLE, SSUSB_DEV_SPEED_CHG_INTR_EN);
  348. }
  349. void _ex_mu3d_hal_system_intr_en(void)
  350. {
  351. DEV_UINT16 int_en;
  352. DEV_UINT32 ltssm_int_en;
  353. os_printk(K_ERR, "%s\n", __func__);
  354. /* Disable All endpoint interrupt */
  355. os_writel(U3D_EPIECR, os_readl(U3D_EPIER));
  356. /* Disable All DMA interrput */
  357. os_writel(U3D_DMAIECR, os_readl(U3D_DMAIER));
  358. /* Disable U2 common USB interrupts */
  359. os_writel(U3D_COMMON_USB_INTR_ENABLE, 0x00);
  360. /* Clear U2 common USB interrupts status */
  361. os_writel(U3D_COMMON_USB_INTR, os_readl(U3D_COMMON_USB_INTR));
  362. /* Enable U2 common USB interrupt */
  363. int_en = SUSPEND_INTR_EN | RESUME_INTR_EN | RESET_INTR_EN | CONN_INTR_EN | DISCONN_INTR_EN
  364. | VBUSERR_INTR_EN | LPM_INTR_EN | LPM_RESUME_INTR_EN;
  365. os_writel(U3D_COMMON_USB_INTR_ENABLE, int_en);
  366. #ifdef SUPPORT_U3
  367. /* Disable U3 LTSSM interrupts */
  368. os_writel(U3D_LTSSM_INTR_ENABLE, 0x00);
  369. os_printk(K_ERR, "U3D_LTSSM_INTR: %x\n", os_readl(U3D_LTSSM_INTR));
  370. /* Clear U3 LTSSM interrupts */
  371. os_writel(U3D_LTSSM_INTR, os_readl(U3D_LTSSM_INTR));
  372. /* Enable U3 LTSSM interrupts */
  373. ltssm_int_en =
  374. SS_INACTIVE_INTR_EN | SS_DISABLE_INTR_EN | COMPLIANCE_INTR_EN | LOOPBACK_INTR_EN |
  375. HOT_RST_INTR_EN | WARM_RST_INTR_EN | RECOVERY_INTR_EN | ENTER_U0_INTR_EN |
  376. ENTER_U1_INTR_EN | ENTER_U2_INTR_EN | ENTER_U3_INTR_EN | EXIT_U1_INTR_EN |
  377. EXIT_U2_INTR_EN | EXIT_U3_INTR_EN | RXDET_SUCCESS_INTR_EN | VBUS_RISE_INTR_EN |
  378. VBUS_FALL_INTR_EN | U3_LFPS_TMOUT_INTR_EN | U3_RESUME_INTR_EN;
  379. os_writel(U3D_LTSSM_INTR_ENABLE, ltssm_int_en);
  380. #endif
  381. #ifdef SUPPORT_OTG
  382. /* os_writel(U3D_SSUSB_OTG_INT_EN, 0x0); */
  383. os_printk(K_ERR, "U3D_SSUSB_OTG_STS: %x\n", os_readl(U3D_SSUSB_OTG_STS));
  384. os_writel(U3D_SSUSB_OTG_STS_CLR, os_readl(U3D_SSUSB_OTG_STS));
  385. os_writel(U3D_SSUSB_OTG_INT_EN,
  386. os_readl(U3D_SSUSB_OTG_INT_EN) | SSUSB_VBUS_CHG_INT_B_EN |
  387. SSUSB_CHG_B_ROLE_B_INT_EN | SSUSB_CHG_A_ROLE_B_INT_EN |
  388. SSUSB_ATTACH_B_ROLE_INT_EN);
  389. #endif
  390. #ifdef USE_SSUSB_QMU
  391. /* Enable QMU interrupt. */
  392. os_writel(U3D_QIESR1, TXQ_EMPTY_IESR | TXQ_CSERR_IESR | TXQ_LENERR_IESR |
  393. RXQ_EMPTY_IESR | RXQ_CSERR_IESR | RXQ_LENERR_IESR | RXQ_ZLPERR_IESR);
  394. #endif
  395. /* Enable EP0 DMA interrupt */
  396. os_writel(U3D_DMAIESR, EP0DMAIESR);
  397. /* Enable speed change interrupt */
  398. os_writel(U3D_DEV_LINK_INTR_ENABLE, SSUSB_DEV_SPEED_CHG_INTR_EN);
  399. }
  400. /**
  401. * mu3d_hal_resume - power mode resume
  402. *
  403. */
  404. void mu3d_hal_resume(void)
  405. {
  406. #ifdef SUPPORT_U3
  407. if (os_readl(U3D_DEVICE_CONF) & HW_USB2_3_SEL) { /* SS */
  408. mu3d_hal_pdn_ip_port(1, 0, 1, 0);
  409. os_setmsk(U3D_LINK_POWER_CONTROL, UX_EXIT);
  410. } else
  411. #endif
  412. { /* hs fs */
  413. mu3d_hal_pdn_ip_port(1, 0, 0, 1);
  414. os_setmsk(U3D_POWER_MANAGEMENT, RESUME);
  415. os_ms_delay(10);
  416. os_clrmsk(U3D_POWER_MANAGEMENT, RESUME);
  417. }
  418. }
  419. /**
  420. * mu3d_hal_u2dev_connect - u2 device softconnect
  421. *
  422. */
  423. void mu3d_hal_u2dev_connect(void)
  424. {
  425. os_writel(U3D_POWER_MANAGEMENT, os_readl(U3D_POWER_MANAGEMENT) | SOFT_CONN);
  426. os_writel(U3D_POWER_MANAGEMENT, os_readl(U3D_POWER_MANAGEMENT) | SUSPENDM_ENABLE);
  427. os_printk(K_INFO, "SOFTCONN = 1\n");
  428. }
  429. void mu3d_hal_u2dev_disconn(void)
  430. {
  431. os_writel(U3D_POWER_MANAGEMENT, os_readl(U3D_POWER_MANAGEMENT) & ~SOFT_CONN);
  432. os_writel(U3D_POWER_MANAGEMENT, os_readl(U3D_POWER_MANAGEMENT) & ~SUSPENDM_ENABLE);
  433. os_printk(K_INFO, "SOFTCONN = 0\n");
  434. }
  435. /**
  436. * mu3d_hal_u3dev_en - enable U3D SS dev
  437. *
  438. */
  439. void mu3d_hal_dump_register(void)
  440. {
  441. void __iomem *i;
  442. pr_debug("\n\n[mu3d_hal_dump_register]\n");
  443. pr_debug("SSUSB_DEV_BASE ==================>\n");
  444. for (i = SSUSB_DEV_BASE; i <= SSUSB_DEV_BASE + 0xC; i += 0x4)
  445. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  446. for (i = SSUSB_DEV_BASE + 0x20; i <= SSUSB_DEV_BASE + 0x24; i += 0x4)
  447. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  448. for (i = SSUSB_DEV_BASE + 0x30; i <= SSUSB_DEV_BASE + 0x34; i += 0x4)
  449. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  450. for (i = SSUSB_DEV_BASE + 0x40; i <= SSUSB_DEV_BASE + 0x44; i += 0x4)
  451. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  452. for (i = SSUSB_DEV_BASE + 0x50; i <= SSUSB_DEV_BASE + 0x50; i += 0x4)
  453. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  454. for (i = SSUSB_DEV_BASE + 0x70; i <= SSUSB_DEV_BASE + 0x74; i += 0x4)
  455. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  456. for (i = SSUSB_DEV_BASE + 0x80; i <= SSUSB_DEV_BASE + 0x9C; i += 0x4)
  457. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  458. for (i = SSUSB_DEV_BASE + 0xC0; i <= SSUSB_DEV_BASE + 0xEC; i += 0x4)
  459. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  460. for (i = SSUSB_DEV_BASE + 0x100; i <= SSUSB_DEV_BASE + 0x10C; i += 0x4)
  461. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  462. for (i = SSUSB_DEV_BASE + 0x400; i <= SSUSB_DEV_BASE + 0x410; i += 0x4)
  463. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  464. for (i = SSUSB_DEV_BASE + 0x700; i <= SSUSB_DEV_BASE + 0x71C; i += 0x4)
  465. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  466. for (i = SSUSB_DEV_BASE + 0xC04; i <= SSUSB_DEV_BASE + 0xC10; i += 0x4)
  467. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  468. for (i = SSUSB_DEV_BASE + 0xC20; i <= SSUSB_DEV_BASE + 0xC3C; i += 0x4)
  469. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  470. for (i = SSUSB_DEV_BASE + 0xC84; i <= SSUSB_DEV_BASE + 0xC84; i += 0x4)
  471. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  472. pr_debug("SSUSB_DEV_BASE <==================\n");
  473. pr_debug("SSUSB_USB2_CSR ==================>\n");
  474. for (i = SSUSB_USB2_CSR_BASE + 0x0000; i <= SSUSB_USB2_CSR_BASE + 0x0060; i += 0x4)
  475. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  476. pr_debug("SSUSB_USB2_CSR <==================\n");
  477. pr_debug("SSUSB_SIFSLV_IPPC_BASE ==================>\n");
  478. for (i = SSUSB_SIFSLV_IPPC_BASE + 0x0000; i <= SSUSB_SIFSLV_IPPC_BASE + 0x002C; i += 0x4)
  479. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  480. for (i = SSUSB_SIFSLV_IPPC_BASE + 0x0030; i <= SSUSB_SIFSLV_IPPC_BASE + 0x0038; i += 0x4)
  481. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  482. for (i = SSUSB_SIFSLV_IPPC_BASE + 0x0050; i <= SSUSB_SIFSLV_IPPC_BASE + 0x0050; i += 0x4)
  483. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  484. for (i = SSUSB_SIFSLV_IPPC_BASE + 0x007C; i <= SSUSB_SIFSLV_IPPC_BASE + 0x00A4; i += 0x4)
  485. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  486. pr_debug("SSUSB_SIFSLV_IPPC_BASE <==================\n");
  487. pr_debug("SSUSB_EPCTL_CSR_BASE ==================>\n");
  488. for (i = SSUSB_EPCTL_CSR_BASE + 0x0000; i <= SSUSB_EPCTL_CSR_BASE + 0x0028; i += 0x4)
  489. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  490. for (i = SSUSB_EPCTL_CSR_BASE + 0x0030; i <= SSUSB_EPCTL_CSR_BASE + 0x0030; i += 0x4)
  491. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  492. for (i = SSUSB_EPCTL_CSR_BASE + 0x0040; i <= SSUSB_EPCTL_CSR_BASE + 0x0048; i += 0x4)
  493. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  494. for (i = SSUSB_EPCTL_CSR_BASE + 0x0050; i <= SSUSB_EPCTL_CSR_BASE + 0x0054; i += 0x4)
  495. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  496. for (i = SSUSB_EPCTL_CSR_BASE + 0x0060; i <= SSUSB_EPCTL_CSR_BASE + 0x0064; i += 0x4)
  497. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  498. pr_debug("SSUSB_EPCTL_CSR_BASE <==================\n");
  499. pr_debug("SSUSB_USB3_SYS_CSR_BASE ==================>\n");
  500. for (i = SSUSB_USB3_SYS_CSR_BASE + 0x0200; i <= SSUSB_USB3_SYS_CSR_BASE + 0x022C; i += 0x4)
  501. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  502. for (i = SSUSB_USB3_SYS_CSR_BASE + 0x0240; i <= SSUSB_USB3_SYS_CSR_BASE + 0x0244; i += 0x4)
  503. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  504. for (i = SSUSB_USB3_SYS_CSR_BASE + 0x0290; i <= SSUSB_USB3_SYS_CSR_BASE + 0x029C; i += 0x4)
  505. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  506. for (i = SSUSB_USB3_SYS_CSR_BASE + 0x02A0; i <= SSUSB_USB3_SYS_CSR_BASE + 0x02AC; i += 0x4)
  507. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  508. for (i = SSUSB_USB3_SYS_CSR_BASE + 0x02B0; i <= SSUSB_USB3_SYS_CSR_BASE + 0x02B8; i += 0x4)
  509. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  510. for (i = SSUSB_USB3_SYS_CSR_BASE + 0x02C0; i <= SSUSB_USB3_SYS_CSR_BASE + 0x02DC; i += 0x4)
  511. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  512. pr_debug("SSUSB_USB3_SYS_CSR_BASE <==================\n");
  513. pr_debug("SSUSB_USB3_MAC_CSR ==================>\n");
  514. for (i = SSUSB_USB3_MAC_CSR_BASE + 0x0000; i <= SSUSB_USB3_MAC_CSR_BASE + 0x001C; i += 0x4)
  515. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  516. for (i = SSUSB_USB3_MAC_CSR_BASE + 0x0050; i <= SSUSB_USB3_MAC_CSR_BASE + 0x0054; i += 0x4)
  517. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  518. for (i = SSUSB_USB3_MAC_CSR_BASE + 0x007C; i <= SSUSB_USB3_MAC_CSR_BASE + 0x00B0; i += 0x4)
  519. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  520. for (i = SSUSB_USB3_MAC_CSR_BASE + 0x0010C; i <= SSUSB_USB3_MAC_CSR_BASE + 0x0148; i += 0x4)
  521. pr_debug("[0x%lx] 0x%x\n", (unsigned long)i, os_readl(i));
  522. pr_debug("SSUSB_USB3_MAC_CSR <==================\n");
  523. pr_debug("\n[mu3d_hal_dump_register]\n\n\n");
  524. }
  525. void mu3d_hal_u3dev_en(void)
  526. {
  527. /*
  528. * Enable super speed function.
  529. */
  530. os_writel(U3D_USB3_CONFIG, USB3_EN);
  531. os_printk(K_INFO, "USB3_EN = 1\n");
  532. }
  533. /**
  534. * mu3d_hal_u3dev_dis - disable U3D SS dev
  535. *
  536. */
  537. void mu3d_hal_u3dev_dis(void)
  538. {
  539. /*
  540. * If usb3_en =0 => LTSSM will go to SS.Disable state.
  541. */
  542. os_writel(U3D_USB3_CONFIG, 0);
  543. os_printk(K_INFO, "USB3_EN = 0\n");
  544. }
  545. /**
  546. * mu3d_hal_set_speed - enable ss or connect to hs/fs
  547. *@args - arg1: speed
  548. */
  549. void mu3d_hal_set_speed(USB_SPEED speed)
  550. {
  551. #ifndef EXT_VBUS_DET
  552. os_writel(U3D_MISC_CTRL, 0);
  553. #else
  554. os_writel(U3D_MISC_CTRL, 0x3);
  555. #endif
  556. pr_debug("mu3d_hal_set_speed speed=%d\n", speed);
  557. /* clear ltssm state */
  558. if (speed == SSUSB_SPEED_FULL) {
  559. os_writel(U3D_POWER_MANAGEMENT, os_readl(U3D_POWER_MANAGEMENT) & ~HS_ENABLE);
  560. mu3d_hal_u2dev_connect();
  561. g_u3d_setting.speed = SSUSB_SPEED_FULL;
  562. } else if (speed == SSUSB_SPEED_HIGH) {
  563. os_writel(U3D_POWER_MANAGEMENT, os_readl(U3D_POWER_MANAGEMENT) | HS_ENABLE);
  564. mu3d_hal_u2dev_connect();
  565. g_u3d_setting.speed = SSUSB_SPEED_HIGH;
  566. }
  567. #ifdef SUPPORT_U3
  568. else if (speed == SSUSB_SPEED_SUPER) {
  569. g_u3d_setting.speed = SSUSB_SPEED_SUPER;
  570. mu3d_hal_u2dev_disconn();
  571. mu3d_hal_u3dev_en();
  572. }
  573. #endif
  574. else {
  575. os_printk(K_ALET, "Unsupported speed!!\n");
  576. BUG_ON(1);
  577. }
  578. }
  579. /**
  580. * mu3d_hal_pdn_cg_en - enable U2/U3 pdn & cg
  581. *@args -
  582. */
  583. void mu3d_hal_pdn_cg_en(void)
  584. {
  585. #ifdef POWER_SAVING_MODE
  586. DEV_UINT8 speed = (os_readl(U3D_DEVICE_CONF) & SSUSB_DEV_SPEED);
  587. os_printk(K_INFO, "%s\n", __func__);
  588. switch (speed) {
  589. case SSUSB_SPEED_SUPER:
  590. os_printk(K_NOTICE, "Device: SUPER SPEED LOW POWER\n");
  591. os_setmsk(U3D_SSUSB_U2_CTRL_0P, SSUSB_U2_PORT_PDN);
  592. break;
  593. case SSUSB_SPEED_HIGH:
  594. os_printk(K_NOTICE, "Device: HIGH SPEED LOW POWER\n");
  595. #ifdef SUPPORT_U3
  596. os_setmsk(U3D_SSUSB_U3_CTRL_0P, SSUSB_U3_PORT_PDN);
  597. #endif
  598. break;
  599. case SSUSB_SPEED_FULL:
  600. os_printk(K_NOTICE, "Device: FULL SPEED LOW POWER\n");
  601. #ifdef SUPPORT_U3
  602. os_setmsk(U3D_SSUSB_U3_CTRL_0P, SSUSB_U3_PORT_PDN);
  603. #endif
  604. break;
  605. default:
  606. os_printk(K_NOTICE, "[ERROR] Are you kidding!?!?\n");
  607. break;
  608. }
  609. #endif
  610. }
  611. void mu3d_hal_pdn_ip_port(DEV_UINT8 on, DEV_UINT8 touch_dis, DEV_UINT8 u3, DEV_UINT8 u2)
  612. {
  613. #ifdef POWER_SAVING_MODE
  614. os_printk(K_INFO, "%s on=%d, touch_dis=%d, u3=%d, u2=%d\n", __func__, on, touch_dis, u3,
  615. u2);
  616. if (on) {
  617. os_clrmsk(U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
  618. #ifdef SUPPORT_U3
  619. if (u3)
  620. os_clrmsk(U3D_SSUSB_U3_CTRL_0P, SSUSB_U3_PORT_PDN
  621. | ((touch_dis) ? SSUSB_U3_PORT_DIS : 0));
  622. #endif
  623. if (u2)
  624. os_clrmsk(U3D_SSUSB_U2_CTRL_0P, SSUSB_U2_PORT_PDN
  625. | ((touch_dis) ? SSUSB_U2_PORT_DIS : 0));
  626. while (!(os_readl(U3D_SSUSB_IP_PW_STS1) & SSUSB_SYSPLL_STABLE))
  627. ;
  628. } else {
  629. #ifdef SUPPORT_U3
  630. if (u3)
  631. os_setmsk(U3D_SSUSB_U3_CTRL_0P, SSUSB_U3_PORT_PDN
  632. | ((touch_dis) ? SSUSB_U3_PORT_DIS : 0));
  633. #endif
  634. if (u2)
  635. os_setmsk(U3D_SSUSB_U2_CTRL_0P, SSUSB_U2_PORT_PDN
  636. | ((touch_dis) ? SSUSB_U2_PORT_DIS : 0));
  637. os_setmsk(U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
  638. }
  639. #else
  640. os_printk(K_INFO, "%s Does NOT support IP power down\n", __func__);
  641. #endif
  642. }
  643. /**
  644. * mu3d_hal_det_speed - detect device speed
  645. *@args - arg1: speed
  646. */
  647. void mu3d_hal_det_speed(USB_SPEED speed, DEV_UINT8 det_speed)
  648. {
  649. DEV_UINT8 temp;
  650. DEV_UINT16 cnt_down = 10000;
  651. pr_debug("===Start polling===\n");
  652. /* #ifdef EXT_VBUS_DET */
  653. if (!det_speed) {
  654. while (!(os_readl(U3D_DEV_LINK_INTR) & SSUSB_DEV_SPEED_CHG_INTR)) {
  655. os_ms_delay(1);
  656. cnt_down--;
  657. if (cnt_down == 0) {
  658. pr_debug("===Polling FAIL===\n");
  659. return;
  660. }
  661. }
  662. } else {
  663. while (!(os_readl(U3D_DEV_LINK_INTR) & SSUSB_DEV_SPEED_CHG_INTR))
  664. ;
  665. }
  666. /* #else */
  667. /* while(!(os_readl(U3D_DEV_LINK_INTR) & SSUSB_DEV_SPEED_CHG_INTR)); */
  668. /* #endif */
  669. pr_debug("===Polling End===\n");
  670. os_writel(U3D_DEV_LINK_INTR, SSUSB_DEV_SPEED_CHG_INTR);
  671. temp = (os_readl(U3D_DEVICE_CONF) & SSUSB_DEV_SPEED);
  672. switch (temp) {
  673. case SSUSB_SPEED_SUPER:
  674. os_printk(K_EMERG, "Device: SUPER SPEED\n");
  675. break;
  676. case SSUSB_SPEED_HIGH:
  677. os_printk(K_EMERG, "Device: HIGH SPEED\n");
  678. break;
  679. case SSUSB_SPEED_FULL:
  680. os_printk(K_EMERG, "Device: FULL SPEED\n");
  681. break;
  682. case SSUSB_SPEED_INACTIVE:
  683. os_printk(K_EMERG, "Device: INACTIVE\n");
  684. break;
  685. }
  686. if (temp != speed) {
  687. os_printk(K_EMERG, "desired speed: %d, detected speed: %d\n", speed, temp);
  688. os_ms_delay(5000);
  689. /* while(1); */
  690. }
  691. }
  692. /**
  693. * mu3d_hal_write_fifo - pio write one packet
  694. *@args - arg1: ep number, arg2: data length, arg3: data buffer, arg4: max packet size
  695. */
  696. DEV_INT32 mu3d_hal_write_fifo(DEV_INT32 ep_num, DEV_INT32 length, DEV_UINT8 *buf, DEV_INT32 maxp)
  697. {
  698. DEV_UINT32 residue;
  699. DEV_UINT32 count;
  700. DEV_UINT32 temp;
  701. os_printk(K_DEBUG, "%s epnum=%d, len=%d, buf=%p, maxp=%d\n", __func__, ep_num, length, buf,
  702. maxp);
  703. count = residue = length;
  704. while (residue > 0) {
  705. if (residue == 1) {
  706. temp = ((*buf) & 0xFF);
  707. os_writeb(USB_FIFO(ep_num), temp);
  708. buf += 1;
  709. residue -= 1;
  710. } else if (residue == 2) {
  711. temp = ((*buf) & 0xFF) + (((*(buf + 1)) << 8) & 0xFF00);
  712. os_writew(USB_FIFO(ep_num), temp);
  713. buf += 2;
  714. residue -= 2;
  715. } else if (residue == 3) {
  716. temp = ((*buf) & 0xFF) + (((*(buf + 1)) << 8) & 0xFF00);
  717. os_writew(USB_FIFO(ep_num), temp);
  718. buf += 2;
  719. temp = ((*buf) & 0xFF);
  720. os_writeb(USB_FIFO(ep_num), temp);
  721. buf += 1;
  722. residue -= 3;
  723. } else {
  724. temp =
  725. ((*buf) & 0xFF) + (((*(buf + 1)) << 8) & 0xFF00) +
  726. (((*(buf + 2)) << 16) & 0xFF0000) + (((*(buf + 3)) << 24) & 0xFF000000);
  727. os_writel(USB_FIFO(ep_num), temp);
  728. buf += 4;
  729. residue -= 4;
  730. }
  731. }
  732. if (ep_num == 0) {
  733. if (count == 0) {
  734. os_printk(K_DEBUG, "USB_EP0_DATAEND %8X+\n", os_readl(U3D_EP0CSR));
  735. os_writel(U3D_EP0CSR, os_readl(U3D_EP0CSR) | EP0_DATAEND | EP0_TXPKTRDY);
  736. os_printk(K_DEBUG, "USB_EP0_DATAEND %8X-\n", os_readl(U3D_EP0CSR));
  737. } else {
  738. #ifdef AUTOSET
  739. if (count < maxp) {
  740. os_writel(U3D_EP0CSR, os_readl(U3D_EP0CSR) | EP0_TXPKTRDY);
  741. os_printk(K_DEBUG, "EP0_TXPKTRDY\n");
  742. }
  743. #else
  744. os_writel(U3D_EP0CSR, os_readl(U3D_EP0CSR) | EP0_TXPKTRDY);
  745. #endif
  746. }
  747. } else {
  748. if (count == 0) {
  749. USB_WriteCsr32(U3D_TX1CSR0, ep_num,
  750. USB_ReadCsr32(U3D_TX1CSR0, ep_num) | TX_TXPKTRDY);
  751. } else {
  752. #ifdef AUTOSET
  753. if (count < maxp) {
  754. USB_WriteCsr32(U3D_TX1CSR0, ep_num,
  755. USB_ReadCsr32(U3D_TX1CSR0, ep_num) | TX_TXPKTRDY);
  756. os_printk(K_DEBUG, "short packet\n");
  757. }
  758. #else
  759. USB_WriteCsr32(U3D_TX1CSR0, ep_num,
  760. USB_ReadCsr32(U3D_TX1CSR0, ep_num) | TX_TXPKTRDY);
  761. #endif
  762. }
  763. }
  764. return count;
  765. }
  766. /**
  767. * mu3d_hal_read_fifo - pio read one packet
  768. *@args - arg1: ep number, arg2: data buffer
  769. */
  770. DEV_INT32 mu3d_hal_read_fifo(DEV_INT32 ep_num, DEV_UINT8 *buf)
  771. {
  772. DEV_UINT16 count, residue;
  773. DEV_UINT32 temp;
  774. DEV_UINT8 *bp = buf;
  775. if (ep_num == 0)
  776. residue = count = os_readl(U3D_RXCOUNT0);
  777. else
  778. residue = count = (USB_ReadCsr32(U3D_RX1CSR3, ep_num) >> EP_RX_COUNT_OFST);
  779. os_printk(K_DEBUG, "%s, req->buf=%p, cnt=%d\n", __func__, buf, count);
  780. while (residue > 0) {
  781. temp = os_readl(USB_FIFO(ep_num));
  782. /*Store the first byte */
  783. *bp = temp & 0xFF;
  784. /*Store the 2nd byte, If have */
  785. if (residue > 1)
  786. *(bp + 1) = (temp >> 8) & 0xFF;
  787. /*Store the 3rd byte, If have */
  788. if (residue > 2)
  789. *(bp + 2) = (temp >> 16) & 0xFF;
  790. /*Store the 4th byte, If have */
  791. if (residue > 3)
  792. *(bp + 3) = (temp >> 24) & 0xFF;
  793. if (residue > 4) {
  794. bp = bp + 4;
  795. residue = residue - 4;
  796. } else {
  797. residue = 0;
  798. }
  799. }
  800. #ifdef AUTOCLEAR
  801. if (ep_num == 0) {
  802. if (!count) {
  803. os_writel(U3D_EP0CSR, os_readl(U3D_EP0CSR) | EP0_RXPKTRDY);
  804. os_printk(K_DEBUG, "EP0_RXPKTRDY\n");
  805. }
  806. } else {
  807. if (!count) {
  808. USB_WriteCsr32(U3D_RX1CSR0, ep_num,
  809. USB_ReadCsr32(U3D_RX1CSR0, ep_num) | RX_RXPKTRDY);
  810. os_printk(K_ALET, "ZLP\n");
  811. }
  812. }
  813. #else
  814. if (ep_num == 0) {
  815. os_writel(U3D_EP0CSR, os_readl(U3D_EP0CSR) | EP0_RXPKTRDY);
  816. os_printk(K_DEBUG, "EP0_RXPKTRDY\n");
  817. } else {
  818. USB_WriteCsr32(U3D_RX1CSR0, ep_num,
  819. USB_ReadCsr32(U3D_RX1CSR0, ep_num) | RX_RXPKTRDY);
  820. os_printk(K_DEBUG, "RX_RXPKTRDY\n");
  821. }
  822. #endif
  823. return count;
  824. }
  825. /**
  826. * mu3d_hal_write_fifo_burst - pio write n packets with polling buffer full (epn only)
  827. *@args - arg1: ep number, arg2: u3d req
  828. */
  829. DEV_INT32 mu3d_hal_write_fifo_burst(DEV_INT32 ep_num, DEV_INT32 length, DEV_UINT8 *buf,
  830. DEV_INT32 maxp)
  831. {
  832. DEV_UINT32 residue, count, actual;
  833. DEV_UINT32 temp;
  834. DEV_UINT8 *bp;
  835. os_printk(K_DEBUG, "%s ep_num=%d, length=%d, buf=%p, maxp=%d\n", __func__, ep_num, length,
  836. buf, maxp);
  837. #if (BUS_MODE == PIO_MODE)
  838. /* Here is really tricky, need to print this log to pass EPn PIO loopback
  839. * No time to figure out why. Sorry~
  840. */
  841. pr_debug("write_fifo_burst=ep_num=%d, length=%d, buf=%p, maxp=%d\n", ep_num, length, buf,
  842. maxp);
  843. #endif
  844. actual = 0;
  845. #ifdef AUTOSET
  846. while (!(USB_ReadCsr32(U3D_TX1CSR0, ep_num) & TX_FIFOFULL)) {
  847. #endif
  848. if (length - actual > maxp)
  849. count = residue = maxp;
  850. else
  851. count = residue = length - actual;
  852. bp = buf + actual;
  853. while (residue > 0) {
  854. if (residue == 1) {
  855. temp = ((*buf) & 0xFF);
  856. os_writeb(USB_FIFO(ep_num), temp);
  857. buf += 1;
  858. residue -= 1;
  859. } else if (residue == 2) {
  860. temp = ((*buf) & 0xFF) + (((*(buf + 1)) << 8) & 0xFF00);
  861. os_writew(USB_FIFO(ep_num), temp);
  862. buf += 2;
  863. residue -= 2;
  864. } else if (residue == 3) {
  865. temp = ((*buf) & 0xFF) + (((*(buf + 1)) << 8) & 0xFF00);
  866. os_writew(USB_FIFO(ep_num), temp);
  867. buf += 2;
  868. temp = ((*buf) & 0xFF);
  869. os_writeb(USB_FIFO(ep_num), temp);
  870. buf += 1;
  871. residue -= 3;
  872. } else {
  873. temp =
  874. ((*buf) & 0xFF) + (((*(buf + 1)) << 8) & 0xFF00) +
  875. (((*(buf + 2)) << 16) & 0xFF0000) +
  876. (((*(buf + 3)) << 24) & 0xFF000000);
  877. os_writel(USB_FIFO(ep_num), temp);
  878. buf += 4;
  879. residue -= 4;
  880. }
  881. }
  882. #ifdef NEVER
  883. while (residue > 0) {
  884. if (residue == 1) {
  885. temp = ((*bp) & 0xFF);
  886. os_writel(U3D_RISC_SIZE, RISC_SIZE_1B);
  887. unit = 1;
  888. } else if (residue == 2) {
  889. temp = ((*bp) & 0xFF) + (((*(bp + 1)) << 8) & 0xFF00);
  890. os_writel(U3D_RISC_SIZE, RISC_SIZE_2B);
  891. unit = 2;
  892. } else if (residue == 3) {
  893. temp = ((*bp) & 0xFF) + (((*(bp + 1)) << 8) & 0xFF00);
  894. os_writel(U3D_RISC_SIZE, RISC_SIZE_2B);
  895. unit = 2;
  896. } else {
  897. temp =
  898. ((*bp) & 0xFF) + (((*(bp + 1)) << 8) & 0xFF00) +
  899. (((*(bp + 2)) << 16) & 0xFF0000) +
  900. (((*(bp + 3)) << 24) & 0xFF000000);
  901. unit = 4;
  902. }
  903. os_writel(USB_FIFO(ep_num), temp);
  904. bp = bp + unit;
  905. residue -= unit;
  906. }
  907. if (os_readl(U3D_RISC_SIZE) != RISC_SIZE_4B)
  908. os_writel(U3D_RISC_SIZE, RISC_SIZE_4B);
  909. #endif /* NEVER */
  910. actual += count;
  911. if (length == 0) {
  912. USB_WriteCsr32(U3D_TX1CSR0, ep_num,
  913. USB_ReadCsr32(U3D_TX1CSR0, ep_num) | TX_TXPKTRDY);
  914. return actual;
  915. }
  916. /*WARNING:UNNECESSARY_ELSE: else is not generally useful after a break or return*/
  917. /*else*/
  918. {
  919. #ifdef AUTOSET
  920. if ((count < maxp) && (count > 0)) {
  921. USB_WriteCsr32(U3D_TX1CSR0, ep_num,
  922. USB_ReadCsr32(U3D_TX1CSR0, ep_num) | TX_TXPKTRDY);
  923. os_printk(K_DEBUG, "short packet\n");
  924. return actual;
  925. }
  926. if (count == 0)
  927. return actual;
  928. #else
  929. USB_WriteCsr32(U3D_TX1CSR0, ep_num,
  930. USB_ReadCsr32(U3D_TX1CSR0, ep_num) | TX_TXPKTRDY);
  931. #endif
  932. }
  933. #ifdef AUTOSET
  934. }
  935. #endif
  936. return actual;
  937. }
  938. /**
  939. * mu3d_hal_read_fifo_burst - pio read n packets with polling buffer empty (epn only)
  940. *@args - arg1: ep number, arg2: data buffer
  941. */
  942. DEV_INT32 mu3d_hal_read_fifo_burst(DEV_INT32 ep_num, DEV_UINT8 *buf)
  943. {
  944. DEV_UINT16 count, residue;
  945. DEV_UINT32 temp, actual;
  946. DEV_UINT8 *bp;
  947. os_printk(K_INFO, "mu3d_hal_read_fifo_burst\n");
  948. os_printk(K_ALET, "req->buf=%p\n", buf);
  949. actual = 0;
  950. #ifdef AUTOCLEAR
  951. while (!(USB_ReadCsr32(U3D_RX1CSR0, ep_num) & RX_FIFOEMPTY)) {
  952. #endif
  953. residue = count = (USB_ReadCsr32(U3D_RX1CSR3, ep_num) >> EP_RX_COUNT_OFST);
  954. os_printk(K_INFO, "count :%d ; req->actual :%d\n", count, actual);
  955. bp = buf + actual;
  956. while (residue > 0) {
  957. temp = os_readl(USB_FIFO(ep_num));
  958. *bp = temp & 0xFF;
  959. *(bp + 1) = (temp >> 8) & 0xFF;
  960. *(bp + 2) = (temp >> 16) & 0xFF;
  961. *(bp + 3) = (temp >> 24) & 0xFF;
  962. bp = bp + 4;
  963. if (residue > 4)
  964. residue = residue - 4;
  965. else
  966. residue = 0;
  967. }
  968. actual += count;
  969. #ifdef AUTOCLEAR
  970. if (!count) {
  971. USB_WriteCsr32(U3D_RX1CSR0, ep_num,
  972. USB_ReadCsr32(U3D_RX1CSR0, ep_num) | RX_RXPKTRDY);
  973. os_printk(K_ALET, "zlp\n");
  974. os_printk(K_ALET, "actual :%d\n", actual);
  975. return actual;
  976. }
  977. #else
  978. if (ep_num == 0) {
  979. os_writel(U3D_EP0CSR, os_readl(U3D_EP0CSR) | EP0_RXPKTRDY);
  980. } else {
  981. USB_WriteCsr32(U3D_RX1CSR0, ep_num,
  982. USB_ReadCsr32(U3D_RX1CSR0, ep_num) | RX_RXPKTRDY);
  983. }
  984. #endif
  985. #ifdef AUTOCLEAR
  986. }
  987. #endif
  988. return actual;
  989. }
  990. /**
  991. * mu3d_hal_unfigured_ep -
  992. *@args -
  993. */
  994. void mu3d_hal_unfigured_ep(void)
  995. {
  996. DEV_UINT32 i, tx_ep_num, rx_ep_num;
  997. struct USB_EP_SETTING *ep_setting;
  998. os_printk(K_INFO, "%s\n", __func__);
  999. g_TxFIFOadd = USB_TX_FIFO_START_ADDRESS;
  1000. g_RxFIFOadd = USB_RX_FIFO_START_ADDRESS;
  1001. #ifdef HARDCODE_EP
  1002. tx_ep_num = MAX_QMU_EP; /* os_readl(U3D_CAP_EPINFO) & CAP_TX_EP_NUM; */
  1003. rx_ep_num = MAX_QMU_EP; /* (os_readl(U3D_CAP_EPINFO) & CAP_RX_EP_NUM) >> 8; */
  1004. #else
  1005. tx_ep_num = os_readl(U3D_CAP_EPINFO) & CAP_TX_EP_NUM;
  1006. rx_ep_num = (os_readl(U3D_CAP_EPINFO) & CAP_RX_EP_NUM) >> 8;
  1007. #endif
  1008. for (i = 1; i <= tx_ep_num; i++) {
  1009. USB_WriteCsr32(U3D_TX1CSR0, i, USB_ReadCsr32(U3D_TX1CSR0, i) & (~0x7FF));
  1010. USB_WriteCsr32(U3D_TX1CSR1, i, 0);
  1011. USB_WriteCsr32(U3D_TX1CSR2, i, 0);
  1012. ep_setting = &g_u3d_setting.ep_setting[i];
  1013. ep_setting->fifoaddr = 0;
  1014. ep_setting->enabled = 0;
  1015. }
  1016. for (i = 1; i <= rx_ep_num; i++) {
  1017. USB_WriteCsr32(U3D_RX1CSR0, i, USB_ReadCsr32(U3D_RX1CSR0, i) & (~0x7FF));
  1018. USB_WriteCsr32(U3D_RX1CSR1, i, 0);
  1019. USB_WriteCsr32(U3D_RX1CSR2, i, 0);
  1020. ep_setting = &g_u3d_setting.ep_setting[i + MAX_EP_NUM];
  1021. ep_setting->fifoaddr = 0;
  1022. ep_setting->enabled = 0;
  1023. }
  1024. }
  1025. /**
  1026. * mu3d_hal_unfigured_ep_num -
  1027. *@args -
  1028. */
  1029. void mu3d_hal_unfigured_ep_num(DEV_UINT8 ep_num, USB_DIR dir)
  1030. {
  1031. struct USB_EP_SETTING *ep_setting;
  1032. os_printk(K_INFO, "%s %d\n", __func__, ep_num);
  1033. if (dir == USB_TX) {
  1034. USB_WriteCsr32(U3D_TX1CSR0, ep_num, USB_ReadCsr32(U3D_TX1CSR0, ep_num) & (~0x7FF));
  1035. USB_WriteCsr32(U3D_TX1CSR1, ep_num, 0);
  1036. USB_WriteCsr32(U3D_TX1CSR2, ep_num, 0);
  1037. ep_setting = &g_u3d_setting.ep_setting[ep_num];
  1038. ep_setting->enabled = 0;
  1039. } else {
  1040. USB_WriteCsr32(U3D_RX1CSR0, ep_num, USB_ReadCsr32(U3D_RX1CSR0, ep_num) & (~0x7FF));
  1041. USB_WriteCsr32(U3D_RX1CSR1, ep_num, 0);
  1042. USB_WriteCsr32(U3D_RX1CSR2, ep_num, 0);
  1043. ep_setting = &g_u3d_setting.ep_setting[ep_num + MAX_EP_NUM];
  1044. ep_setting->enabled = 0;
  1045. }
  1046. }
  1047. /**
  1048. * mu3d_hal_ep_enable - configure ep
  1049. *@args - arg1: ep number, arg2: dir, arg3: transfer type, arg4: max packet size, arg5: interval, arg6: slot, arg7: burst, arg8: mult
  1050. */
  1051. void _ex_mu3d_hal_ep_enable(DEV_UINT8 ep_num, USB_DIR dir, TRANSFER_TYPE type, DEV_INT32 maxp,
  1052. DEV_INT8 interval, DEV_INT8 slot, DEV_INT8 burst, DEV_INT8 mult)
  1053. {
  1054. DEV_INT32 ep_index = 0;
  1055. DEV_INT32 used_before;
  1056. DEV_UINT8 fifosz = 0, max_pkt, binterval;
  1057. DEV_INT32 csr0, csr1, csr2;
  1058. struct USB_EP_SETTING *ep_setting;
  1059. DEV_UINT8 update_FIFOadd = 0;
  1060. os_printk(K_INFO, "%s\n", __func__);
  1061. /*TODO: Enable in future. */
  1062. /*Enable Burst, NumP=0, EoB */
  1063. /* os_writel( U3D_USB3_EPCTRL_CAP, os_readl(U3D_USB3_EPCTRL_CAP) | TX_NUMP_0_EN | SET_EOB_EN | TX_BURST_EN); */
  1064. /*
  1065. * Default value of U3D_USB3_EPCTRL_CAP
  1066. * 1. tx_burst_en 1'b1
  1067. * 2. set_eob_en 1'b0
  1068. * 3. usb3_iso_crc_chk_dis 1'b1
  1069. * 4. send_stall_clr_pp_en 1'b1
  1070. * 5. tx_nump_0_en 1'b0
  1071. */
  1072. if (slot > MAX_SLOT) {
  1073. os_printk(K_ALET, "[ERROR]Configure wrong slot number(MAX=%d, Not=%d)\n", MAX_SLOT,
  1074. slot);
  1075. slot = MAX_SLOT;
  1076. }
  1077. if (type == USB_CTRL) {
  1078. ep_setting = &g_u3d_setting.ep_setting[0];
  1079. ep_setting->fifosz = maxp;
  1080. ep_setting->maxp = maxp;
  1081. csr0 = os_readl(U3D_EP0CSR) & EP0_W1C_BITS;
  1082. csr0 |= maxp;
  1083. os_writel(U3D_EP0CSR, csr0);
  1084. os_setmsk(U3D_USB2_RX_EP_DATAERR_INTR, BIT16); /* EP0 data error interrupt */
  1085. return;
  1086. }
  1087. if (dir == USB_TX)
  1088. ep_index = ep_num;
  1089. else if (dir == USB_RX)
  1090. ep_index = ep_num + MAX_EP_NUM;
  1091. else
  1092. BUG_ON(1);
  1093. ep_setting = &g_u3d_setting.ep_setting[ep_index];
  1094. used_before = ep_setting->fifoaddr;
  1095. if (ep_setting->enabled)
  1096. return;
  1097. binterval = interval;
  1098. if (dir == USB_TX) {
  1099. if ((g_TxFIFOadd + maxp * (slot + 1) > os_readl(U3D_CAP_EPNTXFFSZ))
  1100. && (!used_before)) {
  1101. os_printk(K_ALET, "mu3d_hal_ep_enable, FAILED: sram exhausted\n");
  1102. os_printk(K_ALET, "g_FIFOadd :%x\n", g_TxFIFOadd);
  1103. os_printk(K_ALET, "maxp :%d\n", maxp);
  1104. os_printk(K_ALET, "mult :%d\n", slot);
  1105. WARN_ON(1);
  1106. }
  1107. } else {
  1108. if ((g_RxFIFOadd + maxp * (slot + 1) > os_readl(U3D_CAP_EPNRXFFSZ))
  1109. && (!used_before)) {
  1110. os_printk(K_ALET, "mu3d_hal_ep_enable, FAILED: sram exhausted\n");
  1111. os_printk(K_ALET, "g_FIFOadd :%x\n", g_RxFIFOadd);
  1112. os_printk(K_ALET, "maxp :%d\n", maxp);
  1113. os_printk(K_ALET, "mult :%d\n", slot);
  1114. WARN_ON(1);
  1115. }
  1116. }
  1117. ep_setting->transfer_type = type;
  1118. if (dir == USB_TX) {
  1119. if (!ep_setting->fifoaddr) {
  1120. ep_setting->fifoaddr = g_TxFIFOadd;
  1121. update_FIFOadd = 1;
  1122. }
  1123. } else {
  1124. if (!ep_setting->fifoaddr) {
  1125. ep_setting->fifoaddr = g_RxFIFOadd;
  1126. update_FIFOadd = 1;
  1127. }
  1128. }
  1129. ep_setting->fifosz = maxp;
  1130. ep_setting->maxp = maxp;
  1131. ep_setting->dir = dir;
  1132. ep_setting->enabled = 1;
  1133. /*
  1134. * Indicate the Tx/Rx FIFO size of 2^n bytes, (ex: value 10 means 2^10 = 1024 bytes.)
  1135. * It means the value of Tx/RxFIFOSz _MUST_ be a power of 2 (2^n).
  1136. * It can _NOT_ be 5,48,180 the kind of values.
  1137. * TX/RXFIFOSEGSIZE should be equal or bigger than 4. The Tx/RxFIFO
  1138. * size of 2^n bytes also should be equal
  1139. * or bigger than TX/RXMAXPKTSZ. This EndPoint occupy total memory size
  1140. * (TX/RX_SLOT + 1 )*2^TX/RXFIFOSEGSIZE bytes.
  1141. */
  1142. if (maxp <= 16)
  1143. fifosz = USB_FIFOSZ_SIZE_16;
  1144. else if (maxp <= 32)
  1145. fifosz = USB_FIFOSZ_SIZE_32;
  1146. else if (maxp <= 64)
  1147. fifosz = USB_FIFOSZ_SIZE_64;
  1148. else if (maxp <= 128)
  1149. fifosz = USB_FIFOSZ_SIZE_128;
  1150. else if (maxp <= 256)
  1151. fifosz = USB_FIFOSZ_SIZE_256;
  1152. else if (maxp <= 512)
  1153. fifosz = USB_FIFOSZ_SIZE_512;
  1154. else if (maxp <= 32768)
  1155. fifosz = USB_FIFOSZ_SIZE_1024;
  1156. else {
  1157. os_printk(K_ERR, "%s Wrong MAXP\n", __func__);
  1158. fifosz = USB_FIFOSZ_SIZE_1024;
  1159. }
  1160. if (dir == USB_TX) {
  1161. /* CSR0 */
  1162. csr0 = USB_ReadCsr32(U3D_TX1CSR0, ep_num) & ~TX_TXMAXPKTSZ;
  1163. csr0 |= (maxp & TX_TXMAXPKTSZ);
  1164. #ifdef USE_SSUSB_QMU
  1165. /* from SSUSB Device Programming Guide(Revision 0.1) page26
  1166. * TX EP Setting of QMU
  1167. * TXnCSR0.TxMaxPktSz
  1168. * TXnCSR1.SS_BURST/TxType/TxSlot
  1169. * TXnCSR1.Tx_Max_Pkt/Tx_Mult (ISO Only)
  1170. * TXnCSR2.TxFIFOAddr/TxFIFOSegSize
  1171. * TXnCSR2.TxBInterval (SS ISO/INT Only)
  1172. * TxnCSR0.AutoSet = 0
  1173. * TxnCSR0.DMARegEn = 1
  1174. */
  1175. csr0 &= ~TX_AUTOSET;
  1176. csr0 |= TX_DMAREQEN;
  1177. #else
  1178. #ifdef AUTOSET
  1179. csr0 |= TX_AUTOSET;
  1180. #endif
  1181. /*Disable DMA, Use PIO mode */
  1182. csr0 &= ~TX_DMAREQEN;
  1183. #endif
  1184. /* CSR1 */
  1185. max_pkt = (burst + 1) * (mult + 1) - 1;
  1186. csr1 = (burst & SS_TX_BURST);
  1187. csr1 |= (slot << TX_SLOT_OFST) & TX_SLOT;
  1188. csr1 |= (max_pkt << TX_MAX_PKT_OFST) & TX_MAX_PKT;
  1189. csr1 |= (mult << TX_MULT_OFST) & TX_MULT;
  1190. /* CSR2 */
  1191. csr2 = (ep_setting->fifoaddr >> 4) & TXFIFOADDR;
  1192. csr2 |= (fifosz << TXFIFOSEGSIZE_OFST) & TXFIFOSEGSIZE;
  1193. if (type == USB_BULK) {
  1194. csr1 |= TYPE_BULK;
  1195. } else if (type == USB_INTR) {
  1196. csr1 |= TYPE_INT;
  1197. csr2 |= (binterval << TXBINTERVAL_OFST) & TXBINTERVAL;
  1198. } else if (type == USB_ISO) {
  1199. csr1 |= TYPE_ISO;
  1200. csr2 |= (binterval << TXBINTERVAL_OFST) & TXBINTERVAL;
  1201. }
  1202. #ifdef USE_SSUSB_QMU
  1203. /*Disable Endpoint interrupt */
  1204. os_setmsk(U3D_EPIECR, (BIT0 << ep_num));
  1205. /* Enable QMU */
  1206. os_setmsk(U3D_QGCSR, QMU_TX_EN(ep_num));
  1207. /* Enable QMU Done interrupt */
  1208. os_setmsk(U3D_QIESR0, QMU_TX_EN(ep_num));
  1209. #endif
  1210. USB_WriteCsr32(U3D_TX1CSR0, ep_num, csr0);
  1211. USB_WriteCsr32(U3D_TX1CSR1, ep_num, csr1);
  1212. USB_WriteCsr32(U3D_TX1CSR2, ep_num, csr2);
  1213. os_printk(K_INFO, "[CSR]U3D_TX%dCSR0 :%x\n", ep_num,
  1214. USB_ReadCsr32(U3D_TX1CSR0, ep_num));
  1215. os_printk(K_INFO, "[CSR]U3D_TX%dCSR1 :%x\n", ep_num,
  1216. USB_ReadCsr32(U3D_TX1CSR1, ep_num));
  1217. os_printk(K_INFO, "[CSR]U3D_TX%dCSR2 :%x\n", ep_num,
  1218. USB_ReadCsr32(U3D_TX1CSR2, ep_num));
  1219. } else if (dir == USB_RX) {
  1220. /* CSR0 */
  1221. csr0 = USB_ReadCsr32(U3D_RX1CSR0, ep_num) & ~RX_RXMAXPKTSZ;
  1222. csr0 |= (maxp & RX_RXMAXPKTSZ);
  1223. #ifdef USE_SSUSB_QMU
  1224. /* from SSUSB Device Programming Guide(Revision 0.1) page32
  1225. * RX EP Setting of QMU
  1226. * RXnCSR0.RxMaxPktSz
  1227. * RXnCSR1.SS_BURST/RxType/RxSlot
  1228. * RXnCSR1.Rx_Max_Pkt/Rx_Mult (ISO Only)
  1229. * RXnCSR2.RxFIFOAddr/RxFIFOSegSize
  1230. * RXnCSR2.RxBInterval (SS ISO/INT Only)
  1231. * RxnCSR0.AutoClear = 0
  1232. * RxnCSR0.DMARegEn = 1
  1233. */
  1234. csr0 &= ~RX_AUTOCLEAR;
  1235. csr0 |= RX_DMAREQEN;
  1236. #else
  1237. #ifdef AUTOCLEAR
  1238. csr0 |= RX_AUTOCLEAR;
  1239. #endif
  1240. /*Disable DMA, Use PIO mode */
  1241. csr0 &= ~RX_DMAREQEN;
  1242. #endif
  1243. /* CSR1 */
  1244. max_pkt = (burst + 1) * (mult + 1) - 1;
  1245. csr1 = (burst & SS_RX_BURST);
  1246. csr1 |= (slot << RX_SLOT_OFST) & RX_SLOT;
  1247. csr1 |= (max_pkt << RX_MAX_PKT_OFST) & RX_MAX_PKT;
  1248. csr1 |= (mult << RX_MULT_OFST) & RX_MULT;
  1249. /* CSR2 */
  1250. csr2 = (ep_setting->fifoaddr >> 4) & RXFIFOADDR;
  1251. csr2 |= (fifosz << RXFIFOSEGSIZE_OFST) & RXFIFOSEGSIZE;
  1252. if (type == USB_BULK) {
  1253. csr1 |= TYPE_BULK;
  1254. } else if (type == USB_INTR) {
  1255. csr1 |= TYPE_INT;
  1256. csr2 |= (binterval << RXBINTERVAL_OFST) & RXBINTERVAL;
  1257. } else if (type == USB_ISO) {
  1258. csr1 |= TYPE_ISO;
  1259. csr2 |= (binterval << RXBINTERVAL_OFST) & RXBINTERVAL;
  1260. }
  1261. #ifdef USE_SSUSB_QMU
  1262. /*Disable Endpoint interrupt */
  1263. os_setmsk(U3D_EPIECR, (BIT16 << ep_num));
  1264. /* Enable QMU */
  1265. os_setmsk(U3D_QGCSR, QMU_TX_EN(ep_num));
  1266. /*Enable QMU Done interrupt */
  1267. os_setmsk(U3D_QIESR0, QMU_RX_EN(ep_num));
  1268. #endif
  1269. USB_WriteCsr32(U3D_RX1CSR0, ep_num, csr0);
  1270. USB_WriteCsr32(U3D_RX1CSR1, ep_num, csr1);
  1271. USB_WriteCsr32(U3D_RX1CSR2, ep_num, csr2);
  1272. os_printk(K_INFO, "[CSR]U3D_RX%dCSR0 :%x\n", ep_num,
  1273. USB_ReadCsr32(U3D_RX1CSR0, ep_num));
  1274. os_printk(K_INFO, "[CSR]U3D_RX%dCSR1 :%x\n", ep_num,
  1275. USB_ReadCsr32(U3D_RX1CSR1, ep_num));
  1276. os_printk(K_INFO, "[CSR]U3D_RX%dCSR2 :%x\n", ep_num,
  1277. USB_ReadCsr32(U3D_RX1CSR2, ep_num));
  1278. os_setmsk(U3D_USB2_RX_EP_DATAERR_INTR, BIT16 << ep_num); /* EPn data error interrupt */
  1279. } else {
  1280. os_printk(K_ERR, "WHAT THE DIRECTION IS?!?!\n");
  1281. BUG_ON(1);
  1282. }
  1283. if (update_FIFOadd == 1) {
  1284. if (dir == USB_TX) {
  1285. /* The minimum unit of FIFO address is _16_ bytes.
  1286. * So let the offset of each EP fifo address aligns _16_ bytes.*/
  1287. int fifo_offset = 0;
  1288. if ((maxp & 0xF))
  1289. fifo_offset = ((maxp + 16) >> 4) << 4;
  1290. else
  1291. fifo_offset = maxp;
  1292. g_TxFIFOadd += (fifo_offset * (slot + 1));
  1293. } else {
  1294. int fifo_offset = 0;
  1295. if ((maxp & 0xF))
  1296. fifo_offset = ((maxp + 16) >> 4) << 4;
  1297. else
  1298. fifo_offset = maxp;
  1299. g_RxFIFOadd += (fifo_offset * (slot + 1));
  1300. }
  1301. }
  1302. }
  1303. void mu3d_hal_ep_enable(DEV_UINT8 ep_num, USB_DIR dir, TRANSFER_TYPE type, DEV_INT32 maxp,
  1304. DEV_INT8 interval, DEV_INT8 slot, DEV_INT8 burst, DEV_INT8 mult)
  1305. {
  1306. DEV_INT32 ep_index = 0;
  1307. DEV_INT32 used_before;
  1308. DEV_UINT8 fifosz = 0, max_pkt, binterval;
  1309. DEV_INT32 csr0, csr1, csr2;
  1310. struct USB_EP_SETTING *ep_setting;
  1311. DEV_UINT8 update_FIFOadd = 0;
  1312. /*Enable Burst, NumP=0, EoB */
  1313. os_writel(U3D_USB3_EPCTRL_CAP,
  1314. os_readl(U3D_USB3_EPCTRL_CAP) | TX_NUMP_0_EN | SET_EOB_EN | TX_BURST_EN);
  1315. if (slot > MAX_SLOT) {
  1316. os_printk(K_ALET,
  1317. "!!!!!!!!!!!!!!Configure wrong slot number!!!!!!!!!(MAX=%d, Not=%d)\n",
  1318. MAX_SLOT, slot);
  1319. slot = MAX_SLOT;
  1320. }
  1321. if (type == USB_CTRL) {
  1322. ep_setting = &g_u3d_setting.ep_setting[0];
  1323. ep_setting->fifosz = maxp;
  1324. ep_setting->maxp = maxp;
  1325. csr0 = os_readl(U3D_EP0CSR) & EP0_W1C_BITS;
  1326. csr0 |= maxp;
  1327. os_writel(U3D_EP0CSR, csr0);
  1328. os_setmsk(U3D_USB2_RX_EP_DATAERR_INTR, BIT16); /* EP0 data error interrupt */
  1329. return;
  1330. }
  1331. if (dir == USB_TX)
  1332. ep_index = ep_num;
  1333. else if (dir == USB_RX)
  1334. ep_index = ep_num + MAX_EP_NUM;
  1335. else
  1336. BUG_ON(1);
  1337. ep_setting = &g_u3d_setting.ep_setting[ep_index];
  1338. used_before = ep_setting->fifoaddr;
  1339. if (ep_setting->enabled)
  1340. return;
  1341. binterval = interval;
  1342. if (dir == USB_TX) {
  1343. if ((g_TxFIFOadd + maxp * (slot + 1) > os_readl(U3D_CAP_EPNTXFFSZ))
  1344. && (!used_before)) {
  1345. os_printk(K_ALET, "mu3d_hal_ep_enable, FAILED: sram exhausted\n");
  1346. os_printk(K_ALET, "g_FIFOadd :%x\n", g_TxFIFOadd);
  1347. os_printk(K_ALET, "maxp :%d\n", maxp);
  1348. os_printk(K_ALET, "mult :%d\n", slot);
  1349. WARN_ON(1);
  1350. }
  1351. } else {
  1352. if ((g_RxFIFOadd + maxp * (slot + 1) > os_readl(U3D_CAP_EPNRXFFSZ))
  1353. && (!used_before)) {
  1354. os_printk(K_ALET, "mu3d_hal_ep_enable, FAILED: sram exhausted\n");
  1355. os_printk(K_ALET, "g_FIFOadd :%x\n", g_RxFIFOadd);
  1356. os_printk(K_ALET, "maxp :%d\n", maxp);
  1357. os_printk(K_ALET, "mult :%d\n", slot);
  1358. WARN_ON(1);
  1359. }
  1360. }
  1361. ep_setting->transfer_type = type;
  1362. if (dir == USB_TX) {
  1363. if (!ep_setting->fifoaddr) {
  1364. ep_setting->fifoaddr = g_TxFIFOadd;
  1365. update_FIFOadd = 1;
  1366. }
  1367. } else {
  1368. if (!ep_setting->fifoaddr) {
  1369. ep_setting->fifoaddr = g_RxFIFOadd;
  1370. update_FIFOadd = 1;
  1371. }
  1372. }
  1373. ep_setting->fifosz = maxp;
  1374. ep_setting->maxp = maxp;
  1375. ep_setting->dir = dir;
  1376. ep_setting->enabled = 1;
  1377. if (maxp <= 16)
  1378. fifosz = USB_FIFOSZ_SIZE_16;
  1379. else if (maxp <= 32)
  1380. fifosz = USB_FIFOSZ_SIZE_32;
  1381. else if (maxp <= 64)
  1382. fifosz = USB_FIFOSZ_SIZE_64;
  1383. else if (maxp <= 128)
  1384. fifosz = USB_FIFOSZ_SIZE_128;
  1385. else if (maxp <= 256)
  1386. fifosz = USB_FIFOSZ_SIZE_256;
  1387. else if (maxp <= 512)
  1388. fifosz = USB_FIFOSZ_SIZE_512;
  1389. else if (maxp <= 32768)
  1390. fifosz = USB_FIFOSZ_SIZE_1024;
  1391. else {
  1392. os_printk(K_ERR, "%s Wrong MAXP\n", __func__);
  1393. fifosz = USB_FIFOSZ_SIZE_1024;
  1394. }
  1395. if (dir == USB_TX) {
  1396. /* CSR0 */
  1397. csr0 = USB_ReadCsr32(U3D_TX1CSR0, ep_num) & ~TX_TXMAXPKTSZ;
  1398. csr0 |= (maxp & TX_TXMAXPKTSZ);
  1399. #if (BUS_MODE == PIO_MODE)
  1400. #ifdef AUTOSET
  1401. csr0 |= TX_AUTOSET;
  1402. #endif
  1403. csr0 &= ~TX_DMAREQEN;
  1404. #endif
  1405. /* CSR1 */
  1406. max_pkt = (burst + 1) * (mult + 1) - 1;
  1407. csr1 = (burst & SS_TX_BURST);
  1408. csr1 |= (slot << TX_SLOT_OFST) & TX_SLOT;
  1409. csr1 |= (max_pkt << TX_MAX_PKT_OFST) & TX_MAX_PKT;
  1410. csr1 |= (mult << TX_MULT_OFST) & TX_MULT;
  1411. /* CSR2 */
  1412. csr2 = (ep_setting->fifoaddr >> 4) & TXFIFOADDR;
  1413. csr2 |= (fifosz << TXFIFOSEGSIZE_OFST) & TXFIFOSEGSIZE;
  1414. if (type == USB_BULK) {
  1415. csr1 |= TYPE_BULK;
  1416. } else if (type == USB_INTR) {
  1417. csr1 |= TYPE_INT;
  1418. csr2 |= (binterval << TXBINTERVAL_OFST) & TXBINTERVAL;
  1419. } else if (type == USB_ISO) {
  1420. csr1 |= TYPE_ISO;
  1421. csr2 |= (binterval << TXBINTERVAL_OFST) & TXBINTERVAL;
  1422. }
  1423. #ifdef USE_SSUSB_QMU
  1424. os_writel(U3D_EPIECR, os_readl(U3D_EPIECR) | (BIT0 << ep_num));
  1425. #endif
  1426. USB_WriteCsr32(U3D_TX1CSR0, ep_num, csr0);
  1427. USB_WriteCsr32(U3D_TX1CSR1, ep_num, csr1);
  1428. USB_WriteCsr32(U3D_TX1CSR2, ep_num, csr2);
  1429. os_printk(K_INFO, "[CSR]U3D_TX1CSR0 :%x\n", USB_ReadCsr32(U3D_TX1CSR0, ep_num));
  1430. os_printk(K_INFO, "[CSR]U3D_TX1CSR1 :%x\n", USB_ReadCsr32(U3D_TX1CSR1, ep_num));
  1431. os_printk(K_INFO, "[CSR]U3D_TX1CSR2 :%x\n", USB_ReadCsr32(U3D_TX1CSR2, ep_num));
  1432. } else if (dir == USB_RX) {
  1433. /* CSR0 */
  1434. csr0 = USB_ReadCsr32(U3D_RX1CSR0, ep_num) & ~RX_RXMAXPKTSZ;
  1435. csr0 |= (maxp & RX_RXMAXPKTSZ);
  1436. #if (BUS_MODE == PIO_MODE)
  1437. #ifdef AUTOCLEAR
  1438. csr0 |= RX_AUTOCLEAR;
  1439. #endif
  1440. csr0 &= ~RX_DMAREQEN;
  1441. #endif
  1442. /* CSR1 */
  1443. max_pkt = (burst + 1) * (mult + 1) - 1;
  1444. csr1 = (burst & SS_RX_BURST);
  1445. csr1 |= (slot << RX_SLOT_OFST) & RX_SLOT;
  1446. csr1 |= (max_pkt << RX_MAX_PKT_OFST) & RX_MAX_PKT;
  1447. csr1 |= (mult << RX_MULT_OFST) & RX_MULT;
  1448. /* CSR2 */
  1449. csr2 = (ep_setting->fifoaddr >> 4) & RXFIFOADDR;
  1450. csr2 |= (fifosz << RXFIFOSEGSIZE_OFST) & RXFIFOSEGSIZE;
  1451. if (type == USB_BULK) {
  1452. csr1 |= TYPE_BULK;
  1453. } else if (type == USB_INTR) {
  1454. csr1 |= TYPE_INT;
  1455. csr2 |= (binterval << RXBINTERVAL_OFST) & RXBINTERVAL;
  1456. } else if (type == USB_ISO) {
  1457. csr1 |= TYPE_ISO;
  1458. csr2 |= (binterval << RXBINTERVAL_OFST) & RXBINTERVAL;
  1459. }
  1460. #ifdef USE_SSUSB_QMU
  1461. os_writel(U3D_EPIECR, os_readl(U3D_EPIECR) | (BIT16 << ep_num));
  1462. #endif
  1463. USB_WriteCsr32(U3D_RX1CSR0, ep_num, csr0);
  1464. USB_WriteCsr32(U3D_RX1CSR1, ep_num, csr1);
  1465. USB_WriteCsr32(U3D_RX1CSR2, ep_num, csr2);
  1466. os_printk(K_INFO, "[CSR]U3D_RX1CSR0 :%x\n", USB_ReadCsr32(U3D_RX1CSR0, ep_num));
  1467. os_printk(K_INFO, "[CSR]U3D_RX1CSR1 :%x\n", USB_ReadCsr32(U3D_RX1CSR1, ep_num));
  1468. os_printk(K_INFO, "[CSR]U3D_RX1CSR2 :%x\n", USB_ReadCsr32(U3D_RX1CSR2, ep_num));
  1469. os_setmsk(U3D_USB2_RX_EP_DATAERR_INTR, BIT16 << ep_num); /* EPn data error interrupt */
  1470. } else {
  1471. os_printk(K_ERR, "WHAT THE DIRECTION IS?!?!\n");
  1472. BUG_ON(1);
  1473. }
  1474. if (update_FIFOadd == 1) {
  1475. if (dir == USB_TX) {
  1476. if (maxp == 1023)
  1477. g_TxFIFOadd += (1024 * (slot + 1));
  1478. else
  1479. g_TxFIFOadd += (maxp * (slot + 1));
  1480. } else {
  1481. if (maxp == 1023)
  1482. g_RxFIFOadd += (1024 * (slot + 1));
  1483. else
  1484. g_RxFIFOadd += (maxp * (slot + 1));
  1485. }
  1486. }
  1487. }