langwell_otg.c 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408
  1. /*
  2. * Intel Langwell USB OTG transceiver driver
  3. * Copyright (C) 2008 - 2010, Intel Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms and conditions of the GNU General Public License,
  7. * version 2, as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  17. *
  18. */
  19. /* This driver helps to switch Langwell OTG controller function between host
  20. * and peripheral. It works with EHCI driver and Langwell client controller
  21. * driver together.
  22. */
  23. #include <linux/module.h>
  24. #include <linux/init.h>
  25. #include <linux/pci.h>
  26. #include <linux/errno.h>
  27. #include <linux/interrupt.h>
  28. #include <linux/kernel.h>
  29. #include <linux/device.h>
  30. #include <linux/moduleparam.h>
  31. #include <linux/usb/ch9.h>
  32. #include <linux/usb/gadget.h>
  33. #include <linux/usb.h>
  34. #include <linux/usb/otg.h>
  35. #include <linux/usb/hcd.h>
  36. #include <linux/notifier.h>
  37. #include <linux/delay.h>
  38. #include <asm/intel_scu_ipc.h>
  39. #include <linux/usb/langwell_otg.h>
  40. #define DRIVER_DESC "Intel Langwell USB OTG transceiver driver"
  41. #define DRIVER_VERSION "July 10, 2010"
  42. MODULE_DESCRIPTION(DRIVER_DESC);
  43. MODULE_AUTHOR("Henry Yuan <hang.yuan@intel.com>, Hao Wu <hao.wu@intel.com>");
  44. MODULE_VERSION(DRIVER_VERSION);
  45. MODULE_LICENSE("GPL");
  46. static const char driver_name[] = "langwell_otg";
  47. static int langwell_otg_probe(struct pci_dev *pdev,
  48. const struct pci_device_id *id);
  49. static void langwell_otg_remove(struct pci_dev *pdev);
  50. static int langwell_otg_suspend(struct pci_dev *pdev, pm_message_t message);
  51. static int langwell_otg_resume(struct pci_dev *pdev);
  52. static int langwell_otg_set_host(struct otg_transceiver *otg,
  53. struct usb_bus *host);
  54. static int langwell_otg_set_peripheral(struct otg_transceiver *otg,
  55. struct usb_gadget *gadget);
  56. static int langwell_otg_start_srp(struct otg_transceiver *otg);
  57. static const struct pci_device_id pci_ids[] = {{
  58. .class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe),
  59. .class_mask = ~0,
  60. .vendor = 0x8086,
  61. .device = 0x0811,
  62. .subvendor = PCI_ANY_ID,
  63. .subdevice = PCI_ANY_ID,
  64. }, { /* end: all zeroes */ }
  65. };
  66. static struct pci_driver otg_pci_driver = {
  67. .name = (char *) driver_name,
  68. .id_table = pci_ids,
  69. .probe = langwell_otg_probe,
  70. .remove = langwell_otg_remove,
  71. .suspend = langwell_otg_suspend,
  72. .resume = langwell_otg_resume,
  73. };
  74. static const char *state_string(enum usb_otg_state state)
  75. {
  76. switch (state) {
  77. case OTG_STATE_A_IDLE:
  78. return "a_idle";
  79. case OTG_STATE_A_WAIT_VRISE:
  80. return "a_wait_vrise";
  81. case OTG_STATE_A_WAIT_BCON:
  82. return "a_wait_bcon";
  83. case OTG_STATE_A_HOST:
  84. return "a_host";
  85. case OTG_STATE_A_SUSPEND:
  86. return "a_suspend";
  87. case OTG_STATE_A_PERIPHERAL:
  88. return "a_peripheral";
  89. case OTG_STATE_A_WAIT_VFALL:
  90. return "a_wait_vfall";
  91. case OTG_STATE_A_VBUS_ERR:
  92. return "a_vbus_err";
  93. case OTG_STATE_B_IDLE:
  94. return "b_idle";
  95. case OTG_STATE_B_SRP_INIT:
  96. return "b_srp_init";
  97. case OTG_STATE_B_PERIPHERAL:
  98. return "b_peripheral";
  99. case OTG_STATE_B_WAIT_ACON:
  100. return "b_wait_acon";
  101. case OTG_STATE_B_HOST:
  102. return "b_host";
  103. default:
  104. return "UNDEFINED";
  105. }
  106. }
  107. /* HSM timers */
  108. static inline struct langwell_otg_timer *otg_timer_initializer
  109. (void (*function)(unsigned long), unsigned long expires, unsigned long data)
  110. {
  111. struct langwell_otg_timer *timer;
  112. timer = kmalloc(sizeof(struct langwell_otg_timer), GFP_KERNEL);
  113. if (timer == NULL)
  114. return timer;
  115. timer->function = function;
  116. timer->expires = expires;
  117. timer->data = data;
  118. return timer;
  119. }
  120. static struct langwell_otg_timer *a_wait_vrise_tmr, *a_aidl_bdis_tmr,
  121. *b_se0_srp_tmr, *b_srp_init_tmr;
  122. static struct list_head active_timers;
  123. static struct langwell_otg *the_transceiver;
  124. /* host/client notify transceiver when event affects HNP state */
  125. void langwell_update_transceiver(void)
  126. {
  127. struct langwell_otg *lnw = the_transceiver;
  128. dev_dbg(lnw->dev, "transceiver is updated\n");
  129. if (!lnw->qwork)
  130. return ;
  131. queue_work(lnw->qwork, &lnw->work);
  132. }
  133. EXPORT_SYMBOL(langwell_update_transceiver);
  134. static int langwell_otg_set_host(struct otg_transceiver *otg,
  135. struct usb_bus *host)
  136. {
  137. otg->host = host;
  138. return 0;
  139. }
  140. static int langwell_otg_set_peripheral(struct otg_transceiver *otg,
  141. struct usb_gadget *gadget)
  142. {
  143. otg->gadget = gadget;
  144. return 0;
  145. }
  146. static int langwell_otg_set_power(struct otg_transceiver *otg,
  147. unsigned mA)
  148. {
  149. return 0;
  150. }
  151. /* A-device drives vbus, controlled through PMIC CHRGCNTL register*/
  152. static int langwell_otg_set_vbus(struct otg_transceiver *otg, bool enabled)
  153. {
  154. struct langwell_otg *lnw = the_transceiver;
  155. u8 r;
  156. dev_dbg(lnw->dev, "%s <--- %s\n", __func__, enabled ? "on" : "off");
  157. /* FIXME: surely we should cache this on the first read. If not use
  158. readv to avoid two transactions */
  159. if (intel_scu_ipc_ioread8(0x00, &r) < 0) {
  160. dev_dbg(lnw->dev, "Failed to read PMIC register 0xD2");
  161. return -EBUSY;
  162. }
  163. if ((r & 0x03) != 0x02) {
  164. dev_dbg(lnw->dev, "not NEC PMIC attached\n");
  165. return -EBUSY;
  166. }
  167. if (intel_scu_ipc_ioread8(0x20, &r) < 0) {
  168. dev_dbg(lnw->dev, "Failed to read PMIC register 0xD2");
  169. return -EBUSY;
  170. }
  171. if ((r & 0x20) == 0) {
  172. dev_dbg(lnw->dev, "no battery attached\n");
  173. return -EBUSY;
  174. }
  175. /* Workaround for battery attachment issue */
  176. if (r == 0x34) {
  177. dev_dbg(lnw->dev, "no battery attached on SH\n");
  178. return -EBUSY;
  179. }
  180. dev_dbg(lnw->dev, "battery attached. 2 reg = %x\n", r);
  181. /* workaround: FW detect writing 0x20/0xc0 to d4 event.
  182. * this is only for NEC PMIC.
  183. */
  184. if (intel_scu_ipc_iowrite8(0xD4, enabled ? 0x20 : 0xC0))
  185. dev_dbg(lnw->dev, "Failed to write PMIC.\n");
  186. dev_dbg(lnw->dev, "%s --->\n", __func__);
  187. return 0;
  188. }
  189. /* charge vbus or discharge vbus through a resistor to ground */
  190. static void langwell_otg_chrg_vbus(int on)
  191. {
  192. struct langwell_otg *lnw = the_transceiver;
  193. u32 val;
  194. val = readl(lnw->iotg.base + CI_OTGSC);
  195. if (on)
  196. writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_VC,
  197. lnw->iotg.base + CI_OTGSC);
  198. else
  199. writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_VD,
  200. lnw->iotg.base + CI_OTGSC);
  201. }
  202. /* Start SRP */
  203. static int langwell_otg_start_srp(struct otg_transceiver *otg)
  204. {
  205. struct langwell_otg *lnw = the_transceiver;
  206. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  207. u32 val;
  208. dev_dbg(lnw->dev, "%s --->\n", __func__);
  209. val = readl(iotg->base + CI_OTGSC);
  210. writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_HADP,
  211. iotg->base + CI_OTGSC);
  212. /* Check if the data plus is finished or not */
  213. msleep(8);
  214. val = readl(iotg->base + CI_OTGSC);
  215. if (val & (OTGSC_HADP | OTGSC_DP))
  216. dev_dbg(lnw->dev, "DataLine SRP Error\n");
  217. /* Disable interrupt - b_sess_vld */
  218. val = readl(iotg->base + CI_OTGSC);
  219. val &= (~(OTGSC_BSVIE | OTGSC_BSEIE));
  220. writel(val, iotg->base + CI_OTGSC);
  221. /* Start VBus SRP, drive vbus to generate VBus pulse */
  222. iotg->otg.set_vbus(&iotg->otg, true);
  223. msleep(15);
  224. iotg->otg.set_vbus(&iotg->otg, false);
  225. /* Enable interrupt - b_sess_vld*/
  226. val = readl(iotg->base + CI_OTGSC);
  227. dev_dbg(lnw->dev, "after VBUS pulse otgsc = %x\n", val);
  228. val |= (OTGSC_BSVIE | OTGSC_BSEIE);
  229. writel(val, iotg->base + CI_OTGSC);
  230. /* If Vbus is valid, then update the hsm */
  231. if (val & OTGSC_BSV) {
  232. dev_dbg(lnw->dev, "no b_sess_vld interrupt\n");
  233. lnw->iotg.hsm.b_sess_vld = 1;
  234. langwell_update_transceiver();
  235. }
  236. dev_dbg(lnw->dev, "%s <---\n", __func__);
  237. return 0;
  238. }
  239. /* stop SOF via bus_suspend */
  240. static void langwell_otg_loc_sof(int on)
  241. {
  242. struct langwell_otg *lnw = the_transceiver;
  243. struct usb_hcd *hcd;
  244. int err;
  245. dev_dbg(lnw->dev, "%s ---> %s\n", __func__, on ? "suspend" : "resume");
  246. hcd = bus_to_hcd(lnw->iotg.otg.host);
  247. if (on)
  248. err = hcd->driver->bus_resume(hcd);
  249. else
  250. err = hcd->driver->bus_suspend(hcd);
  251. if (err)
  252. dev_dbg(lnw->dev, "Fail to resume/suspend USB bus - %d\n", err);
  253. dev_dbg(lnw->dev, "%s <---\n", __func__);
  254. }
  255. static int langwell_otg_check_otgsc(void)
  256. {
  257. struct langwell_otg *lnw = the_transceiver;
  258. u32 otgsc, usbcfg;
  259. dev_dbg(lnw->dev, "check sync OTGSC and USBCFG registers\n");
  260. otgsc = readl(lnw->iotg.base + CI_OTGSC);
  261. usbcfg = readl(lnw->usbcfg);
  262. dev_dbg(lnw->dev, "OTGSC = %08x, USBCFG = %08x\n",
  263. otgsc, usbcfg);
  264. dev_dbg(lnw->dev, "OTGSC_AVV = %d\n", !!(otgsc & OTGSC_AVV));
  265. dev_dbg(lnw->dev, "USBCFG.VBUSVAL = %d\n",
  266. !!(usbcfg & USBCFG_VBUSVAL));
  267. dev_dbg(lnw->dev, "OTGSC_ASV = %d\n", !!(otgsc & OTGSC_ASV));
  268. dev_dbg(lnw->dev, "USBCFG.AVALID = %d\n",
  269. !!(usbcfg & USBCFG_AVALID));
  270. dev_dbg(lnw->dev, "OTGSC_BSV = %d\n", !!(otgsc & OTGSC_BSV));
  271. dev_dbg(lnw->dev, "USBCFG.BVALID = %d\n",
  272. !!(usbcfg & USBCFG_BVALID));
  273. dev_dbg(lnw->dev, "OTGSC_BSE = %d\n", !!(otgsc & OTGSC_BSE));
  274. dev_dbg(lnw->dev, "USBCFG.SESEND = %d\n",
  275. !!(usbcfg & USBCFG_SESEND));
  276. /* Check USBCFG VBusValid/AValid/BValid/SessEnd */
  277. if (!!(otgsc & OTGSC_AVV) ^ !!(usbcfg & USBCFG_VBUSVAL)) {
  278. dev_dbg(lnw->dev, "OTGSC.AVV != USBCFG.VBUSVAL\n");
  279. goto err;
  280. }
  281. if (!!(otgsc & OTGSC_ASV) ^ !!(usbcfg & USBCFG_AVALID)) {
  282. dev_dbg(lnw->dev, "OTGSC.ASV != USBCFG.AVALID\n");
  283. goto err;
  284. }
  285. if (!!(otgsc & OTGSC_BSV) ^ !!(usbcfg & USBCFG_BVALID)) {
  286. dev_dbg(lnw->dev, "OTGSC.BSV != USBCFG.BVALID\n");
  287. goto err;
  288. }
  289. if (!!(otgsc & OTGSC_BSE) ^ !!(usbcfg & USBCFG_SESEND)) {
  290. dev_dbg(lnw->dev, "OTGSC.BSE != USBCFG.SESSEN\n");
  291. goto err;
  292. }
  293. dev_dbg(lnw->dev, "OTGSC and USBCFG are synced\n");
  294. return 0;
  295. err:
  296. dev_warn(lnw->dev, "OTGSC isn't equal to USBCFG\n");
  297. return -EPIPE;
  298. }
  299. static void langwell_otg_phy_low_power(int on)
  300. {
  301. struct langwell_otg *lnw = the_transceiver;
  302. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  303. u8 val, phcd;
  304. int retval;
  305. dev_dbg(lnw->dev, "%s ---> %s mode\n",
  306. __func__, on ? "Low power" : "Normal");
  307. phcd = 0x40;
  308. val = readb(iotg->base + CI_HOSTPC1 + 2);
  309. if (on) {
  310. /* Due to hardware issue, after set PHCD, sync will failed
  311. * between USBCFG and OTGSC, so before set PHCD, check if
  312. * sync is in process now. If the answer is "yes", then do
  313. * not touch PHCD bit */
  314. retval = langwell_otg_check_otgsc();
  315. if (retval) {
  316. dev_dbg(lnw->dev, "Skip PHCD programming..\n");
  317. return ;
  318. }
  319. writeb(val | phcd, iotg->base + CI_HOSTPC1 + 2);
  320. } else
  321. writeb(val & ~phcd, iotg->base + CI_HOSTPC1 + 2);
  322. dev_dbg(lnw->dev, "%s <--- done\n", __func__);
  323. }
  324. /* After drv vbus, add 2 ms delay to set PHCD */
  325. static void langwell_otg_phy_low_power_wait(int on)
  326. {
  327. struct langwell_otg *lnw = the_transceiver;
  328. dev_dbg(lnw->dev, "add 2ms delay before programing PHCD\n");
  329. mdelay(2);
  330. langwell_otg_phy_low_power(on);
  331. }
  332. /* Enable/Disable OTG interrupt */
  333. static void langwell_otg_intr(int on)
  334. {
  335. struct langwell_otg *lnw = the_transceiver;
  336. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  337. u32 val;
  338. dev_dbg(lnw->dev, "%s ---> %s\n", __func__, on ? "on" : "off");
  339. val = readl(iotg->base + CI_OTGSC);
  340. /* OTGSC_INT_MASK doesn't contains 1msInt */
  341. if (on) {
  342. val = val | (OTGSC_INT_MASK);
  343. writel(val, iotg->base + CI_OTGSC);
  344. } else {
  345. val = val & ~(OTGSC_INT_MASK);
  346. writel(val, iotg->base + CI_OTGSC);
  347. }
  348. dev_dbg(lnw->dev, "%s <---\n", __func__);
  349. }
  350. /* set HAAR: Hardware Assist Auto-Reset */
  351. static void langwell_otg_HAAR(int on)
  352. {
  353. struct langwell_otg *lnw = the_transceiver;
  354. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  355. u32 val;
  356. dev_dbg(lnw->dev, "%s ---> %s\n", __func__, on ? "on" : "off");
  357. val = readl(iotg->base + CI_OTGSC);
  358. if (on)
  359. writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_HAAR,
  360. iotg->base + CI_OTGSC);
  361. else
  362. writel((val & ~OTGSC_INTSTS_MASK) & ~OTGSC_HAAR,
  363. iotg->base + CI_OTGSC);
  364. dev_dbg(lnw->dev, "%s <---\n", __func__);
  365. }
  366. /* set HABA: Hardware Assist B-Disconnect to A-Connect */
  367. static void langwell_otg_HABA(int on)
  368. {
  369. struct langwell_otg *lnw = the_transceiver;
  370. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  371. u32 val;
  372. dev_dbg(lnw->dev, "%s ---> %s\n", __func__, on ? "on" : "off");
  373. val = readl(iotg->base + CI_OTGSC);
  374. if (on)
  375. writel((val & ~OTGSC_INTSTS_MASK) | OTGSC_HABA,
  376. iotg->base + CI_OTGSC);
  377. else
  378. writel((val & ~OTGSC_INTSTS_MASK) & ~OTGSC_HABA,
  379. iotg->base + CI_OTGSC);
  380. dev_dbg(lnw->dev, "%s <---\n", __func__);
  381. }
  382. static int langwell_otg_check_se0_srp(int on)
  383. {
  384. struct langwell_otg *lnw = the_transceiver;
  385. int delay_time = TB_SE0_SRP * 10;
  386. u32 val;
  387. dev_dbg(lnw->dev, "%s --->\n", __func__);
  388. do {
  389. udelay(100);
  390. if (!delay_time--)
  391. break;
  392. val = readl(lnw->iotg.base + CI_PORTSC1);
  393. val &= PORTSC_LS;
  394. } while (!val);
  395. dev_dbg(lnw->dev, "%s <---\n", __func__);
  396. return val;
  397. }
  398. /* The timeout callback function to set time out bit */
  399. static void set_tmout(unsigned long indicator)
  400. {
  401. *(int *)indicator = 1;
  402. }
  403. void langwell_otg_nsf_msg(unsigned long indicator)
  404. {
  405. struct langwell_otg *lnw = the_transceiver;
  406. switch (indicator) {
  407. case 2:
  408. case 4:
  409. case 6:
  410. case 7:
  411. dev_warn(lnw->dev,
  412. "OTG:NSF-%lu - deivce not responding\n", indicator);
  413. break;
  414. case 3:
  415. dev_warn(lnw->dev,
  416. "OTG:NSF-%lu - deivce not supported\n", indicator);
  417. break;
  418. default:
  419. dev_warn(lnw->dev, "Do not have this kind of NSF\n");
  420. break;
  421. }
  422. }
  423. /* Initialize timers */
  424. static int langwell_otg_init_timers(struct otg_hsm *hsm)
  425. {
  426. /* HSM used timers */
  427. a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE,
  428. (unsigned long)&hsm->a_wait_vrise_tmout);
  429. if (a_wait_vrise_tmr == NULL)
  430. return -ENOMEM;
  431. a_aidl_bdis_tmr = otg_timer_initializer(&set_tmout, TA_AIDL_BDIS,
  432. (unsigned long)&hsm->a_aidl_bdis_tmout);
  433. if (a_aidl_bdis_tmr == NULL)
  434. return -ENOMEM;
  435. b_se0_srp_tmr = otg_timer_initializer(&set_tmout, TB_SE0_SRP,
  436. (unsigned long)&hsm->b_se0_srp);
  437. if (b_se0_srp_tmr == NULL)
  438. return -ENOMEM;
  439. b_srp_init_tmr = otg_timer_initializer(&set_tmout, TB_SRP_INIT,
  440. (unsigned long)&hsm->b_srp_init_tmout);
  441. if (b_srp_init_tmr == NULL)
  442. return -ENOMEM;
  443. return 0;
  444. }
  445. /* Free timers */
  446. static void langwell_otg_free_timers(void)
  447. {
  448. kfree(a_wait_vrise_tmr);
  449. kfree(a_aidl_bdis_tmr);
  450. kfree(b_se0_srp_tmr);
  451. kfree(b_srp_init_tmr);
  452. }
  453. /* The timeout callback function to set time out bit */
  454. static void langwell_otg_timer_fn(unsigned long indicator)
  455. {
  456. struct langwell_otg *lnw = the_transceiver;
  457. *(int *)indicator = 1;
  458. dev_dbg(lnw->dev, "kernel timer - timeout\n");
  459. langwell_update_transceiver();
  460. }
  461. /* kernel timer used instead of HW based interrupt */
  462. static void langwell_otg_add_ktimer(enum langwell_otg_timer_type timers)
  463. {
  464. struct langwell_otg *lnw = the_transceiver;
  465. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  466. unsigned long j = jiffies;
  467. unsigned long data, time;
  468. switch (timers) {
  469. case TA_WAIT_VRISE_TMR:
  470. iotg->hsm.a_wait_vrise_tmout = 0;
  471. data = (unsigned long)&iotg->hsm.a_wait_vrise_tmout;
  472. time = TA_WAIT_VRISE;
  473. break;
  474. case TA_WAIT_BCON_TMR:
  475. iotg->hsm.a_wait_bcon_tmout = 0;
  476. data = (unsigned long)&iotg->hsm.a_wait_bcon_tmout;
  477. time = TA_WAIT_BCON;
  478. break;
  479. case TA_AIDL_BDIS_TMR:
  480. iotg->hsm.a_aidl_bdis_tmout = 0;
  481. data = (unsigned long)&iotg->hsm.a_aidl_bdis_tmout;
  482. time = TA_AIDL_BDIS;
  483. break;
  484. case TB_ASE0_BRST_TMR:
  485. iotg->hsm.b_ase0_brst_tmout = 0;
  486. data = (unsigned long)&iotg->hsm.b_ase0_brst_tmout;
  487. time = TB_ASE0_BRST;
  488. break;
  489. case TB_SRP_INIT_TMR:
  490. iotg->hsm.b_srp_init_tmout = 0;
  491. data = (unsigned long)&iotg->hsm.b_srp_init_tmout;
  492. time = TB_SRP_INIT;
  493. break;
  494. case TB_SRP_FAIL_TMR:
  495. iotg->hsm.b_srp_fail_tmout = 0;
  496. data = (unsigned long)&iotg->hsm.b_srp_fail_tmout;
  497. time = TB_SRP_FAIL;
  498. break;
  499. case TB_BUS_SUSPEND_TMR:
  500. iotg->hsm.b_bus_suspend_tmout = 0;
  501. data = (unsigned long)&iotg->hsm.b_bus_suspend_tmout;
  502. time = TB_BUS_SUSPEND;
  503. break;
  504. default:
  505. dev_dbg(lnw->dev, "unkown timer, cannot enable it\n");
  506. return;
  507. }
  508. lnw->hsm_timer.data = data;
  509. lnw->hsm_timer.function = langwell_otg_timer_fn;
  510. lnw->hsm_timer.expires = j + time * HZ / 1000; /* milliseconds */
  511. add_timer(&lnw->hsm_timer);
  512. dev_dbg(lnw->dev, "add timer successfully\n");
  513. }
  514. /* Add timer to timer list */
  515. static void langwell_otg_add_timer(void *gtimer)
  516. {
  517. struct langwell_otg_timer *timer = (struct langwell_otg_timer *)gtimer;
  518. struct langwell_otg_timer *tmp_timer;
  519. struct intel_mid_otg_xceiv *iotg = &the_transceiver->iotg;
  520. u32 val32;
  521. /* Check if the timer is already in the active list,
  522. * if so update timer count
  523. */
  524. list_for_each_entry(tmp_timer, &active_timers, list)
  525. if (tmp_timer == timer) {
  526. timer->count = timer->expires;
  527. return;
  528. }
  529. timer->count = timer->expires;
  530. if (list_empty(&active_timers)) {
  531. val32 = readl(iotg->base + CI_OTGSC);
  532. writel(val32 | OTGSC_1MSE, iotg->base + CI_OTGSC);
  533. }
  534. list_add_tail(&timer->list, &active_timers);
  535. }
  536. /* Remove timer from the timer list; clear timeout status */
  537. static void langwell_otg_del_timer(void *gtimer)
  538. {
  539. struct langwell_otg *lnw = the_transceiver;
  540. struct langwell_otg_timer *timer = (struct langwell_otg_timer *)gtimer;
  541. struct langwell_otg_timer *tmp_timer, *del_tmp;
  542. u32 val32;
  543. list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list)
  544. if (tmp_timer == timer)
  545. list_del(&timer->list);
  546. if (list_empty(&active_timers)) {
  547. val32 = readl(lnw->iotg.base + CI_OTGSC);
  548. writel(val32 & ~OTGSC_1MSE, lnw->iotg.base + CI_OTGSC);
  549. }
  550. }
  551. /* Reduce timer count by 1, and find timeout conditions.*/
  552. static int langwell_otg_tick_timer(u32 *int_sts)
  553. {
  554. struct langwell_otg *lnw = the_transceiver;
  555. struct langwell_otg_timer *tmp_timer, *del_tmp;
  556. int expired = 0;
  557. list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) {
  558. tmp_timer->count--;
  559. /* check if timer expires */
  560. if (!tmp_timer->count) {
  561. list_del(&tmp_timer->list);
  562. tmp_timer->function(tmp_timer->data);
  563. expired = 1;
  564. }
  565. }
  566. if (list_empty(&active_timers)) {
  567. dev_dbg(lnw->dev, "tick timer: disable 1ms int\n");
  568. *int_sts = *int_sts & ~OTGSC_1MSE;
  569. }
  570. return expired;
  571. }
  572. static void reset_otg(void)
  573. {
  574. struct langwell_otg *lnw = the_transceiver;
  575. int delay_time = 1000;
  576. u32 val;
  577. dev_dbg(lnw->dev, "reseting OTG controller ...\n");
  578. val = readl(lnw->iotg.base + CI_USBCMD);
  579. writel(val | USBCMD_RST, lnw->iotg.base + CI_USBCMD);
  580. do {
  581. udelay(100);
  582. if (!delay_time--)
  583. dev_dbg(lnw->dev, "reset timeout\n");
  584. val = readl(lnw->iotg.base + CI_USBCMD);
  585. val &= USBCMD_RST;
  586. } while (val != 0);
  587. dev_dbg(lnw->dev, "reset done.\n");
  588. }
  589. static void set_host_mode(void)
  590. {
  591. struct langwell_otg *lnw = the_transceiver;
  592. u32 val;
  593. reset_otg();
  594. val = readl(lnw->iotg.base + CI_USBMODE);
  595. val = (val & (~USBMODE_CM)) | USBMODE_HOST;
  596. writel(val, lnw->iotg.base + CI_USBMODE);
  597. }
  598. static void set_client_mode(void)
  599. {
  600. struct langwell_otg *lnw = the_transceiver;
  601. u32 val;
  602. reset_otg();
  603. val = readl(lnw->iotg.base + CI_USBMODE);
  604. val = (val & (~USBMODE_CM)) | USBMODE_DEVICE;
  605. writel(val, lnw->iotg.base + CI_USBMODE);
  606. }
  607. static void init_hsm(void)
  608. {
  609. struct langwell_otg *lnw = the_transceiver;
  610. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  611. u32 val32;
  612. /* read OTGSC after reset */
  613. val32 = readl(lnw->iotg.base + CI_OTGSC);
  614. dev_dbg(lnw->dev, "%s: OTGSC init value = 0x%x\n", __func__, val32);
  615. /* set init state */
  616. if (val32 & OTGSC_ID) {
  617. iotg->hsm.id = 1;
  618. iotg->otg.default_a = 0;
  619. set_client_mode();
  620. iotg->otg.state = OTG_STATE_B_IDLE;
  621. } else {
  622. iotg->hsm.id = 0;
  623. iotg->otg.default_a = 1;
  624. set_host_mode();
  625. iotg->otg.state = OTG_STATE_A_IDLE;
  626. }
  627. /* set session indicator */
  628. if (val32 & OTGSC_BSE)
  629. iotg->hsm.b_sess_end = 1;
  630. if (val32 & OTGSC_BSV)
  631. iotg->hsm.b_sess_vld = 1;
  632. if (val32 & OTGSC_ASV)
  633. iotg->hsm.a_sess_vld = 1;
  634. if (val32 & OTGSC_AVV)
  635. iotg->hsm.a_vbus_vld = 1;
  636. /* defautly power the bus */
  637. iotg->hsm.a_bus_req = 1;
  638. iotg->hsm.a_bus_drop = 0;
  639. /* defautly don't request bus as B device */
  640. iotg->hsm.b_bus_req = 0;
  641. /* no system error */
  642. iotg->hsm.a_clr_err = 0;
  643. langwell_otg_phy_low_power_wait(1);
  644. }
  645. static void update_hsm(void)
  646. {
  647. struct langwell_otg *lnw = the_transceiver;
  648. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  649. u32 val32;
  650. /* read OTGSC */
  651. val32 = readl(lnw->iotg.base + CI_OTGSC);
  652. dev_dbg(lnw->dev, "%s: OTGSC value = 0x%x\n", __func__, val32);
  653. iotg->hsm.id = !!(val32 & OTGSC_ID);
  654. iotg->hsm.b_sess_end = !!(val32 & OTGSC_BSE);
  655. iotg->hsm.b_sess_vld = !!(val32 & OTGSC_BSV);
  656. iotg->hsm.a_sess_vld = !!(val32 & OTGSC_ASV);
  657. iotg->hsm.a_vbus_vld = !!(val32 & OTGSC_AVV);
  658. }
  659. static irqreturn_t otg_dummy_irq(int irq, void *_dev)
  660. {
  661. struct langwell_otg *lnw = the_transceiver;
  662. void __iomem *reg_base = _dev;
  663. u32 val;
  664. u32 int_mask = 0;
  665. val = readl(reg_base + CI_USBMODE);
  666. if ((val & USBMODE_CM) != USBMODE_DEVICE)
  667. return IRQ_NONE;
  668. val = readl(reg_base + CI_USBSTS);
  669. int_mask = val & INTR_DUMMY_MASK;
  670. if (int_mask == 0)
  671. return IRQ_NONE;
  672. /* clear hsm.b_conn here since host driver can't detect it
  673. * otg_dummy_irq called means B-disconnect happened.
  674. */
  675. if (lnw->iotg.hsm.b_conn) {
  676. lnw->iotg.hsm.b_conn = 0;
  677. if (spin_trylock(&lnw->wq_lock)) {
  678. langwell_update_transceiver();
  679. spin_unlock(&lnw->wq_lock);
  680. }
  681. }
  682. /* Clear interrupts */
  683. writel(int_mask, reg_base + CI_USBSTS);
  684. return IRQ_HANDLED;
  685. }
  686. static irqreturn_t otg_irq(int irq, void *_dev)
  687. {
  688. struct langwell_otg *lnw = _dev;
  689. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  690. u32 int_sts, int_en;
  691. u32 int_mask = 0;
  692. int flag = 0;
  693. int_sts = readl(lnw->iotg.base + CI_OTGSC);
  694. int_en = (int_sts & OTGSC_INTEN_MASK) >> 8;
  695. int_mask = int_sts & int_en;
  696. if (int_mask == 0)
  697. return IRQ_NONE;
  698. if (int_mask & OTGSC_IDIS) {
  699. dev_dbg(lnw->dev, "%s: id change int\n", __func__);
  700. iotg->hsm.id = (int_sts & OTGSC_ID) ? 1 : 0;
  701. dev_dbg(lnw->dev, "id = %d\n", iotg->hsm.id);
  702. flag = 1;
  703. }
  704. if (int_mask & OTGSC_DPIS) {
  705. dev_dbg(lnw->dev, "%s: data pulse int\n", __func__);
  706. iotg->hsm.a_srp_det = (int_sts & OTGSC_DPS) ? 1 : 0;
  707. dev_dbg(lnw->dev, "data pulse = %d\n", iotg->hsm.a_srp_det);
  708. flag = 1;
  709. }
  710. if (int_mask & OTGSC_BSEIS) {
  711. dev_dbg(lnw->dev, "%s: b session end int\n", __func__);
  712. iotg->hsm.b_sess_end = (int_sts & OTGSC_BSE) ? 1 : 0;
  713. dev_dbg(lnw->dev, "b_sess_end = %d\n", iotg->hsm.b_sess_end);
  714. flag = 1;
  715. }
  716. if (int_mask & OTGSC_BSVIS) {
  717. dev_dbg(lnw->dev, "%s: b session valid int\n", __func__);
  718. iotg->hsm.b_sess_vld = (int_sts & OTGSC_BSV) ? 1 : 0;
  719. dev_dbg(lnw->dev, "b_sess_vld = %d\n", iotg->hsm.b_sess_end);
  720. flag = 1;
  721. }
  722. if (int_mask & OTGSC_ASVIS) {
  723. dev_dbg(lnw->dev, "%s: a session valid int\n", __func__);
  724. iotg->hsm.a_sess_vld = (int_sts & OTGSC_ASV) ? 1 : 0;
  725. dev_dbg(lnw->dev, "a_sess_vld = %d\n", iotg->hsm.a_sess_vld);
  726. flag = 1;
  727. }
  728. if (int_mask & OTGSC_AVVIS) {
  729. dev_dbg(lnw->dev, "%s: a vbus valid int\n", __func__);
  730. iotg->hsm.a_vbus_vld = (int_sts & OTGSC_AVV) ? 1 : 0;
  731. dev_dbg(lnw->dev, "a_vbus_vld = %d\n", iotg->hsm.a_vbus_vld);
  732. flag = 1;
  733. }
  734. if (int_mask & OTGSC_1MSS) {
  735. /* need to schedule otg_work if any timer is expired */
  736. if (langwell_otg_tick_timer(&int_sts))
  737. flag = 1;
  738. }
  739. writel((int_sts & ~OTGSC_INTSTS_MASK) | int_mask,
  740. lnw->iotg.base + CI_OTGSC);
  741. if (flag)
  742. langwell_update_transceiver();
  743. return IRQ_HANDLED;
  744. }
  745. static int langwell_otg_iotg_notify(struct notifier_block *nb,
  746. unsigned long action, void *data)
  747. {
  748. struct langwell_otg *lnw = the_transceiver;
  749. struct intel_mid_otg_xceiv *iotg = data;
  750. int flag = 0;
  751. if (iotg == NULL)
  752. return NOTIFY_BAD;
  753. if (lnw == NULL)
  754. return NOTIFY_BAD;
  755. switch (action) {
  756. case MID_OTG_NOTIFY_CONNECT:
  757. dev_dbg(lnw->dev, "Lnw OTG Notify Connect Event\n");
  758. if (iotg->otg.default_a == 1)
  759. iotg->hsm.b_conn = 1;
  760. else
  761. iotg->hsm.a_conn = 1;
  762. flag = 1;
  763. break;
  764. case MID_OTG_NOTIFY_DISCONN:
  765. dev_dbg(lnw->dev, "Lnw OTG Notify Disconnect Event\n");
  766. if (iotg->otg.default_a == 1)
  767. iotg->hsm.b_conn = 0;
  768. else
  769. iotg->hsm.a_conn = 0;
  770. flag = 1;
  771. break;
  772. case MID_OTG_NOTIFY_HSUSPEND:
  773. dev_dbg(lnw->dev, "Lnw OTG Notify Host Bus suspend Event\n");
  774. if (iotg->otg.default_a == 1)
  775. iotg->hsm.a_suspend_req = 1;
  776. else
  777. iotg->hsm.b_bus_req = 0;
  778. flag = 1;
  779. break;
  780. case MID_OTG_NOTIFY_HRESUME:
  781. dev_dbg(lnw->dev, "Lnw OTG Notify Host Bus resume Event\n");
  782. if (iotg->otg.default_a == 1)
  783. iotg->hsm.b_bus_resume = 1;
  784. flag = 1;
  785. break;
  786. case MID_OTG_NOTIFY_CSUSPEND:
  787. dev_dbg(lnw->dev, "Lnw OTG Notify Client Bus suspend Event\n");
  788. if (iotg->otg.default_a == 1) {
  789. if (iotg->hsm.b_bus_suspend_vld == 2) {
  790. iotg->hsm.b_bus_suspend = 1;
  791. iotg->hsm.b_bus_suspend_vld = 0;
  792. flag = 1;
  793. } else {
  794. iotg->hsm.b_bus_suspend_vld++;
  795. flag = 0;
  796. }
  797. } else {
  798. if (iotg->hsm.a_bus_suspend == 0) {
  799. iotg->hsm.a_bus_suspend = 1;
  800. flag = 1;
  801. }
  802. }
  803. break;
  804. case MID_OTG_NOTIFY_CRESUME:
  805. dev_dbg(lnw->dev, "Lnw OTG Notify Client Bus resume Event\n");
  806. if (iotg->otg.default_a == 0)
  807. iotg->hsm.a_bus_suspend = 0;
  808. flag = 0;
  809. break;
  810. case MID_OTG_NOTIFY_HOSTADD:
  811. dev_dbg(lnw->dev, "Lnw OTG Nofity Host Driver Add\n");
  812. flag = 1;
  813. break;
  814. case MID_OTG_NOTIFY_HOSTREMOVE:
  815. dev_dbg(lnw->dev, "Lnw OTG Nofity Host Driver remove\n");
  816. flag = 1;
  817. break;
  818. case MID_OTG_NOTIFY_CLIENTADD:
  819. dev_dbg(lnw->dev, "Lnw OTG Nofity Client Driver Add\n");
  820. flag = 1;
  821. break;
  822. case MID_OTG_NOTIFY_CLIENTREMOVE:
  823. dev_dbg(lnw->dev, "Lnw OTG Nofity Client Driver remove\n");
  824. flag = 1;
  825. break;
  826. default:
  827. dev_dbg(lnw->dev, "Lnw OTG Nofity unknown notify message\n");
  828. return NOTIFY_DONE;
  829. }
  830. if (flag)
  831. langwell_update_transceiver();
  832. return NOTIFY_OK;
  833. }
  834. static void langwell_otg_work(struct work_struct *work)
  835. {
  836. struct langwell_otg *lnw;
  837. struct intel_mid_otg_xceiv *iotg;
  838. int retval;
  839. struct pci_dev *pdev;
  840. lnw = container_of(work, struct langwell_otg, work);
  841. iotg = &lnw->iotg;
  842. pdev = to_pci_dev(lnw->dev);
  843. dev_dbg(lnw->dev, "%s: old state = %s\n", __func__,
  844. state_string(iotg->otg.state));
  845. switch (iotg->otg.state) {
  846. case OTG_STATE_UNDEFINED:
  847. case OTG_STATE_B_IDLE:
  848. if (!iotg->hsm.id) {
  849. langwell_otg_del_timer(b_srp_init_tmr);
  850. del_timer_sync(&lnw->hsm_timer);
  851. iotg->otg.default_a = 1;
  852. iotg->hsm.a_srp_det = 0;
  853. langwell_otg_chrg_vbus(0);
  854. set_host_mode();
  855. langwell_otg_phy_low_power(1);
  856. iotg->otg.state = OTG_STATE_A_IDLE;
  857. langwell_update_transceiver();
  858. } else if (iotg->hsm.b_sess_vld) {
  859. langwell_otg_del_timer(b_srp_init_tmr);
  860. del_timer_sync(&lnw->hsm_timer);
  861. iotg->hsm.b_sess_end = 0;
  862. iotg->hsm.a_bus_suspend = 0;
  863. langwell_otg_chrg_vbus(0);
  864. if (lnw->iotg.start_peripheral) {
  865. lnw->iotg.start_peripheral(&lnw->iotg);
  866. iotg->otg.state = OTG_STATE_B_PERIPHERAL;
  867. } else
  868. dev_dbg(lnw->dev, "client driver not loaded\n");
  869. } else if (iotg->hsm.b_srp_init_tmout) {
  870. iotg->hsm.b_srp_init_tmout = 0;
  871. dev_warn(lnw->dev, "SRP init timeout\n");
  872. } else if (iotg->hsm.b_srp_fail_tmout) {
  873. iotg->hsm.b_srp_fail_tmout = 0;
  874. iotg->hsm.b_bus_req = 0;
  875. /* No silence failure */
  876. langwell_otg_nsf_msg(6);
  877. } else if (iotg->hsm.b_bus_req && iotg->hsm.b_sess_end) {
  878. del_timer_sync(&lnw->hsm_timer);
  879. /* workaround for b_se0_srp detection */
  880. retval = langwell_otg_check_se0_srp(0);
  881. if (retval) {
  882. iotg->hsm.b_bus_req = 0;
  883. dev_dbg(lnw->dev, "LS isn't SE0, try later\n");
  884. } else {
  885. /* clear the PHCD before start srp */
  886. langwell_otg_phy_low_power(0);
  887. /* Start SRP */
  888. langwell_otg_add_timer(b_srp_init_tmr);
  889. iotg->otg.start_srp(&iotg->otg);
  890. langwell_otg_del_timer(b_srp_init_tmr);
  891. langwell_otg_add_ktimer(TB_SRP_FAIL_TMR);
  892. /* reset PHY low power mode here */
  893. langwell_otg_phy_low_power_wait(1);
  894. }
  895. }
  896. break;
  897. case OTG_STATE_B_SRP_INIT:
  898. if (!iotg->hsm.id) {
  899. iotg->otg.default_a = 1;
  900. iotg->hsm.a_srp_det = 0;
  901. /* Turn off VBus */
  902. iotg->otg.set_vbus(&iotg->otg, false);
  903. langwell_otg_chrg_vbus(0);
  904. set_host_mode();
  905. langwell_otg_phy_low_power(1);
  906. iotg->otg.state = OTG_STATE_A_IDLE;
  907. langwell_update_transceiver();
  908. } else if (iotg->hsm.b_sess_vld) {
  909. langwell_otg_chrg_vbus(0);
  910. if (lnw->iotg.start_peripheral) {
  911. lnw->iotg.start_peripheral(&lnw->iotg);
  912. iotg->otg.state = OTG_STATE_B_PERIPHERAL;
  913. } else
  914. dev_dbg(lnw->dev, "client driver not loaded\n");
  915. }
  916. break;
  917. case OTG_STATE_B_PERIPHERAL:
  918. if (!iotg->hsm.id) {
  919. iotg->otg.default_a = 1;
  920. iotg->hsm.a_srp_det = 0;
  921. langwell_otg_chrg_vbus(0);
  922. if (lnw->iotg.stop_peripheral)
  923. lnw->iotg.stop_peripheral(&lnw->iotg);
  924. else
  925. dev_dbg(lnw->dev,
  926. "client driver has been removed.\n");
  927. set_host_mode();
  928. langwell_otg_phy_low_power(1);
  929. iotg->otg.state = OTG_STATE_A_IDLE;
  930. langwell_update_transceiver();
  931. } else if (!iotg->hsm.b_sess_vld) {
  932. iotg->hsm.b_hnp_enable = 0;
  933. if (lnw->iotg.stop_peripheral)
  934. lnw->iotg.stop_peripheral(&lnw->iotg);
  935. else
  936. dev_dbg(lnw->dev,
  937. "client driver has been removed.\n");
  938. iotg->otg.state = OTG_STATE_B_IDLE;
  939. } else if (iotg->hsm.b_bus_req && iotg->otg.gadget &&
  940. iotg->otg.gadget->b_hnp_enable &&
  941. iotg->hsm.a_bus_suspend) {
  942. if (lnw->iotg.stop_peripheral)
  943. lnw->iotg.stop_peripheral(&lnw->iotg);
  944. else
  945. dev_dbg(lnw->dev,
  946. "client driver has been removed.\n");
  947. langwell_otg_HAAR(1);
  948. iotg->hsm.a_conn = 0;
  949. if (lnw->iotg.start_host) {
  950. lnw->iotg.start_host(&lnw->iotg);
  951. iotg->otg.state = OTG_STATE_B_WAIT_ACON;
  952. } else
  953. dev_dbg(lnw->dev,
  954. "host driver not loaded.\n");
  955. iotg->hsm.a_bus_resume = 0;
  956. langwell_otg_add_ktimer(TB_ASE0_BRST_TMR);
  957. }
  958. break;
  959. case OTG_STATE_B_WAIT_ACON:
  960. if (!iotg->hsm.id) {
  961. /* delete hsm timer for b_ase0_brst_tmr */
  962. del_timer_sync(&lnw->hsm_timer);
  963. iotg->otg.default_a = 1;
  964. iotg->hsm.a_srp_det = 0;
  965. langwell_otg_chrg_vbus(0);
  966. langwell_otg_HAAR(0);
  967. if (lnw->iotg.stop_host)
  968. lnw->iotg.stop_host(&lnw->iotg);
  969. else
  970. dev_dbg(lnw->dev,
  971. "host driver has been removed.\n");
  972. set_host_mode();
  973. langwell_otg_phy_low_power(1);
  974. iotg->otg.state = OTG_STATE_A_IDLE;
  975. langwell_update_transceiver();
  976. } else if (!iotg->hsm.b_sess_vld) {
  977. /* delete hsm timer for b_ase0_brst_tmr */
  978. del_timer_sync(&lnw->hsm_timer);
  979. iotg->hsm.b_hnp_enable = 0;
  980. iotg->hsm.b_bus_req = 0;
  981. langwell_otg_chrg_vbus(0);
  982. langwell_otg_HAAR(0);
  983. if (lnw->iotg.stop_host)
  984. lnw->iotg.stop_host(&lnw->iotg);
  985. else
  986. dev_dbg(lnw->dev,
  987. "host driver has been removed.\n");
  988. set_client_mode();
  989. langwell_otg_phy_low_power(1);
  990. iotg->otg.state = OTG_STATE_B_IDLE;
  991. } else if (iotg->hsm.a_conn) {
  992. /* delete hsm timer for b_ase0_brst_tmr */
  993. del_timer_sync(&lnw->hsm_timer);
  994. langwell_otg_HAAR(0);
  995. iotg->otg.state = OTG_STATE_B_HOST;
  996. langwell_update_transceiver();
  997. } else if (iotg->hsm.a_bus_resume ||
  998. iotg->hsm.b_ase0_brst_tmout) {
  999. /* delete hsm timer for b_ase0_brst_tmr */
  1000. del_timer_sync(&lnw->hsm_timer);
  1001. langwell_otg_HAAR(0);
  1002. langwell_otg_nsf_msg(7);
  1003. if (lnw->iotg.stop_host)
  1004. lnw->iotg.stop_host(&lnw->iotg);
  1005. else
  1006. dev_dbg(lnw->dev,
  1007. "host driver has been removed.\n");
  1008. iotg->hsm.a_bus_suspend = 0;
  1009. iotg->hsm.b_bus_req = 0;
  1010. if (lnw->iotg.start_peripheral)
  1011. lnw->iotg.start_peripheral(&lnw->iotg);
  1012. else
  1013. dev_dbg(lnw->dev,
  1014. "client driver not loaded.\n");
  1015. iotg->otg.state = OTG_STATE_B_PERIPHERAL;
  1016. }
  1017. break;
  1018. case OTG_STATE_B_HOST:
  1019. if (!iotg->hsm.id) {
  1020. iotg->otg.default_a = 1;
  1021. iotg->hsm.a_srp_det = 0;
  1022. langwell_otg_chrg_vbus(0);
  1023. if (lnw->iotg.stop_host)
  1024. lnw->iotg.stop_host(&lnw->iotg);
  1025. else
  1026. dev_dbg(lnw->dev,
  1027. "host driver has been removed.\n");
  1028. set_host_mode();
  1029. langwell_otg_phy_low_power(1);
  1030. iotg->otg.state = OTG_STATE_A_IDLE;
  1031. langwell_update_transceiver();
  1032. } else if (!iotg->hsm.b_sess_vld) {
  1033. iotg->hsm.b_hnp_enable = 0;
  1034. iotg->hsm.b_bus_req = 0;
  1035. langwell_otg_chrg_vbus(0);
  1036. if (lnw->iotg.stop_host)
  1037. lnw->iotg.stop_host(&lnw->iotg);
  1038. else
  1039. dev_dbg(lnw->dev,
  1040. "host driver has been removed.\n");
  1041. set_client_mode();
  1042. langwell_otg_phy_low_power(1);
  1043. iotg->otg.state = OTG_STATE_B_IDLE;
  1044. } else if ((!iotg->hsm.b_bus_req) ||
  1045. (!iotg->hsm.a_conn)) {
  1046. iotg->hsm.b_bus_req = 0;
  1047. langwell_otg_loc_sof(0);
  1048. if (lnw->iotg.stop_host)
  1049. lnw->iotg.stop_host(&lnw->iotg);
  1050. else
  1051. dev_dbg(lnw->dev,
  1052. "host driver has been removed.\n");
  1053. iotg->hsm.a_bus_suspend = 0;
  1054. if (lnw->iotg.start_peripheral)
  1055. lnw->iotg.start_peripheral(&lnw->iotg);
  1056. else
  1057. dev_dbg(lnw->dev,
  1058. "client driver not loaded.\n");
  1059. iotg->otg.state = OTG_STATE_B_PERIPHERAL;
  1060. }
  1061. break;
  1062. case OTG_STATE_A_IDLE:
  1063. iotg->otg.default_a = 1;
  1064. if (iotg->hsm.id) {
  1065. iotg->otg.default_a = 0;
  1066. iotg->hsm.b_bus_req = 0;
  1067. iotg->hsm.vbus_srp_up = 0;
  1068. langwell_otg_chrg_vbus(0);
  1069. set_client_mode();
  1070. langwell_otg_phy_low_power(1);
  1071. iotg->otg.state = OTG_STATE_B_IDLE;
  1072. langwell_update_transceiver();
  1073. } else if (!iotg->hsm.a_bus_drop &&
  1074. (iotg->hsm.a_srp_det || iotg->hsm.a_bus_req)) {
  1075. langwell_otg_phy_low_power(0);
  1076. /* Turn on VBus */
  1077. iotg->otg.set_vbus(&iotg->otg, true);
  1078. iotg->hsm.vbus_srp_up = 0;
  1079. iotg->hsm.a_wait_vrise_tmout = 0;
  1080. langwell_otg_add_timer(a_wait_vrise_tmr);
  1081. iotg->otg.state = OTG_STATE_A_WAIT_VRISE;
  1082. langwell_update_transceiver();
  1083. } else if (!iotg->hsm.a_bus_drop && iotg->hsm.a_sess_vld) {
  1084. iotg->hsm.vbus_srp_up = 1;
  1085. } else if (!iotg->hsm.a_sess_vld && iotg->hsm.vbus_srp_up) {
  1086. msleep(10);
  1087. langwell_otg_phy_low_power(0);
  1088. /* Turn on VBus */
  1089. iotg->otg.set_vbus(&iotg->otg, true);
  1090. iotg->hsm.a_srp_det = 1;
  1091. iotg->hsm.vbus_srp_up = 0;
  1092. iotg->hsm.a_wait_vrise_tmout = 0;
  1093. langwell_otg_add_timer(a_wait_vrise_tmr);
  1094. iotg->otg.state = OTG_STATE_A_WAIT_VRISE;
  1095. langwell_update_transceiver();
  1096. } else if (!iotg->hsm.a_sess_vld &&
  1097. !iotg->hsm.vbus_srp_up) {
  1098. langwell_otg_phy_low_power(1);
  1099. }
  1100. break;
  1101. case OTG_STATE_A_WAIT_VRISE:
  1102. if (iotg->hsm.id) {
  1103. langwell_otg_del_timer(a_wait_vrise_tmr);
  1104. iotg->hsm.b_bus_req = 0;
  1105. iotg->otg.default_a = 0;
  1106. /* Turn off VBus */
  1107. iotg->otg.set_vbus(&iotg->otg, false);
  1108. set_client_mode();
  1109. langwell_otg_phy_low_power_wait(1);
  1110. iotg->otg.state = OTG_STATE_B_IDLE;
  1111. } else if (iotg->hsm.a_vbus_vld) {
  1112. langwell_otg_del_timer(a_wait_vrise_tmr);
  1113. iotg->hsm.b_conn = 0;
  1114. if (lnw->iotg.start_host)
  1115. lnw->iotg.start_host(&lnw->iotg);
  1116. else {
  1117. dev_dbg(lnw->dev, "host driver not loaded.\n");
  1118. break;
  1119. }
  1120. langwell_otg_add_ktimer(TA_WAIT_BCON_TMR);
  1121. iotg->otg.state = OTG_STATE_A_WAIT_BCON;
  1122. } else if (iotg->hsm.a_wait_vrise_tmout) {
  1123. iotg->hsm.b_conn = 0;
  1124. if (iotg->hsm.a_vbus_vld) {
  1125. if (lnw->iotg.start_host)
  1126. lnw->iotg.start_host(&lnw->iotg);
  1127. else {
  1128. dev_dbg(lnw->dev,
  1129. "host driver not loaded.\n");
  1130. break;
  1131. }
  1132. langwell_otg_add_ktimer(TA_WAIT_BCON_TMR);
  1133. iotg->otg.state = OTG_STATE_A_WAIT_BCON;
  1134. } else {
  1135. /* Turn off VBus */
  1136. iotg->otg.set_vbus(&iotg->otg, false);
  1137. langwell_otg_phy_low_power_wait(1);
  1138. iotg->otg.state = OTG_STATE_A_VBUS_ERR;
  1139. }
  1140. }
  1141. break;
  1142. case OTG_STATE_A_WAIT_BCON:
  1143. if (iotg->hsm.id) {
  1144. /* delete hsm timer for a_wait_bcon_tmr */
  1145. del_timer_sync(&lnw->hsm_timer);
  1146. iotg->otg.default_a = 0;
  1147. iotg->hsm.b_bus_req = 0;
  1148. if (lnw->iotg.stop_host)
  1149. lnw->iotg.stop_host(&lnw->iotg);
  1150. else
  1151. dev_dbg(lnw->dev,
  1152. "host driver has been removed.\n");
  1153. /* Turn off VBus */
  1154. iotg->otg.set_vbus(&iotg->otg, false);
  1155. set_client_mode();
  1156. langwell_otg_phy_low_power_wait(1);
  1157. iotg->otg.state = OTG_STATE_B_IDLE;
  1158. langwell_update_transceiver();
  1159. } else if (!iotg->hsm.a_vbus_vld) {
  1160. /* delete hsm timer for a_wait_bcon_tmr */
  1161. del_timer_sync(&lnw->hsm_timer);
  1162. if (lnw->iotg.stop_host)
  1163. lnw->iotg.stop_host(&lnw->iotg);
  1164. else
  1165. dev_dbg(lnw->dev,
  1166. "host driver has been removed.\n");
  1167. /* Turn off VBus */
  1168. iotg->otg.set_vbus(&iotg->otg, false);
  1169. langwell_otg_phy_low_power_wait(1);
  1170. iotg->otg.state = OTG_STATE_A_VBUS_ERR;
  1171. } else if (iotg->hsm.a_bus_drop ||
  1172. (iotg->hsm.a_wait_bcon_tmout &&
  1173. !iotg->hsm.a_bus_req)) {
  1174. /* delete hsm timer for a_wait_bcon_tmr */
  1175. del_timer_sync(&lnw->hsm_timer);
  1176. if (lnw->iotg.stop_host)
  1177. lnw->iotg.stop_host(&lnw->iotg);
  1178. else
  1179. dev_dbg(lnw->dev,
  1180. "host driver has been removed.\n");
  1181. /* Turn off VBus */
  1182. iotg->otg.set_vbus(&iotg->otg, false);
  1183. iotg->otg.state = OTG_STATE_A_WAIT_VFALL;
  1184. } else if (iotg->hsm.b_conn) {
  1185. /* delete hsm timer for a_wait_bcon_tmr */
  1186. del_timer_sync(&lnw->hsm_timer);
  1187. iotg->hsm.a_suspend_req = 0;
  1188. iotg->otg.state = OTG_STATE_A_HOST;
  1189. if (iotg->hsm.a_srp_det && iotg->otg.host &&
  1190. !iotg->otg.host->b_hnp_enable) {
  1191. /* SRP capable peripheral-only device */
  1192. iotg->hsm.a_bus_req = 1;
  1193. iotg->hsm.a_srp_det = 0;
  1194. } else if (!iotg->hsm.a_bus_req && iotg->otg.host &&
  1195. iotg->otg.host->b_hnp_enable) {
  1196. /* It is not safe enough to do a fast
  1197. * transistion from A_WAIT_BCON to
  1198. * A_SUSPEND */
  1199. msleep(10000);
  1200. if (iotg->hsm.a_bus_req)
  1201. break;
  1202. if (request_irq(pdev->irq,
  1203. otg_dummy_irq, IRQF_SHARED,
  1204. driver_name, iotg->base) != 0) {
  1205. dev_dbg(lnw->dev,
  1206. "request interrupt %d fail\n",
  1207. pdev->irq);
  1208. }
  1209. langwell_otg_HABA(1);
  1210. iotg->hsm.b_bus_resume = 0;
  1211. iotg->hsm.a_aidl_bdis_tmout = 0;
  1212. langwell_otg_loc_sof(0);
  1213. /* clear PHCD to enable HW timer */
  1214. langwell_otg_phy_low_power(0);
  1215. langwell_otg_add_timer(a_aidl_bdis_tmr);
  1216. iotg->otg.state = OTG_STATE_A_SUSPEND;
  1217. } else if (!iotg->hsm.a_bus_req && iotg->otg.host &&
  1218. !iotg->otg.host->b_hnp_enable) {
  1219. if (lnw->iotg.stop_host)
  1220. lnw->iotg.stop_host(&lnw->iotg);
  1221. else
  1222. dev_dbg(lnw->dev,
  1223. "host driver removed.\n");
  1224. /* Turn off VBus */
  1225. iotg->otg.set_vbus(&iotg->otg, false);
  1226. iotg->otg.state = OTG_STATE_A_WAIT_VFALL;
  1227. }
  1228. }
  1229. break;
  1230. case OTG_STATE_A_HOST:
  1231. if (iotg->hsm.id) {
  1232. iotg->otg.default_a = 0;
  1233. iotg->hsm.b_bus_req = 0;
  1234. if (lnw->iotg.stop_host)
  1235. lnw->iotg.stop_host(&lnw->iotg);
  1236. else
  1237. dev_dbg(lnw->dev,
  1238. "host driver has been removed.\n");
  1239. /* Turn off VBus */
  1240. iotg->otg.set_vbus(&iotg->otg, false);
  1241. set_client_mode();
  1242. langwell_otg_phy_low_power_wait(1);
  1243. iotg->otg.state = OTG_STATE_B_IDLE;
  1244. langwell_update_transceiver();
  1245. } else if (iotg->hsm.a_bus_drop ||
  1246. (iotg->otg.host &&
  1247. !iotg->otg.host->b_hnp_enable &&
  1248. !iotg->hsm.a_bus_req)) {
  1249. if (lnw->iotg.stop_host)
  1250. lnw->iotg.stop_host(&lnw->iotg);
  1251. else
  1252. dev_dbg(lnw->dev,
  1253. "host driver has been removed.\n");
  1254. /* Turn off VBus */
  1255. iotg->otg.set_vbus(&iotg->otg, false);
  1256. iotg->otg.state = OTG_STATE_A_WAIT_VFALL;
  1257. } else if (!iotg->hsm.a_vbus_vld) {
  1258. if (lnw->iotg.stop_host)
  1259. lnw->iotg.stop_host(&lnw->iotg);
  1260. else
  1261. dev_dbg(lnw->dev,
  1262. "host driver has been removed.\n");
  1263. /* Turn off VBus */
  1264. iotg->otg.set_vbus(&iotg->otg, false);
  1265. langwell_otg_phy_low_power_wait(1);
  1266. iotg->otg.state = OTG_STATE_A_VBUS_ERR;
  1267. } else if (iotg->otg.host &&
  1268. iotg->otg.host->b_hnp_enable &&
  1269. !iotg->hsm.a_bus_req) {
  1270. /* Set HABA to enable hardware assistance to signal
  1271. * A-connect after receiver B-disconnect. Hardware
  1272. * will then set client mode and enable URE, SLE and
  1273. * PCE after the assistance. otg_dummy_irq is used to
  1274. * clean these ints when client driver is not resumed.
  1275. */
  1276. if (request_irq(pdev->irq, otg_dummy_irq, IRQF_SHARED,
  1277. driver_name, iotg->base) != 0) {
  1278. dev_dbg(lnw->dev,
  1279. "request interrupt %d failed\n",
  1280. pdev->irq);
  1281. }
  1282. /* set HABA */
  1283. langwell_otg_HABA(1);
  1284. iotg->hsm.b_bus_resume = 0;
  1285. iotg->hsm.a_aidl_bdis_tmout = 0;
  1286. langwell_otg_loc_sof(0);
  1287. /* clear PHCD to enable HW timer */
  1288. langwell_otg_phy_low_power(0);
  1289. langwell_otg_add_timer(a_aidl_bdis_tmr);
  1290. iotg->otg.state = OTG_STATE_A_SUSPEND;
  1291. } else if (!iotg->hsm.b_conn || !iotg->hsm.a_bus_req) {
  1292. langwell_otg_add_ktimer(TA_WAIT_BCON_TMR);
  1293. iotg->otg.state = OTG_STATE_A_WAIT_BCON;
  1294. }
  1295. break;
  1296. case OTG_STATE_A_SUSPEND:
  1297. if (iotg->hsm.id) {
  1298. langwell_otg_del_timer(a_aidl_bdis_tmr);
  1299. langwell_otg_HABA(0);
  1300. free_irq(pdev->irq, iotg->base);
  1301. iotg->otg.default_a = 0;
  1302. iotg->hsm.b_bus_req = 0;
  1303. if (lnw->iotg.stop_host)
  1304. lnw->iotg.stop_host(&lnw->iotg);
  1305. else
  1306. dev_dbg(lnw->dev,
  1307. "host driver has been removed.\n");
  1308. /* Turn off VBus */
  1309. iotg->otg.set_vbus(&iotg->otg, false);
  1310. set_client_mode();
  1311. langwell_otg_phy_low_power(1);
  1312. iotg->otg.state = OTG_STATE_B_IDLE;
  1313. langwell_update_transceiver();
  1314. } else if (iotg->hsm.a_bus_req ||
  1315. iotg->hsm.b_bus_resume) {
  1316. langwell_otg_del_timer(a_aidl_bdis_tmr);
  1317. langwell_otg_HABA(0);
  1318. free_irq(pdev->irq, iotg->base);
  1319. iotg->hsm.a_suspend_req = 0;
  1320. langwell_otg_loc_sof(1);
  1321. iotg->otg.state = OTG_STATE_A_HOST;
  1322. } else if (iotg->hsm.a_aidl_bdis_tmout ||
  1323. iotg->hsm.a_bus_drop) {
  1324. langwell_otg_del_timer(a_aidl_bdis_tmr);
  1325. langwell_otg_HABA(0);
  1326. free_irq(pdev->irq, iotg->base);
  1327. if (lnw->iotg.stop_host)
  1328. lnw->iotg.stop_host(&lnw->iotg);
  1329. else
  1330. dev_dbg(lnw->dev,
  1331. "host driver has been removed.\n");
  1332. /* Turn off VBus */
  1333. iotg->otg.set_vbus(&iotg->otg, false);
  1334. iotg->otg.state = OTG_STATE_A_WAIT_VFALL;
  1335. } else if (!iotg->hsm.b_conn && iotg->otg.host &&
  1336. iotg->otg.host->b_hnp_enable) {
  1337. langwell_otg_del_timer(a_aidl_bdis_tmr);
  1338. langwell_otg_HABA(0);
  1339. free_irq(pdev->irq, iotg->base);
  1340. if (lnw->iotg.stop_host)
  1341. lnw->iotg.stop_host(&lnw->iotg);
  1342. else
  1343. dev_dbg(lnw->dev,
  1344. "host driver has been removed.\n");
  1345. iotg->hsm.b_bus_suspend = 0;
  1346. iotg->hsm.b_bus_suspend_vld = 0;
  1347. /* msleep(200); */
  1348. if (lnw->iotg.start_peripheral)
  1349. lnw->iotg.start_peripheral(&lnw->iotg);
  1350. else
  1351. dev_dbg(lnw->dev,
  1352. "client driver not loaded.\n");
  1353. langwell_otg_add_ktimer(TB_BUS_SUSPEND_TMR);
  1354. iotg->otg.state = OTG_STATE_A_PERIPHERAL;
  1355. break;
  1356. } else if (!iotg->hsm.a_vbus_vld) {
  1357. langwell_otg_del_timer(a_aidl_bdis_tmr);
  1358. langwell_otg_HABA(0);
  1359. free_irq(pdev->irq, iotg->base);
  1360. if (lnw->iotg.stop_host)
  1361. lnw->iotg.stop_host(&lnw->iotg);
  1362. else
  1363. dev_dbg(lnw->dev,
  1364. "host driver has been removed.\n");
  1365. /* Turn off VBus */
  1366. iotg->otg.set_vbus(&iotg->otg, false);
  1367. langwell_otg_phy_low_power_wait(1);
  1368. iotg->otg.state = OTG_STATE_A_VBUS_ERR;
  1369. }
  1370. break;
  1371. case OTG_STATE_A_PERIPHERAL:
  1372. if (iotg->hsm.id) {
  1373. /* delete hsm timer for b_bus_suspend_tmr */
  1374. del_timer_sync(&lnw->hsm_timer);
  1375. iotg->otg.default_a = 0;
  1376. iotg->hsm.b_bus_req = 0;
  1377. if (lnw->iotg.stop_peripheral)
  1378. lnw->iotg.stop_peripheral(&lnw->iotg);
  1379. else
  1380. dev_dbg(lnw->dev,
  1381. "client driver has been removed.\n");
  1382. /* Turn off VBus */
  1383. iotg->otg.set_vbus(&iotg->otg, false);
  1384. set_client_mode();
  1385. langwell_otg_phy_low_power_wait(1);
  1386. iotg->otg.state = OTG_STATE_B_IDLE;
  1387. langwell_update_transceiver();
  1388. } else if (!iotg->hsm.a_vbus_vld) {
  1389. /* delete hsm timer for b_bus_suspend_tmr */
  1390. del_timer_sync(&lnw->hsm_timer);
  1391. if (lnw->iotg.stop_peripheral)
  1392. lnw->iotg.stop_peripheral(&lnw->iotg);
  1393. else
  1394. dev_dbg(lnw->dev,
  1395. "client driver has been removed.\n");
  1396. /* Turn off VBus */
  1397. iotg->otg.set_vbus(&iotg->otg, false);
  1398. langwell_otg_phy_low_power_wait(1);
  1399. iotg->otg.state = OTG_STATE_A_VBUS_ERR;
  1400. } else if (iotg->hsm.a_bus_drop) {
  1401. /* delete hsm timer for b_bus_suspend_tmr */
  1402. del_timer_sync(&lnw->hsm_timer);
  1403. if (lnw->iotg.stop_peripheral)
  1404. lnw->iotg.stop_peripheral(&lnw->iotg);
  1405. else
  1406. dev_dbg(lnw->dev,
  1407. "client driver has been removed.\n");
  1408. /* Turn off VBus */
  1409. iotg->otg.set_vbus(&iotg->otg, false);
  1410. iotg->otg.state = OTG_STATE_A_WAIT_VFALL;
  1411. } else if (iotg->hsm.b_bus_suspend) {
  1412. /* delete hsm timer for b_bus_suspend_tmr */
  1413. del_timer_sync(&lnw->hsm_timer);
  1414. if (lnw->iotg.stop_peripheral)
  1415. lnw->iotg.stop_peripheral(&lnw->iotg);
  1416. else
  1417. dev_dbg(lnw->dev,
  1418. "client driver has been removed.\n");
  1419. if (lnw->iotg.start_host)
  1420. lnw->iotg.start_host(&lnw->iotg);
  1421. else
  1422. dev_dbg(lnw->dev,
  1423. "host driver not loaded.\n");
  1424. langwell_otg_add_ktimer(TA_WAIT_BCON_TMR);
  1425. iotg->otg.state = OTG_STATE_A_WAIT_BCON;
  1426. } else if (iotg->hsm.b_bus_suspend_tmout) {
  1427. u32 val;
  1428. val = readl(lnw->iotg.base + CI_PORTSC1);
  1429. if (!(val & PORTSC_SUSP))
  1430. break;
  1431. if (lnw->iotg.stop_peripheral)
  1432. lnw->iotg.stop_peripheral(&lnw->iotg);
  1433. else
  1434. dev_dbg(lnw->dev,
  1435. "client driver has been removed.\n");
  1436. if (lnw->iotg.start_host)
  1437. lnw->iotg.start_host(&lnw->iotg);
  1438. else
  1439. dev_dbg(lnw->dev,
  1440. "host driver not loaded.\n");
  1441. langwell_otg_add_ktimer(TA_WAIT_BCON_TMR);
  1442. iotg->otg.state = OTG_STATE_A_WAIT_BCON;
  1443. }
  1444. break;
  1445. case OTG_STATE_A_VBUS_ERR:
  1446. if (iotg->hsm.id) {
  1447. iotg->otg.default_a = 0;
  1448. iotg->hsm.a_clr_err = 0;
  1449. iotg->hsm.a_srp_det = 0;
  1450. set_client_mode();
  1451. langwell_otg_phy_low_power(1);
  1452. iotg->otg.state = OTG_STATE_B_IDLE;
  1453. langwell_update_transceiver();
  1454. } else if (iotg->hsm.a_clr_err) {
  1455. iotg->hsm.a_clr_err = 0;
  1456. iotg->hsm.a_srp_det = 0;
  1457. reset_otg();
  1458. init_hsm();
  1459. if (iotg->otg.state == OTG_STATE_A_IDLE)
  1460. langwell_update_transceiver();
  1461. } else {
  1462. /* FW will clear PHCD bit when any VBus
  1463. * event detected. Reset PHCD to 1 again */
  1464. langwell_otg_phy_low_power(1);
  1465. }
  1466. break;
  1467. case OTG_STATE_A_WAIT_VFALL:
  1468. if (iotg->hsm.id) {
  1469. iotg->otg.default_a = 0;
  1470. set_client_mode();
  1471. langwell_otg_phy_low_power(1);
  1472. iotg->otg.state = OTG_STATE_B_IDLE;
  1473. langwell_update_transceiver();
  1474. } else if (iotg->hsm.a_bus_req) {
  1475. /* Turn on VBus */
  1476. iotg->otg.set_vbus(&iotg->otg, true);
  1477. iotg->hsm.a_wait_vrise_tmout = 0;
  1478. langwell_otg_add_timer(a_wait_vrise_tmr);
  1479. iotg->otg.state = OTG_STATE_A_WAIT_VRISE;
  1480. } else if (!iotg->hsm.a_sess_vld) {
  1481. iotg->hsm.a_srp_det = 0;
  1482. set_host_mode();
  1483. langwell_otg_phy_low_power(1);
  1484. iotg->otg.state = OTG_STATE_A_IDLE;
  1485. }
  1486. break;
  1487. default:
  1488. ;
  1489. }
  1490. dev_dbg(lnw->dev, "%s: new state = %s\n", __func__,
  1491. state_string(iotg->otg.state));
  1492. }
  1493. static ssize_t
  1494. show_registers(struct device *_dev, struct device_attribute *attr, char *buf)
  1495. {
  1496. struct langwell_otg *lnw = the_transceiver;
  1497. char *next;
  1498. unsigned size, t;
  1499. next = buf;
  1500. size = PAGE_SIZE;
  1501. t = scnprintf(next, size,
  1502. "\n"
  1503. "USBCMD = 0x%08x\n"
  1504. "USBSTS = 0x%08x\n"
  1505. "USBINTR = 0x%08x\n"
  1506. "ASYNCLISTADDR = 0x%08x\n"
  1507. "PORTSC1 = 0x%08x\n"
  1508. "HOSTPC1 = 0x%08x\n"
  1509. "OTGSC = 0x%08x\n"
  1510. "USBMODE = 0x%08x\n",
  1511. readl(lnw->iotg.base + 0x30),
  1512. readl(lnw->iotg.base + 0x34),
  1513. readl(lnw->iotg.base + 0x38),
  1514. readl(lnw->iotg.base + 0x48),
  1515. readl(lnw->iotg.base + 0x74),
  1516. readl(lnw->iotg.base + 0xb4),
  1517. readl(lnw->iotg.base + 0xf4),
  1518. readl(lnw->iotg.base + 0xf8)
  1519. );
  1520. size -= t;
  1521. next += t;
  1522. return PAGE_SIZE - size;
  1523. }
  1524. static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL);
  1525. static ssize_t
  1526. show_hsm(struct device *_dev, struct device_attribute *attr, char *buf)
  1527. {
  1528. struct langwell_otg *lnw = the_transceiver;
  1529. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1530. char *next;
  1531. unsigned size, t;
  1532. next = buf;
  1533. size = PAGE_SIZE;
  1534. if (iotg->otg.host)
  1535. iotg->hsm.a_set_b_hnp_en = iotg->otg.host->b_hnp_enable;
  1536. if (iotg->otg.gadget)
  1537. iotg->hsm.b_hnp_enable = iotg->otg.gadget->b_hnp_enable;
  1538. t = scnprintf(next, size,
  1539. "\n"
  1540. "current state = %s\n"
  1541. "a_bus_resume = \t%d\n"
  1542. "a_bus_suspend = \t%d\n"
  1543. "a_conn = \t%d\n"
  1544. "a_sess_vld = \t%d\n"
  1545. "a_srp_det = \t%d\n"
  1546. "a_vbus_vld = \t%d\n"
  1547. "b_bus_resume = \t%d\n"
  1548. "b_bus_suspend = \t%d\n"
  1549. "b_conn = \t%d\n"
  1550. "b_se0_srp = \t%d\n"
  1551. "b_sess_end = \t%d\n"
  1552. "b_sess_vld = \t%d\n"
  1553. "id = \t%d\n"
  1554. "a_set_b_hnp_en = \t%d\n"
  1555. "b_srp_done = \t%d\n"
  1556. "b_hnp_enable = \t%d\n"
  1557. "a_wait_vrise_tmout = \t%d\n"
  1558. "a_wait_bcon_tmout = \t%d\n"
  1559. "a_aidl_bdis_tmout = \t%d\n"
  1560. "b_ase0_brst_tmout = \t%d\n"
  1561. "a_bus_drop = \t%d\n"
  1562. "a_bus_req = \t%d\n"
  1563. "a_clr_err = \t%d\n"
  1564. "a_suspend_req = \t%d\n"
  1565. "b_bus_req = \t%d\n"
  1566. "b_bus_suspend_tmout = \t%d\n"
  1567. "b_bus_suspend_vld = \t%d\n",
  1568. state_string(iotg->otg.state),
  1569. iotg->hsm.a_bus_resume,
  1570. iotg->hsm.a_bus_suspend,
  1571. iotg->hsm.a_conn,
  1572. iotg->hsm.a_sess_vld,
  1573. iotg->hsm.a_srp_det,
  1574. iotg->hsm.a_vbus_vld,
  1575. iotg->hsm.b_bus_resume,
  1576. iotg->hsm.b_bus_suspend,
  1577. iotg->hsm.b_conn,
  1578. iotg->hsm.b_se0_srp,
  1579. iotg->hsm.b_sess_end,
  1580. iotg->hsm.b_sess_vld,
  1581. iotg->hsm.id,
  1582. iotg->hsm.a_set_b_hnp_en,
  1583. iotg->hsm.b_srp_done,
  1584. iotg->hsm.b_hnp_enable,
  1585. iotg->hsm.a_wait_vrise_tmout,
  1586. iotg->hsm.a_wait_bcon_tmout,
  1587. iotg->hsm.a_aidl_bdis_tmout,
  1588. iotg->hsm.b_ase0_brst_tmout,
  1589. iotg->hsm.a_bus_drop,
  1590. iotg->hsm.a_bus_req,
  1591. iotg->hsm.a_clr_err,
  1592. iotg->hsm.a_suspend_req,
  1593. iotg->hsm.b_bus_req,
  1594. iotg->hsm.b_bus_suspend_tmout,
  1595. iotg->hsm.b_bus_suspend_vld
  1596. );
  1597. size -= t;
  1598. next += t;
  1599. return PAGE_SIZE - size;
  1600. }
  1601. static DEVICE_ATTR(hsm, S_IRUGO, show_hsm, NULL);
  1602. static ssize_t
  1603. get_a_bus_req(struct device *dev, struct device_attribute *attr, char *buf)
  1604. {
  1605. struct langwell_otg *lnw = the_transceiver;
  1606. char *next;
  1607. unsigned size, t;
  1608. next = buf;
  1609. size = PAGE_SIZE;
  1610. t = scnprintf(next, size, "%d", lnw->iotg.hsm.a_bus_req);
  1611. size -= t;
  1612. next += t;
  1613. return PAGE_SIZE - size;
  1614. }
  1615. static ssize_t
  1616. set_a_bus_req(struct device *dev, struct device_attribute *attr,
  1617. const char *buf, size_t count)
  1618. {
  1619. struct langwell_otg *lnw = the_transceiver;
  1620. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1621. if (!iotg->otg.default_a)
  1622. return -1;
  1623. if (count > 2)
  1624. return -1;
  1625. if (buf[0] == '0') {
  1626. iotg->hsm.a_bus_req = 0;
  1627. dev_dbg(lnw->dev, "User request: a_bus_req = 0\n");
  1628. } else if (buf[0] == '1') {
  1629. /* If a_bus_drop is TRUE, a_bus_req can't be set */
  1630. if (iotg->hsm.a_bus_drop)
  1631. return -1;
  1632. iotg->hsm.a_bus_req = 1;
  1633. dev_dbg(lnw->dev, "User request: a_bus_req = 1\n");
  1634. }
  1635. if (spin_trylock(&lnw->wq_lock)) {
  1636. langwell_update_transceiver();
  1637. spin_unlock(&lnw->wq_lock);
  1638. }
  1639. return count;
  1640. }
  1641. static DEVICE_ATTR(a_bus_req, S_IRUGO | S_IWUGO, get_a_bus_req, set_a_bus_req);
  1642. static ssize_t
  1643. get_a_bus_drop(struct device *dev, struct device_attribute *attr, char *buf)
  1644. {
  1645. struct langwell_otg *lnw = the_transceiver;
  1646. char *next;
  1647. unsigned size, t;
  1648. next = buf;
  1649. size = PAGE_SIZE;
  1650. t = scnprintf(next, size, "%d", lnw->iotg.hsm.a_bus_drop);
  1651. size -= t;
  1652. next += t;
  1653. return PAGE_SIZE - size;
  1654. }
  1655. static ssize_t
  1656. set_a_bus_drop(struct device *dev, struct device_attribute *attr,
  1657. const char *buf, size_t count)
  1658. {
  1659. struct langwell_otg *lnw = the_transceiver;
  1660. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1661. if (!iotg->otg.default_a)
  1662. return -1;
  1663. if (count > 2)
  1664. return -1;
  1665. if (buf[0] == '0') {
  1666. iotg->hsm.a_bus_drop = 0;
  1667. dev_dbg(lnw->dev, "User request: a_bus_drop = 0\n");
  1668. } else if (buf[0] == '1') {
  1669. iotg->hsm.a_bus_drop = 1;
  1670. iotg->hsm.a_bus_req = 0;
  1671. dev_dbg(lnw->dev, "User request: a_bus_drop = 1\n");
  1672. dev_dbg(lnw->dev, "User request: and a_bus_req = 0\n");
  1673. }
  1674. if (spin_trylock(&lnw->wq_lock)) {
  1675. langwell_update_transceiver();
  1676. spin_unlock(&lnw->wq_lock);
  1677. }
  1678. return count;
  1679. }
  1680. static DEVICE_ATTR(a_bus_drop, S_IRUGO | S_IWUGO,
  1681. get_a_bus_drop, set_a_bus_drop);
  1682. static ssize_t
  1683. get_b_bus_req(struct device *dev, struct device_attribute *attr, char *buf)
  1684. {
  1685. struct langwell_otg *lnw = the_transceiver;
  1686. char *next;
  1687. unsigned size, t;
  1688. next = buf;
  1689. size = PAGE_SIZE;
  1690. t = scnprintf(next, size, "%d", lnw->iotg.hsm.b_bus_req);
  1691. size -= t;
  1692. next += t;
  1693. return PAGE_SIZE - size;
  1694. }
  1695. static ssize_t
  1696. set_b_bus_req(struct device *dev, struct device_attribute *attr,
  1697. const char *buf, size_t count)
  1698. {
  1699. struct langwell_otg *lnw = the_transceiver;
  1700. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1701. if (iotg->otg.default_a)
  1702. return -1;
  1703. if (count > 2)
  1704. return -1;
  1705. if (buf[0] == '0') {
  1706. iotg->hsm.b_bus_req = 0;
  1707. dev_dbg(lnw->dev, "User request: b_bus_req = 0\n");
  1708. } else if (buf[0] == '1') {
  1709. iotg->hsm.b_bus_req = 1;
  1710. dev_dbg(lnw->dev, "User request: b_bus_req = 1\n");
  1711. }
  1712. if (spin_trylock(&lnw->wq_lock)) {
  1713. langwell_update_transceiver();
  1714. spin_unlock(&lnw->wq_lock);
  1715. }
  1716. return count;
  1717. }
  1718. static DEVICE_ATTR(b_bus_req, S_IRUGO | S_IWUGO, get_b_bus_req, set_b_bus_req);
  1719. static ssize_t
  1720. set_a_clr_err(struct device *dev, struct device_attribute *attr,
  1721. const char *buf, size_t count)
  1722. {
  1723. struct langwell_otg *lnw = the_transceiver;
  1724. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1725. if (!iotg->otg.default_a)
  1726. return -1;
  1727. if (count > 2)
  1728. return -1;
  1729. if (buf[0] == '1') {
  1730. iotg->hsm.a_clr_err = 1;
  1731. dev_dbg(lnw->dev, "User request: a_clr_err = 1\n");
  1732. }
  1733. if (spin_trylock(&lnw->wq_lock)) {
  1734. langwell_update_transceiver();
  1735. spin_unlock(&lnw->wq_lock);
  1736. }
  1737. return count;
  1738. }
  1739. static DEVICE_ATTR(a_clr_err, S_IWUGO, NULL, set_a_clr_err);
  1740. static struct attribute *inputs_attrs[] = {
  1741. &dev_attr_a_bus_req.attr,
  1742. &dev_attr_a_bus_drop.attr,
  1743. &dev_attr_b_bus_req.attr,
  1744. &dev_attr_a_clr_err.attr,
  1745. NULL,
  1746. };
  1747. static struct attribute_group debug_dev_attr_group = {
  1748. .name = "inputs",
  1749. .attrs = inputs_attrs,
  1750. };
  1751. static int langwell_otg_probe(struct pci_dev *pdev,
  1752. const struct pci_device_id *id)
  1753. {
  1754. unsigned long resource, len;
  1755. void __iomem *base = NULL;
  1756. int retval;
  1757. u32 val32;
  1758. struct langwell_otg *lnw;
  1759. char qname[] = "langwell_otg_queue";
  1760. retval = 0;
  1761. dev_dbg(&pdev->dev, "\notg controller is detected.\n");
  1762. if (pci_enable_device(pdev) < 0) {
  1763. retval = -ENODEV;
  1764. goto done;
  1765. }
  1766. lnw = kzalloc(sizeof *lnw, GFP_KERNEL);
  1767. if (lnw == NULL) {
  1768. retval = -ENOMEM;
  1769. goto done;
  1770. }
  1771. the_transceiver = lnw;
  1772. /* control register: BAR 0 */
  1773. resource = pci_resource_start(pdev, 0);
  1774. len = pci_resource_len(pdev, 0);
  1775. if (!request_mem_region(resource, len, driver_name)) {
  1776. retval = -EBUSY;
  1777. goto err;
  1778. }
  1779. lnw->region = 1;
  1780. base = ioremap_nocache(resource, len);
  1781. if (base == NULL) {
  1782. retval = -EFAULT;
  1783. goto err;
  1784. }
  1785. lnw->iotg.base = base;
  1786. if (!request_mem_region(USBCFG_ADDR, USBCFG_LEN, driver_name)) {
  1787. retval = -EBUSY;
  1788. goto err;
  1789. }
  1790. lnw->cfg_region = 1;
  1791. /* For the SCCB.USBCFG register */
  1792. base = ioremap_nocache(USBCFG_ADDR, USBCFG_LEN);
  1793. if (base == NULL) {
  1794. retval = -EFAULT;
  1795. goto err;
  1796. }
  1797. lnw->usbcfg = base;
  1798. if (!pdev->irq) {
  1799. dev_dbg(&pdev->dev, "No IRQ.\n");
  1800. retval = -ENODEV;
  1801. goto err;
  1802. }
  1803. lnw->qwork = create_singlethread_workqueue(qname);
  1804. if (!lnw->qwork) {
  1805. dev_dbg(&pdev->dev, "cannot create workqueue %s\n", qname);
  1806. retval = -ENOMEM;
  1807. goto err;
  1808. }
  1809. INIT_WORK(&lnw->work, langwell_otg_work);
  1810. /* OTG common part */
  1811. lnw->dev = &pdev->dev;
  1812. lnw->iotg.otg.dev = lnw->dev;
  1813. lnw->iotg.otg.label = driver_name;
  1814. lnw->iotg.otg.set_host = langwell_otg_set_host;
  1815. lnw->iotg.otg.set_peripheral = langwell_otg_set_peripheral;
  1816. lnw->iotg.otg.set_power = langwell_otg_set_power;
  1817. lnw->iotg.otg.set_vbus = langwell_otg_set_vbus;
  1818. lnw->iotg.otg.start_srp = langwell_otg_start_srp;
  1819. lnw->iotg.otg.state = OTG_STATE_UNDEFINED;
  1820. if (otg_set_transceiver(&lnw->iotg.otg)) {
  1821. dev_dbg(lnw->dev, "can't set transceiver\n");
  1822. retval = -EBUSY;
  1823. goto err;
  1824. }
  1825. reset_otg();
  1826. init_hsm();
  1827. spin_lock_init(&lnw->lock);
  1828. spin_lock_init(&lnw->wq_lock);
  1829. INIT_LIST_HEAD(&active_timers);
  1830. retval = langwell_otg_init_timers(&lnw->iotg.hsm);
  1831. if (retval) {
  1832. dev_dbg(&pdev->dev, "Failed to init timers\n");
  1833. goto err;
  1834. }
  1835. init_timer(&lnw->hsm_timer);
  1836. ATOMIC_INIT_NOTIFIER_HEAD(&lnw->iotg.iotg_notifier);
  1837. lnw->iotg_notifier.notifier_call = langwell_otg_iotg_notify;
  1838. retval = intel_mid_otg_register_notifier(&lnw->iotg,
  1839. &lnw->iotg_notifier);
  1840. if (retval) {
  1841. dev_dbg(lnw->dev, "Failed to register notifier\n");
  1842. goto err;
  1843. }
  1844. if (request_irq(pdev->irq, otg_irq, IRQF_SHARED,
  1845. driver_name, lnw) != 0) {
  1846. dev_dbg(lnw->dev, "request interrupt %d failed\n", pdev->irq);
  1847. retval = -EBUSY;
  1848. goto err;
  1849. }
  1850. /* enable OTGSC int */
  1851. val32 = OTGSC_DPIE | OTGSC_BSEIE | OTGSC_BSVIE |
  1852. OTGSC_ASVIE | OTGSC_AVVIE | OTGSC_IDIE | OTGSC_IDPU;
  1853. writel(val32, lnw->iotg.base + CI_OTGSC);
  1854. retval = device_create_file(&pdev->dev, &dev_attr_registers);
  1855. if (retval < 0) {
  1856. dev_dbg(lnw->dev,
  1857. "Can't register sysfs attribute: %d\n", retval);
  1858. goto err;
  1859. }
  1860. retval = device_create_file(&pdev->dev, &dev_attr_hsm);
  1861. if (retval < 0) {
  1862. dev_dbg(lnw->dev, "Can't hsm sysfs attribute: %d\n", retval);
  1863. goto err;
  1864. }
  1865. retval = sysfs_create_group(&pdev->dev.kobj, &debug_dev_attr_group);
  1866. if (retval < 0) {
  1867. dev_dbg(lnw->dev,
  1868. "Can't register sysfs attr group: %d\n", retval);
  1869. goto err;
  1870. }
  1871. if (lnw->iotg.otg.state == OTG_STATE_A_IDLE)
  1872. langwell_update_transceiver();
  1873. return 0;
  1874. err:
  1875. if (the_transceiver)
  1876. langwell_otg_remove(pdev);
  1877. done:
  1878. return retval;
  1879. }
  1880. static void langwell_otg_remove(struct pci_dev *pdev)
  1881. {
  1882. struct langwell_otg *lnw = the_transceiver;
  1883. if (lnw->qwork) {
  1884. flush_workqueue(lnw->qwork);
  1885. destroy_workqueue(lnw->qwork);
  1886. }
  1887. intel_mid_otg_unregister_notifier(&lnw->iotg, &lnw->iotg_notifier);
  1888. langwell_otg_free_timers();
  1889. /* disable OTGSC interrupt as OTGSC doesn't change in reset */
  1890. writel(0, lnw->iotg.base + CI_OTGSC);
  1891. if (pdev->irq)
  1892. free_irq(pdev->irq, lnw);
  1893. if (lnw->usbcfg)
  1894. iounmap(lnw->usbcfg);
  1895. if (lnw->cfg_region)
  1896. release_mem_region(USBCFG_ADDR, USBCFG_LEN);
  1897. if (lnw->iotg.base)
  1898. iounmap(lnw->iotg.base);
  1899. if (lnw->region)
  1900. release_mem_region(pci_resource_start(pdev, 0),
  1901. pci_resource_len(pdev, 0));
  1902. otg_set_transceiver(NULL);
  1903. pci_disable_device(pdev);
  1904. sysfs_remove_group(&pdev->dev.kobj, &debug_dev_attr_group);
  1905. device_remove_file(&pdev->dev, &dev_attr_hsm);
  1906. device_remove_file(&pdev->dev, &dev_attr_registers);
  1907. kfree(lnw);
  1908. lnw = NULL;
  1909. }
  1910. static void transceiver_suspend(struct pci_dev *pdev)
  1911. {
  1912. pci_save_state(pdev);
  1913. pci_set_power_state(pdev, PCI_D3hot);
  1914. langwell_otg_phy_low_power(1);
  1915. }
  1916. static int langwell_otg_suspend(struct pci_dev *pdev, pm_message_t message)
  1917. {
  1918. struct langwell_otg *lnw = the_transceiver;
  1919. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1920. int ret = 0;
  1921. /* Disbale OTG interrupts */
  1922. langwell_otg_intr(0);
  1923. if (pdev->irq)
  1924. free_irq(pdev->irq, lnw);
  1925. /* Prevent more otg_work */
  1926. flush_workqueue(lnw->qwork);
  1927. destroy_workqueue(lnw->qwork);
  1928. lnw->qwork = NULL;
  1929. /* start actions */
  1930. switch (iotg->otg.state) {
  1931. case OTG_STATE_A_WAIT_VFALL:
  1932. iotg->otg.state = OTG_STATE_A_IDLE;
  1933. case OTG_STATE_A_IDLE:
  1934. case OTG_STATE_B_IDLE:
  1935. case OTG_STATE_A_VBUS_ERR:
  1936. transceiver_suspend(pdev);
  1937. break;
  1938. case OTG_STATE_A_WAIT_VRISE:
  1939. langwell_otg_del_timer(a_wait_vrise_tmr);
  1940. iotg->hsm.a_srp_det = 0;
  1941. /* Turn off VBus */
  1942. iotg->otg.set_vbus(&iotg->otg, false);
  1943. iotg->otg.state = OTG_STATE_A_IDLE;
  1944. transceiver_suspend(pdev);
  1945. break;
  1946. case OTG_STATE_A_WAIT_BCON:
  1947. del_timer_sync(&lnw->hsm_timer);
  1948. if (lnw->iotg.stop_host)
  1949. lnw->iotg.stop_host(&lnw->iotg);
  1950. else
  1951. dev_dbg(&pdev->dev, "host driver has been removed.\n");
  1952. iotg->hsm.a_srp_det = 0;
  1953. /* Turn off VBus */
  1954. iotg->otg.set_vbus(&iotg->otg, false);
  1955. iotg->otg.state = OTG_STATE_A_IDLE;
  1956. transceiver_suspend(pdev);
  1957. break;
  1958. case OTG_STATE_A_HOST:
  1959. if (lnw->iotg.stop_host)
  1960. lnw->iotg.stop_host(&lnw->iotg);
  1961. else
  1962. dev_dbg(&pdev->dev, "host driver has been removed.\n");
  1963. iotg->hsm.a_srp_det = 0;
  1964. /* Turn off VBus */
  1965. iotg->otg.set_vbus(&iotg->otg, false);
  1966. iotg->otg.state = OTG_STATE_A_IDLE;
  1967. transceiver_suspend(pdev);
  1968. break;
  1969. case OTG_STATE_A_SUSPEND:
  1970. langwell_otg_del_timer(a_aidl_bdis_tmr);
  1971. langwell_otg_HABA(0);
  1972. if (lnw->iotg.stop_host)
  1973. lnw->iotg.stop_host(&lnw->iotg);
  1974. else
  1975. dev_dbg(lnw->dev, "host driver has been removed.\n");
  1976. iotg->hsm.a_srp_det = 0;
  1977. /* Turn off VBus */
  1978. iotg->otg.set_vbus(&iotg->otg, false);
  1979. iotg->otg.state = OTG_STATE_A_IDLE;
  1980. transceiver_suspend(pdev);
  1981. break;
  1982. case OTG_STATE_A_PERIPHERAL:
  1983. del_timer_sync(&lnw->hsm_timer);
  1984. if (lnw->iotg.stop_peripheral)
  1985. lnw->iotg.stop_peripheral(&lnw->iotg);
  1986. else
  1987. dev_dbg(&pdev->dev,
  1988. "client driver has been removed.\n");
  1989. iotg->hsm.a_srp_det = 0;
  1990. /* Turn off VBus */
  1991. iotg->otg.set_vbus(&iotg->otg, false);
  1992. iotg->otg.state = OTG_STATE_A_IDLE;
  1993. transceiver_suspend(pdev);
  1994. break;
  1995. case OTG_STATE_B_HOST:
  1996. if (lnw->iotg.stop_host)
  1997. lnw->iotg.stop_host(&lnw->iotg);
  1998. else
  1999. dev_dbg(&pdev->dev, "host driver has been removed.\n");
  2000. iotg->hsm.b_bus_req = 0;
  2001. iotg->otg.state = OTG_STATE_B_IDLE;
  2002. transceiver_suspend(pdev);
  2003. break;
  2004. case OTG_STATE_B_PERIPHERAL:
  2005. if (lnw->iotg.stop_peripheral)
  2006. lnw->iotg.stop_peripheral(&lnw->iotg);
  2007. else
  2008. dev_dbg(&pdev->dev,
  2009. "client driver has been removed.\n");
  2010. iotg->otg.state = OTG_STATE_B_IDLE;
  2011. transceiver_suspend(pdev);
  2012. break;
  2013. case OTG_STATE_B_WAIT_ACON:
  2014. /* delete hsm timer for b_ase0_brst_tmr */
  2015. del_timer_sync(&lnw->hsm_timer);
  2016. langwell_otg_HAAR(0);
  2017. if (lnw->iotg.stop_host)
  2018. lnw->iotg.stop_host(&lnw->iotg);
  2019. else
  2020. dev_dbg(&pdev->dev, "host driver has been removed.\n");
  2021. iotg->hsm.b_bus_req = 0;
  2022. iotg->otg.state = OTG_STATE_B_IDLE;
  2023. transceiver_suspend(pdev);
  2024. break;
  2025. default:
  2026. dev_dbg(lnw->dev, "error state before suspend\n");
  2027. break;
  2028. }
  2029. return ret;
  2030. }
  2031. static void transceiver_resume(struct pci_dev *pdev)
  2032. {
  2033. pci_restore_state(pdev);
  2034. pci_set_power_state(pdev, PCI_D0);
  2035. }
  2036. static int langwell_otg_resume(struct pci_dev *pdev)
  2037. {
  2038. struct langwell_otg *lnw = the_transceiver;
  2039. int ret = 0;
  2040. transceiver_resume(pdev);
  2041. lnw->qwork = create_singlethread_workqueue("langwell_otg_queue");
  2042. if (!lnw->qwork) {
  2043. dev_dbg(&pdev->dev, "cannot create langwell otg workqueuen");
  2044. ret = -ENOMEM;
  2045. goto error;
  2046. }
  2047. if (request_irq(pdev->irq, otg_irq, IRQF_SHARED,
  2048. driver_name, lnw) != 0) {
  2049. dev_dbg(&pdev->dev, "request interrupt %d failed\n", pdev->irq);
  2050. ret = -EBUSY;
  2051. goto error;
  2052. }
  2053. /* enable OTG interrupts */
  2054. langwell_otg_intr(1);
  2055. update_hsm();
  2056. langwell_update_transceiver();
  2057. return ret;
  2058. error:
  2059. langwell_otg_intr(0);
  2060. transceiver_suspend(pdev);
  2061. return ret;
  2062. }
  2063. static int __init langwell_otg_init(void)
  2064. {
  2065. return pci_register_driver(&otg_pci_driver);
  2066. }
  2067. module_init(langwell_otg_init);
  2068. static void __exit langwell_otg_cleanup(void)
  2069. {
  2070. pci_unregister_driver(&otg_pci_driver);
  2071. }
  2072. module_exit(langwell_otg_cleanup);