musb_init.c 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/sched.h>
  4. #include <linux/init.h>
  5. #include <linux/list.h>
  6. #include <linux/gpio.h>
  7. #include <linux/io.h>
  8. #include <linux/platform_device.h>
  9. #include <linux/dma-mapping.h>
  10. #include <linux/prefetch.h>
  11. #include <linux/usb/phy.h>
  12. #include <linux/usb/usb_phy_generic.h>
  13. #include <linux/input.h>
  14. #ifdef CONFIG_OF
  15. #include <linux/of_irq.h>
  16. #include <linux/of_address.h>
  17. #include <linux/of_gpio.h>
  18. #endif
  19. #include "musb_core.h"
  20. #include "mu3d_hal_usb_drv.h"
  21. #include "mu3d_hal_hw.h"
  22. #include "mu3d_hal_qmu_drv.h"
  23. #ifdef CONFIG_SSUSB_PROJECT_PHY
  24. #include <mu3phy/mtk-phy-asic.h>
  25. #endif
  26. #include "xhci-mtk.h"
  27. #include "ssusb_io.h"
  28. static struct musb_fifo_cfg mtu3d_cfg[] __initdata = {
  29. {.hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 1024,},
  30. {.hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 1024,},
  31. {.hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 1024,},
  32. {.hw_ep_num = 2, .style = FIFO_RX, .maxpacket = 1024,},
  33. {.hw_ep_num = 3, .style = FIFO_TX, .maxpacket = 1024,},
  34. {.hw_ep_num = 3, .style = FIFO_RX, .maxpacket = 1024,},
  35. {.hw_ep_num = 4, .style = FIFO_TX, .maxpacket = 1024,},
  36. {.hw_ep_num = 4, .style = FIFO_RX, .maxpacket = 1024,},
  37. {.hw_ep_num = 5, .style = FIFO_TX, .maxpacket = 1024,},
  38. {.hw_ep_num = 5, .style = FIFO_RX, .maxpacket = 1024,},
  39. {.hw_ep_num = 6, .style = FIFO_TX, .maxpacket = 1024,},
  40. {.hw_ep_num = 6, .style = FIFO_RX, .maxpacket = 1024,},
  41. {.hw_ep_num = 7, .style = FIFO_TX, .maxpacket = 1024,},
  42. {.hw_ep_num = 7, .style = FIFO_RX, .maxpacket = 1024,},
  43. {.hw_ep_num = 8, .style = FIFO_TX, .maxpacket = 1024,},
  44. {.hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 1024,},
  45. };
  46. #define CHIP_SW_VER_01 0
  47. static int mtu3d_set_power(struct usb_phy *x, unsigned mA);
  48. static inline void mtu3d_u3_ltssm_intr_handler(struct musb *musb, u32 dwLtssmValue)
  49. {
  50. static u32 soft_conn_num;
  51. void __iomem *mbase = musb->mac_base;
  52. if (dwLtssmValue & SS_DISABLE_INTR) {
  53. mu3d_dbg(K_INFO, "LTSSM: SS_DISABLE_INTR [%d] & Set SOFT_CONN = 1\n",
  54. soft_conn_num++);
  55. /* enable U2 link. after host reset, HS/FS EP0 configuration is applied in musb_g_reset */
  56. mu3d_clrmsk(musb->sif_base, U3D_SSUSB_U2_CTRL_0P, SSUSB_U2_PORT_PDN);
  57. mu3d_setmsk(mbase, U3D_POWER_MANAGEMENT, SOFT_CONN);
  58. }
  59. if (dwLtssmValue & ENTER_U0_INTR) {
  60. soft_conn_num = 0;
  61. /* do not apply U3 EP0 setting again, if the speed is already U3 */
  62. /* LTSSM may go to recovery and back to U0 */
  63. if (musb->g.speed != USB_SPEED_SUPER) {
  64. mu3d_dbg(K_INFO, "LTSSM: ENTER_U0_INTR %d\n", musb->g.speed);
  65. musb_conifg_ep0(musb);
  66. }
  67. }
  68. if (dwLtssmValue & VBUS_FALL_INTR) {
  69. mu3d_dbg(K_INFO, "LTSSM: VBUS_FALL_INTR\n");
  70. /* mu3d_hal_pdn_ip_port(1, 1, 1, 1); */
  71. mu3d_hal_u3dev_dis(musb);
  72. }
  73. if (dwLtssmValue & VBUS_RISE_INTR) {
  74. mu3d_dbg(K_INFO, "LTSSM: VBUS_RISE_INTR\n");
  75. mu3d_hal_u3dev_en(musb);
  76. }
  77. if (dwLtssmValue & ENTER_U3_INTR) {
  78. mu3d_dbg(K_INFO, "LTSSM: ENTER_U3_INTR\n");
  79. /* mu3d_hal_pdn_ip_port(0, 0, 1, 0); */
  80. }
  81. if (dwLtssmValue & EXIT_U3_INTR) {
  82. mu3d_dbg(K_INFO, "LTSSM: EXIT_U3_INTR\n");
  83. /* mu3d_hal_pdn_ip_port(1, 0, 1, 0); */
  84. }
  85. if (dwLtssmValue & U3_RESUME_INTR) {
  86. mu3d_dbg(K_INFO, "LTSSM: RESUME_INTR\n");
  87. /* mu3d_hal_pdn_ip_port(1, 0, 1, 0); */
  88. mu3d_setmsk(mbase, U3D_LINK_POWER_CONTROL, UX_EXIT);
  89. }
  90. /*7.5.12.2 Hot Reset Requirements
  91. * 1. A downstream port shall reset its Link Error Count as defined in Section 7.4.2.
  92. * 2. A downstream port shall reset its PM timers and the associated U1 and U2 timeout values to zero.
  93. * 3. The port Configuration information shall remain unchanged (refer to Section 8.4.6 for details).
  94. * 4. The port shall maintain its transmitter specifications defined in Table 6-10.
  95. * 5. The port shall maintain its low-impedance receiver termination (RRX-DC) defined in Table 6-13.
  96. */
  97. if (dwLtssmValue & HOT_RST_INTR) {
  98. int link_err_cnt;
  99. int timeout_val;
  100. mu3d_dbg(K_INFO, "LTSSM: HOT_RST_INTR\n");
  101. /* Clear link error count */
  102. link_err_cnt = mu3d_readl(mbase, U3D_LINK_ERR_COUNT);
  103. mu3d_dbg(K_INFO, "LTSSM: link_err_cnt=%x\n", link_err_cnt);
  104. mu3d_writel(mbase, U3D_LINK_ERR_COUNT, CLR_LINK_ERR_CNT);
  105. /* Clear U1 & U2 Enable */
  106. mu3d_clrmsk(mbase, U3D_LINK_POWER_CONTROL,
  107. (SW_U1_ACCEPT_ENABLE | SW_U2_ACCEPT_ENABLE));
  108. musb->bU1Enabled = 0;
  109. musb->bU2Enabled = 0;
  110. /* Reset U1 & U2 timeout value */
  111. timeout_val = mu3d_readl(mbase, U3D_LINK_UX_INACT_TIMER);
  112. mu3d_dbg(K_INFO, "LTSSM: timer_val =%x\n", timeout_val);
  113. timeout_val &= ~(U1_INACT_TIMEOUT_VALUE | DEV_U2_INACT_TIMEOUT_VALUE);
  114. mu3d_writel(mbase, U3D_LINK_UX_INACT_TIMER, timeout_val);
  115. }
  116. if (dwLtssmValue & SS_INACTIVE_INTR)
  117. mu3d_dbg(K_INFO, "LTSSM: SS_INACTIVE_INTR\n");
  118. if (dwLtssmValue & RECOVERY_INTR)
  119. mu3d_dbg(K_DEBUG, "LTSSM: RECOVERY_INTR\n");
  120. /* A completion of a Warm Reset shall result in the following.
  121. * 1. A downstream port shall reset its Link Error Count.
  122. * 2. Port configuration information of an upstream port shall be reset to default values. Refer to
  123. * Sections 8.4.5 and 8.4.6 for details.
  124. * 3. The PHY level variables (such as Rx equalization settings) shall be reinitialized or retrained.
  125. * 4. The LTSSM of a port shall transition to U0 through RxDetect and Polling.
  126. */
  127. if (dwLtssmValue & WARM_RST_INTR) {
  128. int link_err_cnt;
  129. mu3d_dbg(K_INFO, "LTSSM: WARM_RST_INTR\n");
  130. /* Clear link error count */
  131. link_err_cnt = mu3d_readl(mbase, U3D_LINK_ERR_COUNT);
  132. mu3d_dbg(K_INFO, "LTSSM: link_err_cnt=%x\n", link_err_cnt);
  133. mu3d_writel(mbase, U3D_LINK_ERR_COUNT, CLR_LINK_ERR_CNT);
  134. }
  135. if (dwLtssmValue & ENTER_U2_INTR)
  136. mu3d_dbg(K_DEBUG, "LTSSM: ENTER_U2_INTR\n");
  137. if (dwLtssmValue & ENTER_U1_INTR)
  138. mu3d_dbg(K_DEBUG, "LTSSM: ENTER_U1_INTR\n");
  139. if (dwLtssmValue & RXDET_SUCCESS_INTR)
  140. mu3d_dbg(K_INFO, "LTSSM: RXDET_SUCCESS_INTR\n");
  141. }
  142. static inline void mtu3d_u2_common_intr_handler(struct musb *musb, u32 dwIntrUsbValue)
  143. {
  144. if (dwIntrUsbValue & DISCONN_INTR) {
  145. /* mu3d_hal_pdn_ip_port(1, 0, 1, 1); */
  146. mu3d_dbg(K_NOTICE, "[U2 DISCONN_INTR] Set SOFT_CONN=0\n");
  147. mu3d_clrmsk(musb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
  148. /*TODO-J: ADD musb_g_disconnect(musb);?? */
  149. }
  150. if (dwIntrUsbValue & LPM_INTR) {
  151. mu3d_dbg(K_NOTICE, "[U2 LPM interrupt]\n");
  152. /* if (!((os_readl(U3D_POWER_MANAGEMENT) & LPM_HRWE))) { */
  153. /* mu3d_hal_pdn_ip_port(0, 0, 0, 1); */
  154. /* } */
  155. }
  156. if (dwIntrUsbValue & LPM_RESUME_INTR) {
  157. if (!(mu3d_readl(musb->mac_base, U3D_POWER_MANAGEMENT) & LPM_HRWE)) {
  158. /* mu3d_hal_pdn_ip_port(1, 0, 0, 1); */
  159. mu3d_setmsk(musb->mac_base, U3D_USB20_MISC_CONTROL, LPM_U3_ACK_EN);
  160. }
  161. }
  162. if (dwIntrUsbValue & SUSPEND_INTR) {
  163. mu3d_dbg(K_NOTICE, "[U2 SUSPEND_INTR]\n");
  164. /* mu3d_hal_pdn_ip_port(0, 0, 0, 1); */
  165. }
  166. if (dwIntrUsbValue & RESUME_INTR) {
  167. mu3d_dbg(K_NOTICE, "[U2 RESUME_INTR]\n");
  168. /* mu3d_hal_pdn_ip_port(1, 0, 0, 1); */
  169. }
  170. if (dwIntrUsbValue & RESET_INTR)
  171. mu3d_dbg(K_NOTICE, "[U2 RESET_INTR]\n");
  172. }
  173. static inline void mtu3d_link_intr_handler(struct musb *musb, u32 dwLinkIntValue)
  174. {
  175. void __iomem *mbase = musb->mac_base;
  176. u32 dwTemp;
  177. dwTemp = mu3d_readl(mbase, U3D_DEVICE_CONF) & SSUSB_DEV_SPEED;
  178. /* mu3d_hal_pdn_cg_en(); */
  179. switch (dwTemp) {
  180. case SSUSB_SPEED_FULL:
  181. mu3d_dbg(K_ALET, "USB Speed = Full Speed\n");
  182. #ifdef CONFIG_SSUSB_PROJECT_PHY
  183. /* Comment from CC Chou.
  184. * When detecting HS or FS and setting RG_USB20_SW_PLLMODE=1, It is OK to enter LPM L1 with BESL=0.
  185. * When disconnecting, set RG_USB20_SW_PLLMODE=0 back.
  186. */
  187. mu3d_setmsk(musb->sif_base, U3D_U2PHYDCR1,
  188. (0x1 << E60802_RG_USB20_SW_PLLMODE_OFST));
  189. /*BESLCK = 0 < BESLCK_U3 = 1 < BESLDCK = 15 */
  190. mu3d_writel(mbase, U3D_USB20_LPM_PARAMETER, 0x10f0);
  191. /*
  192. * The default value of LPM_BESL_STALL and LPM_BESLD_STALL are 1.
  193. * So Does _NOT_ need to set.
  194. */
  195. /*os_setmsk(U3D_POWER_MANAGEMENT, (LPM_BESL_STALL|LPM_BESLD_STALL)); */
  196. #else
  197. /*BESLCK = 4 < BESLCK_U3 = 10 < BESLDCK = 15 */
  198. mu3d_writel(mbase, U3D_USB20_LPM_PARAMETER, 0xa4f0);
  199. mu3d_setmsk(mbase, U3D_POWER_MANAGEMENT, (LPM_BESL_STALL | LPM_BESLD_STALL));
  200. #endif
  201. break;
  202. case SSUSB_SPEED_HIGH:
  203. mu3d_dbg(K_ALET, "USB Speed = High Speed\n");
  204. #ifdef CONFIG_SSUSB_PROJECT_PHY
  205. /* Comment from CC Chou.
  206. * When detecting HS or FS and setting RG_USB20_SW_PLLMODE=1, It is OK to enter LPM L1 with BESL=0.
  207. * When disconnecting, set RG_USB20_SW_PLLMODE=0 back.
  208. */
  209. mu3d_setmsk(musb->sif_base, U3D_U2PHYDCR1,
  210. (0x1 << E60802_RG_USB20_SW_PLLMODE_OFST));
  211. /*BESLCK = 0 < BESLCK_U3 = 1 < BESLDCK = 15 */
  212. mu3d_writel(mbase, U3D_USB20_LPM_PARAMETER, 0x10f0);
  213. /*
  214. * The default value of LPM_BESL_STALL and LPM_BESLD_STALL are 1.
  215. * So Does _NOT_ need to set.
  216. */
  217. /*os_setmsk(U3D_POWER_MANAGEMENT, (LPM_BESL_STALL|LPM_BESLD_STALL)); */
  218. #else
  219. /*BESLCK = 4 < BESLCK_U3 = 10 < BESLDCK = 15 */
  220. mu3d_writel(mbase, U3D_USB20_LPM_PARAMETER, 0xa4f0);
  221. mu3d_setmsk(mbase, U3D_POWER_MANAGEMENT, (LPM_BESL_STALL | LPM_BESLD_STALL));
  222. #endif
  223. break;
  224. case SSUSB_SPEED_SUPER:
  225. mu3d_dbg(K_ALET, "USB Speed = Super Speed\n");
  226. break;
  227. default:
  228. mu3d_dbg(K_ALET, "USB Speed = Invalid\n");
  229. break;
  230. }
  231. }
  232. static inline void mtu3d_otg_isr(struct musb *musb, u32 dwOtgIntValue)
  233. {
  234. void __iomem *sif_base = musb->sif_base;
  235. int vbus_pc = is_ssusb_connected_to_pc(musb->ssusb);
  236. int vvalid = mu3d_readl(musb->sif_base, U3D_SSUSB_OTG_STS) & SSUSB_VBUS_VALID;
  237. if (dwOtgIntValue & VBUS_CHG_INTR) {
  238. mu3d_dbg(K_DEBUG, "OTG: VBUS_CHG_INTR (vbus_pc: %d/vvalid: %d)\n", vbus_pc, vvalid);
  239. mu3d_setmsk(sif_base, U3D_SSUSB_OTG_STS_CLR, SSUSB_VBUS_INTR_CLR);
  240. if (!vvalid && (musb->g.speed != USB_SPEED_UNKNOWN))
  241. musb_g_disconnect(musb);
  242. else if (musb->g.speed == USB_SPEED_UNKNOWN)
  243. mu3d_dbg(K_DEBUG, "%s already disconnect\n", __func__);
  244. }
  245. }
  246. static irqreturn_t generic_interrupt(int irq, void *__hci)
  247. {
  248. unsigned long flags;
  249. irqreturn_t retval = IRQ_HANDLED;
  250. struct musb *musb = __hci;
  251. void __iomem *mbase = musb->mac_base;
  252. u32 dwL1Value = 0;
  253. u32 dwIntrUsbValue = 0;
  254. u32 dwDmaIntrValue = 0;
  255. u32 dwIntrEPValue = 0;
  256. u16 wIntrTxValue = 0;
  257. u16 wIntrRxValue = 0;
  258. u32 dwLtssmValue = 0;
  259. u32 dwLinkIntValue = 0;
  260. #if defined(USE_SSUSB_QMU)
  261. u32 wIntrQMUDoneValue = 0;
  262. u32 wIntrQMUValue = 0;
  263. #endif
  264. u32 dwOtgIntValue = 0;
  265. spin_lock_irqsave(&musb->lock, flags);
  266. dwL1Value = mu3d_readl(mbase, U3D_LV1ISR) & mu3d_readl(mbase, U3D_LV1IER);
  267. if (dwL1Value & EP_CTRL_INTR) {
  268. u32 dwRxEpDataerrVal = mu3d_readl(mbase, U3D_USB2_RX_EP_DATAERR_INTR);
  269. if (dwRxEpDataerrVal != 0) {
  270. /* Write 1 clear */
  271. mu3d_writel(mbase, U3D_USB2_RX_EP_DATAERR_INTR, dwRxEpDataerrVal);
  272. mu3d_dbg(K_INFO, "===L1[%x] RxDataErr[%x]\n", dwL1Value,
  273. (dwRxEpDataerrVal >> USB2_RX_EP_DATAERR_INTR_EN_OFST
  274. && dwRxEpDataerrVal));
  275. }
  276. dwLinkIntValue =
  277. mu3d_readl(mbase, U3D_DEV_LINK_INTR) & mu3d_readl(mbase,
  278. U3D_DEV_LINK_INTR_ENABLE);
  279. if (dwLinkIntValue != 0) {
  280. /* Write 1 clear */
  281. mu3d_writel(mbase, U3D_DEV_LINK_INTR, dwLinkIntValue);
  282. mu3d_dbg(K_INFO, "===L1[%x] LinkInt[%x]\n", dwL1Value, dwLinkIntValue);
  283. }
  284. }
  285. if (dwL1Value & MAC2_INTR) {
  286. dwIntrUsbValue =
  287. mu3d_readl(mbase, U3D_COMMON_USB_INTR) & mu3d_readl(mbase,
  288. U3D_COMMON_USB_INTR_ENABLE);
  289. /* Write 1 clear */
  290. mu3d_writel(mbase, U3D_COMMON_USB_INTR, dwIntrUsbValue);
  291. mu3d_dbg(K_INFO, "===L1[%x] U2[%x]\n", dwL1Value, dwIntrUsbValue);
  292. }
  293. if (dwL1Value & DMA_INTR) {
  294. dwDmaIntrValue = mu3d_readl(mbase, U3D_DMAISR) & mu3d_readl(mbase, U3D_DMAIER);
  295. /* Write 1 clear */
  296. mu3d_writel(mbase, U3D_DMAISR, dwDmaIntrValue);
  297. mu3d_dbg(K_INFO, "===L1[%x] DMA[%x]\n", dwL1Value, dwDmaIntrValue);
  298. }
  299. if (dwL1Value & MAC3_INTR) {
  300. dwLtssmValue =
  301. mu3d_readl(mbase, U3D_LTSSM_INTR) & mu3d_readl(mbase, U3D_LTSSM_INTR_ENABLE);
  302. /* Write 1 clear */
  303. mu3d_writel(mbase, U3D_LTSSM_INTR, dwLtssmValue);
  304. mu3d_dbg(K_DEBUG, "===L1[%x] LTSSM[%x]\n", dwL1Value, dwLtssmValue);
  305. }
  306. #ifdef USE_SSUSB_QMU
  307. if (dwL1Value & QMU_INTR) {
  308. wIntrQMUValue = mu3d_readl(mbase, U3D_QISAR1) & mu3d_readl(mbase, U3D_QIER1);
  309. wIntrQMUDoneValue = mu3d_readl(mbase, U3D_QISAR0) & mu3d_readl(mbase, U3D_QIER0);
  310. /* Write 1 clear */
  311. mu3d_writel(mbase, U3D_QISAR0, wIntrQMUDoneValue);
  312. qmu_dbg(K_DEBUG, "===L1[%x] QMUDone[Tx=%x,Rx=%x] QMU[%x]===\n",
  313. dwL1Value, ((wIntrQMUDoneValue & 0xFFFF) >> 1), wIntrQMUDoneValue >> 17,
  314. wIntrQMUValue);
  315. }
  316. #endif
  317. if (dwL1Value & BMU_INTR) {
  318. dwIntrEPValue = mu3d_readl(mbase, U3D_EPISR) & mu3d_readl(mbase, U3D_EPIER);
  319. wIntrTxValue = dwIntrEPValue & 0xFFFF;
  320. wIntrRxValue = (dwIntrEPValue >> 16);
  321. mu3d_writel(mbase, U3D_EPISR, dwIntrEPValue);
  322. mu3d_dbg(K_DEBUG, "===L1[%x] Tx[%x] Rx[%x]===\n",
  323. dwL1Value, wIntrTxValue, wIntrRxValue);
  324. }
  325. /*TODO: need to handle SetupEnd Interrupt!!! */
  326. /*--Handle each interrupt--*/
  327. if ((dwL1Value & (BMU_INTR | MAC2_INTR)) || dwIntrUsbValue) {
  328. musb->int_usb = dwIntrUsbValue;
  329. musb->int_tx = wIntrTxValue;
  330. musb->int_rx = wIntrRxValue;
  331. if (musb->int_usb || musb->int_tx || musb->int_rx)
  332. retval = musb_interrupt(musb);
  333. else
  334. mu3d_dbg(K_INFO, "===L1[%x] Nothing can do?? Tx[%x] Rx[%x] U2[%x]===\n",
  335. dwL1Value, wIntrTxValue, wIntrRxValue, dwIntrUsbValue);
  336. }
  337. if (need_vbus_chg_int(musb)) {
  338. dwOtgIntValue = mu3d_readl(musb->sif_base, U3D_SSUSB_OTG_STS)
  339. & mu3d_readl(musb->sif_base, U3D_SSUSB_OTG_INT_EN);
  340. }
  341. #if defined(USE_SSUSB_QMU)
  342. if (wIntrQMUDoneValue) {
  343. if (musb->qmu_done_intr != 0) {
  344. musb->qmu_done_intr = wIntrQMUDoneValue | musb->qmu_done_intr;
  345. qmu_dbg(K_DEBUG, "Has not handle yet %x\n", musb->qmu_done_intr);
  346. } else
  347. musb->qmu_done_intr = wIntrQMUDoneValue;
  348. tasklet_schedule(&musb->qmu_done);
  349. }
  350. if (wIntrQMUValue)
  351. qmu_exception_interrupt(musb, wIntrQMUValue);
  352. #endif
  353. if (dwLtssmValue)
  354. mtu3d_u3_ltssm_intr_handler(musb, dwLtssmValue);
  355. if (dwIntrUsbValue)
  356. mtu3d_u2_common_intr_handler(musb, dwIntrUsbValue);
  357. if (dwLinkIntValue & SSUSB_DEV_SPEED_CHG_INTR)
  358. mtu3d_link_intr_handler(musb, dwLinkIntValue);
  359. /* use OTG's vbus change interrupt */
  360. if (need_vbus_chg_int(musb) && dwOtgIntValue)
  361. mtu3d_otg_isr(musb, dwOtgIntValue);
  362. spin_unlock_irqrestore(&musb->lock, flags);
  363. return retval;
  364. }
  365. /*Turn on/off ADA_SSUSB_XTAL_CK 26MHz*/
  366. static void ssusb_xtal_clock_enable(struct ssusb_mtk *ssusb)
  367. {
  368. /*
  369. * 1 *AP_PLL_CON0 =| 0x1 [0]=1: RG_LTECLKSQ_EN
  370. * 2 Wait PLL stable (100us)
  371. * 3 *AP_PLL_CON0 =| 0x2 [1]=1: RG_LTECLKSQ_LPF_EN
  372. * 4 *AP_PLL_CON2 =| 0x1 [0]=1: DA_REF2USB_TX_EN
  373. * 5 Wait PLL stable (100us)
  374. * 6 *AP_PLL_CON2 =| 0x2 [1]=1: DA_REF2USB_TX_LPF_EN
  375. * 7 *AP_PLL_CON2 =| 0x4 [2]=1: DA_REF2USB_TX_OUT_EN
  376. */
  377. mu3d_setmsk(ssusb->uap_pll_con, UAP_PLL_CON0, CON0_RG_LTECLKSQ_EN);
  378. /*Wait 100 usec */
  379. udelay(100);
  380. mu3d_setmsk(ssusb->uap_pll_con, UAP_PLL_CON0, CON0_RG_LTECLKSQ_LPF_EN);
  381. mu3d_setmsk(ssusb->uap_pll_con, UAP_PLL_CON2, CON2_DA_REF2USB_TX_EN);
  382. /*Wait 100 usec */
  383. udelay(100);
  384. mu3d_setmsk(ssusb->uap_pll_con, UAP_PLL_CON2, CON2_DA_REF2USB_TX_LPF_EN);
  385. mu3d_setmsk(ssusb->uap_pll_con, UAP_PLL_CON2, CON2_DA_REF2USB_TX_OUT_EN);
  386. }
  387. static inline void ssusb_xtal_clock_disable(struct ssusb_mtk *ssusb)
  388. {
  389. /*
  390. * AP_PLL_CON2 &= 0xFFFFFFF8
  391. * [2]=0: DA_REF2USB_TX_OUT_EN
  392. * [1]=0: DA_REF2USB_TX_LPF_EN
  393. * [0]=0: DA_REF2USB_TX_EN
  394. */
  395. mu3d_clrmsk(ssusb->uap_pll_con, UAP_PLL_CON2, CON2_DA_REF2USB_TX_MASK);
  396. }
  397. static int ssusb_clks_enable(struct ssusb_mtk *ssusb)
  398. {
  399. int ret;
  400. ssusb_xtal_clock_enable(ssusb);
  401. pm_runtime_get_sync(ssusb->dev);
  402. ret = clk_prepare_enable(ssusb->scp_sys);
  403. if (ret) {
  404. mu3d_dbg(K_ERR, "%s failed to enable top_usb30\n", __func__);
  405. goto scp_sys_err;
  406. }
  407. ret = clk_prepare_enable(ssusb->peri_usb0);
  408. if (ret) {
  409. mu3d_dbg(K_ERR, "%s failed to enable peri-usb0\n", __func__);
  410. goto clken_usb0_err;
  411. }
  412. if (ssusb->p1_exist) {
  413. ret = clk_prepare_enable(ssusb->peri_usb1);
  414. if (ret) {
  415. mu3d_dbg(K_ERR, "%s failed to enable peri-usb1\n", __func__);
  416. goto clken_usb1_err;
  417. }
  418. }
  419. udelay(50);
  420. return 0;
  421. clken_usb1_err:
  422. clk_disable_unprepare(ssusb->peri_usb0);
  423. clken_usb0_err:
  424. clk_disable_unprepare(ssusb->scp_sys);
  425. scp_sys_err:
  426. pm_runtime_put_sync(ssusb->dev);
  427. ssusb_xtal_clock_disable(ssusb);
  428. return -EINVAL;
  429. }
  430. static int ssusb_clks_disable(struct ssusb_mtk *ssusb)
  431. {
  432. if (ssusb->p1_exist)
  433. clk_disable_unprepare(ssusb->peri_usb1);
  434. clk_disable_unprepare(ssusb->peri_usb0);
  435. if (ssusb->ic_version != CHIP_SW_VER_01) {
  436. clk_disable_unprepare(ssusb->scp_sys); /* only for ECO IC */
  437. pm_runtime_put_sync(ssusb->dev);
  438. }
  439. ssusb_xtal_clock_disable(ssusb);
  440. return 0;
  441. }
  442. static int peri_clks_enable(struct ssusb_mtk *ssusb)
  443. {
  444. int ret;
  445. ssusb_xtal_clock_enable(ssusb);
  446. ret = clk_prepare_enable(ssusb->peri_usb0);
  447. if (ret) {
  448. mu3d_dbg(K_ERR, "%s failed to enable peri-usb0\n", __func__);
  449. goto clken_usb0_err;
  450. }
  451. if (ssusb->p1_exist) {
  452. ret = clk_prepare_enable(ssusb->peri_usb1);
  453. if (ret) {
  454. mu3d_dbg(K_ERR, "%s failed to enable peri-usb1\n", __func__);
  455. goto clken_usb1_err;
  456. }
  457. }
  458. udelay(50);
  459. return 0;
  460. clken_usb1_err:
  461. clk_disable_unprepare(ssusb->peri_usb0);
  462. clken_usb0_err:
  463. ssusb_xtal_clock_disable(ssusb);
  464. return -EINVAL;
  465. }
  466. static int peri_clks_disable(struct ssusb_mtk *ssusb)
  467. {
  468. if (ssusb->p1_exist)
  469. clk_disable_unprepare(ssusb->peri_usb1);
  470. clk_disable_unprepare(ssusb->peri_usb0);
  471. ssusb_xtal_clock_disable(ssusb);
  472. return 0;
  473. }
  474. /*
  475. * on 8173:
  476. * avdd1.0v which comes from aio18v is poweron/off by rg_ssusbldo_bg_ldo_en;
  477. * vio18v is always keep on, meanwhile avdd10 is out range of regulator driver,
  478. * so operate register directly here.
  479. */
  480. static int check_vusb10_ready(struct ssusb_mtk *ssusb)
  481. {
  482. int count = 200;
  483. u32 val;
  484. while (count > 0) {
  485. /* no mare than 50us normally */
  486. val = mu3d_readl(ssusb->sif_base, U3D_USB30_PHYA_REGC);
  487. if (val & E60802_AD_VUSB10_READY)
  488. break;
  489. udelay(1);
  490. }
  491. return count > 0 ? 0 : -ENODEV;
  492. }
  493. static int ssusb_vusb10_enable(struct ssusb_mtk *ssusb)
  494. {
  495. void __iomem *sif_base = ssusb->sif_base;
  496. u32 efuse_cal_val;
  497. u32 val;
  498. val = mu3d_readl(sif_base, U3D_USB30_PHYA_REGD);
  499. if (0 == (val & E60802_RG_SSUSBLDO_BG_LDO_EN))
  500. mu3d_setmsk(sif_base, U3D_USB30_PHYA_REGD, E60802_RG_SSUSBLDO_BG_LDO_EN);
  501. /*
  502. * read efuse cal vule 0x10206534[19:16]
  503. * write to PHYA 0x11290b34[11:8]
  504. * to make avdd10 be closest to 1.0V
  505. * index is 31 for 0x10206534
  506. */
  507. efuse_cal_val = get_devinfo_with_index(31);
  508. efuse_cal_val = (efuse_cal_val >> 16) & 0xf;
  509. val = mu3d_readl(sif_base, U3D_USB30_PHYA_REGD);
  510. val &= ~E60802_RG_SSUSBLDO_CAL;
  511. val |= efuse_cal_val << E60802_RG_SSUSBLDO_CAL_OFST;
  512. mu3d_writel(sif_base, U3D_USB30_PHYA_REGD, val);
  513. mu3d_dbg(K_DEBUG, "efuse : 0x%x(0x%x), regd : 0x%x(0x%x)\n",
  514. efuse_cal_val, get_devinfo_with_index(31), val,
  515. mu3d_readl(sif_base, U3D_USB30_PHYA_REGD));
  516. return check_vusb10_ready(ssusb);
  517. }
  518. static inline void ssusb_vusb10_disable(struct ssusb_mtk *ssusb)
  519. {
  520. mu3d_clrmsk(ssusb->sif_base, U3D_USB30_PHYA_REGD, E60802_RG_SSUSBLDO_BG_LDO_EN);
  521. }
  522. static int ssusb_regulators_enable(struct ssusb_mtk *ssusb)
  523. {
  524. int ret;
  525. ret = regulator_enable(ssusb->vusb33);
  526. if (ret) {
  527. mu3d_dbg(K_ERR, "%s failed to enable vusb33\n", __func__);
  528. return ret;
  529. }
  530. if (ssusb->usbnet33) {
  531. ret = regulator_enable(ssusb->usbnet33);
  532. if (ret) {
  533. mu3d_dbg(K_ERR, "%s failed to enable usbnet33\n", __func__);
  534. regulator_disable(ssusb->vusb33);
  535. return ret;
  536. }
  537. }
  538. return 0;
  539. }
  540. static void ssusb_regulators_disable(struct ssusb_mtk *ssusb)
  541. {
  542. regulator_disable(ssusb->vusb33);
  543. if (ssusb->usbnet33)
  544. regulator_disable(ssusb->usbnet33);
  545. }
  546. static int ssusb_phy_init(struct ssusb_mtk *ssusb)
  547. {
  548. struct u3phy_reg_base u3p_reg;
  549. int ret = -1;
  550. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  551. u3p_reg.sif_base = ssusb->sif_base;
  552. /* u3p_reg.sif2_base = musb->sif2_base; */
  553. u3p_reg.phy_num = ssusb->p1_exist ? 2 : 1;
  554. ret = ssusb_regulators_enable(ssusb);
  555. if (ret) {
  556. mu3d_dbg(K_ERR, "%s failed to enable regulators\n", __func__);
  557. return ret;
  558. }
  559. ret = ssusb_clks_enable(ssusb);
  560. if (ret) {
  561. mu3d_dbg(K_ERR, "%s failed to enable clks\n", __func__);
  562. goto clks_err;
  563. }
  564. /* clock is on by default on mt8173, so turn it off if not use */
  565. if (!ssusb->p1_exist) {
  566. clk_prepare_enable(ssusb->peri_usb1);
  567. clk_disable_unprepare(ssusb->peri_usb1);
  568. }
  569. /*
  570. * if usb2-port0 100U current extracts from U3(RG_USB20_HS_100U_U3_EN = 1),
  571. * enable vusb10, otherwise close it
  572. */
  573. ret = ssusb_vusb10_enable(ssusb);
  574. if (ret) {
  575. mu3d_dbg(K_ERR, "%s failed to enable vusb10\n", __func__);
  576. goto vusb10_err;
  577. }
  578. mu3d_dbg(K_INFO, "%s: vusb33, vusb10 and clks are enabled\n", __func__);
  579. /* initialize PHY related data structure, param is dummy if not project phy */
  580. if (!u3phy)
  581. ret = u3phy_init(&u3p_reg);
  582. u3phy->u3p_ops->init(u3phy);
  583. u3phy->u3p_ops->usb_phy_recover(u3phy, 1 /*musb->is_clk_on */);
  584. /* USB 2.0 slew rate calibration */
  585. u3phy->u3p_ops->u2_slew_rate_calibration(u3phy);
  586. ssusb->is_power_on = 1;
  587. return 0;
  588. vusb10_err:
  589. ssusb_clks_disable(ssusb);
  590. clks_err:
  591. ssusb_regulators_disable(ssusb);
  592. return -EINVAL;
  593. }
  594. static void ssusb_phy_exit(struct ssusb_mtk *ssusb)
  595. {
  596. ssusb_vusb10_disable(ssusb);
  597. ssusb_clks_disable(ssusb);
  598. ssusb_regulators_disable(ssusb);
  599. if (u3phy)
  600. u3phy_exit(NULL);
  601. }
  602. static int low_power_enter(struct ssusb_mtk *ssusb)
  603. {
  604. mutex_lock(&ssusb->power_mutex);
  605. if (!ssusb->is_power_on)
  606. goto out;
  607. u3phy->u3p_ops->usb_phy_savecurrent(u3phy, 1);
  608. /*
  609. * if disable 3.3v, BC11 will also be disabled at the same time.
  610. * when keep it on, port0's electrostatic discharge will increase
  611. * from 0.0002mA to 0.0149mA in suspend mode.
  612. */
  613. if (SSUSB_STR_DEEP != ssusb->str_mode)
  614. peri_clks_disable(ssusb);
  615. else {
  616. ssusb_vusb10_disable(ssusb);
  617. ssusb_clks_disable(ssusb);
  618. ssusb_regulators_disable(ssusb);
  619. }
  620. ssusb->is_power_on = 0;
  621. out:
  622. mutex_unlock(&ssusb->power_mutex);
  623. return 0;
  624. }
  625. static int low_power_exit(struct ssusb_mtk *ssusb)
  626. {
  627. int ret = 0;
  628. mutex_lock(&ssusb->power_mutex);
  629. if (ssusb->is_power_on)
  630. goto out;
  631. if (SSUSB_STR_DEEP != ssusb->str_mode) {
  632. peri_clks_enable(ssusb);
  633. goto restore_phy;
  634. }
  635. ret = ssusb_regulators_enable(ssusb);
  636. if (ret) {
  637. mu3d_dbg(K_ERR, "%s failed to enable ldos\n", __func__);
  638. goto out;
  639. }
  640. ret = ssusb_clks_enable(ssusb);
  641. if (ret) {
  642. mu3d_dbg(K_ERR, "%s failed to enable clks\n", __func__);
  643. ssusb_regulators_disable(ssusb);
  644. goto out;
  645. }
  646. ssusb_vusb10_enable(ssusb);
  647. restore_phy:
  648. u3phy->u3p_ops->usb_phy_recover(u3phy, 1);
  649. /* USB 2.0 slew rate calibration */
  650. u3phy->u3p_ops->u2_slew_rate_calibration(u3phy);
  651. ssusb->is_power_on = 1;
  652. out:
  653. mutex_unlock(&ssusb->power_mutex);
  654. return ret;
  655. }
  656. int ssusb_power_save(struct ssusb_mtk *ssusb)
  657. {
  658. if (!ssusb->is_power_saving_mode)
  659. return 0;
  660. low_power_enter(ssusb);
  661. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  662. return 0;
  663. }
  664. int ssusb_power_restore(struct ssusb_mtk *ssusb)
  665. {
  666. if (!ssusb->is_power_saving_mode)
  667. return 0;
  668. low_power_exit(ssusb);
  669. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  670. return 0;
  671. }
  672. static void ssusb_mac_sw_reset(struct ssusb_mtk *ssusb)
  673. {
  674. /* reset whole ip (xhci & mu3d) */
  675. mu3d_setmsk(ssusb->sif_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST);
  676. mu3d_clrmsk(ssusb->sif_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST);
  677. }
  678. static int mtu3d_musb_reg_init(struct musb *musb)
  679. {
  680. #if 0
  681. struct u3phy_reg_base u3p_reg;
  682. int ret = -1;
  683. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  684. u3p_reg.sif_base = musb->sif_base;
  685. /* u3p_reg.sif2_base = musb->sif2_base; */
  686. #ifndef CONFIG_MTK_FPGA
  687. /* initialize PHY related data structure */
  688. if (!u3phy)
  689. ret = u3phy_init(&u3p_reg);
  690. #else
  691. ret = 1;
  692. #endif
  693. if (ret) {
  694. #ifndef CONFIG_MTK_FPGA
  695. u3phy->u3p_ops->init(u3phy);
  696. musb->is_clk_on = 1;
  697. u3phy->u3p_ops->usb_phy_recover(u3phy, musb->is_clk_on);
  698. /* USB 2.0 slew rate calibration */
  699. u3phy->u3p_ops->u2_slew_rate_calibration(u3phy);
  700. #endif
  701. /* disable ip power down, disable U2/U3 ip power down */
  702. mu3d_hal_ssusb_en(musb);
  703. /* reset U3D all dev module. */
  704. mu3d_hal_rst_dev(musb);
  705. } else {
  706. mu3d_dbg(K_ERR, "%s: PHY initialization fail!\n", __func__);
  707. ret = -ENODEV;
  708. }
  709. return ret;
  710. #endif
  711. musb->is_clk_on = 1;
  712. /* disable ip power down, disable U2/U3 ip power down */
  713. mu3d_hal_ssusb_en(musb);
  714. /* reset U3D all dev module. */
  715. mu3d_hal_rst_dev(musb);
  716. return 0;
  717. }
  718. void mtu3d_musb_enable(struct musb *musb)
  719. {
  720. mu3d_dbg(K_INFO, "%s\n", __func__);
  721. }
  722. void mtu3d_musb_disable(struct musb *musb)
  723. {
  724. mu3d_dbg(K_INFO, "%s\n", __func__);
  725. #ifdef CONFIG_SSUSB_PROJECT_PHY
  726. /* Comment from CC Chou.
  727. * When detecting HS or FS and setting RG_USB20_SW_PLLMODE=1, It is OK to enter LPM L1 with BESL=0.
  728. * When disconnecting, set RG_USB20_SW_PLLMODE=0 back.
  729. */
  730. /* use phy hook function directly. yun */
  731. mu3d_clrmsk(musb->sif_base, U3D_U2PHYDCR1, E60802_RG_USB20_SW_PLLMODE);
  732. #endif
  733. }
  734. static int mtu3d_musb_init(struct musb *musb)
  735. {
  736. int retval;
  737. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  738. usb_phy_generic_register();
  739. musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
  740. if (IS_ERR_OR_NULL(musb->xceiv))
  741. goto unregister;
  742. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  743. retval = mtu3d_musb_reg_init(musb);
  744. if (retval < 0)
  745. goto put_phy;
  746. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  747. if (is_peripheral_enabled(musb))
  748. musb->xceiv->set_power = mtu3d_set_power;
  749. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  750. musb->isr = generic_interrupt;
  751. return 0;
  752. put_phy:
  753. usb_put_phy(musb->xceiv);
  754. unregister:
  755. return -ENODEV;
  756. }
  757. static int mtu3d_set_power(struct usb_phy *x, unsigned mA)
  758. {
  759. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  760. return 0;
  761. }
  762. static int mtu3d_musb_exit(struct musb *musb)
  763. {
  764. #ifdef NEVER
  765. struct device *dev = musb->controller;
  766. struct musb_hdrc_platform_data *plat = dev->platform_data;
  767. #endif /* NEVER */
  768. usb_put_phy(musb->xceiv);
  769. /* u3phy_exit(); */
  770. return 0;
  771. }
  772. static const struct musb_platform_ops mtu3d_ops = {
  773. .init = mtu3d_musb_init,
  774. .exit = mtu3d_musb_exit,
  775. .enable = mtu3d_musb_enable,
  776. .disable = mtu3d_musb_disable
  777. };
  778. static u64 usb_dmamask = DMA_BIT_MASK(32);
  779. #if 0
  780. static int ssusb_gadget_init(struct ssusb_mtk *ssusb)
  781. {
  782. struct musb_hdrc_platform_data *pdata = ssusb->pdata;
  783. struct platform_device *mu3d;
  784. int ret;
  785. mu3d_dbg(K_DEBUG, "%s() %d\n", __func__, __LINE__);
  786. mu3d = platform_device_alloc(MUSB_DRIVER_NAME, PLATFORM_DEVID_NONE);
  787. if (!mu3d) {
  788. dev_err(ssusb->dev, "failed to allocate musb device\n");
  789. ret = -ENOMEM;
  790. goto err0;
  791. }
  792. mu3d->dev.parent = ssusb->dev;
  793. mu3d->dev.dma_mask = ssusb->dev->dma_mask;
  794. dma_set_coherent_mask(&mu3d->dev, ssusb->dev->coherent_dma_mask);
  795. ssusb->mu3d = mu3d;
  796. pdata->platform_ops = &mtu3d_ops;
  797. mu3d_dbg(K_DEBUG, "%s() %d\n", __func__, __LINE__);
  798. /* FIXME:
  799. * the ep cfg should be placed at mt_dev.c.
  800. * However, each item of the array is 8 showing from ICE.
  801. * But the actul size of each item is 6 by sizeof().
  802. * Move the array here, the array algin issue is fixed.
  803. * So put here temp until we know the reason.
  804. */
  805. pdata->config->fifo_cfg = mtu3d_cfg;
  806. pdata->config->fifo_cfg_size = ARRAY_SIZE(mtu3d_cfg);
  807. ret = platform_device_add_resources(mu3d, ssusb->mu3d_rscs, SSUSB_MU3D_RSCS_NUM);
  808. if (ret) {
  809. dev_err(ssusb->dev, "failed to add resources\n");
  810. goto err1;
  811. }
  812. ret = platform_device_add_data(mu3d, pdata, sizeof(*pdata));
  813. if (ret) {
  814. dev_err(ssusb->dev, "failed to add platform_data\n");
  815. goto err1;
  816. }
  817. mu3d_dbg(K_DEBUG, "%s() %d\n", __func__, __LINE__);
  818. ret = platform_device_add(mu3d);
  819. if (ret) {
  820. dev_err(ssusb->dev, "failed to register musb device\n");
  821. goto err1;
  822. }
  823. mu3d_dbg(K_DEBUG, "%s() %d register mu3d device ok\n", __func__, __LINE__);
  824. return 0;
  825. err1:
  826. platform_device_put(mu3d);
  827. err0:
  828. return ret;
  829. }
  830. void ssusb_gadget_exit(struct ssusb_mtk *ssusb)
  831. {
  832. platform_device_unregister(ssusb->mu3d);
  833. }
  834. #endif
  835. #ifdef CONFIG_OF
  836. static int get_otg_iddig_eint_num(struct device_node *dn, u32 *outval)
  837. {
  838. struct device_node *iddig_dn;
  839. u32 irq_num;
  840. iddig_dn = of_get_child_by_name(dn, "otg-iddig");
  841. if (NULL == iddig_dn) {
  842. mu3d_dbg(K_ERR, "failed to get otg-iddig sub node\n");
  843. return -ENODEV;
  844. }
  845. irq_num = irq_of_parse_and_map(iddig_dn, 0);
  846. if (irq_num <= 0) {
  847. mu3d_dbg(K_ERR, "invalid eint number - %d\n", irq_num);
  848. return -EINVAL;
  849. }
  850. mu3d_dbg(K_WARNIN, "eint number - %d\n", irq_num);
  851. *outval = irq_num;
  852. return 0;
  853. }
  854. static struct musb_hdrc_platform_data *mu3d_parse_dts(struct device_node *dn)
  855. {
  856. struct musb_hdrc_platform_data *pdata;
  857. struct musb_hdrc_config *config;
  858. enum of_gpio_flags flags;
  859. /* u32 tmp; */
  860. int ret = 0;
  861. /* struct device_node *np = pdev->dev.of_node; */
  862. /* u32 temp_id = 0; */
  863. /* unsigned long usb_mac; */
  864. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  865. mu3d_dbg(K_WARNIN, "%s: use device tree\n", __func__);
  866. /* usb_irq_number1 = irq_of_parse_and_map(pdev->dev.of_node, 0); */
  867. /* usb_mac = (unsigned long)of_iomap(pdev->dev.of_node, 0); */
  868. /* usb_phy_base = (unsigned long)of_iomap(pdev->dev.of_node, 1); */
  869. pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  870. if (NULL == pdata)
  871. goto pd_err;
  872. pdata->p0_gpio_num = -1; /* will update if use */
  873. pdata->p1_gpio_num = -1;
  874. config = kzalloc(sizeof(*config), GFP_KERNEL);
  875. if (NULL == config)
  876. goto cfg_err;
  877. ret = of_property_read_u32(dn, "num-eps", &config->num_eps);
  878. if (ret) {
  879. mu3d_dbg(K_ERR, "failed to get num_eps\n");
  880. goto prp_err;
  881. }
  882. ret = of_property_read_u32(dn, "str-mode", &pdata->str_mode);
  883. if (ret) {
  884. mu3d_dbg(K_ERR, "failed to get str-mode\n");
  885. goto prp_err;
  886. }
  887. ret = of_property_read_u32(dn, "drv-mode", &pdata->drv_mode);
  888. if (ret) {
  889. mu3d_dbg(K_ERR, "failed to get drv-mode\n");
  890. goto prp_err;
  891. } else if (SSUSB_MODE_DEVICE == pdata->drv_mode) {
  892. mu3d_dbg(K_INFO, "only as DEVICE mode\n");
  893. goto prp_ok;
  894. }
  895. ret = of_property_read_u32(dn, "port-num", &pdata->port_num);
  896. if (ret) {
  897. mu3d_dbg(K_ERR, "failed to get port-num\n");
  898. goto prp_err;
  899. }
  900. ret = of_property_read_u32(dn, "wakeup-src", &pdata->wakeup_src);
  901. if (ret) {
  902. mu3d_dbg(K_ERR, "failed to get wakeup-src\n");
  903. goto prp_err;
  904. }
  905. /* to get more configs for HOST or DRD mode */
  906. ret = of_property_read_u32(dn, "p0-vbus-mode", &pdata->p0_vbus_mode);
  907. if (ret) {
  908. mu3d_dbg(K_ERR, "failed to get p0-vbus-mode\n");
  909. goto prp_err;
  910. } else if (SSUSB_VBUS_GPIO == pdata->p0_vbus_mode) {
  911. pdata->p0_gpio_num = of_get_named_gpio_flags(dn, "p0-gpio", 0, &flags);
  912. if (pdata->p0_gpio_num < 0) {
  913. mu3d_dbg(K_ERR, "failed to get p0-gpio\n");
  914. goto prp_err;
  915. }
  916. pdata->p0_gpio_active_low = !!(flags & OF_GPIO_ACTIVE_LOW);
  917. }
  918. if (2 == pdata->port_num) { /* port-num is max(u2-ports, u3-ports) */
  919. ret = of_property_read_u32(dn, "p1-vbus-mode", &pdata->p1_vbus_mode);
  920. if (ret) {
  921. mu3d_dbg(K_ERR, "failed to get p1-vbus-mode\n");
  922. goto prp_err;
  923. } else if (SSUSB_VBUS_GPIO == pdata->p1_vbus_mode) {
  924. pdata->p1_gpio_num = of_get_named_gpio_flags(dn, "p1-gpio", 0, &flags);
  925. if (pdata->p1_gpio_num < 0) {
  926. mu3d_dbg(K_ERR, "failed to get p1-gpio-num\n");
  927. goto prp_err;
  928. }
  929. pdata->p1_gpio_active_low = !!(flags & OF_GPIO_ACTIVE_LOW);
  930. }
  931. }
  932. if (SSUSB_MODE_HOST == pdata->drv_mode) {
  933. mu3d_dbg(K_INFO, "only as HOST mode\n");
  934. goto prp_ok;
  935. }
  936. /* to get more configs for DRD mode */
  937. ret = of_property_read_u32(dn, "is-u3-otg", &pdata->is_u3_otg);
  938. if (ret) {
  939. mu3d_dbg(K_ERR, "failed to get is_u3_otg\n");
  940. goto prp_err;
  941. }
  942. ret = of_property_read_u32(dn, "otg-mode", &pdata->otg_mode);
  943. if (ret) {
  944. mu3d_dbg(K_ERR, "failed to get otg-mode\n");
  945. goto prp_err;
  946. } else if (is_eint_used(pdata->otg_mode)) {
  947. ret = get_otg_iddig_eint_num(dn, &pdata->eint_num);
  948. if (ret) {
  949. mu3d_dbg(K_ERR, "failed to get iddig-eint-num\n");
  950. goto prp_err;
  951. }
  952. } else if (SSUSB_OTG_MANUAL == pdata->otg_mode) {
  953. ret = of_property_read_u32(dn, "init-as-host", &pdata->otg_init_as_host);
  954. if (ret) {
  955. mu3d_dbg(K_ERR, "failed to get init-as-host\n");
  956. goto prp_err;
  957. }
  958. }
  959. prp_ok:
  960. pdata->config = config;
  961. mu3d_dbg(K_WARNIN, "drv_mode:%d, str_mode:%d, num_eps:%d, ports:%d\n",
  962. pdata->drv_mode, pdata->str_mode, config->num_eps, pdata->port_num);
  963. mu3d_dbg(K_WARNIN, "otg-mode:%d, init_to_host:%d, u3_otg:%d, wakeup_src:%d\n",
  964. pdata->otg_mode, pdata->otg_init_as_host, pdata->is_u3_otg, pdata->wakeup_src);
  965. mu3d_dbg(K_WARNIN, "eint:%d, p0_vbus:%d, p0_gpio:%d, p1_vbus:%d, p1_gpio:%d\n",
  966. pdata->eint_num, pdata->p0_vbus_mode, pdata->p0_gpio_num,
  967. pdata->p1_vbus_mode, pdata->p1_gpio_num);
  968. return pdata;
  969. prp_err:
  970. kfree(config);
  971. cfg_err:
  972. kfree(pdata);
  973. pd_err:
  974. return NULL;
  975. }
  976. static void mu3d_pdata_free(struct musb_hdrc_platform_data *pdata)
  977. {
  978. kfree(pdata->config);
  979. kfree(pdata);
  980. }
  981. static void __iomem *get_regs_base(struct platform_device *pdev, int index)
  982. {
  983. struct resource *res;
  984. void __iomem *regs;
  985. res = platform_get_resource(pdev, IORESOURCE_MEM, index);
  986. if (NULL == res) {
  987. mu3d_dbg(K_ERR, "error to get rsrc %d\n", index);
  988. return NULL;
  989. }
  990. regs = ioremap_nocache(res->start, resource_size(res));
  991. if (NULL == regs) {
  992. mu3d_dbg(K_ERR, "error mapping memory for %d\n", index);
  993. return NULL;
  994. }
  995. mu3d_dbg(K_INFO, "index:%d - iomap:0x%p, res:%#lx, len:%#lx\n", index, regs,
  996. (unsigned long)res->start, (unsigned long)resource_size(res));
  997. return regs;
  998. }
  999. static void put_regs_map(struct ssusb_mtk *ssusb)
  1000. {
  1001. if (ssusb->mac_base)
  1002. iounmap(ssusb->mac_base);
  1003. if (ssusb->sif_base)
  1004. iounmap(ssusb->sif_base);
  1005. }
  1006. static int get_ssusb_clks(struct platform_device *pdev, struct ssusb_mtk *ssusb)
  1007. {
  1008. struct clk *tmp;
  1009. tmp = clk_get(&pdev->dev, "top_usb30");
  1010. if (IS_ERR(tmp)) {
  1011. mu3d_dbg(K_ERR, "error to get top_usb30\n");
  1012. goto pwr_err;
  1013. }
  1014. ssusb->scp_sys = tmp;
  1015. pm_runtime_enable(&pdev->dev);
  1016. tmp = clk_get(&pdev->dev, "peri_usb0");
  1017. if (IS_ERR(tmp)) {
  1018. mu3d_dbg(K_ERR, "error to get peri_usb0\n");
  1019. goto clk_usb0_err;
  1020. }
  1021. ssusb->peri_usb0 = tmp;
  1022. tmp = clk_get(&pdev->dev, "peri_usb1");
  1023. if (IS_ERR(tmp)) {
  1024. mu3d_dbg(K_ERR, "error to get peri_usb1\n");
  1025. goto clk_usb1_err;
  1026. }
  1027. ssusb->peri_usb1 = tmp;
  1028. mu3d_dbg(K_INFO, "mu3d get clks ok\n");
  1029. return 0;
  1030. clk_usb1_err:
  1031. clk_put(ssusb->peri_usb0);
  1032. clk_usb0_err:
  1033. clk_put(ssusb->scp_sys);
  1034. pwr_err:
  1035. return -EINVAL;
  1036. }
  1037. static void put_ssusb_clks(struct ssusb_mtk *ssusb)
  1038. {
  1039. if (ssusb->peri_usb0)
  1040. clk_put(ssusb->peri_usb0);
  1041. if (ssusb->peri_usb1)
  1042. clk_put(ssusb->peri_usb1);
  1043. if (ssusb->scp_sys)
  1044. clk_put(ssusb->scp_sys);
  1045. }
  1046. static int get_regulators(struct platform_device *pdev, struct ssusb_mtk *ssusb)
  1047. {
  1048. int ret = -EINVAL;
  1049. ssusb->vusb33 = regulator_get(&pdev->dev, "reg-vusb33");
  1050. if (IS_ERR_OR_NULL(ssusb->vusb33)) {
  1051. mu3d_dbg(K_ERR, "fail to get vusb33\n");
  1052. ret = PTR_ERR(ssusb->vusb33);
  1053. goto err;
  1054. }
  1055. mu3d_dbg(K_INFO, "mu3d get vusb33 ok\n");
  1056. /* vusb33's regulator is fixed at voltage-3.3v, so can't reset new value agian */
  1057. #if 0
  1058. ret = regulator_set_voltage(ssusb->vusb33, 3300000, 3300000);
  1059. if (ret) {
  1060. mu3d_dbg(K_ERR, "%s failed to set vusb33 voltage:%d\n", __func__, ret);
  1061. regulator_put(ssusb->vusb33);
  1062. ssusb->vusb33 = NULL;
  1063. goto err;
  1064. }
  1065. #endif
  1066. /* only box maybe use it , so is not error if it don't exists */
  1067. #if 0
  1068. ssusb->usbnet33 = regulator_get(&pdev->dev, "reg-usbnet33");
  1069. if (!IS_ERR_OR_NULL(ssusb->usbnet33)) {
  1070. ret = regulator_set_voltage(ssusb->usbnet33, 3300000, 3300000);
  1071. if (ret) {
  1072. mu3d_dbg(K_ERR, "%s failed to set usbnet35 to 3.3v:%d\n", __func__, ret);
  1073. goto un33_err;
  1074. }
  1075. mu3d_dbg(K_WARNIN, "mu3d get usbnet33 ok\n");
  1076. } else
  1077. #endif
  1078. ssusb->usbnet33 = NULL;
  1079. return 0;
  1080. err:
  1081. return ret;
  1082. }
  1083. static void put_regulators(struct ssusb_mtk *ssusb)
  1084. {
  1085. regulator_put(ssusb->usbnet33);
  1086. regulator_put(ssusb->vusb33);
  1087. }
  1088. #endif
  1089. static void get_host_ports(struct ssusb_mtk *ssusb)
  1090. {
  1091. u32 xhci_cap;
  1092. if (ssusb->p1_exist) {
  1093. xhci_cap = mu3d_readl(ssusb->sif_base, U3D_SSUSB_IP_XHCI_CAP);
  1094. ssusb->u2_ports = SSUSB_U2_PORT_NUM(xhci_cap);
  1095. ssusb->u3_ports = SSUSB_U3_PORT_NUM(xhci_cap);
  1096. } else {
  1097. /* if there is only one host port on mt8173, it only supports usb2.0 */
  1098. ssusb->u2_ports = 1;
  1099. ssusb->u3_ports = 0;
  1100. }
  1101. mu3d_dbg(K_INFO, "use u2_ports:%d, u3_ports:%d in fact\n",
  1102. ssusb->u2_ports, ssusb->u3_ports);
  1103. }
  1104. static int get_one_resource(struct platform_device *pdev,
  1105. struct resource *rsc, unsigned int type, unsigned int num, char *name)
  1106. {
  1107. struct resource *res;
  1108. res = platform_get_resource(pdev, type, num);
  1109. if (!res) {
  1110. dev_err(&pdev->dev, "missing %s type: 0x%x, index:%d\n", name, type, num);
  1111. return -ENODEV;
  1112. }
  1113. memcpy(rsc, res, sizeof(*res));
  1114. mu3d_dbg(K_DEBUG, "%s: rsc - start:0x%x, end: 0x%x, flags: 0x%lx, name: %s\n",
  1115. __func__, (u32) rsc->start, (u32) rsc->end, rsc->flags, rsc->name);
  1116. return 0;
  1117. }
  1118. static int get_vbus_gpio(struct vbus_ctrl_info *vbus, const char *label)
  1119. {
  1120. int retval;
  1121. if (SSUSB_VBUS_GPIO != vbus->vbus_mode)
  1122. return 0;
  1123. if (!gpio_is_valid(vbus->vbus_gpio_num)) {
  1124. mu3d_dbg(K_ERR, "%s gpio-num is invalid:%d\n", label, vbus->vbus_gpio_num);
  1125. return -ENODEV;
  1126. }
  1127. retval = gpio_request(vbus->vbus_gpio_num, label);
  1128. if (retval) {
  1129. mu3d_dbg(K_ERR, "fail to requeset %s :%d\n", label, vbus->vbus_gpio_num);
  1130. return -EBUSY;
  1131. }
  1132. /* inactive by default */
  1133. gpio_direction_output(vbus->vbus_gpio_num, vbus->gpio_active_low);
  1134. mu3d_dbg(K_DEBUG, "%s :%d is ok\n", label, vbus->vbus_gpio_num);
  1135. return 0;
  1136. }
  1137. /* all power & clocks can be disabled for iddig wakeup mode */
  1138. static void usb_wakeup_iddig_en(struct ssusb_mtk *ssusb, int polarity)
  1139. {
  1140. u32 tmp;
  1141. if (polarity)
  1142. mu3d_setmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_IDDIG_P);
  1143. else
  1144. mu3d_clrmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_IDDIG_P);
  1145. tmp = mu3d_readl(ssusb->perisys, PERI_WK_CTRL1);
  1146. tmp &= ~(UWK_CTL1_IDDIG_C(0xf));
  1147. tmp |= UWK_CTL1_IDDIG_C(0x8);
  1148. mu3d_writel(ssusb->perisys, PERI_WK_CTRL1, tmp);
  1149. mu3d_setmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_IDDIG_E);
  1150. mu3d_dbg(K_INFO, "%s() WK_CTRL1[P9,E10,C11:14]=%#x\n", __func__,
  1151. mu3d_readl(ssusb->perisys, PERI_WK_CTRL1));
  1152. }
  1153. static inline void usb_wakeup_iddig_dis(struct ssusb_mtk *ssusb)
  1154. {
  1155. mu3d_clrmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_IDDIG_E);
  1156. }
  1157. /* only clocks can be turn off for ip-sleep wakeup mode */
  1158. static void usb_wakeup_ip_sleep_en(struct ssusb_mtk *ssusb, int polarity)
  1159. {
  1160. u32 tmp;
  1161. if (polarity)
  1162. mu3d_setmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_IS_P);
  1163. else
  1164. mu3d_clrmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_IS_P);
  1165. tmp = mu3d_readl(ssusb->perisys, PERI_WK_CTRL1);
  1166. tmp &= ~(UWK_CTL1_IS_C(0xf));
  1167. tmp |= UWK_CTL1_IS_C(0x8);
  1168. mu3d_writel(ssusb->perisys, PERI_WK_CTRL1, tmp);
  1169. mu3d_setmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_IS_E);
  1170. mu3d_dbg(K_INFO, "%s() WK_CTRL1[P6,E25,C26:29]=%#x\n", __func__,
  1171. mu3d_readl(ssusb->perisys, PERI_WK_CTRL1));
  1172. }
  1173. static inline void usb_wakeup_ip_sleep_dis(struct ssusb_mtk *ssusb)
  1174. {
  1175. mu3d_clrmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_IS_E);
  1176. }
  1177. /*
  1178. * for line-state wakeup mode, phy's power should not power-down
  1179. */
  1180. static void usb_wakeup_p0_line_state_en(struct ssusb_mtk *ssusb, int polarity, int edge)
  1181. {
  1182. u32 tmp;
  1183. if (polarity)
  1184. mu3d_setmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_0P_LS_P);
  1185. else
  1186. mu3d_clrmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_0P_LS_P);
  1187. tmp = mu3d_readl(ssusb->perisys, PERI_WK_CTRL1);
  1188. tmp &= ~(UWK_CTL1_0P_LS_C(0xf));
  1189. tmp |= UWK_CTL1_0P_LS_C(0x8);
  1190. mu3d_writel(ssusb->perisys, PERI_WK_CTRL1, tmp);
  1191. mu3d_setmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_0P_LS_E);
  1192. mu3d_dbg(K_INFO, "%s() WK_CTRL1[P7,E20,C21:24]=%#x\n", __func__,
  1193. mu3d_readl(ssusb->perisys, PERI_WK_CTRL1));
  1194. }
  1195. static inline void usb_wakeup_p0_line_state_dis(struct ssusb_mtk *ssusb)
  1196. {
  1197. mu3d_clrmsk(ssusb->perisys, PERI_WK_CTRL1, UWK_CTL1_0P_LS_E);
  1198. }
  1199. static void usb_wakeup_p1_line_state_en(struct ssusb_mtk *ssusb)
  1200. {
  1201. u32 tmp;
  1202. tmp = mu3d_readl(ssusb->perisys, PERI_WK_CTRL0);
  1203. tmp &= ~(UWK_CTL1_1P_LS_C(0xf));
  1204. tmp |= UWK_CTL1_1P_LS_C(0x8);
  1205. mu3d_writel(ssusb->perisys, PERI_WK_CTRL0, tmp);
  1206. mu3d_setmsk(ssusb->perisys, PERI_WK_CTRL0, UWK_CTL1_1P_LS_E);
  1207. mu3d_dbg(K_INFO, "%s() WK_CTRL0[E0,C1:4]=%#x\n", __func__,
  1208. mu3d_readl(ssusb->perisys, PERI_WK_CTRL0));
  1209. }
  1210. static inline void usb_wakeup_p1_line_state_dis(struct ssusb_mtk *ssusb)
  1211. {
  1212. mu3d_clrmsk(ssusb->perisys, PERI_WK_CTRL0, UWK_CTL1_1P_LS_E);
  1213. }
  1214. static void usb_wakeup_enable(struct ssusb_mtk *ssusb)
  1215. {
  1216. if (ssusb->wakeup_src & SSUSB_WK_IDDIG)
  1217. usb_wakeup_iddig_en(ssusb, 0);
  1218. if (ssusb->wakeup_src & SSUSB_WK_LINESTATE_0P)
  1219. usb_wakeup_p0_line_state_en(ssusb, 0, 0);
  1220. if (ssusb->wakeup_src & SSUSB_WK_LINESTATE_1P)
  1221. usb_wakeup_p1_line_state_en(ssusb);
  1222. /* TO FIXUP: always wakeup system even no device plugged-in */
  1223. if (ssusb->wakeup_src & SSUSB_WK_IP_SLEEP)
  1224. usb_wakeup_ip_sleep_en(ssusb, 0);
  1225. }
  1226. static void usb_wakeup_disable(struct ssusb_mtk *ssusb)
  1227. {
  1228. if (ssusb->wakeup_src & SSUSB_WK_IDDIG)
  1229. usb_wakeup_iddig_dis(ssusb);
  1230. if (ssusb->wakeup_src & SSUSB_WK_LINESTATE_0P)
  1231. usb_wakeup_p0_line_state_dis(ssusb);
  1232. if (ssusb->wakeup_src & SSUSB_WK_LINESTATE_1P)
  1233. usb_wakeup_p1_line_state_dis(ssusb);
  1234. if (ssusb->wakeup_src & SSUSB_WK_IP_SLEEP)
  1235. usb_wakeup_ip_sleep_dis(ssusb);
  1236. }
  1237. static void usb_sleep_wakesrc_set(struct ssusb_mtk *ssusb)
  1238. {
  1239. #if 0
  1240. if (ssusb->wakeup_src & (SSUSB_WK_IDDIG | SSUSB_WK_IP_SLEEP))
  1241. spm_set_sleep_wakesrc(WAKE_SRC_USB_PDN, 1, 0);
  1242. if (ssusb->wakeup_src & (SSUSB_WK_LINESTATE_0P | SSUSB_WK_LINESTATE_1P))
  1243. spm_set_sleep_wakesrc(WAKE_SRC_USB_CD, 1, 0);
  1244. #endif
  1245. }
  1246. static void usb_sleep_wakesrc_clear(struct ssusb_mtk *ssusb)
  1247. {
  1248. #if 0
  1249. if (ssusb->wakeup_src & (SSUSB_WK_IDDIG | SSUSB_WK_IP_SLEEP))
  1250. spm_set_sleep_wakesrc(WAKE_SRC_USB_PDN, 0, 0);
  1251. if (ssusb->wakeup_src & (SSUSB_WK_LINESTATE_0P | SSUSB_WK_LINESTATE_1P))
  1252. spm_set_sleep_wakesrc(WAKE_SRC_USB_CD, 0, 0);
  1253. #endif
  1254. }
  1255. static int is_usb_wakeup_event(void)
  1256. {
  1257. #if 0
  1258. struct mt_wake_event *usb_we;
  1259. usb_we = spm_get_wakeup_event();
  1260. if (usb_we && !strcmp(usb_we->domain, "SPM")) {
  1261. if ((usb_we->code == __ffs(WAKE_SRC_USB_CD))
  1262. || (usb_we->code == __ffs(WAKE_SRC_USB_PDN))) {
  1263. mu3d_dbg(K_INFO, "%s WEV_USB: %s@%d\n", __func__,
  1264. usb_we->domain, usb_we->code);
  1265. return 1;
  1266. }
  1267. }
  1268. #endif
  1269. return 0;
  1270. }
  1271. static inline int need_virtual_input_event(struct ssusb_mtk *ssusb)
  1272. {
  1273. /*
  1274. * for iddig wakeup, port0 switch to host and will hold wakeloack at the same
  1275. * time, so no need to send virtual power-key if only port0's iddig wakeup source
  1276. * is enabled.
  1277. */
  1278. return !!(ssusb->wakeup_src & (~SSUSB_WK_IDDIG));
  1279. }
  1280. static int attach_input_dev(struct ssusb_mtk *ssusb)
  1281. {
  1282. struct input_dev *input = NULL;
  1283. int ret = 0;
  1284. mu3d_dbg(K_DEBUG, "%s\n", __func__);
  1285. if (!need_virtual_input_event(ssusb)) {
  1286. ssusb->vi_dev = NULL;
  1287. goto ignore_input_dev;
  1288. }
  1289. input = input_allocate_device();
  1290. if (!input) {
  1291. ret = -ENOMEM;
  1292. goto err_free_mem;
  1293. }
  1294. /* Indicate that we generate key events */
  1295. set_bit(EV_KEY, input->evbit);
  1296. __set_bit(KEY_POWER, input->keybit);
  1297. input->name = "ssusb";
  1298. ret = input_register_device(input);
  1299. if (ret)
  1300. goto err_free_mem;
  1301. ssusb->vi_dev = input;
  1302. mu3d_dbg(K_INFO, "%s, attach input device success!\n", __func__);
  1303. ignore_input_dev:
  1304. if (ssusb->wakeup_src)
  1305. usb_sleep_wakesrc_set(ssusb);
  1306. return ret;
  1307. err_free_mem:
  1308. input_free_device(input);
  1309. return ret;
  1310. }
  1311. static int detach_input_dev(struct ssusb_mtk *ssusb)
  1312. {
  1313. if (ssusb->vi_dev) {
  1314. input_unregister_device(ssusb->vi_dev);
  1315. ssusb->vi_dev = NULL;
  1316. }
  1317. if (ssusb->wakeup_src)
  1318. usb_sleep_wakesrc_clear(ssusb);
  1319. return 0;
  1320. }
  1321. static int report_virtual_key(struct ssusb_mtk *ssusb)
  1322. {
  1323. struct input_dev *input = ssusb->vi_dev;
  1324. /*
  1325. * if only port0's iddig-wakeup is enabled, no need to send virtual power-key;
  1326. * but if port0's iddig-wakeup and port1's linestate-wakeup are all enabled, and when
  1327. * iddig wake up system, we can't distinguish the sources, so sends a dummy power-key
  1328. * event anyway.
  1329. */
  1330. if (!need_virtual_input_event(ssusb))
  1331. return 0;
  1332. mu3d_dbg(K_INFO, "%s send virtual POWER-KEY event!\n", __func__);
  1333. input_report_key(input, KEY_POWER, 1);
  1334. input_sync(input);
  1335. input_report_key(input, KEY_POWER, 0);
  1336. input_sync(input);
  1337. return 0;
  1338. }
  1339. static void remove_dummy_wakeup_src(struct ssusb_mtk *ssusb)
  1340. {
  1341. int ws_old = ssusb->wakeup_src;
  1342. /*
  1343. * SSUSB_WK_LINESTATE_0P is only necessary for port0 which works on
  1344. * for SSUSB_OTG_MANUAL mode
  1345. */
  1346. if ((ssusb->wakeup_src & SSUSB_WK_LINESTATE_0P)
  1347. && (ssusb->otg_switch.otg_mode != SSUSB_OTG_MANUAL))
  1348. ssusb->wakeup_src &= ~SSUSB_WK_LINESTATE_0P;
  1349. /*
  1350. * for SSUSB_OTG_MANUAL mode, there is no id-pin, so SSUSB_WK_IDDIG is dummy
  1351. */
  1352. if ((ssusb->wakeup_src & SSUSB_WK_IDDIG)
  1353. && !is_eint_used(ssusb->otg_switch.otg_mode))
  1354. ssusb->wakeup_src &= ~SSUSB_WK_IDDIG;
  1355. if (!ssusb->p1_exist && (ssusb->wakeup_src & SSUSB_WK_LINESTATE_1P))
  1356. ssusb->wakeup_src &= ~SSUSB_WK_LINESTATE_1P;
  1357. mu3d_dbg(K_INFO, "usb wakeup source(new:%d/old:%d)\n", ssusb->wakeup_src, ws_old);
  1358. }
  1359. static void __iomem *get_ref_node_regs_base(struct device *dev, char *phandle)
  1360. {
  1361. struct device_node *dn = dev->of_node;
  1362. struct device_node *pll_dn;
  1363. pll_dn = of_parse_phandle(dn, phandle, 0);
  1364. if (!pll_dn) {
  1365. dev_err(dev, "failed to get %s phandle in %s node\n", phandle,
  1366. dev->of_node->full_name);
  1367. return NULL;
  1368. }
  1369. return of_iomap(pll_dn, 0);
  1370. }
  1371. static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb)
  1372. {
  1373. struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
  1374. struct otg_switch_mtk *otg_switch = &ssusb->otg_switch;
  1375. struct vbus_ctrl_info *p0_vbus;
  1376. struct vbus_ctrl_info *p1_vbus;
  1377. int ret;
  1378. ret = get_one_resource(pdev, &ssusb->xhci_rscs[0], IORESOURCE_MEM, 0, "xhci-mem");
  1379. if (ret)
  1380. goto err;
  1381. ret = get_one_resource(pdev, &ssusb->mu3d_rscs[0], IORESOURCE_MEM, 1, "mu3d-mem");
  1382. if (ret)
  1383. goto err;
  1384. ret = get_one_resource(pdev, &ssusb->mu3d_rscs[1], IORESOURCE_MEM, 2, "sif-mem");
  1385. if (ret)
  1386. goto err;
  1387. /* ret = get_one_resource(pdev, &ssusb->mu3d_rscs[2], IORESOURCE_MEM, 3, "sif2-mem"); */
  1388. /* if (ret) { */
  1389. /* goto err; */
  1390. /* } */
  1391. ret = get_one_resource(pdev, &ssusb->xhci_rscs[1], IORESOURCE_IRQ, 0, "xhci-irq");
  1392. if (ret)
  1393. goto err;
  1394. ret = get_one_resource(pdev, &ssusb->mu3d_rscs[2], IORESOURCE_IRQ, 1, "mu3d-irq");
  1395. if (ret)
  1396. goto err;
  1397. /* ssusb->mu3d_irq = ssusb->mu3d_rscs[2].start; */
  1398. ssusb->mu3d_irq = platform_get_irq(pdev, 1);
  1399. if (ssusb->mu3d_irq <= 0) {
  1400. mu3d_dbg(K_ERR, "fail to get irq number\n");
  1401. ret = -ENODEV;
  1402. goto err;
  1403. }
  1404. mu3d_dbg(K_INFO, "mu3d irq : %d\n", ssusb->mu3d_irq);
  1405. ret = get_regulators(pdev, ssusb);
  1406. if (ret < 0) {
  1407. mu3d_dbg(K_ERR, "fail to get regulators\n");
  1408. goto err;
  1409. }
  1410. /* cant put it in dts, resources conflict, so use it directly */
  1411. /* ssusb->uap_pll_con = ioremap_nocache(UAP_PLL_CONX_BASE, UAP_PLL_CONX_LEN); */
  1412. ssusb->uap_pll_con = get_ref_node_regs_base(&pdev->dev, "usb-xtal-clk");
  1413. if (!ssusb->uap_pll_con) {
  1414. mu3d_dbg(K_ERR, "mu3d fail to map pll regs\n");
  1415. goto pll_err;
  1416. }
  1417. mu3d_dbg(K_INFO, "mu3d uap_pll_con: %p\n", ssusb->uap_pll_con);
  1418. /* ssusb->perisys = ioremap_nocache(PERIFSYS_BASE, PERIFSYS_LEN); */
  1419. ssusb->perisys = get_ref_node_regs_base(&pdev->dev, "usb-wakeup-ctrl");
  1420. if (!ssusb->perisys) {
  1421. mu3d_dbg(K_ERR, "mu3d fail to map perisys regs\n");
  1422. goto peri_err;
  1423. }
  1424. mu3d_dbg(K_INFO, "mu3d perisys: %p\n", ssusb->perisys);
  1425. ret = get_ssusb_clks(pdev, ssusb);
  1426. if (ret) {
  1427. mu3d_dbg(K_ERR, "mu3d fail to get clks\n");
  1428. goto clks_err;
  1429. }
  1430. if ((SSUSB_MODE_DEVICE == pdata->drv_mode)
  1431. || (SSUSB_OTG_IDPIN == pdata->otg_mode)
  1432. || ((SSUSB_OTG_MANUAL == pdata->otg_mode) && !pdata->otg_init_as_host)) {
  1433. /*
  1434. * when device only mode ,such as under FPGA env. system can't detect
  1435. * usb-cable plug, so need start mu3d directly. another case is pseudol-OTG
  1436. * (SSUSB_OTG_MANUAL & SSUSB_OTG_IDPIN).
  1437. */
  1438. ssusb->start_mu3d = 1;
  1439. }
  1440. ssusb->drv_mode = pdata->drv_mode;
  1441. ssusb->str_mode = pdata->str_mode;
  1442. ssusb->wakeup_src = pdata->wakeup_src;
  1443. otg_switch->otg_mode = pdata->otg_mode;
  1444. otg_switch->is_init_as_host = pdata->otg_init_as_host;
  1445. otg_switch->port0_u2 = 1;
  1446. otg_switch->port0_u3 = !!pdata->is_u3_otg;
  1447. otg_switch->iddig_eint_num = pdata->eint_num;
  1448. p0_vbus = &otg_switch->p0_vbus;
  1449. p0_vbus->vbus_mode = pdata->p0_vbus_mode;
  1450. p0_vbus->vbus_gpio_num = pdata->p0_gpio_num;
  1451. p0_vbus->gpio_active_low = pdata->p0_gpio_active_low;
  1452. ret = get_vbus_gpio(p0_vbus, "p0_vbus_gpio");
  1453. if (ret)
  1454. goto p0_vbus_err;
  1455. if (pdata->port_num > 1) {
  1456. ssusb->p1_exist = 1;
  1457. p1_vbus = &ssusb->p1_vbus;
  1458. p1_vbus->vbus_mode = pdata->p1_vbus_mode;
  1459. p1_vbus->vbus_gpio_num = pdata->p1_gpio_num;
  1460. p1_vbus->gpio_active_low = pdata->p1_gpio_active_low;
  1461. ret = get_vbus_gpio(p1_vbus, "p1_vbus_gpio");
  1462. if (ret)
  1463. goto p1_vbus_err;
  1464. }
  1465. remove_dummy_wakeup_src(ssusb);
  1466. ssusb->is_power_saving_mode = !!(SSUSB_STR_NONE == ssusb->str_mode);
  1467. mu3d_dbg(K_INFO, "is_power_saving_mode: %d\n", ssusb->is_power_saving_mode);
  1468. return 0;
  1469. p1_vbus_err:
  1470. if (SSUSB_VBUS_GPIO == p0_vbus->vbus_mode)
  1471. gpio_free(p0_vbus->vbus_gpio_num);
  1472. p0_vbus_err:
  1473. put_ssusb_clks(ssusb);
  1474. clks_err:
  1475. iounmap(ssusb->perisys);
  1476. peri_err:
  1477. iounmap(ssusb->uap_pll_con);
  1478. pll_err:
  1479. put_regulators(ssusb);
  1480. err:
  1481. return ret;
  1482. }
  1483. static int put_ssusb_rscs(struct ssusb_mtk *ssusb)
  1484. {
  1485. struct vbus_ctrl_info *vbus;
  1486. put_ssusb_clks(ssusb);
  1487. put_regulators(ssusb);
  1488. if (ssusb->uap_pll_con)
  1489. iounmap(ssusb->uap_pll_con);
  1490. if (ssusb->perisys)
  1491. iounmap(ssusb->perisys);
  1492. vbus = &ssusb->otg_switch.p0_vbus;
  1493. if (SSUSB_VBUS_GPIO == vbus->vbus_mode)
  1494. gpio_free(vbus->vbus_gpio_num);
  1495. vbus = &ssusb->p1_vbus;
  1496. if (ssusb->p1_exist && SSUSB_VBUS_GPIO == vbus->vbus_mode)
  1497. gpio_free(vbus->vbus_gpio_num);
  1498. return 0;
  1499. }
  1500. int __weak mt_get_chip_sw_ver(void)
  1501. {
  1502. return 1;
  1503. }
  1504. static void ssusb_eco_fixup(struct ssusb_mtk *ssusb)
  1505. {
  1506. ssusb->ic_version = mt_get_chip_sw_ver();
  1507. mu3d_dbg(K_INFO, "%s ic_version :%x\n", __func__, ssusb->ic_version);
  1508. if (ssusb->ic_version != CHIP_SW_VER_01) {
  1509. /*
  1510. * sparse[0] = 1'b1: reg_fix_host_iso_tog_err, default not fixed up
  1511. * sparse[1] = 1'b1: reg_fix_dev_setupend_err, default not fixed up
  1512. */
  1513. mu3d_setmsk(ssusb->sif_base, U3D_SSUSB_IP_SPARE0, 0x3);
  1514. }
  1515. }
  1516. static int mtu3d_probe(struct platform_device *pdev)
  1517. {
  1518. struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
  1519. struct ssusb_mtk *ssusb;
  1520. int ret = -ENOMEM;
  1521. mu3d_dbg(K_DEBUG, "%s() %d\n", __func__, __LINE__);
  1522. #ifdef CONFIG_OF
  1523. pdata = mu3d_parse_dts(pdev->dev.of_node);
  1524. if (NULL == pdata) {
  1525. mu3d_dbg(K_ERR, "fail to parse dts of mu3d\n");
  1526. goto of_err;
  1527. }
  1528. pdev->dev.dma_mask = &usb_dmamask;
  1529. pdev->dev.coherent_dma_mask = usb_dmamask;
  1530. #endif
  1531. /* all elements are set to ZERO as default value */
  1532. ssusb = kzalloc(sizeof(*ssusb), GFP_KERNEL);
  1533. if (!ssusb)
  1534. goto free_pdata;
  1535. ssusb->dev = &pdev->dev;
  1536. ssusb->pdata = pdata;
  1537. mutex_init(&ssusb->power_mutex);
  1538. /* move below to dts parse function later. */
  1539. pdata->platform_ops = &mtu3d_ops;
  1540. pdata->config->fifo_cfg = mtu3d_cfg;
  1541. pdata->config->fifo_cfg_size = ARRAY_SIZE(mtu3d_cfg);
  1542. platform_set_drvdata(pdev, ssusb); /* memcpy, should modify pdata later */
  1543. mu3d_dbg(K_DEBUG, "%s() %d\n", __func__, __LINE__);
  1544. ssusb->mac_base = get_regs_base(pdev, 1);
  1545. if (NULL == ssusb->mac_base) {
  1546. mu3d_dbg(K_ERR, "fail to get mu3d mac regs\n");
  1547. goto free_ssusb;
  1548. }
  1549. ssusb->sif_base = get_regs_base(pdev, 2);
  1550. if (NULL == ssusb->sif_base) {
  1551. mu3d_dbg(K_ERR, "fail to get phy sif regs\n");
  1552. goto put_regmap;
  1553. }
  1554. platform_device_add_data(pdev, pdata, sizeof(*pdata));
  1555. ret = get_ssusb_rscs(pdev, ssusb);
  1556. if (ret) {
  1557. mu3d_dbg(K_ERR, "fail to get mu3d resources\n");
  1558. goto put_regmap;
  1559. }
  1560. ret = attach_input_dev(ssusb);
  1561. if (ret) {
  1562. mu3d_dbg(K_ERR, "fail to reg input device\n");
  1563. goto put_rscs;
  1564. }
  1565. /* ip-reset and phy-init */
  1566. ret = ssusb_phy_init(ssusb);
  1567. if (ret) {
  1568. mu3d_dbg(K_ERR, "fail to init phy\n");
  1569. goto put_input_dev;
  1570. }
  1571. ssusb_mac_sw_reset(ssusb);
  1572. ssusb_otg_iddig_en(ssusb);
  1573. ssusb_eco_fixup(ssusb);
  1574. get_host_ports(ssusb);
  1575. /* if (IS_ENABLED(CONFIG_USB_SSUSB_HOST)) */
  1576. /* mode = SSUSB_MODE_HOST; */
  1577. /* else if (IS_ENABLED(CONFIG_USB_SSUSB_GADGET)) */
  1578. /* mode = SSUSB_MODE_DEVICE; */
  1579. /* else */
  1580. /* mode = SSUSB_MODE_DRD; */
  1581. switch (ssusb->drv_mode) {
  1582. case SSUSB_MODE_DEVICE:
  1583. ret = ssusb_gadget_init(ssusb);
  1584. if (ret) {
  1585. dev_err(&pdev->dev, "failed to initialize gadget\n");
  1586. goto exit_phy;
  1587. }
  1588. break;
  1589. case SSUSB_MODE_HOST:
  1590. mtk_xhci_ip_init(ssusb);
  1591. ret = ssusb_host_init(ssusb);
  1592. if (ret) {
  1593. dev_err(&pdev->dev, "failed to initialize host\n");
  1594. goto exit_phy;
  1595. }
  1596. break;
  1597. case SSUSB_MODE_DRD:
  1598. ret = ssusb_gadget_init(ssusb);
  1599. if (ret) {
  1600. dev_err(&pdev->dev, "failed to initialize gadget\n");
  1601. goto exit_phy;
  1602. }
  1603. /* when it's power saving mode, use iddig to add/remove host platform_device */
  1604. if (!ssusb->is_power_saving_mode) {
  1605. mtk_xhci_ip_init(ssusb);
  1606. ret = ssusb_host_init(ssusb);
  1607. if (ret) {
  1608. dev_err(&pdev->dev, "failed to initialize host\n");
  1609. goto gadget_exit;
  1610. }
  1611. }
  1612. mtk_otg_switch_init(ssusb);
  1613. break;
  1614. default:
  1615. dev_err(&pdev->dev, "Unsupported mode of operation %d\n", ssusb->drv_mode);
  1616. goto exit_phy;
  1617. }
  1618. mu3d_dbg(K_WARNIN, "%s() done!\n", __func__);
  1619. return 0;
  1620. gadget_exit:
  1621. ssusb_gadget_exit(ssusb);
  1622. exit_phy:
  1623. ssusb_phy_exit(ssusb);
  1624. put_input_dev:
  1625. detach_input_dev(ssusb);
  1626. put_rscs:
  1627. put_ssusb_rscs(ssusb);
  1628. put_regmap:
  1629. put_regs_map(ssusb);
  1630. free_ssusb:
  1631. kfree(ssusb);
  1632. free_pdata:
  1633. #ifdef CONFIG_OF
  1634. mu3d_pdata_free(pdata);
  1635. of_err:
  1636. #endif
  1637. return ret;
  1638. }
  1639. static int mtu3d_remove(struct platform_device *pdev)
  1640. {
  1641. struct ssusb_mtk *ssusb = platform_get_drvdata(pdev);
  1642. #ifdef CONFIG_OF
  1643. mu3d_pdata_free(pdev->dev.platform_data);
  1644. #endif
  1645. detach_input_dev(ssusb);
  1646. if (ssusb->mu3di)
  1647. ssusb_gadget_exit(ssusb);
  1648. if (ssusb->xhci)
  1649. platform_device_unregister(ssusb->xhci);
  1650. mtk_otg_switch_exit(ssusb);
  1651. ssusb_phy_exit(ssusb);
  1652. put_ssusb_rscs(ssusb);
  1653. put_regs_map(ssusb);
  1654. kfree(ssusb);
  1655. return 0;
  1656. }
  1657. #ifdef CONFIG_PM
  1658. static int mtu3d_suspend_noirq(struct device *dev)
  1659. {
  1660. struct platform_device *pdev = to_platform_device(dev);
  1661. struct ssusb_mtk *ssusb = platform_get_drvdata(pdev);
  1662. struct musb *musb = ssusb->mu3di;
  1663. if (ssusb->wakeup_src)
  1664. usb_wakeup_enable(ssusb);
  1665. /*
  1666. * J:I think it does _NOT_ have to do anything. Because when the phone/tablet
  1667. * with USB cable,the system does _NOT_ enter suspend mode. At the normal case,
  1668. * the USB driver calls PHY savecurrent, when USB cable is plugged out.
  1669. */
  1670. if (ssusb->is_power_saving_mode)
  1671. return 0;
  1672. if ((SSUSB_MODE_DEVICE != ssusb->drv_mode) && SSUSB_STR_DEEP == ssusb->str_mode) {
  1673. mtk_xhci_ip_exit(ssusb);
  1674. mu3d_dbg(K_INFO, "%s deep suspend enter\n", __func__);
  1675. }
  1676. if (musb->start_mu3d && !mtk_is_host_mode())
  1677. musb_stop(musb);
  1678. low_power_enter(ssusb);
  1679. mu3d_dbg(K_INFO, "%s\n", __func__);
  1680. return 0;
  1681. }
  1682. static int mtu3d_resume_noirq(struct device *dev)
  1683. {
  1684. struct platform_device *pdev = to_platform_device(dev);
  1685. struct ssusb_mtk *ssusb = platform_get_drvdata(pdev);
  1686. struct musb *musb = ssusb->mu3di;
  1687. int ret;
  1688. if (ssusb->wakeup_src)
  1689. usb_wakeup_disable(ssusb);
  1690. if (ssusb->is_power_saving_mode)
  1691. return 0;
  1692. ret = low_power_exit(ssusb);
  1693. if (ret) {
  1694. mu3d_dbg(K_ERR, "%s failed to enable clks & ldo\n", __func__);
  1695. return ret;
  1696. }
  1697. if ((SSUSB_MODE_DEVICE != ssusb->drv_mode) && SSUSB_STR_DEEP == ssusb->str_mode) {
  1698. mtk_xhci_ip_init(ssusb);
  1699. mu3d_dbg(K_INFO, "%s deep suspend exit\n", __func__);
  1700. }
  1701. if (musb->start_mu3d && !mtk_is_host_mode())
  1702. musb_start(musb);
  1703. if (is_usb_wakeup_event())
  1704. report_virtual_key(ssusb);
  1705. mu3d_dbg(K_INFO, "%s\n", __func__);
  1706. return 0;
  1707. }
  1708. static const struct dev_pm_ops mtu3d_pm_ops = {
  1709. .suspend_noirq = mtu3d_suspend_noirq,
  1710. .resume_noirq = mtu3d_resume_noirq,
  1711. };
  1712. #define DEV_PM_OPS (&mtu3d_pm_ops)
  1713. #else
  1714. #define DEV_PM_OPS NULL
  1715. #endif
  1716. #ifdef CONFIG_OF
  1717. /* static u64 usb_dmamask = DMA_BIT_MASK(32); */
  1718. static const struct of_device_id ssusb_of_match[] = {
  1719. {.compatible = "mediatek,mt8173-ssusb",},
  1720. {},
  1721. };
  1722. MODULE_DEVICE_TABLE(of, mu3d_of_match);
  1723. #endif
  1724. static struct platform_driver mtu3d_driver = {
  1725. .probe = mtu3d_probe,
  1726. .remove = mtu3d_remove,
  1727. .driver = {
  1728. .name = "musb-mtu3d",
  1729. .pm = DEV_PM_OPS,
  1730. #ifdef CONFIG_OF
  1731. .of_match_table = ssusb_of_match,
  1732. #endif
  1733. },
  1734. };
  1735. MODULE_DESCRIPTION("mtu3d MUSB Glue Layer");
  1736. MODULE_AUTHOR("MediaTek");
  1737. MODULE_LICENSE("GPL v2");
  1738. module_platform_driver(mtu3d_driver);