r8a66597-hcd.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  1. /*
  2. * R8A66597 HCD (Host Controller Driver) for u-boot
  3. *
  4. * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; version 2 of the License.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  18. *
  19. */
  20. #include <common.h>
  21. #include <usb.h>
  22. #include <asm/io.h>
  23. #include "r8a66597.h"
  24. #ifdef R8A66597_DEBUG
  25. #define R8A66597_DPRINT printf
  26. #else
  27. #define R8A66597_DPRINT(...)
  28. #endif
  29. static const char hcd_name[] = "r8a66597_hcd";
  30. static unsigned short clock = CONFIG_R8A66597_XTAL;
  31. static unsigned short vif = CONFIG_R8A66597_LDRV;
  32. static unsigned short endian = CONFIG_R8A66597_ENDIAN;
  33. static struct r8a66597 gr8a66597;
  34. static void get_hub_data(struct usb_device *dev, u16 *hub_devnum, u16 *hubport)
  35. {
  36. int i;
  37. *hub_devnum = 0;
  38. *hubport = 0;
  39. /* check a device connected to root_hub */
  40. if ((dev->parent && dev->parent->devnum == 1) ||
  41. (dev->devnum == 1))
  42. return;
  43. for (i = 0; i < USB_MAXCHILDREN; i++) {
  44. if (dev->parent->children[i] == dev) {
  45. *hub_devnum = (u8)dev->parent->devnum;
  46. *hubport = i;
  47. return;
  48. }
  49. }
  50. printf("get_hub_data error.\n");
  51. }
  52. static void set_devadd(struct r8a66597 *r8a66597, u8 r8a66597_address,
  53. struct usb_device *dev, int port)
  54. {
  55. u16 val, usbspd, upphub, hubport;
  56. unsigned long devadd_reg = get_devadd_addr(r8a66597_address);
  57. get_hub_data(dev, &upphub, &hubport);
  58. usbspd = r8a66597->speed;
  59. val = (upphub << 11) | (hubport << 8) | (usbspd << 6) | (port & 0x0001);
  60. r8a66597_write(r8a66597, val, devadd_reg);
  61. }
  62. static int r8a66597_clock_enable(struct r8a66597 *r8a66597)
  63. {
  64. u16 tmp;
  65. int i = 0;
  66. #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597)
  67. do {
  68. r8a66597_write(r8a66597, SCKE, SYSCFG0);
  69. tmp = r8a66597_read(r8a66597, SYSCFG0);
  70. if (i++ > 1000) {
  71. printf("register access fail.\n");
  72. return -1;
  73. }
  74. } while ((tmp & SCKE) != SCKE);
  75. r8a66597_write(r8a66597, 0x04, 0x02);
  76. #else
  77. do {
  78. r8a66597_write(r8a66597, USBE, SYSCFG0);
  79. tmp = r8a66597_read(r8a66597, SYSCFG0);
  80. if (i++ > 1000) {
  81. printf("register access fail.\n");
  82. return -1;
  83. }
  84. } while ((tmp & USBE) != USBE);
  85. r8a66597_bclr(r8a66597, USBE, SYSCFG0);
  86. r8a66597_mdfy(r8a66597, clock, XTAL, SYSCFG0);
  87. i = 0;
  88. r8a66597_bset(r8a66597, XCKE, SYSCFG0);
  89. do {
  90. udelay(1000);
  91. tmp = r8a66597_read(r8a66597, SYSCFG0);
  92. if (i++ > 500) {
  93. printf("register access fail.\n");
  94. return -1;
  95. }
  96. } while ((tmp & SCKE) != SCKE);
  97. #endif /* #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) */
  98. return 0;
  99. }
  100. static void r8a66597_clock_disable(struct r8a66597 *r8a66597)
  101. {
  102. r8a66597_bclr(r8a66597, SCKE, SYSCFG0);
  103. udelay(1);
  104. #if !defined(CONFIG_SUPERH_ON_CHIP_R8A66597)
  105. r8a66597_bclr(r8a66597, PLLC, SYSCFG0);
  106. r8a66597_bclr(r8a66597, XCKE, SYSCFG0);
  107. r8a66597_bclr(r8a66597, USBE, SYSCFG0);
  108. #endif
  109. }
  110. static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)
  111. {
  112. u16 val;
  113. val = port ? DRPD : DCFM | DRPD;
  114. r8a66597_bset(r8a66597, val, get_syscfg_reg(port));
  115. r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port));
  116. r8a66597_write(r8a66597, BURST | CPU_ADR_RD_WR, get_dmacfg_reg(port));
  117. }
  118. static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port)
  119. {
  120. u16 val, tmp;
  121. r8a66597_write(r8a66597, 0, get_intenb_reg(port));
  122. r8a66597_write(r8a66597, 0, get_intsts_reg(port));
  123. r8a66597_port_power(r8a66597, port, 0);
  124. do {
  125. tmp = r8a66597_read(r8a66597, SOFCFG) & EDGESTS;
  126. udelay(640);
  127. } while (tmp == EDGESTS);
  128. val = port ? DRPD : DCFM | DRPD;
  129. r8a66597_bclr(r8a66597, val, get_syscfg_reg(port));
  130. r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port));
  131. }
  132. static int enable_controller(struct r8a66597 *r8a66597)
  133. {
  134. int ret, port;
  135. ret = r8a66597_clock_enable(r8a66597);
  136. if (ret < 0)
  137. return ret;
  138. r8a66597_bset(r8a66597, vif & LDRV, PINCFG);
  139. r8a66597_bset(r8a66597, USBE, SYSCFG0);
  140. r8a66597_bset(r8a66597, INTL, SOFCFG);
  141. r8a66597_write(r8a66597, 0, INTENB0);
  142. r8a66597_write(r8a66597, 0, INTENB1);
  143. r8a66597_write(r8a66597, 0, INTENB2);
  144. r8a66597_bset(r8a66597, endian & BIGEND, CFIFOSEL);
  145. r8a66597_bset(r8a66597, endian & BIGEND, D0FIFOSEL);
  146. r8a66597_bset(r8a66597, endian & BIGEND, D1FIFOSEL);
  147. r8a66597_bset(r8a66597, TRNENSEL, SOFCFG);
  148. for (port = 0; port < R8A66597_MAX_ROOT_HUB; port++)
  149. r8a66597_enable_port(r8a66597, port);
  150. return 0;
  151. }
  152. static void disable_controller(struct r8a66597 *r8a66597)
  153. {
  154. int i;
  155. if (!(r8a66597_read(r8a66597, SYSCFG0) & USBE))
  156. return;
  157. r8a66597_write(r8a66597, 0, INTENB0);
  158. r8a66597_write(r8a66597, 0, INTSTS0);
  159. r8a66597_write(r8a66597, 0, D0FIFOSEL);
  160. r8a66597_write(r8a66597, 0, D1FIFOSEL);
  161. r8a66597_write(r8a66597, 0, DCPCFG);
  162. r8a66597_write(r8a66597, 0x40, DCPMAXP);
  163. r8a66597_write(r8a66597, 0, DCPCTR);
  164. for (i = 0; i <= 10; i++)
  165. r8a66597_write(r8a66597, 0, get_devadd_addr(i));
  166. for (i = 1; i <= 5; i++) {
  167. r8a66597_write(r8a66597, 0, get_pipetre_addr(i));
  168. r8a66597_write(r8a66597, 0, get_pipetrn_addr(i));
  169. }
  170. for (i = 1; i < R8A66597_MAX_NUM_PIPE; i++) {
  171. r8a66597_write(r8a66597, 0, get_pipectr_addr(i));
  172. r8a66597_write(r8a66597, i, PIPESEL);
  173. r8a66597_write(r8a66597, 0, PIPECFG);
  174. r8a66597_write(r8a66597, 0, PIPEBUF);
  175. r8a66597_write(r8a66597, 0, PIPEMAXP);
  176. r8a66597_write(r8a66597, 0, PIPEPERI);
  177. }
  178. for (i = 0; i < R8A66597_MAX_ROOT_HUB; i++)
  179. r8a66597_disable_port(r8a66597, i);
  180. r8a66597_clock_disable(r8a66597);
  181. }
  182. static void r8a66597_reg_wait(struct r8a66597 *r8a66597, unsigned long reg,
  183. u16 mask, u16 loop)
  184. {
  185. u16 tmp;
  186. int i = 0;
  187. do {
  188. tmp = r8a66597_read(r8a66597, reg);
  189. if (i++ > 1000000) {
  190. printf("register%lx, loop %x is timeout\n", reg, loop);
  191. break;
  192. }
  193. } while ((tmp & mask) != loop);
  194. }
  195. static void pipe_buffer_setting(struct r8a66597 *r8a66597,
  196. struct usb_device *dev, unsigned long pipe)
  197. {
  198. u16 val = 0;
  199. u16 pipenum, bufnum, maxpacket;
  200. if (usb_pipein(pipe)) {
  201. pipenum = BULK_IN_PIPENUM;
  202. bufnum = BULK_IN_BUFNUM;
  203. maxpacket = dev->epmaxpacketin[usb_pipeendpoint(pipe)];
  204. } else {
  205. pipenum = BULK_OUT_PIPENUM;
  206. bufnum = BULK_OUT_BUFNUM;
  207. maxpacket = dev->epmaxpacketout[usb_pipeendpoint(pipe)];
  208. }
  209. if (r8a66597->pipe_config & (1 << pipenum))
  210. return;
  211. r8a66597->pipe_config |= (1 << pipenum);
  212. r8a66597_bset(r8a66597, ACLRM, get_pipectr_addr(pipenum));
  213. r8a66597_bclr(r8a66597, ACLRM, get_pipectr_addr(pipenum));
  214. r8a66597_write(r8a66597, pipenum, PIPESEL);
  215. /* FIXME: This driver support bulk transfer only. */
  216. if (!usb_pipein(pipe))
  217. val |= R8A66597_DIR;
  218. else
  219. val |= R8A66597_SHTNAK;
  220. val |= R8A66597_BULK | R8A66597_DBLB | usb_pipeendpoint(pipe);
  221. r8a66597_write(r8a66597, val, PIPECFG);
  222. r8a66597_write(r8a66597, (8 << 10) | bufnum, PIPEBUF);
  223. r8a66597_write(r8a66597, make_devsel(usb_pipedevice(pipe)) |
  224. maxpacket, PIPEMAXP);
  225. r8a66597_write(r8a66597, 0, PIPEPERI);
  226. r8a66597_write(r8a66597, SQCLR, get_pipectr_addr(pipenum));
  227. }
  228. static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev,
  229. struct devrequest *setup)
  230. {
  231. int i;
  232. unsigned short *p = (unsigned short *)setup;
  233. unsigned long setup_addr = USBREQ;
  234. u16 intsts1;
  235. int timeout = 3000;
  236. u16 devsel = setup->request == USB_REQ_SET_ADDRESS ? 0 : dev->devnum;
  237. r8a66597_write(r8a66597, make_devsel(devsel) |
  238. (8 << dev->maxpacketsize), DCPMAXP);
  239. r8a66597_write(r8a66597, ~(SIGN | SACK), INTSTS1);
  240. for (i = 0; i < 4; i++) {
  241. r8a66597_write(r8a66597, le16_to_cpu(p[i]), setup_addr);
  242. setup_addr += 2;
  243. }
  244. r8a66597_write(r8a66597, ~0x0001, BRDYSTS);
  245. r8a66597_write(r8a66597, SUREQ, DCPCTR);
  246. while (1) {
  247. intsts1 = r8a66597_read(r8a66597, INTSTS1);
  248. if (intsts1 & SACK)
  249. break;
  250. if (intsts1 & SIGN) {
  251. printf("setup packet send error\n");
  252. return -1;
  253. }
  254. if (timeout-- < 0) {
  255. printf("setup packet timeout\n");
  256. return -1;
  257. }
  258. udelay(500);
  259. }
  260. return 0;
  261. }
  262. static int send_bulk_packet(struct r8a66597 *r8a66597, struct usb_device *dev,
  263. unsigned long pipe, void *buffer, int transfer_len)
  264. {
  265. u16 tmp, bufsize;
  266. u16 *buf;
  267. size_t size;
  268. R8A66597_DPRINT("%s\n", __func__);
  269. r8a66597_mdfy(r8a66597, MBW | BULK_OUT_PIPENUM,
  270. MBW | CURPIPE, CFIFOSEL);
  271. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, BULK_OUT_PIPENUM);
  272. tmp = r8a66597_read(r8a66597, CFIFOCTR);
  273. if ((tmp & FRDY) == 0) {
  274. printf("%s FRDY is not set (%x)\n", __func__, tmp);
  275. return -1;
  276. }
  277. /* prepare parameters */
  278. bufsize = dev->epmaxpacketout[usb_pipeendpoint(pipe)];
  279. buf = (u16 *)(buffer + dev->act_len);
  280. size = min((int)bufsize, transfer_len - dev->act_len);
  281. /* write fifo */
  282. r8a66597_write(r8a66597, ~(1 << BULK_OUT_PIPENUM), BEMPSTS);
  283. if (buffer) {
  284. r8a66597_write_fifo(r8a66597, CFIFO, buf, size);
  285. r8a66597_write(r8a66597, BVAL, CFIFOCTR);
  286. }
  287. /* update parameters */
  288. dev->act_len += size;
  289. r8a66597_mdfy(r8a66597, PID_BUF, PID,
  290. get_pipectr_addr(BULK_OUT_PIPENUM));
  291. while (!(r8a66597_read(r8a66597, BEMPSTS) & (1 << BULK_OUT_PIPENUM)))
  292. if (ctrlc())
  293. return -1;
  294. r8a66597_write(r8a66597, ~(1 << BULK_OUT_PIPENUM), BEMPSTS);
  295. if (dev->act_len >= transfer_len)
  296. r8a66597_mdfy(r8a66597, PID_NAK, PID,
  297. get_pipectr_addr(BULK_OUT_PIPENUM));
  298. return 0;
  299. }
  300. static int receive_bulk_packet(struct r8a66597 *r8a66597,
  301. struct usb_device *dev,
  302. unsigned long pipe,
  303. void *buffer, int transfer_len)
  304. {
  305. u16 tmp;
  306. u16 *buf;
  307. const u16 pipenum = BULK_IN_PIPENUM;
  308. int rcv_len;
  309. int maxpacket = dev->epmaxpacketin[usb_pipeendpoint(pipe)];
  310. R8A66597_DPRINT("%s\n", __func__);
  311. /* prepare */
  312. if (dev->act_len == 0) {
  313. r8a66597_mdfy(r8a66597, PID_NAK, PID,
  314. get_pipectr_addr(pipenum));
  315. r8a66597_write(r8a66597, ~(1 << pipenum), BRDYSTS);
  316. r8a66597_write(r8a66597, TRCLR, get_pipetre_addr(pipenum));
  317. r8a66597_write(r8a66597,
  318. (transfer_len + maxpacket - 1) / maxpacket,
  319. get_pipetrn_addr(pipenum));
  320. r8a66597_bset(r8a66597, TRENB, get_pipetre_addr(pipenum));
  321. r8a66597_mdfy(r8a66597, PID_BUF, PID,
  322. get_pipectr_addr(pipenum));
  323. }
  324. r8a66597_mdfy(r8a66597, MBW | pipenum, MBW | CURPIPE, CFIFOSEL);
  325. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, pipenum);
  326. while (!(r8a66597_read(r8a66597, BRDYSTS) & (1 << pipenum)))
  327. if (ctrlc())
  328. return -1;
  329. r8a66597_write(r8a66597, ~(1 << pipenum), BRDYSTS);
  330. tmp = r8a66597_read(r8a66597, CFIFOCTR);
  331. if ((tmp & FRDY) == 0) {
  332. printf("%s FRDY is not set. (%x)\n", __func__, tmp);
  333. return -1;
  334. }
  335. buf = (u16 *)(buffer + dev->act_len);
  336. rcv_len = tmp & DTLN;
  337. dev->act_len += rcv_len;
  338. if (buffer) {
  339. if (rcv_len == 0)
  340. r8a66597_write(r8a66597, BCLR, CFIFOCTR);
  341. else
  342. r8a66597_read_fifo(r8a66597, CFIFO, buf, rcv_len);
  343. }
  344. return 0;
  345. }
  346. static int receive_control_packet(struct r8a66597 *r8a66597,
  347. struct usb_device *dev,
  348. void *buffer, int transfer_len)
  349. {
  350. u16 tmp;
  351. int rcv_len;
  352. /* FIXME: limit transfer size : 64byte or less */
  353. r8a66597_bclr(r8a66597, R8A66597_DIR, DCPCFG);
  354. r8a66597_mdfy(r8a66597, 0, ISEL | CURPIPE, CFIFOSEL);
  355. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0);
  356. r8a66597_bset(r8a66597, SQSET, DCPCTR);
  357. r8a66597_write(r8a66597, BCLR, CFIFOCTR);
  358. r8a66597_mdfy(r8a66597, PID_BUF, PID, DCPCTR);
  359. while (!(r8a66597_read(r8a66597, BRDYSTS) & 0x0001))
  360. if (ctrlc())
  361. return -1;
  362. r8a66597_write(r8a66597, ~0x0001, BRDYSTS);
  363. r8a66597_mdfy(r8a66597, MBW, MBW | CURPIPE, CFIFOSEL);
  364. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0);
  365. tmp = r8a66597_read(r8a66597, CFIFOCTR);
  366. if ((tmp & FRDY) == 0) {
  367. printf("%s FRDY is not set. (%x)\n", __func__, tmp);
  368. return -1;
  369. }
  370. rcv_len = tmp & DTLN;
  371. dev->act_len += rcv_len;
  372. r8a66597_mdfy(r8a66597, PID_NAK, PID, DCPCTR);
  373. if (buffer) {
  374. if (rcv_len == 0)
  375. r8a66597_write(r8a66597, BCLR, DCPCTR);
  376. else
  377. r8a66597_read_fifo(r8a66597, CFIFO, buffer, rcv_len);
  378. }
  379. return 0;
  380. }
  381. static int send_status_packet(struct r8a66597 *r8a66597,
  382. unsigned long pipe)
  383. {
  384. r8a66597_bset(r8a66597, SQSET, DCPCTR);
  385. r8a66597_mdfy(r8a66597, PID_NAK, PID, DCPCTR);
  386. if (usb_pipein(pipe)) {
  387. r8a66597_bset(r8a66597, R8A66597_DIR, DCPCFG);
  388. r8a66597_mdfy(r8a66597, ISEL, ISEL | CURPIPE, CFIFOSEL);
  389. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0);
  390. r8a66597_write(r8a66597, ~BEMP0, BEMPSTS);
  391. r8a66597_write(r8a66597, BCLR | BVAL, CFIFOCTR);
  392. } else {
  393. r8a66597_bclr(r8a66597, R8A66597_DIR, DCPCFG);
  394. r8a66597_mdfy(r8a66597, 0, ISEL | CURPIPE, CFIFOSEL);
  395. r8a66597_reg_wait(r8a66597, CFIFOSEL, CURPIPE, 0);
  396. r8a66597_write(r8a66597, BCLR, CFIFOCTR);
  397. }
  398. r8a66597_mdfy(r8a66597, PID_BUF, PID, DCPCTR);
  399. while (!(r8a66597_read(r8a66597, BEMPSTS) & 0x0001))
  400. if (ctrlc())
  401. return -1;
  402. return 0;
  403. }
  404. static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port)
  405. {
  406. int count = R8A66597_MAX_SAMPLING;
  407. unsigned short syssts, old_syssts;
  408. R8A66597_DPRINT("%s\n", __func__);
  409. old_syssts = r8a66597_read(r8a66597, get_syssts_reg(port) & LNST);
  410. while (count > 0) {
  411. wait_ms(R8A66597_RH_POLL_TIME);
  412. syssts = r8a66597_read(r8a66597, get_syssts_reg(port) & LNST);
  413. if (syssts == old_syssts) {
  414. count--;
  415. } else {
  416. count = R8A66597_MAX_SAMPLING;
  417. old_syssts = syssts;
  418. }
  419. }
  420. }
  421. static void r8a66597_bus_reset(struct r8a66597 *r8a66597, int port)
  422. {
  423. wait_ms(10);
  424. r8a66597_mdfy(r8a66597, USBRST, USBRST | UACT, get_dvstctr_reg(port));
  425. wait_ms(50);
  426. r8a66597_mdfy(r8a66597, UACT, USBRST | UACT, get_dvstctr_reg(port));
  427. wait_ms(50);
  428. }
  429. static int check_usb_device_connecting(struct r8a66597 *r8a66597)
  430. {
  431. int timeout = 10000; /* 100usec * 10000 = 1sec */
  432. int i;
  433. for (i = 0; i < 5; i++) {
  434. /* check a usb cable connect */
  435. while (!(r8a66597_read(r8a66597, INTSTS1) & ATTCH)) {
  436. if (timeout-- < 0) {
  437. printf("%s timeout.\n", __func__);
  438. return -1;
  439. }
  440. udelay(100);
  441. }
  442. /* check a data line */
  443. r8a66597_check_syssts(r8a66597, 0);
  444. r8a66597_bus_reset(r8a66597, 0);
  445. r8a66597->speed = get_rh_usb_speed(r8a66597, 0);
  446. if (!(r8a66597_read(r8a66597, INTSTS1) & DTCH)) {
  447. r8a66597->port_change = USB_PORT_STAT_C_CONNECTION;
  448. r8a66597->port_status = USB_PORT_STAT_CONNECTION |
  449. USB_PORT_STAT_ENABLE;
  450. return 0; /* success */
  451. }
  452. R8A66597_DPRINT("USB device has detached. retry = %d\n", i);
  453. r8a66597_write(r8a66597, ~DTCH, INTSTS1);
  454. }
  455. return -1; /* fail */
  456. }
  457. /* based on usb_ohci.c */
  458. #define min_t(type, x, y) \
  459. ({ type __x = (x); type __y = (y); __x < __y ? __x : __y; })
  460. /*-------------------------------------------------------------------------*
  461. * Virtual Root Hub
  462. *-------------------------------------------------------------------------*/
  463. /* Device descriptor */
  464. static __u8 root_hub_dev_des[] =
  465. {
  466. 0x12, /* __u8 bLength; */
  467. 0x01, /* __u8 bDescriptorType; Device */
  468. 0x10, /* __u16 bcdUSB; v1.1 */
  469. 0x01,
  470. 0x09, /* __u8 bDeviceClass; HUB_CLASSCODE */
  471. 0x00, /* __u8 bDeviceSubClass; */
  472. 0x00, /* __u8 bDeviceProtocol; */
  473. 0x08, /* __u8 bMaxPacketSize0; 8 Bytes */
  474. 0x00, /* __u16 idVendor; */
  475. 0x00,
  476. 0x00, /* __u16 idProduct; */
  477. 0x00,
  478. 0x00, /* __u16 bcdDevice; */
  479. 0x00,
  480. 0x00, /* __u8 iManufacturer; */
  481. 0x01, /* __u8 iProduct; */
  482. 0x00, /* __u8 iSerialNumber; */
  483. 0x01 /* __u8 bNumConfigurations; */
  484. };
  485. /* Configuration descriptor */
  486. static __u8 root_hub_config_des[] =
  487. {
  488. 0x09, /* __u8 bLength; */
  489. 0x02, /* __u8 bDescriptorType; Configuration */
  490. 0x19, /* __u16 wTotalLength; */
  491. 0x00,
  492. 0x01, /* __u8 bNumInterfaces; */
  493. 0x01, /* __u8 bConfigurationValue; */
  494. 0x00, /* __u8 iConfiguration; */
  495. 0x40, /* __u8 bmAttributes; */
  496. 0x00, /* __u8 MaxPower; */
  497. /* interface */
  498. 0x09, /* __u8 if_bLength; */
  499. 0x04, /* __u8 if_bDescriptorType; Interface */
  500. 0x00, /* __u8 if_bInterfaceNumber; */
  501. 0x00, /* __u8 if_bAlternateSetting; */
  502. 0x01, /* __u8 if_bNumEndpoints; */
  503. 0x09, /* __u8 if_bInterfaceClass; HUB_CLASSCODE */
  504. 0x00, /* __u8 if_bInterfaceSubClass; */
  505. 0x00, /* __u8 if_bInterfaceProtocol; */
  506. 0x00, /* __u8 if_iInterface; */
  507. /* endpoint */
  508. 0x07, /* __u8 ep_bLength; */
  509. 0x05, /* __u8 ep_bDescriptorType; Endpoint */
  510. 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */
  511. 0x03, /* __u8 ep_bmAttributes; Interrupt */
  512. 0x02, /* __u16 ep_wMaxPacketSize; ((MAX_ROOT_PORTS + 1) / 8 */
  513. 0x00,
  514. 0xff /* __u8 ep_bInterval; 255 ms */
  515. };
  516. static unsigned char root_hub_str_index0[] =
  517. {
  518. 0x04, /* __u8 bLength; */
  519. 0x03, /* __u8 bDescriptorType; String-descriptor */
  520. 0x09, /* __u8 lang ID */
  521. 0x04, /* __u8 lang ID */
  522. };
  523. static unsigned char root_hub_str_index1[] =
  524. {
  525. 34, /* __u8 bLength; */
  526. 0x03, /* __u8 bDescriptorType; String-descriptor */
  527. 'R', /* __u8 Unicode */
  528. 0, /* __u8 Unicode */
  529. '8', /* __u8 Unicode */
  530. 0, /* __u8 Unicode */
  531. 'A', /* __u8 Unicode */
  532. 0, /* __u8 Unicode */
  533. '6', /* __u8 Unicode */
  534. 0, /* __u8 Unicode */
  535. '6', /* __u8 Unicode */
  536. 0, /* __u8 Unicode */
  537. '5', /* __u8 Unicode */
  538. 0, /* __u8 Unicode */
  539. '9', /* __u8 Unicode */
  540. 0, /* __u8 Unicode */
  541. '7', /* __u8 Unicode */
  542. 0, /* __u8 Unicode */
  543. ' ', /* __u8 Unicode */
  544. 0, /* __u8 Unicode */
  545. 'R', /* __u8 Unicode */
  546. 0, /* __u8 Unicode */
  547. 'o', /* __u8 Unicode */
  548. 0, /* __u8 Unicode */
  549. 'o', /* __u8 Unicode */
  550. 0, /* __u8 Unicode */
  551. 't', /* __u8 Unicode */
  552. 0, /* __u8 Unicode */
  553. 'H', /* __u8 Unicode */
  554. 0, /* __u8 Unicode */
  555. 'u', /* __u8 Unicode */
  556. 0, /* __u8 Unicode */
  557. 'b', /* __u8 Unicode */
  558. 0, /* __u8 Unicode */
  559. };
  560. static int r8a66597_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
  561. void *buffer, int transfer_len, struct devrequest *cmd)
  562. {
  563. struct r8a66597 *r8a66597 = &gr8a66597;
  564. int leni = transfer_len;
  565. int len = 0;
  566. int stat = 0;
  567. __u16 bmRType_bReq;
  568. __u16 wValue;
  569. __u16 wIndex;
  570. __u16 wLength;
  571. unsigned char data[32];
  572. R8A66597_DPRINT("%s\n", __func__);
  573. if (usb_pipeint(pipe)) {
  574. printf("Root-Hub submit IRQ: NOT implemented");
  575. return 0;
  576. }
  577. bmRType_bReq = cmd->requesttype | (cmd->request << 8);
  578. wValue = cpu_to_le16 (cmd->value);
  579. wIndex = cpu_to_le16 (cmd->index);
  580. wLength = cpu_to_le16 (cmd->length);
  581. switch (bmRType_bReq) {
  582. case RH_GET_STATUS:
  583. *(__u16 *)buffer = cpu_to_le16(1);
  584. len = 2;
  585. break;
  586. case RH_GET_STATUS | RH_INTERFACE:
  587. *(__u16 *)buffer = cpu_to_le16(0);
  588. len = 2;
  589. break;
  590. case RH_GET_STATUS | RH_ENDPOINT:
  591. *(__u16 *)buffer = cpu_to_le16(0);
  592. len = 2;
  593. break;
  594. case RH_GET_STATUS | RH_CLASS:
  595. *(__u32 *)buffer = cpu_to_le32(0);
  596. len = 4;
  597. break;
  598. case RH_GET_STATUS | RH_OTHER | RH_CLASS:
  599. *(__u32 *)buffer = cpu_to_le32(r8a66597->port_status |
  600. (r8a66597->port_change << 16));
  601. len = 4;
  602. break;
  603. case RH_CLEAR_FEATURE | RH_ENDPOINT:
  604. case RH_CLEAR_FEATURE | RH_CLASS:
  605. break;
  606. case RH_CLEAR_FEATURE | RH_OTHER | RH_CLASS:
  607. switch (wValue) {
  608. case RH_C_PORT_CONNECTION:
  609. r8a66597->port_change &= ~USB_PORT_STAT_C_CONNECTION;
  610. break;
  611. }
  612. break;
  613. case RH_SET_FEATURE | RH_OTHER | RH_CLASS:
  614. switch (wValue) {
  615. case (RH_PORT_SUSPEND):
  616. break;
  617. case (RH_PORT_RESET):
  618. r8a66597_bus_reset(r8a66597, 0);
  619. break;
  620. case (RH_PORT_POWER):
  621. break;
  622. case (RH_PORT_ENABLE):
  623. break;
  624. }
  625. break;
  626. case RH_SET_ADDRESS:
  627. gr8a66597.rh_devnum = wValue;
  628. break;
  629. case RH_GET_DESCRIPTOR:
  630. switch ((wValue & 0xff00) >> 8) {
  631. case (0x01): /* device descriptor */
  632. len = min_t(unsigned int,
  633. leni,
  634. min_t(unsigned int,
  635. sizeof(root_hub_dev_des),
  636. wLength));
  637. memcpy(buffer, root_hub_dev_des, len);
  638. break;
  639. case (0x02): /* configuration descriptor */
  640. len = min_t(unsigned int,
  641. leni,
  642. min_t(unsigned int,
  643. sizeof(root_hub_config_des),
  644. wLength));
  645. memcpy(buffer, root_hub_config_des, len);
  646. break;
  647. case (0x03): /* string descriptors */
  648. if (wValue == 0x0300) {
  649. len = min_t(unsigned int,
  650. leni,
  651. min_t(unsigned int,
  652. sizeof(root_hub_str_index0),
  653. wLength));
  654. memcpy(buffer, root_hub_str_index0, len);
  655. }
  656. if (wValue == 0x0301) {
  657. len = min_t(unsigned int,
  658. leni,
  659. min_t(unsigned int,
  660. sizeof(root_hub_str_index1),
  661. wLength));
  662. memcpy(buffer, root_hub_str_index1, len);
  663. }
  664. break;
  665. default:
  666. stat = USB_ST_STALLED;
  667. }
  668. break;
  669. case RH_GET_DESCRIPTOR | RH_CLASS:
  670. {
  671. __u32 temp = 0x00000001;
  672. data[0] = 9; /* min length; */
  673. data[1] = 0x29;
  674. data[2] = temp & RH_A_NDP;
  675. data[3] = 0;
  676. if (temp & RH_A_PSM)
  677. data[3] |= 0x1;
  678. if (temp & RH_A_NOCP)
  679. data[3] |= 0x10;
  680. else if (temp & RH_A_OCPM)
  681. data[3] |= 0x8;
  682. /* corresponds to data[4-7] */
  683. data[5] = (temp & RH_A_POTPGT) >> 24;
  684. data[7] = temp & RH_B_DR;
  685. if (data[2] < 7) {
  686. data[8] = 0xff;
  687. } else {
  688. data[0] += 2;
  689. data[8] = (temp & RH_B_DR) >> 8;
  690. data[10] = data[9] = 0xff;
  691. }
  692. len = min_t(unsigned int, leni,
  693. min_t(unsigned int, data[0], wLength));
  694. memcpy(buffer, data, len);
  695. break;
  696. }
  697. case RH_GET_CONFIGURATION:
  698. *(__u8 *) buffer = 0x01;
  699. len = 1;
  700. break;
  701. case RH_SET_CONFIGURATION:
  702. break;
  703. default:
  704. R8A66597_DPRINT("unsupported root hub command");
  705. stat = USB_ST_STALLED;
  706. }
  707. wait_ms(1);
  708. len = min_t(int, len, leni);
  709. dev->act_len = len;
  710. dev->status = stat;
  711. return stat;
  712. }
  713. int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
  714. int transfer_len)
  715. {
  716. struct r8a66597 *r8a66597 = &gr8a66597;
  717. int ret = 0;
  718. R8A66597_DPRINT("%s\n", __func__);
  719. R8A66597_DPRINT("pipe = %08x, buffer = %p, len = %d, devnum = %d\n",
  720. pipe, buffer, transfer_len, dev->devnum);
  721. set_devadd(r8a66597, dev->devnum, dev, 0);
  722. pipe_buffer_setting(r8a66597, dev, pipe);
  723. dev->act_len = 0;
  724. while (dev->act_len < transfer_len && ret == 0) {
  725. if (ctrlc())
  726. return -1;
  727. if (usb_pipein(pipe))
  728. ret = receive_bulk_packet(r8a66597, dev, pipe, buffer,
  729. transfer_len);
  730. else
  731. ret = send_bulk_packet(r8a66597, dev, pipe, buffer,
  732. transfer_len);
  733. }
  734. if (ret == 0)
  735. dev->status = 0;
  736. return ret;
  737. }
  738. int submit_control_msg(struct usb_device *dev, unsigned long pipe,
  739. void *buffer, int transfer_len, struct devrequest *setup)
  740. {
  741. struct r8a66597 *r8a66597 = &gr8a66597;
  742. u16 r8a66597_address = setup->request == USB_REQ_SET_ADDRESS ?
  743. 0 : dev->devnum;
  744. R8A66597_DPRINT("%s\n", __func__);
  745. if (usb_pipedevice(pipe) == r8a66597->rh_devnum)
  746. return r8a66597_submit_rh_msg(dev, pipe, buffer, transfer_len,
  747. setup);
  748. R8A66597_DPRINT("%s: setup\n", __func__);
  749. set_devadd(r8a66597, r8a66597_address, dev, 0);
  750. if (send_setup_packet(r8a66597, dev, setup) < 0) {
  751. printf("setup packet send error\n");
  752. return -1;
  753. }
  754. dev->act_len = 0;
  755. if (usb_pipein(pipe))
  756. if (receive_control_packet(r8a66597, dev, buffer,
  757. transfer_len) < 0)
  758. return -1;
  759. if (send_status_packet(r8a66597, pipe) < 0)
  760. return -1;
  761. dev->status = 0;
  762. return 0;
  763. }
  764. int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
  765. int transfer_len, int interval)
  766. {
  767. /* no implement */
  768. R8A66597_DPRINT("%s\n", __func__);
  769. return 0;
  770. }
  771. void usb_event_poll(void)
  772. {
  773. /* no implement */
  774. R8A66597_DPRINT("%s\n", __func__);
  775. }
  776. int usb_lowlevel_init(void)
  777. {
  778. struct r8a66597 *r8a66597 = &gr8a66597;
  779. R8A66597_DPRINT("%s\n", __func__);
  780. memset(r8a66597, 0, sizeof(r8a66597));
  781. r8a66597->reg = CONFIG_R8A66597_BASE_ADDR;
  782. disable_controller(r8a66597);
  783. wait_ms(100);
  784. enable_controller(r8a66597);
  785. r8a66597_port_power(r8a66597, 0 , 1);
  786. /* check usb device */
  787. check_usb_device_connecting(r8a66597);
  788. wait_ms(50);
  789. return 0;
  790. }
  791. int usb_lowlevel_stop(void)
  792. {
  793. disable_controller(&gr8a66597);
  794. return 0;
  795. }