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