r8a66597-hcd.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * R8A66597 HCD (Host Controller Driver) for u-boot
  4. *
  5. * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
  6. */
  7. #include <common.h>
  8. #include <console.h>
  9. #include <dm.h>
  10. #include <usb.h>
  11. #include <asm/io.h>
  12. #include <dm/device_compat.h>
  13. #include <linux/iopoll.h>
  14. #include <power/regulator.h>
  15. #include "r8a66597.h"
  16. #ifdef R8A66597_DEBUG
  17. #define R8A66597_DPRINT printf
  18. #else
  19. #define R8A66597_DPRINT(...)
  20. #endif
  21. static inline struct usb_device *usb_dev_get_parent(struct usb_device *udev)
  22. {
  23. struct udevice *parent = udev->dev->parent;
  24. /*
  25. * When called from usb-uclass.c: usb_scan_device() udev->dev points
  26. * to the parent udevice, not the actual udevice belonging to the
  27. * udev as the device is not instantiated yet.
  28. *
  29. * If dev is an usb-bus, then we are called from usb_scan_device() for
  30. * an usb-device plugged directly into the root port, return NULL.
  31. */
  32. if (device_get_uclass_id(udev->dev) == UCLASS_USB)
  33. return NULL;
  34. /*
  35. * If these 2 are not the same we are being called from
  36. * usb_scan_device() and udev itself is the parent.
  37. */
  38. if (dev_get_parent_priv(udev->dev) != udev)
  39. return udev;
  40. /* We are being called normally, use the parent pointer */
  41. if (device_get_uclass_id(parent) == UCLASS_USB_HUB)
  42. return dev_get_parent_priv(parent);
  43. return NULL;
  44. }
  45. static void get_hub_data(struct usb_device *dev, u16 *hub_devnum, u16 *hubport)
  46. {
  47. struct usb_device *parent = usb_dev_get_parent(dev);
  48. *hub_devnum = 0;
  49. *hubport = 0;
  50. /* check a device connected to root_hub */
  51. if ((parent && parent->devnum == 1) ||
  52. dev->devnum == 1)
  53. return;
  54. *hub_devnum = (u8)parent->devnum;
  55. *hubport = parent->portnr - 1;
  56. }
  57. static void set_devadd(struct r8a66597 *r8a66597, u8 r8a66597_address,
  58. struct usb_device *dev, int port)
  59. {
  60. u16 val, usbspd, upphub, hubport;
  61. unsigned long devadd_reg = get_devadd_addr(r8a66597_address);
  62. get_hub_data(dev, &upphub, &hubport);
  63. usbspd = r8a66597->speed;
  64. val = (upphub << 11) | (hubport << 8) | (usbspd << 6) | (port & 0x0001);
  65. r8a66597_write(r8a66597, val, devadd_reg);
  66. }
  67. static int r8a66597_clock_enable(struct r8a66597 *r8a66597)
  68. {
  69. u16 tmp;
  70. int i = 0;
  71. do {
  72. r8a66597_write(r8a66597, USBE, SYSCFG0);
  73. tmp = r8a66597_read(r8a66597, SYSCFG0);
  74. if (i++ > 1000) {
  75. printf("register access fail.\n");
  76. return -1;
  77. }
  78. } while ((tmp & USBE) != USBE);
  79. r8a66597_bclr(r8a66597, USBE, SYSCFG0);
  80. /*
  81. * RZ/A Only:
  82. * Bits XTAL(UCKSEL) and UPLLE in SYSCFG0 for USB0 controls both USB0
  83. * and USB1, so we must always set the USB0 register
  84. */
  85. #if (CONFIG_R8A66597_XTAL == 1)
  86. r8a66597_bset(r8a66597, XTAL, SYSCFG0);
  87. #endif
  88. mdelay(1);
  89. r8a66597_bset(r8a66597, UPLLE, SYSCFG0);
  90. mdelay(1);
  91. r8a66597_bset(r8a66597, SUSPM, SUSPMODE0);
  92. return 0;
  93. }
  94. static void r8a66597_clock_disable(struct r8a66597 *r8a66597)
  95. {
  96. r8a66597_bclr(r8a66597, SUSPM, SUSPMODE0);
  97. r8a66597_bclr(r8a66597, UPLLE, SYSCFG0);
  98. mdelay(1);
  99. r8a66597_bclr(r8a66597, USBE, SYSCFG0);
  100. mdelay(1);
  101. }
  102. static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)
  103. {
  104. u16 val;
  105. val = port ? DRPD : DCFM | DRPD;
  106. r8a66597_bset(r8a66597, val, get_syscfg_reg(port));
  107. r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port));
  108. }
  109. static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port)
  110. {
  111. u16 val, tmp;
  112. r8a66597_write(r8a66597, 0, get_intenb_reg(port));
  113. r8a66597_write(r8a66597, 0, get_intsts_reg(port));
  114. r8a66597_port_power(r8a66597, port, 0);
  115. do {
  116. tmp = r8a66597_read(r8a66597, SOFCFG) & EDGESTS;
  117. udelay(640);
  118. } while (tmp == EDGESTS);
  119. val = port ? DRPD : DCFM | DRPD;
  120. r8a66597_bclr(r8a66597, val, get_syscfg_reg(port));
  121. r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port));
  122. }
  123. static int enable_controller(struct r8a66597 *r8a66597)
  124. {
  125. int ret, port;
  126. ret = r8a66597_clock_enable(r8a66597);
  127. if (ret < 0)
  128. return ret;
  129. r8a66597_bset(r8a66597, USBE, SYSCFG0);
  130. r8a66597_bset(r8a66597, INTL, SOFCFG);
  131. r8a66597_write(r8a66597, 0, INTENB0);
  132. for (port = 0; port < R8A66597_MAX_ROOT_HUB; port++)
  133. r8a66597_write(r8a66597, 0, get_intenb_reg(port));
  134. r8a66597_bclr(r8a66597, BIGEND, CFIFOSEL);
  135. r8a66597_bclr(r8a66597, BIGEND, D0FIFOSEL);
  136. r8a66597_bclr(r8a66597, BIGEND, D1FIFOSEL);
  137. r8a66597_bset(r8a66597, TRNENSEL, SOFCFG);
  138. for (port = 0; port < R8A66597_MAX_ROOT_HUB; port++)
  139. r8a66597_enable_port(r8a66597, port);
  140. return 0;
  141. }
  142. static void disable_controller(struct r8a66597 *r8a66597)
  143. {
  144. int i;
  145. if (!(r8a66597_read(r8a66597, SYSCFG0) & USBE))
  146. return;
  147. r8a66597_write(r8a66597, 0, INTENB0);
  148. r8a66597_write(r8a66597, 0, INTSTS0);
  149. r8a66597_write(r8a66597, 0, D0FIFOSEL);
  150. r8a66597_write(r8a66597, 0, D1FIFOSEL);
  151. r8a66597_write(r8a66597, 0, DCPCFG);
  152. r8a66597_write(r8a66597, 0x40, DCPMAXP);
  153. r8a66597_write(r8a66597, 0, DCPCTR);
  154. for (i = 0; i <= 10; i++)
  155. r8a66597_write(r8a66597, 0, get_devadd_addr(i));
  156. for (i = 1; i <= 5; i++) {
  157. r8a66597_write(r8a66597, 0, get_pipetre_addr(i));
  158. r8a66597_write(r8a66597, 0, get_pipetrn_addr(i));
  159. }
  160. for (i = 1; i < R8A66597_MAX_NUM_PIPE; i++) {
  161. r8a66597_write(r8a66597, 0, get_pipectr_addr(i));
  162. r8a66597_write(r8a66597, i, PIPESEL);
  163. r8a66597_write(r8a66597, 0, PIPECFG);
  164. r8a66597_write(r8a66597, 0, PIPEBUF);
  165. r8a66597_write(r8a66597, 0, PIPEMAXP);
  166. r8a66597_write(r8a66597, 0, PIPEPERI);
  167. }
  168. for (i = 0; i < R8A66597_MAX_ROOT_HUB; i++)
  169. r8a66597_disable_port(r8a66597, i);
  170. r8a66597_clock_disable(r8a66597);
  171. }
  172. static void r8a66597_reg_wait(struct r8a66597 *r8a66597, unsigned long reg,
  173. u16 mask, u16 loop)
  174. {
  175. u16 tmp;
  176. int i = 0;
  177. do {
  178. tmp = r8a66597_read(r8a66597, reg);
  179. if (i++ > 1000000) {
  180. printf("register%lx, loop %x is timeout\n", reg, loop);
  181. break;
  182. }
  183. } while ((tmp & mask) != loop);
  184. }
  185. static void pipe_buffer_setting(struct r8a66597 *r8a66597,
  186. struct usb_device *dev, unsigned long pipe)
  187. {
  188. u16 val = 0;
  189. u16 pipenum, bufnum, maxpacket;
  190. if (usb_pipein(pipe)) {
  191. pipenum = BULK_IN_PIPENUM;
  192. bufnum = BULK_IN_BUFNUM;
  193. maxpacket = dev->epmaxpacketin[usb_pipeendpoint(pipe)];
  194. } else {
  195. pipenum = BULK_OUT_PIPENUM;
  196. bufnum = BULK_OUT_BUFNUM;
  197. maxpacket = dev->epmaxpacketout[usb_pipeendpoint(pipe)];
  198. }
  199. if (r8a66597->pipe_config & (1 << pipenum))
  200. return;
  201. r8a66597->pipe_config |= (1 << pipenum);
  202. r8a66597_bset(r8a66597, ACLRM, get_pipectr_addr(pipenum));
  203. r8a66597_bclr(r8a66597, ACLRM, get_pipectr_addr(pipenum));
  204. r8a66597_write(r8a66597, pipenum, PIPESEL);
  205. /* FIXME: This driver support bulk transfer only. */
  206. if (!usb_pipein(pipe))
  207. val |= R8A66597_DIR;
  208. else
  209. val |= R8A66597_SHTNAK;
  210. val |= R8A66597_BULK | R8A66597_DBLB | usb_pipeendpoint(pipe);
  211. r8a66597_write(r8a66597, val, PIPECFG);
  212. r8a66597_write(r8a66597, (8 << 10) | bufnum, PIPEBUF);
  213. r8a66597_write(r8a66597, make_devsel(usb_pipedevice(pipe)) |
  214. maxpacket, PIPEMAXP);
  215. r8a66597_write(r8a66597, 0, PIPEPERI);
  216. r8a66597_write(r8a66597, SQCLR, get_pipectr_addr(pipenum));
  217. }
  218. static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev,
  219. struct devrequest *setup)
  220. {
  221. int i;
  222. unsigned short *p = (unsigned short *)setup;
  223. unsigned long setup_addr = USBREQ;
  224. u16 intsts1;
  225. int timeout = 3000;
  226. u16 dcpctr;
  227. u16 devsel = setup->request == USB_REQ_SET_ADDRESS ? 0 : dev->devnum;
  228. r8a66597_write(r8a66597, make_devsel(devsel) |
  229. (8 << dev->maxpacketsize), DCPMAXP);
  230. r8a66597_write(r8a66597, ~(SIGN | SACK), INTSTS1);
  231. dcpctr = r8a66597_read(r8a66597, DCPCTR);
  232. if ((dcpctr & PID) == PID_BUF) {
  233. if (readw_poll_timeout(r8a66597->reg + DCPCTR, dcpctr,
  234. dcpctr & BSTS, 1000) < 0) {
  235. printf("DCPCTR BSTS timeout!\n");
  236. return -ETIMEDOUT;
  237. }
  238. }
  239. for (i = 0; i < 4; i++) {
  240. r8a66597_write(r8a66597, le16_to_cpu(p[i]), setup_addr);
  241. setup_addr += 2;
  242. }
  243. r8a66597_write(r8a66597, ~0x0001, BRDYSTS);
  244. r8a66597_write(r8a66597, SUREQ, DCPCTR);
  245. while (1) {
  246. intsts1 = r8a66597_read(r8a66597, INTSTS1);
  247. if (intsts1 & SACK)
  248. break;
  249. if (intsts1 & SIGN) {
  250. printf("setup packet send error\n");
  251. return -1;
  252. }
  253. if (timeout-- < 0) {
  254. printf("setup packet timeout\n");
  255. return -1;
  256. }
  257. udelay(500);
  258. }
  259. return 0;
  260. }
  261. static int send_bulk_packet(struct r8a66597 *r8a66597, struct usb_device *dev,
  262. unsigned long pipe, void *buffer, int transfer_len)
  263. {
  264. u16 tmp, bufsize;
  265. u16 *buf;
  266. size_t size;
  267. R8A66597_DPRINT("%s\n", __func__);
  268. r8a66597_mdfy(r8a66597, MBW | BULK_OUT_PIPENUM,
  269. MBW | CURPIPE, CFIFOSEL);
  270. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, BULK_OUT_PIPENUM);
  271. tmp = r8a66597_read(r8a66597, CFIFOCTR);
  272. if ((tmp & FRDY) == 0) {
  273. printf("%s FRDY is not set (%x)\n", __func__, tmp);
  274. return -1;
  275. }
  276. /* prepare parameters */
  277. bufsize = dev->epmaxpacketout[usb_pipeendpoint(pipe)];
  278. buf = (u16 *)(buffer + dev->act_len);
  279. size = min((int)bufsize, transfer_len - dev->act_len);
  280. /* write fifo */
  281. r8a66597_write(r8a66597, ~(1 << BULK_OUT_PIPENUM), BEMPSTS);
  282. if (buffer) {
  283. r8a66597_write_fifo(r8a66597, CFIFO, buf, size);
  284. r8a66597_write(r8a66597, BVAL, CFIFOCTR);
  285. }
  286. /* update parameters */
  287. dev->act_len += size;
  288. r8a66597_mdfy(r8a66597, PID_BUF, PID,
  289. get_pipectr_addr(BULK_OUT_PIPENUM));
  290. while (!(r8a66597_read(r8a66597, BEMPSTS) & (1 << BULK_OUT_PIPENUM)))
  291. if (ctrlc())
  292. return -1;
  293. r8a66597_write(r8a66597, ~(1 << BULK_OUT_PIPENUM), BEMPSTS);
  294. if (dev->act_len >= transfer_len)
  295. r8a66597_mdfy(r8a66597, PID_NAK, PID,
  296. get_pipectr_addr(BULK_OUT_PIPENUM));
  297. return 0;
  298. }
  299. static int receive_bulk_packet(struct r8a66597 *r8a66597,
  300. struct usb_device *dev,
  301. unsigned long pipe,
  302. void *buffer, int transfer_len)
  303. {
  304. u16 tmp;
  305. u16 *buf;
  306. const u16 pipenum = BULK_IN_PIPENUM;
  307. int rcv_len;
  308. int maxpacket = dev->epmaxpacketin[usb_pipeendpoint(pipe)];
  309. R8A66597_DPRINT("%s\n", __func__);
  310. /* prepare */
  311. if (dev->act_len == 0) {
  312. r8a66597_mdfy(r8a66597, PID_NAK, PID,
  313. get_pipectr_addr(pipenum));
  314. r8a66597_write(r8a66597, ~(1 << pipenum), BRDYSTS);
  315. r8a66597_write(r8a66597, TRCLR, get_pipetre_addr(pipenum));
  316. r8a66597_write(r8a66597,
  317. (transfer_len + maxpacket - 1) / maxpacket,
  318. get_pipetrn_addr(pipenum));
  319. r8a66597_bset(r8a66597, TRENB, get_pipetre_addr(pipenum));
  320. r8a66597_mdfy(r8a66597, PID_BUF, PID,
  321. get_pipectr_addr(pipenum));
  322. }
  323. r8a66597_mdfy(r8a66597, MBW | pipenum, MBW | CURPIPE, CFIFOSEL);
  324. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, pipenum);
  325. while (!(r8a66597_read(r8a66597, BRDYSTS) & (1 << pipenum)))
  326. if (ctrlc())
  327. return -1;
  328. r8a66597_write(r8a66597, ~(1 << pipenum), BRDYSTS);
  329. tmp = r8a66597_read(r8a66597, CFIFOCTR);
  330. if ((tmp & FRDY) == 0) {
  331. printf("%s FRDY is not set. (%x)\n", __func__, tmp);
  332. return -1;
  333. }
  334. buf = (u16 *)(buffer + dev->act_len);
  335. rcv_len = tmp & DTLN;
  336. dev->act_len += rcv_len;
  337. if (buffer) {
  338. if (rcv_len == 0)
  339. r8a66597_write(r8a66597, BCLR, CFIFOCTR);
  340. else
  341. r8a66597_read_fifo(r8a66597, CFIFO, buf, rcv_len);
  342. }
  343. return 0;
  344. }
  345. static int receive_control_packet(struct r8a66597 *r8a66597,
  346. struct usb_device *dev,
  347. void *buffer, int transfer_len)
  348. {
  349. u16 tmp;
  350. int rcv_len;
  351. /* FIXME: limit transfer size : 64byte or less */
  352. r8a66597_bclr(r8a66597, R8A66597_DIR, DCPCFG);
  353. r8a66597_mdfy(r8a66597, 0, ISEL | CURPIPE, CFIFOSEL);
  354. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0);
  355. r8a66597_bset(r8a66597, SQSET, DCPCTR);
  356. r8a66597_write(r8a66597, BCLR, CFIFOCTR);
  357. r8a66597_mdfy(r8a66597, PID_BUF, PID, DCPCTR);
  358. while (!(r8a66597_read(r8a66597, BRDYSTS) & 0x0001))
  359. if (ctrlc())
  360. return -1;
  361. r8a66597_write(r8a66597, ~0x0001, BRDYSTS);
  362. r8a66597_mdfy(r8a66597, MBW, MBW | CURPIPE, CFIFOSEL);
  363. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0);
  364. tmp = r8a66597_read(r8a66597, CFIFOCTR);
  365. if ((tmp & FRDY) == 0) {
  366. printf("%s FRDY is not set. (%x)\n", __func__, tmp);
  367. return -1;
  368. }
  369. rcv_len = tmp & DTLN;
  370. dev->act_len += rcv_len;
  371. r8a66597_mdfy(r8a66597, PID_NAK, PID, DCPCTR);
  372. if (buffer) {
  373. if (rcv_len == 0)
  374. r8a66597_write(r8a66597, BCLR, DCPCTR);
  375. else
  376. r8a66597_read_fifo(r8a66597, CFIFO, buffer, rcv_len);
  377. }
  378. return 0;
  379. }
  380. static int send_status_packet(struct r8a66597 *r8a66597,
  381. unsigned long pipe)
  382. {
  383. r8a66597_bset(r8a66597, SQSET, DCPCTR);
  384. r8a66597_mdfy(r8a66597, PID_NAK, PID, DCPCTR);
  385. if (usb_pipein(pipe)) {
  386. r8a66597_bset(r8a66597, R8A66597_DIR, DCPCFG);
  387. r8a66597_mdfy(r8a66597, ISEL, ISEL | CURPIPE, CFIFOSEL);
  388. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0);
  389. r8a66597_write(r8a66597, ~BEMP0, BEMPSTS);
  390. r8a66597_write(r8a66597, BCLR | BVAL, CFIFOCTR);
  391. } else {
  392. r8a66597_bclr(r8a66597, R8A66597_DIR, DCPCFG);
  393. r8a66597_mdfy(r8a66597, 0, ISEL | CURPIPE, CFIFOSEL);
  394. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0);
  395. r8a66597_write(r8a66597, BCLR, CFIFOCTR);
  396. }
  397. r8a66597_mdfy(r8a66597, PID_BUF, PID, DCPCTR);
  398. while (!(r8a66597_read(r8a66597, BEMPSTS) & 0x0001))
  399. if (ctrlc())
  400. return -1;
  401. return 0;
  402. }
  403. static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port)
  404. {
  405. int count = R8A66597_MAX_SAMPLING;
  406. unsigned short syssts, old_syssts;
  407. R8A66597_DPRINT("%s\n", __func__);
  408. old_syssts = r8a66597_read(r8a66597, get_syssts_reg(port) & LNST);
  409. while (count > 0) {
  410. mdelay(R8A66597_RH_POLL_TIME);
  411. syssts = r8a66597_read(r8a66597, get_syssts_reg(port) & LNST);
  412. if (syssts == old_syssts) {
  413. count--;
  414. } else {
  415. count = R8A66597_MAX_SAMPLING;
  416. old_syssts = syssts;
  417. }
  418. }
  419. }
  420. static void r8a66597_bus_reset(struct r8a66597 *r8a66597, int port)
  421. {
  422. mdelay(10);
  423. r8a66597_mdfy(r8a66597, USBRST, USBRST | UACT, get_dvstctr_reg(port));
  424. mdelay(50);
  425. r8a66597_mdfy(r8a66597, UACT, USBRST | UACT, get_dvstctr_reg(port));
  426. mdelay(50);
  427. }
  428. static int check_usb_device_connecting(struct r8a66597 *r8a66597)
  429. {
  430. int timeout = 10000; /* 100usec * 10000 = 1sec */
  431. int i;
  432. for (i = 0; i < 5; i++) {
  433. /* check a usb cable connect */
  434. while (!(r8a66597_read(r8a66597, INTSTS1) & ATTCH)) {
  435. if (timeout-- < 0) {
  436. printf("%s timeout.\n", __func__);
  437. return -1;
  438. }
  439. udelay(100);
  440. }
  441. /* check a data line */
  442. r8a66597_check_syssts(r8a66597, 0);
  443. r8a66597_bus_reset(r8a66597, 0);
  444. r8a66597->speed = get_rh_usb_speed(r8a66597, 0);
  445. if (!(r8a66597_read(r8a66597, INTSTS1) & DTCH)) {
  446. r8a66597->port_change = USB_PORT_STAT_C_CONNECTION;
  447. r8a66597->port_status = USB_PORT_STAT_CONNECTION |
  448. USB_PORT_STAT_ENABLE;
  449. return 0; /* success */
  450. }
  451. R8A66597_DPRINT("USB device has detached. retry = %d\n", i);
  452. r8a66597_write(r8a66597, ~DTCH, INTSTS1);
  453. }
  454. return -1; /* fail */
  455. }
  456. /* Virtual Root Hub */
  457. #include <usbroothubdes.h>
  458. static int r8a66597_submit_rh_msg(struct udevice *udev, struct usb_device *dev,
  459. unsigned long pipe, void *buffer,
  460. int transfer_len, struct devrequest *cmd)
  461. {
  462. struct r8a66597 *r8a66597 = dev_get_priv(udev);
  463. int leni = transfer_len;
  464. int len = 0;
  465. int stat = 0;
  466. __u16 bmRType_bReq;
  467. __u16 wValue;
  468. __u16 wLength;
  469. unsigned char data[32];
  470. R8A66597_DPRINT("%s\n", __func__);
  471. if (usb_pipeint(pipe)) {
  472. printf("Root-Hub submit IRQ: NOT implemented");
  473. return 0;
  474. }
  475. bmRType_bReq = cmd->requesttype | (cmd->request << 8);
  476. wValue = cpu_to_le16 (cmd->value);
  477. wLength = cpu_to_le16 (cmd->length);
  478. switch (bmRType_bReq) {
  479. case RH_GET_STATUS:
  480. *(__u16 *)buffer = cpu_to_le16(1);
  481. len = 2;
  482. break;
  483. case RH_GET_STATUS | RH_INTERFACE:
  484. *(__u16 *)buffer = cpu_to_le16(0);
  485. len = 2;
  486. break;
  487. case RH_GET_STATUS | RH_ENDPOINT:
  488. *(__u16 *)buffer = cpu_to_le16(0);
  489. len = 2;
  490. break;
  491. case RH_GET_STATUS | RH_CLASS:
  492. *(__u32 *)buffer = cpu_to_le32(0);
  493. len = 4;
  494. break;
  495. case RH_GET_STATUS | RH_OTHER | RH_CLASS:
  496. *(__u32 *)buffer = cpu_to_le32(r8a66597->port_status |
  497. (r8a66597->port_change << 16));
  498. len = 4;
  499. break;
  500. case RH_CLEAR_FEATURE | RH_ENDPOINT:
  501. case RH_CLEAR_FEATURE | RH_CLASS:
  502. break;
  503. case RH_CLEAR_FEATURE | RH_OTHER | RH_CLASS:
  504. switch (wValue) {
  505. case RH_C_PORT_CONNECTION:
  506. r8a66597->port_change &= ~USB_PORT_STAT_C_CONNECTION;
  507. break;
  508. }
  509. break;
  510. case RH_SET_FEATURE | RH_OTHER | RH_CLASS:
  511. switch (wValue) {
  512. case (RH_PORT_SUSPEND):
  513. break;
  514. case (RH_PORT_RESET):
  515. r8a66597_bus_reset(r8a66597, 0);
  516. break;
  517. case (RH_PORT_POWER):
  518. break;
  519. case (RH_PORT_ENABLE):
  520. break;
  521. }
  522. break;
  523. case RH_SET_ADDRESS:
  524. r8a66597->rh_devnum = wValue;
  525. break;
  526. case RH_GET_DESCRIPTOR:
  527. switch ((wValue & 0xff00) >> 8) {
  528. case (0x01): /* device descriptor */
  529. len = min_t(unsigned int,
  530. leni,
  531. min_t(unsigned int,
  532. sizeof(root_hub_dev_des),
  533. wLength));
  534. memcpy(buffer, root_hub_dev_des, len);
  535. break;
  536. case (0x02): /* configuration descriptor */
  537. len = min_t(unsigned int,
  538. leni,
  539. min_t(unsigned int,
  540. sizeof(root_hub_config_des),
  541. wLength));
  542. memcpy(buffer, root_hub_config_des, len);
  543. break;
  544. case (0x03): /* string descriptors */
  545. if (wValue == 0x0300) {
  546. len = min_t(unsigned int,
  547. leni,
  548. min_t(unsigned int,
  549. sizeof(root_hub_str_index0),
  550. wLength));
  551. memcpy(buffer, root_hub_str_index0, len);
  552. }
  553. if (wValue == 0x0301) {
  554. len = min_t(unsigned int,
  555. leni,
  556. min_t(unsigned int,
  557. sizeof(root_hub_str_index1),
  558. wLength));
  559. memcpy(buffer, root_hub_str_index1, len);
  560. }
  561. break;
  562. default:
  563. stat = USB_ST_STALLED;
  564. }
  565. break;
  566. case RH_GET_DESCRIPTOR | RH_CLASS:
  567. {
  568. __u32 temp = 0x00000001;
  569. data[0] = 9; /* min length; */
  570. data[1] = 0x29;
  571. data[2] = temp & RH_A_NDP;
  572. data[3] = 0;
  573. if (temp & RH_A_PSM)
  574. data[3] |= 0x1;
  575. if (temp & RH_A_NOCP)
  576. data[3] |= 0x10;
  577. else if (temp & RH_A_OCPM)
  578. data[3] |= 0x8;
  579. /* corresponds to data[4-7] */
  580. data[5] = (temp & RH_A_POTPGT) >> 24;
  581. data[7] = temp & RH_B_DR;
  582. if (data[2] < 7) {
  583. data[8] = 0xff;
  584. } else {
  585. data[0] += 2;
  586. data[8] = (temp & RH_B_DR) >> 8;
  587. data[9] = 0xff;
  588. data[10] = 0xff;
  589. }
  590. len = min_t(unsigned int, leni,
  591. min_t(unsigned int, data[0], wLength));
  592. memcpy(buffer, data, len);
  593. break;
  594. }
  595. case RH_GET_CONFIGURATION:
  596. *(__u8 *)buffer = 0x01;
  597. len = 1;
  598. break;
  599. case RH_SET_CONFIGURATION:
  600. break;
  601. default:
  602. R8A66597_DPRINT("unsupported root hub command");
  603. stat = USB_ST_STALLED;
  604. }
  605. mdelay(1);
  606. len = min_t(int, len, leni);
  607. dev->act_len = len;
  608. dev->status = stat;
  609. return stat;
  610. }
  611. static int r8a66597_submit_control_msg(struct udevice *udev,
  612. struct usb_device *dev,
  613. unsigned long pipe, void *buffer,
  614. int length, struct devrequest *setup)
  615. {
  616. struct r8a66597 *r8a66597 = dev_get_priv(udev);
  617. u16 r8a66597_address = setup->request == USB_REQ_SET_ADDRESS ?
  618. 0 : dev->devnum;
  619. debug("%s: dev='%s', udev=%p, udev->dev='%s', portnr=%d\n", __func__,
  620. udev->name, dev, dev->dev->name, dev->portnr);
  621. R8A66597_DPRINT("%s\n", __func__);
  622. if (usb_pipedevice(pipe) == r8a66597->rh_devnum)
  623. return r8a66597_submit_rh_msg(udev, dev, pipe, buffer,
  624. length, setup);
  625. R8A66597_DPRINT("%s: setup\n", __func__);
  626. set_devadd(r8a66597, r8a66597_address, dev, 0);
  627. if (send_setup_packet(r8a66597, dev, setup) < 0) {
  628. printf("setup packet send error\n");
  629. return -1;
  630. }
  631. dev->act_len = 0;
  632. if (usb_pipein(pipe))
  633. if (receive_control_packet(r8a66597, dev, buffer,
  634. length) < 0)
  635. return -1;
  636. if (send_status_packet(r8a66597, pipe) < 0)
  637. return -1;
  638. dev->status = 0;
  639. return 0;
  640. }
  641. static int r8a66597_submit_bulk_msg(struct udevice *udev,
  642. struct usb_device *dev, unsigned long pipe,
  643. void *buffer, int length)
  644. {
  645. struct r8a66597 *r8a66597 = dev_get_priv(udev);
  646. int ret = 0;
  647. debug("%s: dev='%s', udev=%p\n", __func__, udev->name, dev);
  648. R8A66597_DPRINT("%s\n", __func__);
  649. R8A66597_DPRINT("pipe = %08x, buffer = %p, len = %d, devnum = %d\n",
  650. pipe, buffer, length, dev->devnum);
  651. set_devadd(r8a66597, dev->devnum, dev, 0);
  652. pipe_buffer_setting(r8a66597, dev, pipe);
  653. dev->act_len = 0;
  654. while (dev->act_len < length && ret == 0) {
  655. if (ctrlc())
  656. return -1;
  657. if (usb_pipein(pipe))
  658. ret = receive_bulk_packet(r8a66597, dev, pipe, buffer,
  659. length);
  660. else
  661. ret = send_bulk_packet(r8a66597, dev, pipe, buffer,
  662. length);
  663. }
  664. if (ret == 0)
  665. dev->status = 0;
  666. return ret;
  667. }
  668. static int r8a66597_usb_ofdata_to_platdata(struct udevice *dev)
  669. {
  670. struct r8a66597 *priv = dev_get_priv(dev);
  671. fdt_addr_t addr;
  672. addr = dev_read_addr(dev);
  673. if (addr == FDT_ADDR_T_NONE)
  674. return -EINVAL;
  675. priv->reg = addr;
  676. return 0;
  677. }
  678. static int r8a66597_usb_probe(struct udevice *dev)
  679. {
  680. struct r8a66597 *priv = dev_get_priv(dev);
  681. struct usb_bus_priv *bus_priv = dev_get_uclass_priv(dev);
  682. int ret;
  683. bus_priv->desc_before_addr = true;
  684. if (CONFIG_IS_ENABLED(DM_REGULATOR)) {
  685. ret = device_get_supply_regulator(dev, "vbus-supply",
  686. &priv->vbus_supply);
  687. if (ret) {
  688. dev_err(dev,
  689. "can't get VBUS supply\n");
  690. return ret;
  691. }
  692. ret = regulator_set_enable(priv->vbus_supply, true);
  693. if (ret) {
  694. dev_err(dev,
  695. "can't enable VBUS supply\n");
  696. return ret;
  697. }
  698. }
  699. disable_controller(priv);
  700. mdelay(100);
  701. enable_controller(priv);
  702. r8a66597_port_power(priv, 0, 1);
  703. /* check usb device */
  704. check_usb_device_connecting(priv);
  705. mdelay(50);
  706. return 0;
  707. }
  708. static int r8a66597_usb_remove(struct udevice *dev)
  709. {
  710. struct r8a66597 *priv = dev_get_priv(dev);
  711. int ret;
  712. disable_controller(priv);
  713. if (CONFIG_IS_ENABLED(DM_REGULATOR)) {
  714. ret = regulator_set_enable(priv->vbus_supply, false);
  715. if (ret) {
  716. dev_err(dev,
  717. "can't disable VBUS supply\n");
  718. return ret;
  719. }
  720. }
  721. return 0;
  722. }
  723. struct dm_usb_ops r8a66597_usb_ops = {
  724. .control = r8a66597_submit_control_msg,
  725. .bulk = r8a66597_submit_bulk_msg,
  726. };
  727. static const struct udevice_id r8a66597_usb_ids[] = {
  728. { .compatible = "renesas,rza1-usbhs" },
  729. { }
  730. };
  731. U_BOOT_DRIVER(usb_r8a66597) = {
  732. .name = "r8a66597_usb",
  733. .id = UCLASS_USB,
  734. .of_match = r8a66597_usb_ids,
  735. .ofdata_to_platdata = r8a66597_usb_ofdata_to_platdata,
  736. .probe = r8a66597_usb_probe,
  737. .remove = r8a66597_usb_remove,
  738. .ops = &r8a66597_usb_ops,
  739. .priv_auto_alloc_size = sizeof(struct r8a66597),
  740. .flags = DM_FLAG_ALLOC_PRIV_DMA,
  741. };