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