r8a66597-hcd.c 20 KB

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