uboot/drivers/usb/musb/musb_udc.c
<<
>>
Prefs
   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)                                                \
  64do {                                                                    \
  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 */
  86static int debug_setup;
  87static int debug_level;
  88static struct musb_epinfo epinfo[MAX_ENDPOINT * 2];
  89static enum ep0_state_enum {
  90        IDLE = 0,
  91        TX,
  92        RX,
  93        SET_ADDRESS
  94} ep0_state = IDLE;
  95static char *ep0_state_strings[4] = {
  96        "IDLE",
  97        "TX",
  98        "RX",
  99        "SET_ADDRESS",
 100};
 101
 102static struct urb *ep0_urb;
 103struct usb_endpoint_instance *ep0_endpoint;
 104static struct usb_device_instance *udc_device;
 105static int enabled;
 106
 107#ifdef MUSB_DEBUG
 108static 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
 150static 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
 189static 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
 203static void musb_peri_resume(void)
 204{
 205        /* noop */
 206}
 207
 208static 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
 219static 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
 228static 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
 237static 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
 246static 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
 255static 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
 277static 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
 286static 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
 295static 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
 331static 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
 348static 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
 362static 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
 439end:
 440        return;
 441}
 442
 443static 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
 533static 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
 590end:
 591        return;
 592}
 593
 594static 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
 629static 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
 695static 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
 709static 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
 728void 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
 798void udc_set_nak(int ep_num)
 799{
 800        /* noop */
 801}
 802
 803void udc_unset_nak(int ep_num)
 804{
 805        /* noop */
 806}
 807
 808int 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
 864void 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
 894void udc_connect(void)
 895{
 896        /* noop */
 897}
 898
 899void udc_disconnect(void)
 900{
 901        /* noop */
 902}
 903
 904void udc_enable(struct usb_device_instance *device)
 905{
 906        /* Save the device structure pointer */
 907        udc_device = device;
 908
 909        enabled = 1;
 910}
 911
 912void udc_disable(void)
 913{
 914        enabled = 0;
 915}
 916
 917void 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
 934int 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;
 956end:
 957
 958        return ret;
 959}
 960