xref: /openbmc/u-boot/drivers/usb/host/r8a66597-hcd.c (revision 29b103c7)
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 	for (port = 0; port < R8A66597_MAX_ROOT_HUB; port++)
168 		r8a66597_write(r8a66597, 0, get_intenb_reg(port));
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 /*-------------------------------------------------------------------------*
554  * Virtual Root Hub
555  *-------------------------------------------------------------------------*/
556 
557 #include <usbroothubdes.h>
558 
559 static int r8a66597_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
560 			void *buffer, int transfer_len, struct devrequest *cmd)
561 {
562 	struct r8a66597 *r8a66597 = &gr8a66597;
563 	int leni = transfer_len;
564 	int len = 0;
565 	int stat = 0;
566 	__u16 bmRType_bReq;
567 	__u16 wValue;
568 	__u16 wLength;
569 	unsigned char data[32];
570 
571 	R8A66597_DPRINT("%s\n", __func__);
572 
573 	if (usb_pipeint(pipe)) {
574 		printf("Root-Hub submit IRQ: NOT implemented");
575 		return 0;
576 	}
577 
578 	bmRType_bReq  = cmd->requesttype | (cmd->request << 8);
579 	wValue	      = cpu_to_le16 (cmd->value);
580 	wLength	      = cpu_to_le16 (cmd->length);
581 
582 	switch (bmRType_bReq) {
583 	case RH_GET_STATUS:
584 		*(__u16 *)buffer = cpu_to_le16(1);
585 		len = 2;
586 		break;
587 	case RH_GET_STATUS | RH_INTERFACE:
588 		*(__u16 *)buffer = cpu_to_le16(0);
589 		len = 2;
590 		break;
591 	case RH_GET_STATUS | RH_ENDPOINT:
592 		*(__u16 *)buffer = cpu_to_le16(0);
593 		len = 2;
594 		break;
595 	case RH_GET_STATUS | RH_CLASS:
596 		*(__u32 *)buffer = cpu_to_le32(0);
597 		len = 4;
598 		break;
599 	case RH_GET_STATUS | RH_OTHER | RH_CLASS:
600 		*(__u32 *)buffer = cpu_to_le32(r8a66597->port_status |
601 						(r8a66597->port_change << 16));
602 		len = 4;
603 		break;
604 	case RH_CLEAR_FEATURE | RH_ENDPOINT:
605 	case RH_CLEAR_FEATURE | RH_CLASS:
606 		break;
607 
608 	case RH_CLEAR_FEATURE | RH_OTHER | RH_CLASS:
609 		switch (wValue) {
610 		case RH_C_PORT_CONNECTION:
611 			r8a66597->port_change &= ~USB_PORT_STAT_C_CONNECTION;
612 			break;
613 		}
614 		break;
615 
616 	case RH_SET_FEATURE | RH_OTHER | RH_CLASS:
617 		switch (wValue) {
618 		case (RH_PORT_SUSPEND):
619 			break;
620 		case (RH_PORT_RESET):
621 			r8a66597_bus_reset(r8a66597, 0);
622 			break;
623 		case (RH_PORT_POWER):
624 			break;
625 		case (RH_PORT_ENABLE):
626 			break;
627 		}
628 		break;
629 	case RH_SET_ADDRESS:
630 		gr8a66597.rh_devnum = wValue;
631 		break;
632 	case RH_GET_DESCRIPTOR:
633 		switch ((wValue & 0xff00) >> 8) {
634 		case (0x01): /* device descriptor */
635 			len = min_t(unsigned int,
636 				  leni,
637 				  min_t(unsigned int,
638 				      sizeof(root_hub_dev_des),
639 				      wLength));
640 			memcpy(buffer, root_hub_dev_des, len);
641 			break;
642 		case (0x02): /* configuration descriptor */
643 			len = min_t(unsigned int,
644 				  leni,
645 				  min_t(unsigned int,
646 				      sizeof(root_hub_config_des),
647 				      wLength));
648 			memcpy(buffer, root_hub_config_des, len);
649 			break;
650 		case (0x03): /* string descriptors */
651 			if (wValue == 0x0300) {
652 				len = min_t(unsigned int,
653 					  leni,
654 					  min_t(unsigned int,
655 					      sizeof(root_hub_str_index0),
656 					      wLength));
657 				memcpy(buffer, root_hub_str_index0, len);
658 			}
659 			if (wValue == 0x0301) {
660 				len = min_t(unsigned int,
661 					  leni,
662 					  min_t(unsigned int,
663 					      sizeof(root_hub_str_index1),
664 					      wLength));
665 				memcpy(buffer, root_hub_str_index1, len);
666 			}
667 			break;
668 		default:
669 			stat = USB_ST_STALLED;
670 		}
671 		break;
672 
673 	case RH_GET_DESCRIPTOR | RH_CLASS:
674 	{
675 		__u32 temp = 0x00000001;
676 
677 		data[0] = 9;		/* min length; */
678 		data[1] = 0x29;
679 		data[2] = temp & RH_A_NDP;
680 		data[3] = 0;
681 		if (temp & RH_A_PSM)
682 			data[3] |= 0x1;
683 		if (temp & RH_A_NOCP)
684 			data[3] |= 0x10;
685 		else if (temp & RH_A_OCPM)
686 			data[3] |= 0x8;
687 
688 		/* corresponds to data[4-7] */
689 		data[5] = (temp & RH_A_POTPGT) >> 24;
690 		data[7] = temp & RH_B_DR;
691 		if (data[2] < 7) {
692 			data[8] = 0xff;
693 		} else {
694 			data[0] += 2;
695 			data[8] = (temp & RH_B_DR) >> 8;
696 			data[10] = data[9] = 0xff;
697 		}
698 
699 		len = min_t(unsigned int, leni,
700 			    min_t(unsigned int, data[0], wLength));
701 		memcpy(buffer, data, len);
702 		break;
703 	}
704 
705 	case RH_GET_CONFIGURATION:
706 		*(__u8 *) buffer = 0x01;
707 		len = 1;
708 		break;
709 	case RH_SET_CONFIGURATION:
710 		break;
711 	default:
712 		R8A66597_DPRINT("unsupported root hub command");
713 		stat = USB_ST_STALLED;
714 	}
715 
716 	mdelay(1);
717 
718 	len = min_t(int, len, leni);
719 
720 	dev->act_len = len;
721 	dev->status = stat;
722 
723 	return stat;
724 }
725 
726 int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
727 		    int transfer_len)
728 {
729 	struct r8a66597 *r8a66597 = &gr8a66597;
730 	int ret = 0;
731 
732 	R8A66597_DPRINT("%s\n", __func__);
733 	R8A66597_DPRINT("pipe = %08x, buffer = %p, len = %d, devnum = %d\n",
734 			pipe, buffer, transfer_len, dev->devnum);
735 
736 	set_devadd(r8a66597, dev->devnum, dev, 0);
737 
738 	pipe_buffer_setting(r8a66597, dev, pipe);
739 
740 	dev->act_len = 0;
741 	while (dev->act_len < transfer_len && ret == 0) {
742 		if (ctrlc())
743 			return -1;
744 
745 		if (usb_pipein(pipe))
746 			ret = receive_bulk_packet(r8a66597, dev, pipe, buffer,
747 							transfer_len);
748 		else
749 			ret = send_bulk_packet(r8a66597, dev, pipe, buffer,
750 							transfer_len);
751 	}
752 
753 	if (ret == 0)
754 		dev->status = 0;
755 
756 	return ret;
757 }
758 
759 int submit_control_msg(struct usb_device *dev, unsigned long pipe,
760 		       void *buffer, int transfer_len, struct devrequest *setup)
761 {
762 	struct r8a66597 *r8a66597 = &gr8a66597;
763 	u16 r8a66597_address = setup->request == USB_REQ_SET_ADDRESS ?
764 					0 : dev->devnum;
765 
766 	R8A66597_DPRINT("%s\n", __func__);
767 	if (usb_pipedevice(pipe) == r8a66597->rh_devnum)
768 		return r8a66597_submit_rh_msg(dev, pipe, buffer, transfer_len,
769 						setup);
770 
771 	R8A66597_DPRINT("%s: setup\n", __func__);
772 	set_devadd(r8a66597, r8a66597_address, dev, 0);
773 
774 	if (send_setup_packet(r8a66597, dev, setup) < 0) {
775 		printf("setup packet send error\n");
776 		return -1;
777 	}
778 
779 	dev->act_len = 0;
780 	if (usb_pipein(pipe))
781 		if (receive_control_packet(r8a66597, dev, buffer,
782 						transfer_len) < 0)
783 			return -1;
784 
785 	if (send_status_packet(r8a66597, pipe) < 0)
786 		return -1;
787 
788 	dev->status = 0;
789 
790 	return 0;
791 }
792 
793 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
794 			int transfer_len, int interval)
795 {
796 	/* no implement */
797 	R8A66597_DPRINT("%s\n", __func__);
798 	return 0;
799 }
800 
801 int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
802 {
803 	struct r8a66597 *r8a66597 = &gr8a66597;
804 
805 	R8A66597_DPRINT("%s\n", __func__);
806 
807 	memset(r8a66597, 0, sizeof(*r8a66597));
808 	r8a66597->reg = CONFIG_R8A66597_BASE_ADDR;
809 
810 	disable_controller(r8a66597);
811 	mdelay(100);
812 
813 	enable_controller(r8a66597);
814 	r8a66597_port_power(r8a66597, 0 , 1);
815 
816 	/* check usb device */
817 	check_usb_device_connecting(r8a66597);
818 
819 	mdelay(50);
820 
821 	return 0;
822 }
823 
824 int usb_lowlevel_stop(int index)
825 {
826 	disable_controller(&gr8a66597);
827 
828 	return 0;
829 }
830