r8a66597-hcd.c 21 KB

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