common: Drop linux/delay.h from common header
[oweals/u-boot.git] / drivers / usb / musb / musb_udc.c
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 <hang.h>
42 #include <serial.h>
43 #include <usbdevice.h>
44 #include <linux/delay.h>
45 #include <usb/udc.h>
46 #include "../gadget/ep0.h"
47 #include "musb_core.h"
48 #if defined(CONFIG_USB_OMAP3)
49 #include "omap3.h"
50 #elif defined(CONFIG_USB_AM35X)
51 #include "am35x.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 + 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 }