xref: /openbmc/u-boot/drivers/usb/musb/musb_udc.c (revision 93322749)
1 /*
2  * Copyright (c) 2009 Wind River Systems, Inc.
3  * Tom Rix <Tom.Rix@windriver.com>
4  *
5  * This file is a rewrite of the usb device part of
6  * repository git.omapzoom.org/repo/u-boot.git, branch master,
7  * file cpu/omap3/fastboot.c
8  *
9  * This is the unique part of its copyright :
10  *
11  * -------------------------------------------------------------------------
12  *
13  * (C) Copyright 2008 - 2009
14  * Windriver, <www.windriver.com>
15  * Tom Rix <Tom.Rix@windriver.com>
16  *
17  * -------------------------------------------------------------------------
18  *
19  * The details of connecting the device to the uboot usb device subsystem
20  * came from the old omap3 repository www.sakoman.net/u-boot-omap3.git,
21  * branch omap3-dev-usb, file drivers/usb/usbdcore_musb.c
22  *
23  * This is the unique part of its copyright :
24  *
25  * -------------------------------------------------------------------------
26  *
27  * (C) Copyright 2008 Texas Instruments Incorporated.
28  *
29  * Based on
30  * u-boot OMAP1510 USB drivers (drivers/usbdcore_omap1510.c)
31  * twl4030 init based on linux (drivers/i2c/chips/twl4030_usb.c)
32  *
33  * Author: Diego Dompe (diego.dompe@ridgerun.com)
34  *         Atin Malaviya (atin.malaviya@gmail.com)
35  *
36  * -------------------------------------------------------------------------
37  *
38  * SPDX-License-Identifier:	GPL-2.0+
39  */
40 
41 #include <common.h>
42 #include <usbdevice.h>
43 #include <usb/udc.h>
44 #include "../gadget/ep0.h"
45 #include "musb_core.h"
46 #if defined(CONFIG_USB_OMAP3)
47 #include "omap3.h"
48 #elif defined(CONFIG_USB_AM35X)
49 #include "am35x.h"
50 #elif defined(CONFIG_USB_DAVINCI)
51 #include "davinci.h"
52 #endif
53 
54 /* Define MUSB_DEBUG for debugging */
55 /* #define MUSB_DEBUG */
56 #include "musb_debug.h"
57 
58 #define MAX_ENDPOINT 15
59 
60 #define GET_ENDPOINT(dev,ep)						\
61 (((struct usb_device_instance *)(dev))->bus->endpoint_array + ep)
62 
63 #define SET_EP0_STATE(s)						\
64 do {									\
65 	if ((0 <= (s)) && (SET_ADDRESS >= (s))) {			\
66 		if ((s) != ep0_state) {					\
67 			if ((debug_setup) && (debug_level > 1))		\
68 				serial_printf("INFO : Changing state "  \
69 					      "from %s to %s in %s at " \
70 					      "line %d\n",		\
71 					      ep0_state_strings[ep0_state],\
72 					      ep0_state_strings[s],	\
73 					      __PRETTY_FUNCTION__,	\
74 					      __LINE__);		\
75 			ep0_state = s;					\
76 		}							\
77 	} else {							\
78 		if (debug_level > 0)					\
79 			serial_printf("Error at %s %d with setting "	\
80 				      "state %d is invalid\n",		\
81 				      __PRETTY_FUNCTION__, __LINE__, s); \
82 	}								\
83 } while (0)
84 
85 /* static implies these initialized to 0 or NULL */
86 static int debug_setup;
87 static int debug_level;
88 static struct musb_epinfo epinfo[MAX_ENDPOINT * 2];
89 static enum ep0_state_enum {
90 	IDLE = 0,
91 	TX,
92 	RX,
93 	SET_ADDRESS
94 } ep0_state = IDLE;
95 static char *ep0_state_strings[4] = {
96 	"IDLE",
97 	"TX",
98 	"RX",
99 	"SET_ADDRESS",
100 };
101 
102 static struct urb *ep0_urb;
103 struct usb_endpoint_instance *ep0_endpoint;
104 static struct usb_device_instance *udc_device;
105 static int enabled;
106 
107 #ifdef MUSB_DEBUG
108 static void musb_db_regs(void)
109 {
110 	u8 b;
111 	u16 w;
112 
113 	b = readb(&musbr->faddr);
114 	serial_printf("\tfaddr   0x%2.2x\n", b);
115 
116 	b = readb(&musbr->power);
117 	musb_print_pwr(b);
118 
119 	w = readw(&musbr->ep[0].ep0.csr0);
120 	musb_print_csr0(w);
121 
122 	b = readb(&musbr->devctl);
123 	musb_print_devctl(b);
124 
125 	b = readb(&musbr->ep[0].ep0.configdata);
126 	musb_print_config(b);
127 
128 	w = readw(&musbr->frame);
129 	serial_printf("\tframe   0x%4.4x\n", w);
130 
131 	b = readb(&musbr->index);
132 	serial_printf("\tindex   0x%2.2x\n", b);
133 
134 	w = readw(&musbr->ep[1].epN.rxmaxp);
135 	musb_print_rxmaxp(w);
136 
137 	w = readw(&musbr->ep[1].epN.rxcsr);
138 	musb_print_rxcsr(w);
139 
140 	w = readw(&musbr->ep[1].epN.txmaxp);
141 	musb_print_txmaxp(w);
142 
143 	w = readw(&musbr->ep[1].epN.txcsr);
144 	musb_print_txcsr(w);
145 }
146 #else
147 #define musb_db_regs()
148 #endif /* DEBUG_MUSB */
149 
150 static void musb_peri_softconnect(void)
151 {
152 	u8 power, devctl;
153 
154 	/* Power off MUSB */
155 	power = readb(&musbr->power);
156 	power &= ~MUSB_POWER_SOFTCONN;
157 	writeb(power, &musbr->power);
158 
159 	/* Read intr to clear */
160 	readb(&musbr->intrusb);
161 	readw(&musbr->intrrx);
162 	readw(&musbr->intrtx);
163 
164 	udelay(1000 * 1000); /* 1 sec */
165 
166 	/* Power on MUSB */
167 	power = readb(&musbr->power);
168 	power |= MUSB_POWER_SOFTCONN;
169 	/*
170 	 * The usb device interface is usb 1.1
171 	 * Disable 2.0 high speed by clearring the hsenable bit.
172 	 */
173 	power &= ~MUSB_POWER_HSENAB;
174 	writeb(power, &musbr->power);
175 
176 	/* Check if device is in b-peripheral mode */
177 	devctl = readb(&musbr->devctl);
178 	if (!(devctl & MUSB_DEVCTL_BDEVICE) ||
179 	    (devctl & MUSB_DEVCTL_HM)) {
180 		serial_printf("ERROR : Unsupport USB mode\n");
181 		serial_printf("Check that mini-B USB cable is attached "
182 			      "to the device\n");
183 	}
184 
185 	if (debug_setup && (debug_level > 1))
186 		musb_db_regs();
187 }
188 
189 static void musb_peri_reset(void)
190 {
191 	if ((debug_setup) && (debug_level > 1))
192 		serial_printf("INFO : %s reset\n", __PRETTY_FUNCTION__);
193 
194 	if (ep0_endpoint)
195 		ep0_endpoint->endpoint_address = 0xff;
196 
197 	/* Sync sw and hw addresses */
198 	writeb(udc_device->address, &musbr->faddr);
199 
200 	SET_EP0_STATE(IDLE);
201 }
202 
203 static void musb_peri_resume(void)
204 {
205 	/* noop */
206 }
207 
208 static void musb_peri_ep0_stall(void)
209 {
210 	u16 csr0;
211 
212 	csr0 = readw(&musbr->ep[0].ep0.csr0);
213 	csr0 |= MUSB_CSR0_P_SENDSTALL;
214 	writew(csr0, &musbr->ep[0].ep0.csr0);
215 	if ((debug_setup) && (debug_level > 1))
216 		serial_printf("INFO : %s stall\n", __PRETTY_FUNCTION__);
217 }
218 
219 static void musb_peri_ep0_ack_req(void)
220 {
221 	u16 csr0;
222 
223 	csr0 = readw(&musbr->ep[0].ep0.csr0);
224 	csr0 |= MUSB_CSR0_P_SVDRXPKTRDY;
225 	writew(csr0, &musbr->ep[0].ep0.csr0);
226 }
227 
228 static void musb_ep0_tx_ready(void)
229 {
230 	u16 csr0;
231 
232 	csr0 = readw(&musbr->ep[0].ep0.csr0);
233 	csr0 |= MUSB_CSR0_TXPKTRDY;
234 	writew(csr0, &musbr->ep[0].ep0.csr0);
235 }
236 
237 static void musb_ep0_tx_ready_and_last(void)
238 {
239 	u16 csr0;
240 
241 	csr0 = readw(&musbr->ep[0].ep0.csr0);
242 	csr0 |= (MUSB_CSR0_TXPKTRDY | MUSB_CSR0_P_DATAEND);
243 	writew(csr0, &musbr->ep[0].ep0.csr0);
244 }
245 
246 static void musb_peri_ep0_last(void)
247 {
248 	u16 csr0;
249 
250 	csr0 = readw(&musbr->ep[0].ep0.csr0);
251 	csr0 |= MUSB_CSR0_P_DATAEND;
252 	writew(csr0, &musbr->ep[0].ep0.csr0);
253 }
254 
255 static void musb_peri_ep0_set_address(void)
256 {
257 	u8 faddr;
258 	writeb(udc_device->address, &musbr->faddr);
259 
260 	/* Verify */
261 	faddr = readb(&musbr->faddr);
262 	if (udc_device->address == faddr) {
263 		SET_EP0_STATE(IDLE);
264 		usbd_device_event_irq(udc_device, DEVICE_ADDRESS_ASSIGNED, 0);
265 		if ((debug_setup) && (debug_level > 1))
266 			serial_printf("INFO : %s Address set to %d\n",
267 				      __PRETTY_FUNCTION__, udc_device->address);
268 	} else {
269 		if (debug_level > 0)
270 			serial_printf("ERROR : %s Address missmatch "
271 				      "sw %d vs hw %d\n",
272 				      __PRETTY_FUNCTION__,
273 				      udc_device->address, faddr);
274 	}
275 }
276 
277 static void musb_peri_rx_ack(unsigned int ep)
278 {
279 	u16 peri_rxcsr;
280 
281 	peri_rxcsr = readw(&musbr->ep[ep].epN.rxcsr);
282 	peri_rxcsr &= ~MUSB_RXCSR_RXPKTRDY;
283 	writew(peri_rxcsr, &musbr->ep[ep].epN.rxcsr);
284 }
285 
286 static void musb_peri_tx_ready(unsigned int ep)
287 {
288 	u16 peri_txcsr;
289 
290 	peri_txcsr = readw(&musbr->ep[ep].epN.txcsr);
291 	peri_txcsr |= MUSB_TXCSR_TXPKTRDY;
292 	writew(peri_txcsr, &musbr->ep[ep].epN.txcsr);
293 }
294 
295 static void musb_peri_ep0_zero_data_request(int err)
296 {
297 	musb_peri_ep0_ack_req();
298 
299 	if (err) {
300 		musb_peri_ep0_stall();
301 		SET_EP0_STATE(IDLE);
302 	} else {
303 
304 		musb_peri_ep0_last();
305 
306 		/* USBD state */
307 		switch (ep0_urb->device_request.bRequest) {
308 		case USB_REQ_SET_ADDRESS:
309 			if ((debug_setup) && (debug_level > 1))
310 				serial_printf("INFO : %s received set "
311 					      "address\n", __PRETTY_FUNCTION__);
312 			break;
313 
314 		case USB_REQ_SET_CONFIGURATION:
315 			if ((debug_setup) && (debug_level > 1))
316 				serial_printf("INFO : %s Configured\n",
317 					      __PRETTY_FUNCTION__);
318 			usbd_device_event_irq(udc_device, DEVICE_CONFIGURED, 0);
319 			break;
320 		}
321 
322 		/* EP0 state */
323 		if (USB_REQ_SET_ADDRESS == ep0_urb->device_request.bRequest) {
324 			SET_EP0_STATE(SET_ADDRESS);
325 		} else {
326 			SET_EP0_STATE(IDLE);
327 		}
328 	}
329 }
330 
331 static void musb_peri_ep0_rx_data_request(void)
332 {
333 	/*
334 	 * This is the completion of the data OUT / RX
335 	 *
336 	 * Host is sending data to ep0 that is not
337 	 * part of setup.  This comes from the cdc_recv_setup
338 	 * op that is device specific.
339 	 *
340 	 */
341 	musb_peri_ep0_ack_req();
342 
343 	ep0_endpoint->rcv_urb = ep0_urb;
344 	ep0_urb->actual_length = 0;
345 	SET_EP0_STATE(RX);
346 }
347 
348 static void musb_peri_ep0_tx_data_request(int err)
349 {
350 	if (err) {
351 		musb_peri_ep0_stall();
352 		SET_EP0_STATE(IDLE);
353 	} else {
354 		musb_peri_ep0_ack_req();
355 
356 		ep0_endpoint->tx_urb = ep0_urb;
357 		ep0_endpoint->sent = 0;
358 		SET_EP0_STATE(TX);
359 	}
360 }
361 
362 static void musb_peri_ep0_idle(void)
363 {
364 	u16 count0;
365 	int err;
366 	u16 csr0;
367 
368 	/*
369 	 * Verify addresses
370 	 * A lot of confusion can be caused if the address
371 	 * in software, udc layer, does not agree with the
372 	 * hardware.  Since the setting of the hardware address
373 	 * must be set after the set address request, the
374 	 * usb state machine is out of sync for a few frame.
375 	 * It is a good idea to run this check when changes
376 	 * are made to the state machine.
377 	 */
378 	if ((debug_level > 0) &&
379 	    (ep0_state != SET_ADDRESS)) {
380 		u8 faddr;
381 
382 		faddr = readb(&musbr->faddr);
383 		if (udc_device->address != faddr) {
384 			serial_printf("ERROR : %s addresses do not"
385 				      "match sw %d vs hw %d\n",
386 				      __PRETTY_FUNCTION__,
387 				      udc_device->address, faddr);
388 			udelay(1000 * 1000);
389 			hang();
390 		}
391 	}
392 
393 	csr0 = readw(&musbr->ep[0].ep0.csr0);
394 
395 	if (!(MUSB_CSR0_RXPKTRDY & csr0))
396 		goto end;
397 
398 	count0 = readw(&musbr->ep[0].ep0.count0);
399 	if (count0 == 0)
400 		goto end;
401 
402 	if (count0 != 8) {
403 		if ((debug_setup) && (debug_level > 1))
404 			serial_printf("WARN : %s SETUP incorrect size %d\n",
405 				      __PRETTY_FUNCTION__, count0);
406 		musb_peri_ep0_stall();
407 		goto end;
408 	}
409 
410 	read_fifo(0, count0, &ep0_urb->device_request);
411 
412 	if (debug_level > 2)
413 		print_usb_device_request(&ep0_urb->device_request);
414 
415 	if (ep0_urb->device_request.wLength == 0) {
416 		err = ep0_recv_setup(ep0_urb);
417 
418 		/* Zero data request */
419 		musb_peri_ep0_zero_data_request(err);
420 	} else {
421 		/* Is data coming or going ? */
422 		u8 reqType = ep0_urb->device_request.bmRequestType;
423 
424 		if (USB_REQ_DEVICE2HOST == (reqType & USB_REQ_DIRECTION_MASK)) {
425 			err = ep0_recv_setup(ep0_urb);
426 			/* Device to host */
427 			musb_peri_ep0_tx_data_request(err);
428 		} else {
429 			/*
430 			 * Host to device
431 			 *
432 			 * The RX routine will call ep0_recv_setup
433 			 * when the data packet has arrived.
434 			 */
435 			musb_peri_ep0_rx_data_request();
436 		}
437 	}
438 
439 end:
440 	return;
441 }
442 
443 static void musb_peri_ep0_rx(void)
444 {
445 	/*
446 	 * This is the completion of the data OUT / RX
447 	 *
448 	 * Host is sending data to ep0 that is not
449 	 * part of setup.  This comes from the cdc_recv_setup
450 	 * op that is device specific.
451 	 *
452 	 * Pass the data back to driver ep0_recv_setup which
453 	 * should give the cdc_recv_setup the chance to handle
454 	 * the rx
455 	 */
456 	u16 csr0;
457 	u16 count0;
458 
459 	if (debug_level > 3) {
460 		if (0 != ep0_urb->actual_length) {
461 			serial_printf("%s finished ? %d of %d\n",
462 				      __PRETTY_FUNCTION__,
463 				      ep0_urb->actual_length,
464 				      ep0_urb->device_request.wLength);
465 		}
466 	}
467 
468 	if (ep0_urb->device_request.wLength == ep0_urb->actual_length) {
469 		musb_peri_ep0_last();
470 		SET_EP0_STATE(IDLE);
471 		ep0_recv_setup(ep0_urb);
472 		return;
473 	}
474 
475 	csr0 = readw(&musbr->ep[0].ep0.csr0);
476 	if (!(MUSB_CSR0_RXPKTRDY & csr0))
477 		return;
478 
479 	count0 = readw(&musbr->ep[0].ep0.count0);
480 
481 	if (count0) {
482 		struct usb_endpoint_instance *endpoint;
483 		u32 length;
484 		u8 *data;
485 
486 		endpoint = ep0_endpoint;
487 		if (endpoint && endpoint->rcv_urb) {
488 			struct urb *urb = endpoint->rcv_urb;
489 			unsigned int remaining_space = urb->buffer_length -
490 				urb->actual_length;
491 
492 			if (remaining_space) {
493 				int urb_bad = 0; /* urb is good */
494 
495 				if (count0 > remaining_space)
496 					length = remaining_space;
497 				else
498 					length = count0;
499 
500 				data = (u8 *) urb->buffer_data;
501 				data += urb->actual_length;
502 
503 				/* The common musb fifo reader */
504 				read_fifo(0, length, data);
505 
506 				musb_peri_ep0_ack_req();
507 
508 				/*
509 				 * urb's actual_length is updated in
510 				 * usbd_rcv_complete
511 				 */
512 				usbd_rcv_complete(endpoint, length, urb_bad);
513 
514 			} else {
515 				if (debug_level > 0)
516 					serial_printf("ERROR : %s no space in "
517 						      "rcv buffer\n",
518 						      __PRETTY_FUNCTION__);
519 			}
520 		} else {
521 			if (debug_level > 0)
522 				serial_printf("ERROR : %s problem with "
523 					      "endpoint\n",
524 					      __PRETTY_FUNCTION__);
525 		}
526 	} else {
527 		if (debug_level > 0)
528 			serial_printf("ERROR : %s with nothing to do\n",
529 				      __PRETTY_FUNCTION__);
530 	}
531 }
532 
533 static void musb_peri_ep0_tx(void)
534 {
535 	u16 csr0;
536 	int transfer_size = 0;
537 	unsigned int p, pm;
538 
539 	csr0 = readw(&musbr->ep[0].ep0.csr0);
540 
541 	/* Check for pending tx */
542 	if (csr0 & MUSB_CSR0_TXPKTRDY)
543 		goto end;
544 
545 	/* Check if this is the last packet sent */
546 	if (ep0_endpoint->sent >= ep0_urb->actual_length) {
547 		SET_EP0_STATE(IDLE);
548 		goto end;
549 	}
550 
551 	transfer_size = ep0_urb->actual_length - ep0_endpoint->sent;
552 	/* Is the transfer size negative ? */
553 	if (transfer_size <= 0) {
554 		if (debug_level > 0)
555 			serial_printf("ERROR : %s problem with the"
556 				      " transfer size %d\n",
557 				      __PRETTY_FUNCTION__,
558 				      transfer_size);
559 		SET_EP0_STATE(IDLE);
560 		goto end;
561 	}
562 
563 	/* Truncate large transfers to the fifo size */
564 	if (transfer_size > ep0_endpoint->tx_packetSize)
565 		transfer_size = ep0_endpoint->tx_packetSize;
566 
567 	write_fifo(0, transfer_size, &ep0_urb->buffer[ep0_endpoint->sent]);
568 	ep0_endpoint->sent += transfer_size;
569 
570 	/* Done or more to send ? */
571 	if (ep0_endpoint->sent >= ep0_urb->actual_length)
572 		musb_ep0_tx_ready_and_last();
573 	else
574 		musb_ep0_tx_ready();
575 
576 	/* Wait a bit */
577 	pm = 10;
578 	for (p = 0; p < pm; p++) {
579 		csr0 = readw(&musbr->ep[0].ep0.csr0);
580 		if (!(csr0 & MUSB_CSR0_TXPKTRDY))
581 			break;
582 
583 		/* Double the delay. */
584 		udelay(1 << pm);
585 	}
586 
587 	if ((ep0_endpoint->sent >= ep0_urb->actual_length) && (p < pm))
588 		SET_EP0_STATE(IDLE);
589 
590 end:
591 	return;
592 }
593 
594 static void musb_peri_ep0(void)
595 {
596 	u16 csr0;
597 
598 	if (SET_ADDRESS == ep0_state)
599 		return;
600 
601 	csr0 = readw(&musbr->ep[0].ep0.csr0);
602 
603 	/* Error conditions */
604 	if (MUSB_CSR0_P_SENTSTALL & csr0) {
605 		csr0 &= ~MUSB_CSR0_P_SENTSTALL;
606 		writew(csr0, &musbr->ep[0].ep0.csr0);
607 		SET_EP0_STATE(IDLE);
608 	}
609 	if (MUSB_CSR0_P_SETUPEND & csr0) {
610 		csr0 |= MUSB_CSR0_P_SVDSETUPEND;
611 		writew(csr0, &musbr->ep[0].ep0.csr0);
612 		SET_EP0_STATE(IDLE);
613 		if ((debug_setup) && (debug_level > 1))
614 			serial_printf("WARN: %s SETUPEND\n",
615 				      __PRETTY_FUNCTION__);
616 	}
617 
618 	/* Normal states */
619 	if (IDLE == ep0_state)
620 		musb_peri_ep0_idle();
621 
622 	if (TX == ep0_state)
623 		musb_peri_ep0_tx();
624 
625 	if (RX == ep0_state)
626 		musb_peri_ep0_rx();
627 }
628 
629 static void musb_peri_rx_ep(unsigned int ep)
630 {
631 	u16 peri_rxcount;
632 	u8 peri_rxcsr = readw(&musbr->ep[ep].epN.rxcsr);
633 
634 	if (!(peri_rxcsr & MUSB_RXCSR_RXPKTRDY)) {
635 		if (debug_level > 0)
636 			serial_printf("ERROR : %s %d without MUSB_RXCSR_RXPKTRDY set\n",
637 				      __PRETTY_FUNCTION__, ep);
638 		return;
639 	}
640 
641 	peri_rxcount = readw(&musbr->ep[ep].epN.rxcount);
642 	if (peri_rxcount) {
643 		struct usb_endpoint_instance *endpoint;
644 		u32 length;
645 		u8 *data;
646 
647 		endpoint = GET_ENDPOINT(udc_device, ep);
648 		if (endpoint && endpoint->rcv_urb) {
649 			struct urb *urb = endpoint->rcv_urb;
650 			unsigned int remaining_space = urb->buffer_length -
651 				urb->actual_length;
652 
653 			if (remaining_space) {
654 				int urb_bad = 0; /* urb is good */
655 
656 				if (peri_rxcount > remaining_space)
657 					length = remaining_space;
658 				else
659 					length = peri_rxcount;
660 
661 				data = (u8 *) urb->buffer_data;
662 				data += urb->actual_length;
663 
664 				/* The common musb fifo reader */
665 				read_fifo(ep, length, data);
666 
667 				musb_peri_rx_ack(ep);
668 
669 				/*
670 				 * urb's actual_length is updated in
671 				 * usbd_rcv_complete
672 				 */
673 				usbd_rcv_complete(endpoint, length, urb_bad);
674 
675 			} else {
676 				if (debug_level > 0)
677 					serial_printf("ERROR : %s %d no space "
678 						      "in rcv buffer\n",
679 						      __PRETTY_FUNCTION__, ep);
680 			}
681 		} else {
682 			if (debug_level > 0)
683 				serial_printf("ERROR : %s %d problem with "
684 					      "endpoint\n",
685 					      __PRETTY_FUNCTION__, ep);
686 		}
687 
688 	} else {
689 		if (debug_level > 0)
690 			serial_printf("ERROR : %s %d with nothing to do\n",
691 				      __PRETTY_FUNCTION__, ep);
692 	}
693 }
694 
695 static void musb_peri_rx(u16 intr)
696 {
697 	unsigned int ep;
698 
699 	/* Check for EP0 */
700 	if (0x01 & intr)
701 		musb_peri_ep0();
702 
703 	for (ep = 1; ep < 16; ep++) {
704 		if ((1 << ep) & intr)
705 			musb_peri_rx_ep(ep);
706 	}
707 }
708 
709 static void musb_peri_tx(u16 intr)
710 {
711 	/* Check for EP0 */
712 	if (0x01 & intr)
713 		musb_peri_ep0_tx();
714 
715 	/*
716 	 * Use this in the future when handling epN tx
717 	 *
718 	 * u8 ep;
719 	 *
720 	 * for (ep = 1; ep < 16; ep++) {
721 	 *	if ((1 << ep) & intr) {
722 	 *		/ * handle tx for this endpoint * /
723 	 *	}
724 	 * }
725 	 */
726 }
727 
728 void udc_irq(void)
729 {
730 	/* This is a high freq called function */
731 	if (enabled) {
732 		u8 intrusb;
733 
734 		intrusb = readb(&musbr->intrusb);
735 
736 		/*
737 		 * See drivers/usb/gadget/mpc8xx_udc.c for
738 		 * state diagram going from detached through
739 		 * configuration.
740 		 */
741 		if (MUSB_INTR_RESUME & intrusb) {
742 			usbd_device_event_irq(udc_device,
743 					      DEVICE_BUS_ACTIVITY, 0);
744 			musb_peri_resume();
745 		}
746 
747 		musb_peri_ep0();
748 
749 		if (MUSB_INTR_RESET & intrusb) {
750 			usbd_device_event_irq(udc_device, DEVICE_RESET, 0);
751 			musb_peri_reset();
752 		}
753 
754 		if (MUSB_INTR_DISCONNECT & intrusb) {
755 			/* cable unplugged from hub/host */
756 			usbd_device_event_irq(udc_device, DEVICE_RESET, 0);
757 			musb_peri_reset();
758 			usbd_device_event_irq(udc_device, DEVICE_HUB_RESET, 0);
759 		}
760 
761 		if (MUSB_INTR_SOF & intrusb) {
762 			usbd_device_event_irq(udc_device,
763 					      DEVICE_BUS_ACTIVITY, 0);
764 			musb_peri_resume();
765 		}
766 
767 		if (MUSB_INTR_SUSPEND & intrusb) {
768 			usbd_device_event_irq(udc_device,
769 					      DEVICE_BUS_INACTIVE, 0);
770 		}
771 
772 		if (ep0_state != SET_ADDRESS) {
773 			u16 intrrx, intrtx;
774 
775 			intrrx = readw(&musbr->intrrx);
776 			intrtx = readw(&musbr->intrtx);
777 
778 			if (intrrx)
779 				musb_peri_rx(intrrx);
780 
781 			if (intrtx)
782 				musb_peri_tx(intrtx);
783 		} else {
784 			if (MUSB_INTR_SOF & intrusb) {
785 				u8 faddr;
786 				faddr = readb(&musbr->faddr);
787 				/*
788 				 * Setting of the address can fail.
789 				 * Normally it succeeds the second time.
790 				 */
791 				if (udc_device->address != faddr)
792 					musb_peri_ep0_set_address();
793 			}
794 		}
795 	}
796 }
797 
798 void udc_set_nak(int ep_num)
799 {
800 	/* noop */
801 }
802 
803 void udc_unset_nak(int ep_num)
804 {
805 	/* noop */
806 }
807 
808 int udc_endpoint_write(struct usb_endpoint_instance *endpoint)
809 {
810 	int ret = 0;
811 
812 	/* Transmit only if the hardware is available */
813 	if (endpoint->tx_urb && endpoint->state == 0) {
814 		unsigned int ep = endpoint->endpoint_address &
815 			USB_ENDPOINT_NUMBER_MASK;
816 
817 		u16 peri_txcsr = readw(&musbr->ep[ep].epN.txcsr);
818 
819 		/* Error conditions */
820 		if (peri_txcsr & MUSB_TXCSR_P_UNDERRUN) {
821 			peri_txcsr &= ~MUSB_TXCSR_P_UNDERRUN;
822 			writew(peri_txcsr, &musbr->ep[ep].epN.txcsr);
823 		}
824 
825 		if (debug_level > 1)
826 			musb_print_txcsr(peri_txcsr);
827 
828 		/* Check if a packet is waiting to be sent */
829 		if (!(peri_txcsr & MUSB_TXCSR_TXPKTRDY)) {
830 			u32 length;
831 			u8 *data;
832 			struct urb *urb = endpoint->tx_urb;
833 			unsigned int remaining_packet = urb->actual_length -
834 				endpoint->sent;
835 
836 			if (endpoint->tx_packetSize < remaining_packet)
837 				length = endpoint->tx_packetSize;
838 			else
839 				length = remaining_packet;
840 
841 			data = (u8 *) urb->buffer;
842 			data += endpoint->sent;
843 
844 			/* common musb fifo function */
845 			write_fifo(ep, length, data);
846 
847 			musb_peri_tx_ready(ep);
848 
849 			endpoint->last = length;
850 			/* usbd_tx_complete will take care of updating 'sent' */
851 			usbd_tx_complete(endpoint);
852 		}
853 	} else {
854 		if (debug_level > 0)
855 			serial_printf("ERROR : %s Problem with urb %p "
856 				      "or ep state %d\n",
857 				      __PRETTY_FUNCTION__,
858 				      endpoint->tx_urb, endpoint->state);
859 	}
860 
861 	return ret;
862 }
863 
864 void udc_setup_ep(struct usb_device_instance *device, unsigned int id,
865 		  struct usb_endpoint_instance *endpoint)
866 {
867 	if (0 == id) {
868 		/* EP0 */
869 		ep0_endpoint = endpoint;
870 		ep0_endpoint->endpoint_address = 0xff;
871 		ep0_urb = usbd_alloc_urb(device, endpoint);
872 	} else if (MAX_ENDPOINT >= id) {
873 		int ep_addr;
874 
875 		/* Check the direction */
876 		ep_addr = endpoint->endpoint_address;
877 		if (USB_DIR_IN == (ep_addr & USB_ENDPOINT_DIR_MASK)) {
878 			/* IN */
879 			epinfo[(id * 2) + 1].epsize = endpoint->tx_packetSize;
880 		} else {
881 			/* OUT */
882 			epinfo[id * 2].epsize = endpoint->rcv_packetSize;
883 		}
884 
885 		musb_configure_ep(&epinfo[0], ARRAY_SIZE(epinfo));
886 	} else {
887 		if (debug_level > 0)
888 			serial_printf("ERROR : %s endpoint request %d "
889 				      "exceeds maximum %d\n",
890 				      __PRETTY_FUNCTION__, id, MAX_ENDPOINT);
891 	}
892 }
893 
894 void udc_connect(void)
895 {
896 	/* noop */
897 }
898 
899 void udc_disconnect(void)
900 {
901 	/* noop */
902 }
903 
904 void udc_enable(struct usb_device_instance *device)
905 {
906 	/* Save the device structure pointer */
907 	udc_device = device;
908 
909 	enabled = 1;
910 }
911 
912 void udc_disable(void)
913 {
914 	enabled = 0;
915 }
916 
917 void udc_startup_events(struct usb_device_instance *device)
918 {
919 	/* The DEVICE_INIT event puts the USB device in the state STATE_INIT. */
920 	usbd_device_event_irq(device, DEVICE_INIT, 0);
921 
922 	/*
923 	 * The DEVICE_CREATE event puts the USB device in the state
924 	 * STATE_ATTACHED.
925 	 */
926 	usbd_device_event_irq(device, DEVICE_CREATE, 0);
927 
928 	/* Resets the address to 0 */
929 	usbd_device_event_irq(device, DEVICE_RESET, 0);
930 
931 	udc_enable(device);
932 }
933 
934 int udc_init(void)
935 {
936 	int ret;
937 	int ep_loop;
938 
939 	ret = musb_platform_init();
940 	if (ret < 0)
941 		goto end;
942 
943 	/* Configure all the endpoint FIFO's and start usb controller */
944 	musbr = musb_cfg.regs;
945 
946 	/* Initialize the endpoints */
947 	for (ep_loop = 0; ep_loop < MAX_ENDPOINT * 2; ep_loop++) {
948 		epinfo[ep_loop].epnum = (ep_loop / 2) + 1;
949 		epinfo[ep_loop].epdir = ep_loop % 2; /* OUT, IN */
950 		epinfo[ep_loop].epsize = 0;
951 	}
952 
953 	musb_peri_softconnect();
954 
955 	ret = 0;
956 end:
957 
958 	return ret;
959 }
960