langwell_otg.c 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407
  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_IWUSR, 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_IWUSR, get_a_bus_drop, set_a_bus_drop);
  1681. static ssize_t
  1682. get_b_bus_req(struct device *dev, struct device_attribute *attr, char *buf)
  1683. {
  1684. struct langwell_otg *lnw = the_transceiver;
  1685. char *next;
  1686. unsigned size, t;
  1687. next = buf;
  1688. size = PAGE_SIZE;
  1689. t = scnprintf(next, size, "%d", lnw->iotg.hsm.b_bus_req);
  1690. size -= t;
  1691. next += t;
  1692. return PAGE_SIZE - size;
  1693. }
  1694. static ssize_t
  1695. set_b_bus_req(struct device *dev, struct device_attribute *attr,
  1696. const char *buf, size_t count)
  1697. {
  1698. struct langwell_otg *lnw = the_transceiver;
  1699. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1700. if (iotg->otg.default_a)
  1701. return -1;
  1702. if (count > 2)
  1703. return -1;
  1704. if (buf[0] == '0') {
  1705. iotg->hsm.b_bus_req = 0;
  1706. dev_dbg(lnw->dev, "User request: b_bus_req = 0\n");
  1707. } else if (buf[0] == '1') {
  1708. iotg->hsm.b_bus_req = 1;
  1709. dev_dbg(lnw->dev, "User request: b_bus_req = 1\n");
  1710. }
  1711. if (spin_trylock(&lnw->wq_lock)) {
  1712. langwell_update_transceiver();
  1713. spin_unlock(&lnw->wq_lock);
  1714. }
  1715. return count;
  1716. }
  1717. static DEVICE_ATTR(b_bus_req, S_IRUGO | S_IWUSR, get_b_bus_req, set_b_bus_req);
  1718. static ssize_t
  1719. set_a_clr_err(struct device *dev, struct device_attribute *attr,
  1720. const char *buf, size_t count)
  1721. {
  1722. struct langwell_otg *lnw = the_transceiver;
  1723. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1724. if (!iotg->otg.default_a)
  1725. return -1;
  1726. if (count > 2)
  1727. return -1;
  1728. if (buf[0] == '1') {
  1729. iotg->hsm.a_clr_err = 1;
  1730. dev_dbg(lnw->dev, "User request: a_clr_err = 1\n");
  1731. }
  1732. if (spin_trylock(&lnw->wq_lock)) {
  1733. langwell_update_transceiver();
  1734. spin_unlock(&lnw->wq_lock);
  1735. }
  1736. return count;
  1737. }
  1738. static DEVICE_ATTR(a_clr_err, S_IWUSR, NULL, set_a_clr_err);
  1739. static struct attribute *inputs_attrs[] = {
  1740. &dev_attr_a_bus_req.attr,
  1741. &dev_attr_a_bus_drop.attr,
  1742. &dev_attr_b_bus_req.attr,
  1743. &dev_attr_a_clr_err.attr,
  1744. NULL,
  1745. };
  1746. static struct attribute_group debug_dev_attr_group = {
  1747. .name = "inputs",
  1748. .attrs = inputs_attrs,
  1749. };
  1750. static int langwell_otg_probe(struct pci_dev *pdev,
  1751. const struct pci_device_id *id)
  1752. {
  1753. unsigned long resource, len;
  1754. void __iomem *base = NULL;
  1755. int retval;
  1756. u32 val32;
  1757. struct langwell_otg *lnw;
  1758. char qname[] = "langwell_otg_queue";
  1759. retval = 0;
  1760. dev_dbg(&pdev->dev, "\notg controller is detected.\n");
  1761. if (pci_enable_device(pdev) < 0) {
  1762. retval = -ENODEV;
  1763. goto done;
  1764. }
  1765. lnw = kzalloc(sizeof *lnw, GFP_KERNEL);
  1766. if (lnw == NULL) {
  1767. retval = -ENOMEM;
  1768. goto done;
  1769. }
  1770. the_transceiver = lnw;
  1771. /* control register: BAR 0 */
  1772. resource = pci_resource_start(pdev, 0);
  1773. len = pci_resource_len(pdev, 0);
  1774. if (!request_mem_region(resource, len, driver_name)) {
  1775. retval = -EBUSY;
  1776. goto err;
  1777. }
  1778. lnw->region = 1;
  1779. base = ioremap_nocache(resource, len);
  1780. if (base == NULL) {
  1781. retval = -EFAULT;
  1782. goto err;
  1783. }
  1784. lnw->iotg.base = base;
  1785. if (!request_mem_region(USBCFG_ADDR, USBCFG_LEN, driver_name)) {
  1786. retval = -EBUSY;
  1787. goto err;
  1788. }
  1789. lnw->cfg_region = 1;
  1790. /* For the SCCB.USBCFG register */
  1791. base = ioremap_nocache(USBCFG_ADDR, USBCFG_LEN);
  1792. if (base == NULL) {
  1793. retval = -EFAULT;
  1794. goto err;
  1795. }
  1796. lnw->usbcfg = base;
  1797. if (!pdev->irq) {
  1798. dev_dbg(&pdev->dev, "No IRQ.\n");
  1799. retval = -ENODEV;
  1800. goto err;
  1801. }
  1802. lnw->qwork = create_singlethread_workqueue(qname);
  1803. if (!lnw->qwork) {
  1804. dev_dbg(&pdev->dev, "cannot create workqueue %s\n", qname);
  1805. retval = -ENOMEM;
  1806. goto err;
  1807. }
  1808. INIT_WORK(&lnw->work, langwell_otg_work);
  1809. /* OTG common part */
  1810. lnw->dev = &pdev->dev;
  1811. lnw->iotg.otg.dev = lnw->dev;
  1812. lnw->iotg.otg.label = driver_name;
  1813. lnw->iotg.otg.set_host = langwell_otg_set_host;
  1814. lnw->iotg.otg.set_peripheral = langwell_otg_set_peripheral;
  1815. lnw->iotg.otg.set_power = langwell_otg_set_power;
  1816. lnw->iotg.otg.set_vbus = langwell_otg_set_vbus;
  1817. lnw->iotg.otg.start_srp = langwell_otg_start_srp;
  1818. lnw->iotg.otg.state = OTG_STATE_UNDEFINED;
  1819. if (otg_set_transceiver(&lnw->iotg.otg)) {
  1820. dev_dbg(lnw->dev, "can't set transceiver\n");
  1821. retval = -EBUSY;
  1822. goto err;
  1823. }
  1824. reset_otg();
  1825. init_hsm();
  1826. spin_lock_init(&lnw->lock);
  1827. spin_lock_init(&lnw->wq_lock);
  1828. INIT_LIST_HEAD(&active_timers);
  1829. retval = langwell_otg_init_timers(&lnw->iotg.hsm);
  1830. if (retval) {
  1831. dev_dbg(&pdev->dev, "Failed to init timers\n");
  1832. goto err;
  1833. }
  1834. init_timer(&lnw->hsm_timer);
  1835. ATOMIC_INIT_NOTIFIER_HEAD(&lnw->iotg.iotg_notifier);
  1836. lnw->iotg_notifier.notifier_call = langwell_otg_iotg_notify;
  1837. retval = intel_mid_otg_register_notifier(&lnw->iotg,
  1838. &lnw->iotg_notifier);
  1839. if (retval) {
  1840. dev_dbg(lnw->dev, "Failed to register notifier\n");
  1841. goto err;
  1842. }
  1843. if (request_irq(pdev->irq, otg_irq, IRQF_SHARED,
  1844. driver_name, lnw) != 0) {
  1845. dev_dbg(lnw->dev, "request interrupt %d failed\n", pdev->irq);
  1846. retval = -EBUSY;
  1847. goto err;
  1848. }
  1849. /* enable OTGSC int */
  1850. val32 = OTGSC_DPIE | OTGSC_BSEIE | OTGSC_BSVIE |
  1851. OTGSC_ASVIE | OTGSC_AVVIE | OTGSC_IDIE | OTGSC_IDPU;
  1852. writel(val32, lnw->iotg.base + CI_OTGSC);
  1853. retval = device_create_file(&pdev->dev, &dev_attr_registers);
  1854. if (retval < 0) {
  1855. dev_dbg(lnw->dev,
  1856. "Can't register sysfs attribute: %d\n", retval);
  1857. goto err;
  1858. }
  1859. retval = device_create_file(&pdev->dev, &dev_attr_hsm);
  1860. if (retval < 0) {
  1861. dev_dbg(lnw->dev, "Can't hsm sysfs attribute: %d\n", retval);
  1862. goto err;
  1863. }
  1864. retval = sysfs_create_group(&pdev->dev.kobj, &debug_dev_attr_group);
  1865. if (retval < 0) {
  1866. dev_dbg(lnw->dev,
  1867. "Can't register sysfs attr group: %d\n", retval);
  1868. goto err;
  1869. }
  1870. if (lnw->iotg.otg.state == OTG_STATE_A_IDLE)
  1871. langwell_update_transceiver();
  1872. return 0;
  1873. err:
  1874. if (the_transceiver)
  1875. langwell_otg_remove(pdev);
  1876. done:
  1877. return retval;
  1878. }
  1879. static void langwell_otg_remove(struct pci_dev *pdev)
  1880. {
  1881. struct langwell_otg *lnw = the_transceiver;
  1882. if (lnw->qwork) {
  1883. flush_workqueue(lnw->qwork);
  1884. destroy_workqueue(lnw->qwork);
  1885. }
  1886. intel_mid_otg_unregister_notifier(&lnw->iotg, &lnw->iotg_notifier);
  1887. langwell_otg_free_timers();
  1888. /* disable OTGSC interrupt as OTGSC doesn't change in reset */
  1889. writel(0, lnw->iotg.base + CI_OTGSC);
  1890. if (pdev->irq)
  1891. free_irq(pdev->irq, lnw);
  1892. if (lnw->usbcfg)
  1893. iounmap(lnw->usbcfg);
  1894. if (lnw->cfg_region)
  1895. release_mem_region(USBCFG_ADDR, USBCFG_LEN);
  1896. if (lnw->iotg.base)
  1897. iounmap(lnw->iotg.base);
  1898. if (lnw->region)
  1899. release_mem_region(pci_resource_start(pdev, 0),
  1900. pci_resource_len(pdev, 0));
  1901. otg_set_transceiver(NULL);
  1902. pci_disable_device(pdev);
  1903. sysfs_remove_group(&pdev->dev.kobj, &debug_dev_attr_group);
  1904. device_remove_file(&pdev->dev, &dev_attr_hsm);
  1905. device_remove_file(&pdev->dev, &dev_attr_registers);
  1906. kfree(lnw);
  1907. lnw = NULL;
  1908. }
  1909. static void transceiver_suspend(struct pci_dev *pdev)
  1910. {
  1911. pci_save_state(pdev);
  1912. pci_set_power_state(pdev, PCI_D3hot);
  1913. langwell_otg_phy_low_power(1);
  1914. }
  1915. static int langwell_otg_suspend(struct pci_dev *pdev, pm_message_t message)
  1916. {
  1917. struct langwell_otg *lnw = the_transceiver;
  1918. struct intel_mid_otg_xceiv *iotg = &lnw->iotg;
  1919. int ret = 0;
  1920. /* Disbale OTG interrupts */
  1921. langwell_otg_intr(0);
  1922. if (pdev->irq)
  1923. free_irq(pdev->irq, lnw);
  1924. /* Prevent more otg_work */
  1925. flush_workqueue(lnw->qwork);
  1926. destroy_workqueue(lnw->qwork);
  1927. lnw->qwork = NULL;
  1928. /* start actions */
  1929. switch (iotg->otg.state) {
  1930. case OTG_STATE_A_WAIT_VFALL:
  1931. iotg->otg.state = OTG_STATE_A_IDLE;
  1932. case OTG_STATE_A_IDLE:
  1933. case OTG_STATE_B_IDLE:
  1934. case OTG_STATE_A_VBUS_ERR:
  1935. transceiver_suspend(pdev);
  1936. break;
  1937. case OTG_STATE_A_WAIT_VRISE:
  1938. langwell_otg_del_timer(a_wait_vrise_tmr);
  1939. iotg->hsm.a_srp_det = 0;
  1940. /* Turn off VBus */
  1941. iotg->otg.set_vbus(&iotg->otg, false);
  1942. iotg->otg.state = OTG_STATE_A_IDLE;
  1943. transceiver_suspend(pdev);
  1944. break;
  1945. case OTG_STATE_A_WAIT_BCON:
  1946. del_timer_sync(&lnw->hsm_timer);
  1947. if (lnw->iotg.stop_host)
  1948. lnw->iotg.stop_host(&lnw->iotg);
  1949. else
  1950. dev_dbg(&pdev->dev, "host driver has been removed.\n");
  1951. iotg->hsm.a_srp_det = 0;
  1952. /* Turn off VBus */
  1953. iotg->otg.set_vbus(&iotg->otg, false);
  1954. iotg->otg.state = OTG_STATE_A_IDLE;
  1955. transceiver_suspend(pdev);
  1956. break;
  1957. case OTG_STATE_A_HOST:
  1958. if (lnw->iotg.stop_host)
  1959. lnw->iotg.stop_host(&lnw->iotg);
  1960. else
  1961. dev_dbg(&pdev->dev, "host driver has been removed.\n");
  1962. iotg->hsm.a_srp_det = 0;
  1963. /* Turn off VBus */
  1964. iotg->otg.set_vbus(&iotg->otg, false);
  1965. iotg->otg.state = OTG_STATE_A_IDLE;
  1966. transceiver_suspend(pdev);
  1967. break;
  1968. case OTG_STATE_A_SUSPEND:
  1969. langwell_otg_del_timer(a_aidl_bdis_tmr);
  1970. langwell_otg_HABA(0);
  1971. if (lnw->iotg.stop_host)
  1972. lnw->iotg.stop_host(&lnw->iotg);
  1973. else
  1974. dev_dbg(lnw->dev, "host driver has been removed.\n");
  1975. iotg->hsm.a_srp_det = 0;
  1976. /* Turn off VBus */
  1977. iotg->otg.set_vbus(&iotg->otg, false);
  1978. iotg->otg.state = OTG_STATE_A_IDLE;
  1979. transceiver_suspend(pdev);
  1980. break;
  1981. case OTG_STATE_A_PERIPHERAL:
  1982. del_timer_sync(&lnw->hsm_timer);
  1983. if (lnw->iotg.stop_peripheral)
  1984. lnw->iotg.stop_peripheral(&lnw->iotg);
  1985. else
  1986. dev_dbg(&pdev->dev,
  1987. "client driver has been removed.\n");
  1988. iotg->hsm.a_srp_det = 0;
  1989. /* Turn off VBus */
  1990. iotg->otg.set_vbus(&iotg->otg, false);
  1991. iotg->otg.state = OTG_STATE_A_IDLE;
  1992. transceiver_suspend(pdev);
  1993. break;
  1994. case OTG_STATE_B_HOST:
  1995. if (lnw->iotg.stop_host)
  1996. lnw->iotg.stop_host(&lnw->iotg);
  1997. else
  1998. dev_dbg(&pdev->dev, "host driver has been removed.\n");
  1999. iotg->hsm.b_bus_req = 0;
  2000. iotg->otg.state = OTG_STATE_B_IDLE;
  2001. transceiver_suspend(pdev);
  2002. break;
  2003. case OTG_STATE_B_PERIPHERAL:
  2004. if (lnw->iotg.stop_peripheral)
  2005. lnw->iotg.stop_peripheral(&lnw->iotg);
  2006. else
  2007. dev_dbg(&pdev->dev,
  2008. "client driver has been removed.\n");
  2009. iotg->otg.state = OTG_STATE_B_IDLE;
  2010. transceiver_suspend(pdev);
  2011. break;
  2012. case OTG_STATE_B_WAIT_ACON:
  2013. /* delete hsm timer for b_ase0_brst_tmr */
  2014. del_timer_sync(&lnw->hsm_timer);
  2015. langwell_otg_HAAR(0);
  2016. if (lnw->iotg.stop_host)
  2017. lnw->iotg.stop_host(&lnw->iotg);
  2018. else
  2019. dev_dbg(&pdev->dev, "host driver has been removed.\n");
  2020. iotg->hsm.b_bus_req = 0;
  2021. iotg->otg.state = OTG_STATE_B_IDLE;
  2022. transceiver_suspend(pdev);
  2023. break;
  2024. default:
  2025. dev_dbg(lnw->dev, "error state before suspend\n");
  2026. break;
  2027. }
  2028. return ret;
  2029. }
  2030. static void transceiver_resume(struct pci_dev *pdev)
  2031. {
  2032. pci_restore_state(pdev);
  2033. pci_set_power_state(pdev, PCI_D0);
  2034. }
  2035. static int langwell_otg_resume(struct pci_dev *pdev)
  2036. {
  2037. struct langwell_otg *lnw = the_transceiver;
  2038. int ret = 0;
  2039. transceiver_resume(pdev);
  2040. lnw->qwork = create_singlethread_workqueue("langwell_otg_queue");
  2041. if (!lnw->qwork) {
  2042. dev_dbg(&pdev->dev, "cannot create langwell otg workqueuen");
  2043. ret = -ENOMEM;
  2044. goto error;
  2045. }
  2046. if (request_irq(pdev->irq, otg_irq, IRQF_SHARED,
  2047. driver_name, lnw) != 0) {
  2048. dev_dbg(&pdev->dev, "request interrupt %d failed\n", pdev->irq);
  2049. ret = -EBUSY;
  2050. goto error;
  2051. }
  2052. /* enable OTG interrupts */
  2053. langwell_otg_intr(1);
  2054. update_hsm();
  2055. langwell_update_transceiver();
  2056. return ret;
  2057. error:
  2058. langwell_otg_intr(0);
  2059. transceiver_suspend(pdev);
  2060. return ret;
  2061. }
  2062. static int __init langwell_otg_init(void)
  2063. {
  2064. return pci_register_driver(&otg_pci_driver);
  2065. }
  2066. module_init(langwell_otg_init);
  2067. static void __exit langwell_otg_cleanup(void)
  2068. {
  2069. pci_unregister_driver(&otg_pci_driver);
  2070. }
  2071. module_exit(langwell_otg_cleanup);