phy-fsl-usb.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2007,2008 Freescale semiconductor, Inc.
  4. *
  5. * Author: Li Yang <[email protected]>
  6. * Jerry Huang <[email protected]>
  7. *
  8. * Initialization based on code from Shlomi Gridish.
  9. */
  10. #include <linux/module.h>
  11. #include <linux/kernel.h>
  12. #include <linux/delay.h>
  13. #include <linux/slab.h>
  14. #include <linux/proc_fs.h>
  15. #include <linux/errno.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/io.h>
  18. #include <linux/timer.h>
  19. #include <linux/usb.h>
  20. #include <linux/device.h>
  21. #include <linux/usb/ch9.h>
  22. #include <linux/usb/gadget.h>
  23. #include <linux/workqueue.h>
  24. #include <linux/time.h>
  25. #include <linux/fsl_devices.h>
  26. #include <linux/platform_device.h>
  27. #include <linux/uaccess.h>
  28. #include <asm/unaligned.h>
  29. #include "phy-fsl-usb.h"
  30. #ifdef VERBOSE
  31. #define VDBG(fmt, args...) pr_debug("[%s] " fmt, \
  32. __func__, ## args)
  33. #else
  34. #define VDBG(stuff...) do {} while (0)
  35. #endif
  36. #define DRIVER_VERSION "Rev. 1.55"
  37. #define DRIVER_AUTHOR "Jerry Huang/Li Yang"
  38. #define DRIVER_DESC "Freescale USB OTG Transceiver Driver"
  39. #define DRIVER_INFO DRIVER_DESC " " DRIVER_VERSION
  40. static const char driver_name[] = "fsl-usb2-otg";
  41. const pm_message_t otg_suspend_state = {
  42. .event = 1,
  43. };
  44. #define HA_DATA_PULSE
  45. static struct usb_dr_mmap *usb_dr_regs;
  46. static struct fsl_otg *fsl_otg_dev;
  47. static int srp_wait_done;
  48. /* FSM timers */
  49. struct fsl_otg_timer *a_wait_vrise_tmr, *a_wait_bcon_tmr, *a_aidl_bdis_tmr,
  50. *b_ase0_brst_tmr, *b_se0_srp_tmr;
  51. /* Driver specific timers */
  52. struct fsl_otg_timer *b_data_pulse_tmr, *b_vbus_pulse_tmr, *b_srp_fail_tmr,
  53. *b_srp_wait_tmr, *a_wait_enum_tmr;
  54. static struct list_head active_timers;
  55. static const struct fsl_otg_config fsl_otg_initdata = {
  56. .otg_port = 1,
  57. };
  58. #ifdef CONFIG_PPC32
  59. static u32 _fsl_readl_be(const unsigned __iomem *p)
  60. {
  61. return in_be32(p);
  62. }
  63. static u32 _fsl_readl_le(const unsigned __iomem *p)
  64. {
  65. return in_le32(p);
  66. }
  67. static void _fsl_writel_be(u32 v, unsigned __iomem *p)
  68. {
  69. out_be32(p, v);
  70. }
  71. static void _fsl_writel_le(u32 v, unsigned __iomem *p)
  72. {
  73. out_le32(p, v);
  74. }
  75. static u32 (*_fsl_readl)(const unsigned __iomem *p);
  76. static void (*_fsl_writel)(u32 v, unsigned __iomem *p);
  77. #define fsl_readl(p) (*_fsl_readl)((p))
  78. #define fsl_writel(v, p) (*_fsl_writel)((v), (p))
  79. #else
  80. #define fsl_readl(addr) readl(addr)
  81. #define fsl_writel(val, addr) writel(val, addr)
  82. #endif /* CONFIG_PPC32 */
  83. int write_ulpi(u8 addr, u8 data)
  84. {
  85. u32 temp;
  86. temp = 0x60000000 | (addr << 16) | data;
  87. fsl_writel(temp, &usb_dr_regs->ulpiview);
  88. return 0;
  89. }
  90. /* -------------------------------------------------------------*/
  91. /* Operations that will be called from OTG Finite State Machine */
  92. /* Charge vbus for vbus pulsing in SRP */
  93. void fsl_otg_chrg_vbus(struct otg_fsm *fsm, int on)
  94. {
  95. u32 tmp;
  96. tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
  97. if (on)
  98. /* stop discharging, start charging */
  99. tmp = (tmp & ~OTGSC_CTRL_VBUS_DISCHARGE) |
  100. OTGSC_CTRL_VBUS_CHARGE;
  101. else
  102. /* stop charging */
  103. tmp &= ~OTGSC_CTRL_VBUS_CHARGE;
  104. fsl_writel(tmp, &usb_dr_regs->otgsc);
  105. }
  106. /* Discharge vbus through a resistor to ground */
  107. void fsl_otg_dischrg_vbus(int on)
  108. {
  109. u32 tmp;
  110. tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
  111. if (on)
  112. /* stop charging, start discharging */
  113. tmp = (tmp & ~OTGSC_CTRL_VBUS_CHARGE) |
  114. OTGSC_CTRL_VBUS_DISCHARGE;
  115. else
  116. /* stop discharging */
  117. tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE;
  118. fsl_writel(tmp, &usb_dr_regs->otgsc);
  119. }
  120. /* A-device driver vbus, controlled through PP bit in PORTSC */
  121. void fsl_otg_drv_vbus(struct otg_fsm *fsm, int on)
  122. {
  123. u32 tmp;
  124. if (on) {
  125. tmp = fsl_readl(&usb_dr_regs->portsc) & ~PORTSC_W1C_BITS;
  126. fsl_writel(tmp | PORTSC_PORT_POWER, &usb_dr_regs->portsc);
  127. } else {
  128. tmp = fsl_readl(&usb_dr_regs->portsc) &
  129. ~PORTSC_W1C_BITS & ~PORTSC_PORT_POWER;
  130. fsl_writel(tmp, &usb_dr_regs->portsc);
  131. }
  132. }
  133. /*
  134. * Pull-up D+, signalling connect by periperal. Also used in
  135. * data-line pulsing in SRP
  136. */
  137. void fsl_otg_loc_conn(struct otg_fsm *fsm, int on)
  138. {
  139. u32 tmp;
  140. tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
  141. if (on)
  142. tmp |= OTGSC_CTRL_DATA_PULSING;
  143. else
  144. tmp &= ~OTGSC_CTRL_DATA_PULSING;
  145. fsl_writel(tmp, &usb_dr_regs->otgsc);
  146. }
  147. /*
  148. * Generate SOF by host. This is controlled through suspend/resume the
  149. * port. In host mode, controller will automatically send SOF.
  150. * Suspend will block the data on the port.
  151. */
  152. void fsl_otg_loc_sof(struct otg_fsm *fsm, int on)
  153. {
  154. u32 tmp;
  155. tmp = fsl_readl(&fsl_otg_dev->dr_mem_map->portsc) & ~PORTSC_W1C_BITS;
  156. if (on)
  157. tmp |= PORTSC_PORT_FORCE_RESUME;
  158. else
  159. tmp |= PORTSC_PORT_SUSPEND;
  160. fsl_writel(tmp, &fsl_otg_dev->dr_mem_map->portsc);
  161. }
  162. /* Start SRP pulsing by data-line pulsing, followed with v-bus pulsing. */
  163. void fsl_otg_start_pulse(struct otg_fsm *fsm)
  164. {
  165. u32 tmp;
  166. srp_wait_done = 0;
  167. #ifdef HA_DATA_PULSE
  168. tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
  169. tmp |= OTGSC_HA_DATA_PULSE;
  170. fsl_writel(tmp, &usb_dr_regs->otgsc);
  171. #else
  172. fsl_otg_loc_conn(1);
  173. #endif
  174. fsl_otg_add_timer(fsm, b_data_pulse_tmr);
  175. }
  176. void b_data_pulse_end(unsigned long foo)
  177. {
  178. #ifdef HA_DATA_PULSE
  179. #else
  180. fsl_otg_loc_conn(0);
  181. #endif
  182. /* Do VBUS pulse after data pulse */
  183. fsl_otg_pulse_vbus();
  184. }
  185. void fsl_otg_pulse_vbus(void)
  186. {
  187. srp_wait_done = 0;
  188. fsl_otg_chrg_vbus(&fsl_otg_dev->fsm, 1);
  189. /* start the timer to end vbus charge */
  190. fsl_otg_add_timer(&fsl_otg_dev->fsm, b_vbus_pulse_tmr);
  191. }
  192. void b_vbus_pulse_end(unsigned long foo)
  193. {
  194. fsl_otg_chrg_vbus(&fsl_otg_dev->fsm, 0);
  195. /*
  196. * As USB3300 using the same a_sess_vld and b_sess_vld voltage
  197. * we need to discharge the bus for a while to distinguish
  198. * residual voltage of vbus pulsing and A device pull up
  199. */
  200. fsl_otg_dischrg_vbus(1);
  201. fsl_otg_add_timer(&fsl_otg_dev->fsm, b_srp_wait_tmr);
  202. }
  203. void b_srp_end(unsigned long foo)
  204. {
  205. fsl_otg_dischrg_vbus(0);
  206. srp_wait_done = 1;
  207. if ((fsl_otg_dev->phy.otg->state == OTG_STATE_B_SRP_INIT) &&
  208. fsl_otg_dev->fsm.b_sess_vld)
  209. fsl_otg_dev->fsm.b_srp_done = 1;
  210. }
  211. /*
  212. * Workaround for a_host suspending too fast. When a_bus_req=0,
  213. * a_host will start by SRP. It needs to set b_hnp_enable before
  214. * actually suspending to start HNP
  215. */
  216. void a_wait_enum(unsigned long foo)
  217. {
  218. VDBG("a_wait_enum timeout\n");
  219. if (!fsl_otg_dev->phy.otg->host->b_hnp_enable)
  220. fsl_otg_add_timer(&fsl_otg_dev->fsm, a_wait_enum_tmr);
  221. else
  222. otg_statemachine(&fsl_otg_dev->fsm);
  223. }
  224. /* The timeout callback function to set time out bit */
  225. void set_tmout(unsigned long indicator)
  226. {
  227. *(int *)indicator = 1;
  228. }
  229. /* Initialize timers */
  230. int fsl_otg_init_timers(struct otg_fsm *fsm)
  231. {
  232. /* FSM used timers */
  233. a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE,
  234. (unsigned long)&fsm->a_wait_vrise_tmout);
  235. if (!a_wait_vrise_tmr)
  236. return -ENOMEM;
  237. a_wait_bcon_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_BCON,
  238. (unsigned long)&fsm->a_wait_bcon_tmout);
  239. if (!a_wait_bcon_tmr)
  240. return -ENOMEM;
  241. a_aidl_bdis_tmr = otg_timer_initializer(&set_tmout, TA_AIDL_BDIS,
  242. (unsigned long)&fsm->a_aidl_bdis_tmout);
  243. if (!a_aidl_bdis_tmr)
  244. return -ENOMEM;
  245. b_ase0_brst_tmr = otg_timer_initializer(&set_tmout, TB_ASE0_BRST,
  246. (unsigned long)&fsm->b_ase0_brst_tmout);
  247. if (!b_ase0_brst_tmr)
  248. return -ENOMEM;
  249. b_se0_srp_tmr = otg_timer_initializer(&set_tmout, TB_SE0_SRP,
  250. (unsigned long)&fsm->b_se0_srp);
  251. if (!b_se0_srp_tmr)
  252. return -ENOMEM;
  253. b_srp_fail_tmr = otg_timer_initializer(&set_tmout, TB_SRP_FAIL,
  254. (unsigned long)&fsm->b_srp_done);
  255. if (!b_srp_fail_tmr)
  256. return -ENOMEM;
  257. a_wait_enum_tmr = otg_timer_initializer(&a_wait_enum, 10,
  258. (unsigned long)&fsm);
  259. if (!a_wait_enum_tmr)
  260. return -ENOMEM;
  261. /* device driver used timers */
  262. b_srp_wait_tmr = otg_timer_initializer(&b_srp_end, TB_SRP_WAIT, 0);
  263. if (!b_srp_wait_tmr)
  264. return -ENOMEM;
  265. b_data_pulse_tmr = otg_timer_initializer(&b_data_pulse_end,
  266. TB_DATA_PLS, 0);
  267. if (!b_data_pulse_tmr)
  268. return -ENOMEM;
  269. b_vbus_pulse_tmr = otg_timer_initializer(&b_vbus_pulse_end,
  270. TB_VBUS_PLS, 0);
  271. if (!b_vbus_pulse_tmr)
  272. return -ENOMEM;
  273. return 0;
  274. }
  275. /* Uninitialize timers */
  276. void fsl_otg_uninit_timers(void)
  277. {
  278. /* FSM used timers */
  279. kfree(a_wait_vrise_tmr);
  280. kfree(a_wait_bcon_tmr);
  281. kfree(a_aidl_bdis_tmr);
  282. kfree(b_ase0_brst_tmr);
  283. kfree(b_se0_srp_tmr);
  284. kfree(b_srp_fail_tmr);
  285. kfree(a_wait_enum_tmr);
  286. /* device driver used timers */
  287. kfree(b_srp_wait_tmr);
  288. kfree(b_data_pulse_tmr);
  289. kfree(b_vbus_pulse_tmr);
  290. }
  291. static struct fsl_otg_timer *fsl_otg_get_timer(enum otg_fsm_timer t)
  292. {
  293. struct fsl_otg_timer *timer;
  294. /* REVISIT: use array of pointers to timers instead */
  295. switch (t) {
  296. case A_WAIT_VRISE:
  297. timer = a_wait_vrise_tmr;
  298. break;
  299. case A_WAIT_BCON:
  300. timer = a_wait_vrise_tmr;
  301. break;
  302. case A_AIDL_BDIS:
  303. timer = a_wait_vrise_tmr;
  304. break;
  305. case B_ASE0_BRST:
  306. timer = a_wait_vrise_tmr;
  307. break;
  308. case B_SE0_SRP:
  309. timer = a_wait_vrise_tmr;
  310. break;
  311. case B_SRP_FAIL:
  312. timer = a_wait_vrise_tmr;
  313. break;
  314. case A_WAIT_ENUM:
  315. timer = a_wait_vrise_tmr;
  316. break;
  317. default:
  318. timer = NULL;
  319. }
  320. return timer;
  321. }
  322. /* Add timer to timer list */
  323. void fsl_otg_add_timer(struct otg_fsm *fsm, void *gtimer)
  324. {
  325. struct fsl_otg_timer *timer = gtimer;
  326. struct fsl_otg_timer *tmp_timer;
  327. /*
  328. * Check if the timer is already in the active list,
  329. * if so update timer count
  330. */
  331. list_for_each_entry(tmp_timer, &active_timers, list)
  332. if (tmp_timer == timer) {
  333. timer->count = timer->expires;
  334. return;
  335. }
  336. timer->count = timer->expires;
  337. list_add_tail(&timer->list, &active_timers);
  338. }
  339. static void fsl_otg_fsm_add_timer(struct otg_fsm *fsm, enum otg_fsm_timer t)
  340. {
  341. struct fsl_otg_timer *timer;
  342. timer = fsl_otg_get_timer(t);
  343. if (!timer)
  344. return;
  345. fsl_otg_add_timer(fsm, timer);
  346. }
  347. /* Remove timer from the timer list; clear timeout status */
  348. void fsl_otg_del_timer(struct otg_fsm *fsm, void *gtimer)
  349. {
  350. struct fsl_otg_timer *timer = gtimer;
  351. struct fsl_otg_timer *tmp_timer, *del_tmp;
  352. list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list)
  353. if (tmp_timer == timer)
  354. list_del(&timer->list);
  355. }
  356. static void fsl_otg_fsm_del_timer(struct otg_fsm *fsm, enum otg_fsm_timer t)
  357. {
  358. struct fsl_otg_timer *timer;
  359. timer = fsl_otg_get_timer(t);
  360. if (!timer)
  361. return;
  362. fsl_otg_del_timer(fsm, timer);
  363. }
  364. /* Reset controller, not reset the bus */
  365. void otg_reset_controller(void)
  366. {
  367. u32 command;
  368. command = fsl_readl(&usb_dr_regs->usbcmd);
  369. command |= (1 << 1);
  370. fsl_writel(command, &usb_dr_regs->usbcmd);
  371. while (fsl_readl(&usb_dr_regs->usbcmd) & (1 << 1))
  372. ;
  373. }
  374. /* Call suspend/resume routines in host driver */
  375. int fsl_otg_start_host(struct otg_fsm *fsm, int on)
  376. {
  377. struct usb_otg *otg = fsm->otg;
  378. struct device *dev;
  379. struct fsl_otg *otg_dev =
  380. container_of(otg->usb_phy, struct fsl_otg, phy);
  381. u32 retval = 0;
  382. if (!otg->host)
  383. return -ENODEV;
  384. dev = otg->host->controller;
  385. /*
  386. * Update a_vbus_vld state as a_vbus_vld int is disabled
  387. * in device mode
  388. */
  389. fsm->a_vbus_vld =
  390. !!(fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_A_VBUS_VALID);
  391. if (on) {
  392. /* start fsl usb host controller */
  393. if (otg_dev->host_working)
  394. goto end;
  395. else {
  396. otg_reset_controller();
  397. VDBG("host on......\n");
  398. if (dev->driver->pm && dev->driver->pm->resume) {
  399. retval = dev->driver->pm->resume(dev);
  400. if (fsm->id) {
  401. /* default-b */
  402. fsl_otg_drv_vbus(fsm, 1);
  403. /*
  404. * Workaround: b_host can't driver
  405. * vbus, but PP in PORTSC needs to
  406. * be 1 for host to work.
  407. * So we set drv_vbus bit in
  408. * transceiver to 0 thru ULPI.
  409. */
  410. write_ulpi(0x0c, 0x20);
  411. }
  412. }
  413. otg_dev->host_working = 1;
  414. }
  415. } else {
  416. /* stop fsl usb host controller */
  417. if (!otg_dev->host_working)
  418. goto end;
  419. else {
  420. VDBG("host off......\n");
  421. if (dev && dev->driver) {
  422. if (dev->driver->pm && dev->driver->pm->suspend)
  423. retval = dev->driver->pm->suspend(dev);
  424. if (fsm->id)
  425. /* default-b */
  426. fsl_otg_drv_vbus(fsm, 0);
  427. }
  428. otg_dev->host_working = 0;
  429. }
  430. }
  431. end:
  432. return retval;
  433. }
  434. /*
  435. * Call suspend and resume function in udc driver
  436. * to stop and start udc driver.
  437. */
  438. int fsl_otg_start_gadget(struct otg_fsm *fsm, int on)
  439. {
  440. struct usb_otg *otg = fsm->otg;
  441. struct device *dev;
  442. if (!otg->gadget || !otg->gadget->dev.parent)
  443. return -ENODEV;
  444. VDBG("gadget %s\n", on ? "on" : "off");
  445. dev = otg->gadget->dev.parent;
  446. if (on) {
  447. if (dev->driver->resume)
  448. dev->driver->resume(dev);
  449. } else {
  450. if (dev->driver->suspend)
  451. dev->driver->suspend(dev, otg_suspend_state);
  452. }
  453. return 0;
  454. }
  455. /*
  456. * Called by initialization code of host driver. Register host controller
  457. * to the OTG. Suspend host for OTG role detection.
  458. */
  459. static int fsl_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
  460. {
  461. struct fsl_otg *otg_dev;
  462. if (!otg)
  463. return -ENODEV;
  464. otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
  465. if (otg_dev != fsl_otg_dev)
  466. return -ENODEV;
  467. otg->host = host;
  468. otg_dev->fsm.a_bus_drop = 0;
  469. otg_dev->fsm.a_bus_req = 1;
  470. if (host) {
  471. VDBG("host off......\n");
  472. otg->host->otg_port = fsl_otg_initdata.otg_port;
  473. otg->host->is_b_host = otg_dev->fsm.id;
  474. /*
  475. * must leave time for hub_wq to finish its thing
  476. * before yanking the host driver out from under it,
  477. * so suspend the host after a short delay.
  478. */
  479. otg_dev->host_working = 1;
  480. schedule_delayed_work(&otg_dev->otg_event, 100);
  481. return 0;
  482. } else {
  483. /* host driver going away */
  484. if (!(fsl_readl(&otg_dev->dr_mem_map->otgsc) &
  485. OTGSC_STS_USB_ID)) {
  486. /* Mini-A cable connected */
  487. struct otg_fsm *fsm = &otg_dev->fsm;
  488. otg->state = OTG_STATE_UNDEFINED;
  489. fsm->protocol = PROTO_UNDEF;
  490. }
  491. }
  492. otg_dev->host_working = 0;
  493. otg_statemachine(&otg_dev->fsm);
  494. return 0;
  495. }
  496. /* Called by initialization code of udc. Register udc to OTG. */
  497. static int fsl_otg_set_peripheral(struct usb_otg *otg,
  498. struct usb_gadget *gadget)
  499. {
  500. struct fsl_otg *otg_dev;
  501. if (!otg)
  502. return -ENODEV;
  503. otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
  504. VDBG("otg_dev 0x%x\n", (int)otg_dev);
  505. VDBG("fsl_otg_dev 0x%x\n", (int)fsl_otg_dev);
  506. if (otg_dev != fsl_otg_dev)
  507. return -ENODEV;
  508. if (!gadget) {
  509. if (!otg->default_a)
  510. otg->gadget->ops->vbus_draw(otg->gadget, 0);
  511. usb_gadget_vbus_disconnect(otg->gadget);
  512. otg->gadget = 0;
  513. otg_dev->fsm.b_bus_req = 0;
  514. otg_statemachine(&otg_dev->fsm);
  515. return 0;
  516. }
  517. otg->gadget = gadget;
  518. otg->gadget->is_a_peripheral = !otg_dev->fsm.id;
  519. otg_dev->fsm.b_bus_req = 1;
  520. /* start the gadget right away if the ID pin says Mini-B */
  521. pr_debug("ID pin=%d\n", otg_dev->fsm.id);
  522. if (otg_dev->fsm.id == 1) {
  523. fsl_otg_start_host(&otg_dev->fsm, 0);
  524. otg_drv_vbus(&otg_dev->fsm, 0);
  525. fsl_otg_start_gadget(&otg_dev->fsm, 1);
  526. }
  527. return 0;
  528. }
  529. /*
  530. * Delayed pin detect interrupt processing.
  531. *
  532. * When the Mini-A cable is disconnected from the board,
  533. * the pin-detect interrupt happens before the disconnect
  534. * interrupts for the connected device(s). In order to
  535. * process the disconnect interrupt(s) prior to switching
  536. * roles, the pin-detect interrupts are delayed, and handled
  537. * by this routine.
  538. */
  539. static void fsl_otg_event(struct work_struct *work)
  540. {
  541. struct fsl_otg *og = container_of(work, struct fsl_otg, otg_event.work);
  542. struct otg_fsm *fsm = &og->fsm;
  543. if (fsm->id) { /* switch to gadget */
  544. fsl_otg_start_host(fsm, 0);
  545. otg_drv_vbus(fsm, 0);
  546. fsl_otg_start_gadget(fsm, 1);
  547. }
  548. }
  549. /* B-device start SRP */
  550. static int fsl_otg_start_srp(struct usb_otg *otg)
  551. {
  552. struct fsl_otg *otg_dev;
  553. if (!otg || otg->state != OTG_STATE_B_IDLE)
  554. return -ENODEV;
  555. otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
  556. if (otg_dev != fsl_otg_dev)
  557. return -ENODEV;
  558. otg_dev->fsm.b_bus_req = 1;
  559. otg_statemachine(&otg_dev->fsm);
  560. return 0;
  561. }
  562. /* A_host suspend will call this function to start hnp */
  563. static int fsl_otg_start_hnp(struct usb_otg *otg)
  564. {
  565. struct fsl_otg *otg_dev;
  566. if (!otg)
  567. return -ENODEV;
  568. otg_dev = container_of(otg->usb_phy, struct fsl_otg, phy);
  569. if (otg_dev != fsl_otg_dev)
  570. return -ENODEV;
  571. pr_debug("start_hnp...\n");
  572. /* clear a_bus_req to enter a_suspend state */
  573. otg_dev->fsm.a_bus_req = 0;
  574. otg_statemachine(&otg_dev->fsm);
  575. return 0;
  576. }
  577. /*
  578. * Interrupt handler. OTG/host/peripheral share the same int line.
  579. * OTG driver clears OTGSC interrupts and leaves USB interrupts
  580. * intact. It needs to have knowledge of some USB interrupts
  581. * such as port change.
  582. */
  583. irqreturn_t fsl_otg_isr(int irq, void *dev_id)
  584. {
  585. struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm;
  586. struct usb_otg *otg = ((struct fsl_otg *)dev_id)->phy.otg;
  587. u32 otg_int_src, otg_sc;
  588. otg_sc = fsl_readl(&usb_dr_regs->otgsc);
  589. otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8);
  590. /* Only clear otg interrupts */
  591. fsl_writel(otg_sc, &usb_dr_regs->otgsc);
  592. /*FIXME: ID change not generate when init to 0 */
  593. fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
  594. otg->default_a = (fsm->id == 0);
  595. /* process OTG interrupts */
  596. if (otg_int_src) {
  597. if (otg_int_src & OTGSC_INTSTS_USB_ID) {
  598. fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
  599. otg->default_a = (fsm->id == 0);
  600. /* clear conn information */
  601. if (fsm->id)
  602. fsm->b_conn = 0;
  603. else
  604. fsm->a_conn = 0;
  605. if (otg->host)
  606. otg->host->is_b_host = fsm->id;
  607. if (otg->gadget)
  608. otg->gadget->is_a_peripheral = !fsm->id;
  609. VDBG("ID int (ID is %d)\n", fsm->id);
  610. if (fsm->id) { /* switch to gadget */
  611. schedule_delayed_work(
  612. &((struct fsl_otg *)dev_id)->otg_event,
  613. 100);
  614. } else { /* switch to host */
  615. cancel_delayed_work(&
  616. ((struct fsl_otg *)dev_id)->
  617. otg_event);
  618. fsl_otg_start_gadget(fsm, 0);
  619. otg_drv_vbus(fsm, 1);
  620. fsl_otg_start_host(fsm, 1);
  621. }
  622. return IRQ_HANDLED;
  623. }
  624. }
  625. return IRQ_NONE;
  626. }
  627. static struct otg_fsm_ops fsl_otg_ops = {
  628. .chrg_vbus = fsl_otg_chrg_vbus,
  629. .drv_vbus = fsl_otg_drv_vbus,
  630. .loc_conn = fsl_otg_loc_conn,
  631. .loc_sof = fsl_otg_loc_sof,
  632. .start_pulse = fsl_otg_start_pulse,
  633. .add_timer = fsl_otg_fsm_add_timer,
  634. .del_timer = fsl_otg_fsm_del_timer,
  635. .start_host = fsl_otg_start_host,
  636. .start_gadget = fsl_otg_start_gadget,
  637. };
  638. /* Initialize the global variable fsl_otg_dev and request IRQ for OTG */
  639. static int fsl_otg_conf(struct platform_device *pdev)
  640. {
  641. struct fsl_otg *fsl_otg_tc;
  642. int status;
  643. if (fsl_otg_dev)
  644. return 0;
  645. /* allocate space to fsl otg device */
  646. fsl_otg_tc = kzalloc(sizeof(struct fsl_otg), GFP_KERNEL);
  647. if (!fsl_otg_tc)
  648. return -ENOMEM;
  649. fsl_otg_tc->phy.otg = kzalloc(sizeof(struct usb_otg), GFP_KERNEL);
  650. if (!fsl_otg_tc->phy.otg) {
  651. kfree(fsl_otg_tc);
  652. return -ENOMEM;
  653. }
  654. INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event);
  655. INIT_LIST_HEAD(&active_timers);
  656. status = fsl_otg_init_timers(&fsl_otg_tc->fsm);
  657. if (status) {
  658. pr_info("Couldn't init OTG timers\n");
  659. goto err;
  660. }
  661. mutex_init(&fsl_otg_tc->fsm.lock);
  662. /* Set OTG state machine operations */
  663. fsl_otg_tc->fsm.ops = &fsl_otg_ops;
  664. /* initialize the otg structure */
  665. fsl_otg_tc->phy.label = DRIVER_DESC;
  666. fsl_otg_tc->phy.dev = &pdev->dev;
  667. fsl_otg_tc->phy.otg->usb_phy = &fsl_otg_tc->phy;
  668. fsl_otg_tc->phy.otg->set_host = fsl_otg_set_host;
  669. fsl_otg_tc->phy.otg->set_peripheral = fsl_otg_set_peripheral;
  670. fsl_otg_tc->phy.otg->start_hnp = fsl_otg_start_hnp;
  671. fsl_otg_tc->phy.otg->start_srp = fsl_otg_start_srp;
  672. fsl_otg_dev = fsl_otg_tc;
  673. /* Store the otg transceiver */
  674. status = usb_add_phy(&fsl_otg_tc->phy, USB_PHY_TYPE_USB2);
  675. if (status) {
  676. pr_warn(FSL_OTG_NAME ": unable to register OTG transceiver.\n");
  677. goto err;
  678. }
  679. return 0;
  680. err:
  681. fsl_otg_uninit_timers();
  682. kfree(fsl_otg_tc->phy.otg);
  683. kfree(fsl_otg_tc);
  684. return status;
  685. }
  686. /* OTG Initialization */
  687. int usb_otg_start(struct platform_device *pdev)
  688. {
  689. struct fsl_otg *p_otg;
  690. struct usb_phy *otg_trans = usb_get_phy(USB_PHY_TYPE_USB2);
  691. struct otg_fsm *fsm;
  692. int status;
  693. struct resource *res;
  694. u32 temp;
  695. struct fsl_usb2_platform_data *pdata = dev_get_platdata(&pdev->dev);
  696. p_otg = container_of(otg_trans, struct fsl_otg, phy);
  697. fsm = &p_otg->fsm;
  698. /* Initialize the state machine structure with default values */
  699. SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED);
  700. fsm->otg = p_otg->phy.otg;
  701. /* We don't require predefined MEM/IRQ resource index */
  702. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  703. if (!res)
  704. return -ENXIO;
  705. /* We don't request_mem_region here to enable resource sharing
  706. * with host/device */
  707. usb_dr_regs = ioremap(res->start, sizeof(struct usb_dr_mmap));
  708. p_otg->dr_mem_map = (struct usb_dr_mmap *)usb_dr_regs;
  709. pdata->regs = (void *)usb_dr_regs;
  710. if (pdata->init && pdata->init(pdev) != 0)
  711. return -EINVAL;
  712. #ifdef CONFIG_PPC32
  713. if (pdata->big_endian_mmio) {
  714. _fsl_readl = _fsl_readl_be;
  715. _fsl_writel = _fsl_writel_be;
  716. } else {
  717. _fsl_readl = _fsl_readl_le;
  718. _fsl_writel = _fsl_writel_le;
  719. }
  720. #endif
  721. /* request irq */
  722. p_otg->irq = platform_get_irq(pdev, 0);
  723. if (p_otg->irq < 0)
  724. return p_otg->irq;
  725. status = request_irq(p_otg->irq, fsl_otg_isr,
  726. IRQF_SHARED, driver_name, p_otg);
  727. if (status) {
  728. dev_dbg(p_otg->phy.dev, "can't get IRQ %d, error %d\n",
  729. p_otg->irq, status);
  730. iounmap(p_otg->dr_mem_map);
  731. kfree(p_otg->phy.otg);
  732. kfree(p_otg);
  733. return status;
  734. }
  735. /* stop the controller */
  736. temp = fsl_readl(&p_otg->dr_mem_map->usbcmd);
  737. temp &= ~USB_CMD_RUN_STOP;
  738. fsl_writel(temp, &p_otg->dr_mem_map->usbcmd);
  739. /* reset the controller */
  740. temp = fsl_readl(&p_otg->dr_mem_map->usbcmd);
  741. temp |= USB_CMD_CTRL_RESET;
  742. fsl_writel(temp, &p_otg->dr_mem_map->usbcmd);
  743. /* wait reset completed */
  744. while (fsl_readl(&p_otg->dr_mem_map->usbcmd) & USB_CMD_CTRL_RESET)
  745. ;
  746. /* configure the VBUSHS as IDLE(both host and device) */
  747. temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USB_MODE_ES : 0);
  748. fsl_writel(temp, &p_otg->dr_mem_map->usbmode);
  749. /* configure PHY interface */
  750. temp = fsl_readl(&p_otg->dr_mem_map->portsc);
  751. temp &= ~(PORTSC_PHY_TYPE_SEL | PORTSC_PTW);
  752. switch (pdata->phy_mode) {
  753. case FSL_USB2_PHY_ULPI:
  754. temp |= PORTSC_PTS_ULPI;
  755. break;
  756. case FSL_USB2_PHY_UTMI_WIDE:
  757. temp |= PORTSC_PTW_16BIT;
  758. fallthrough;
  759. case FSL_USB2_PHY_UTMI:
  760. temp |= PORTSC_PTS_UTMI;
  761. fallthrough;
  762. default:
  763. break;
  764. }
  765. fsl_writel(temp, &p_otg->dr_mem_map->portsc);
  766. if (pdata->have_sysif_regs) {
  767. /* configure control enable IO output, big endian register */
  768. temp = __raw_readl(&p_otg->dr_mem_map->control);
  769. temp |= USB_CTRL_IOENB;
  770. __raw_writel(temp, &p_otg->dr_mem_map->control);
  771. }
  772. /* disable all interrupt and clear all OTGSC status */
  773. temp = fsl_readl(&p_otg->dr_mem_map->otgsc);
  774. temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK;
  775. temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE;
  776. fsl_writel(temp, &p_otg->dr_mem_map->otgsc);
  777. /*
  778. * The identification (id) input is FALSE when a Mini-A plug is inserted
  779. * in the devices Mini-AB receptacle. Otherwise, this input is TRUE.
  780. * Also: record initial state of ID pin
  781. */
  782. if (fsl_readl(&p_otg->dr_mem_map->otgsc) & OTGSC_STS_USB_ID) {
  783. p_otg->phy.otg->state = OTG_STATE_UNDEFINED;
  784. p_otg->fsm.id = 1;
  785. } else {
  786. p_otg->phy.otg->state = OTG_STATE_A_IDLE;
  787. p_otg->fsm.id = 0;
  788. }
  789. pr_debug("initial ID pin=%d\n", p_otg->fsm.id);
  790. /* enable OTG ID pin interrupt */
  791. temp = fsl_readl(&p_otg->dr_mem_map->otgsc);
  792. temp |= OTGSC_INTR_USB_ID_EN;
  793. temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_INTR_1MS_TIMER_EN);
  794. fsl_writel(temp, &p_otg->dr_mem_map->otgsc);
  795. return 0;
  796. }
  797. static int fsl_otg_probe(struct platform_device *pdev)
  798. {
  799. int ret;
  800. if (!dev_get_platdata(&pdev->dev))
  801. return -ENODEV;
  802. /* configure the OTG */
  803. ret = fsl_otg_conf(pdev);
  804. if (ret) {
  805. dev_err(&pdev->dev, "Couldn't configure OTG module\n");
  806. return ret;
  807. }
  808. /* start OTG */
  809. ret = usb_otg_start(pdev);
  810. if (ret) {
  811. dev_err(&pdev->dev, "Can't init FSL OTG device\n");
  812. return ret;
  813. }
  814. return ret;
  815. }
  816. static int fsl_otg_remove(struct platform_device *pdev)
  817. {
  818. struct fsl_usb2_platform_data *pdata = dev_get_platdata(&pdev->dev);
  819. usb_remove_phy(&fsl_otg_dev->phy);
  820. free_irq(fsl_otg_dev->irq, fsl_otg_dev);
  821. iounmap((void *)usb_dr_regs);
  822. fsl_otg_uninit_timers();
  823. kfree(fsl_otg_dev->phy.otg);
  824. kfree(fsl_otg_dev);
  825. if (pdata->exit)
  826. pdata->exit(pdev);
  827. return 0;
  828. }
  829. struct platform_driver fsl_otg_driver = {
  830. .probe = fsl_otg_probe,
  831. .remove = fsl_otg_remove,
  832. .driver = {
  833. .name = driver_name,
  834. .owner = THIS_MODULE,
  835. },
  836. };
  837. module_platform_driver(fsl_otg_driver);
  838. MODULE_DESCRIPTION(DRIVER_INFO);
  839. MODULE_AUTHOR(DRIVER_AUTHOR);
  840. MODULE_LICENSE("GPL");