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