linux/drivers/usb/gadget/udc/fotg210-udc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * FOTG210 UDC Driver supports Bulk transfer so far
   4 *
   5 * Copyright (C) 2013 Faraday Technology Corporation
   6 *
   7 * Author : Yuan-Hsin Chen <yhchen@faraday-tech.com>
   8 */
   9
  10#include <linux/dma-mapping.h>
  11#include <linux/err.h>
  12#include <linux/interrupt.h>
  13#include <linux/io.h>
  14#include <linux/module.h>
  15#include <linux/platform_device.h>
  16#include <linux/usb/ch9.h>
  17#include <linux/usb/gadget.h>
  18
  19#include "fotg210.h"
  20
  21#define DRIVER_DESC     "FOTG210 USB Device Controller Driver"
  22#define DRIVER_VERSION  "30-April-2013"
  23
  24static const char udc_name[] = "fotg210_udc";
  25static const char * const fotg210_ep_name[] = {
  26        "ep0", "ep1", "ep2", "ep3", "ep4"};
  27
  28static void fotg210_disable_fifo_int(struct fotg210_ep *ep)
  29{
  30        u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR1);
  31
  32        if (ep->dir_in)
  33                value |= DMISGR1_MF_IN_INT(ep->epnum - 1);
  34        else
  35                value |= DMISGR1_MF_OUTSPK_INT(ep->epnum - 1);
  36        iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR1);
  37}
  38
  39static void fotg210_enable_fifo_int(struct fotg210_ep *ep)
  40{
  41        u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR1);
  42
  43        if (ep->dir_in)
  44                value &= ~DMISGR1_MF_IN_INT(ep->epnum - 1);
  45        else
  46                value &= ~DMISGR1_MF_OUTSPK_INT(ep->epnum - 1);
  47        iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR1);
  48}
  49
  50static void fotg210_set_cxdone(struct fotg210_udc *fotg210)
  51{
  52        u32 value = ioread32(fotg210->reg + FOTG210_DCFESR);
  53
  54        value |= DCFESR_CX_DONE;
  55        iowrite32(value, fotg210->reg + FOTG210_DCFESR);
  56}
  57
  58static void fotg210_done(struct fotg210_ep *ep, struct fotg210_request *req,
  59                        int status)
  60{
  61        list_del_init(&req->queue);
  62
  63        /* don't modify queue heads during completion callback */
  64        if (ep->fotg210->gadget.speed == USB_SPEED_UNKNOWN)
  65                req->req.status = -ESHUTDOWN;
  66        else
  67                req->req.status = status;
  68
  69        spin_unlock(&ep->fotg210->lock);
  70        usb_gadget_giveback_request(&ep->ep, &req->req);
  71        spin_lock(&ep->fotg210->lock);
  72
  73        if (ep->epnum) {
  74                if (list_empty(&ep->queue))
  75                        fotg210_disable_fifo_int(ep);
  76        } else {
  77                fotg210_set_cxdone(ep->fotg210);
  78        }
  79}
  80
  81static void fotg210_fifo_ep_mapping(struct fotg210_ep *ep, u32 epnum,
  82                                u32 dir_in)
  83{
  84        struct fotg210_udc *fotg210 = ep->fotg210;
  85        u32 val;
  86
  87        /* Driver should map an ep to a fifo and then map the fifo
  88         * to the ep. What a brain-damaged design!
  89         */
  90
  91        /* map a fifo to an ep */
  92        val = ioread32(fotg210->reg + FOTG210_EPMAP);
  93        val &= ~EPMAP_FIFONOMSK(epnum, dir_in);
  94        val |= EPMAP_FIFONO(epnum, dir_in);
  95        iowrite32(val, fotg210->reg + FOTG210_EPMAP);
  96
  97        /* map the ep to the fifo */
  98        val = ioread32(fotg210->reg + FOTG210_FIFOMAP);
  99        val &= ~FIFOMAP_EPNOMSK(epnum);
 100        val |= FIFOMAP_EPNO(epnum);
 101        iowrite32(val, fotg210->reg + FOTG210_FIFOMAP);
 102
 103        /* enable fifo */
 104        val = ioread32(fotg210->reg + FOTG210_FIFOCF);
 105        val |= FIFOCF_FIFO_EN(epnum - 1);
 106        iowrite32(val, fotg210->reg + FOTG210_FIFOCF);
 107}
 108
 109static void fotg210_set_fifo_dir(struct fotg210_ep *ep, u32 epnum, u32 dir_in)
 110{
 111        struct fotg210_udc *fotg210 = ep->fotg210;
 112        u32 val;
 113
 114        val = ioread32(fotg210->reg + FOTG210_FIFOMAP);
 115        val |= (dir_in ? FIFOMAP_DIRIN(epnum - 1) : FIFOMAP_DIROUT(epnum - 1));
 116        iowrite32(val, fotg210->reg + FOTG210_FIFOMAP);
 117}
 118
 119static void fotg210_set_tfrtype(struct fotg210_ep *ep, u32 epnum, u32 type)
 120{
 121        struct fotg210_udc *fotg210 = ep->fotg210;
 122        u32 val;
 123
 124        val = ioread32(fotg210->reg + FOTG210_FIFOCF);
 125        val |= FIFOCF_TYPE(type, epnum - 1);
 126        iowrite32(val, fotg210->reg + FOTG210_FIFOCF);
 127}
 128
 129static void fotg210_set_mps(struct fotg210_ep *ep, u32 epnum, u32 mps,
 130                                u32 dir_in)
 131{
 132        struct fotg210_udc *fotg210 = ep->fotg210;
 133        u32 val;
 134        u32 offset = dir_in ? FOTG210_INEPMPSR(epnum) :
 135                                FOTG210_OUTEPMPSR(epnum);
 136
 137        val = ioread32(fotg210->reg + offset);
 138        val |= INOUTEPMPSR_MPS(mps);
 139        iowrite32(val, fotg210->reg + offset);
 140}
 141
 142static int fotg210_config_ep(struct fotg210_ep *ep,
 143                     const struct usb_endpoint_descriptor *desc)
 144{
 145        struct fotg210_udc *fotg210 = ep->fotg210;
 146
 147        fotg210_set_fifo_dir(ep, ep->epnum, ep->dir_in);
 148        fotg210_set_tfrtype(ep, ep->epnum, ep->type);
 149        fotg210_set_mps(ep, ep->epnum, ep->ep.maxpacket, ep->dir_in);
 150        fotg210_fifo_ep_mapping(ep, ep->epnum, ep->dir_in);
 151
 152        fotg210->ep[ep->epnum] = ep;
 153
 154        return 0;
 155}
 156
 157static int fotg210_ep_enable(struct usb_ep *_ep,
 158                          const struct usb_endpoint_descriptor *desc)
 159{
 160        struct fotg210_ep *ep;
 161
 162        ep = container_of(_ep, struct fotg210_ep, ep);
 163
 164        ep->desc = desc;
 165        ep->epnum = usb_endpoint_num(desc);
 166        ep->type = usb_endpoint_type(desc);
 167        ep->dir_in = usb_endpoint_dir_in(desc);
 168        ep->ep.maxpacket = usb_endpoint_maxp(desc);
 169
 170        return fotg210_config_ep(ep, desc);
 171}
 172
 173static void fotg210_reset_tseq(struct fotg210_udc *fotg210, u8 epnum)
 174{
 175        struct fotg210_ep *ep = fotg210->ep[epnum];
 176        u32 value;
 177        void __iomem *reg;
 178
 179        reg = (ep->dir_in) ?
 180                fotg210->reg + FOTG210_INEPMPSR(epnum) :
 181                fotg210->reg + FOTG210_OUTEPMPSR(epnum);
 182
 183        /* Note: Driver needs to set and clear INOUTEPMPSR_RESET_TSEQ
 184         *       bit. Controller wouldn't clear this bit. WTF!!!
 185         */
 186
 187        value = ioread32(reg);
 188        value |= INOUTEPMPSR_RESET_TSEQ;
 189        iowrite32(value, reg);
 190
 191        value = ioread32(reg);
 192        value &= ~INOUTEPMPSR_RESET_TSEQ;
 193        iowrite32(value, reg);
 194}
 195
 196static int fotg210_ep_release(struct fotg210_ep *ep)
 197{
 198        if (!ep->epnum)
 199                return 0;
 200        ep->epnum = 0;
 201        ep->stall = 0;
 202        ep->wedged = 0;
 203
 204        fotg210_reset_tseq(ep->fotg210, ep->epnum);
 205
 206        return 0;
 207}
 208
 209static int fotg210_ep_disable(struct usb_ep *_ep)
 210{
 211        struct fotg210_ep *ep;
 212        struct fotg210_request *req;
 213        unsigned long flags;
 214
 215        BUG_ON(!_ep);
 216
 217        ep = container_of(_ep, struct fotg210_ep, ep);
 218
 219        while (!list_empty(&ep->queue)) {
 220                req = list_entry(ep->queue.next,
 221                        struct fotg210_request, queue);
 222                spin_lock_irqsave(&ep->fotg210->lock, flags);
 223                fotg210_done(ep, req, -ECONNRESET);
 224                spin_unlock_irqrestore(&ep->fotg210->lock, flags);
 225        }
 226
 227        return fotg210_ep_release(ep);
 228}
 229
 230static struct usb_request *fotg210_ep_alloc_request(struct usb_ep *_ep,
 231                                                gfp_t gfp_flags)
 232{
 233        struct fotg210_request *req;
 234
 235        req = kzalloc(sizeof(struct fotg210_request), gfp_flags);
 236        if (!req)
 237                return NULL;
 238
 239        INIT_LIST_HEAD(&req->queue);
 240
 241        return &req->req;
 242}
 243
 244static void fotg210_ep_free_request(struct usb_ep *_ep,
 245                                        struct usb_request *_req)
 246{
 247        struct fotg210_request *req;
 248
 249        req = container_of(_req, struct fotg210_request, req);
 250        kfree(req);
 251}
 252
 253static void fotg210_enable_dma(struct fotg210_ep *ep,
 254                              dma_addr_t d, u32 len)
 255{
 256        u32 value;
 257        struct fotg210_udc *fotg210 = ep->fotg210;
 258
 259        /* set transfer length and direction */
 260        value = ioread32(fotg210->reg + FOTG210_DMACPSR1);
 261        value &= ~(DMACPSR1_DMA_LEN(0xFFFF) | DMACPSR1_DMA_TYPE(1));
 262        value |= DMACPSR1_DMA_LEN(len) | DMACPSR1_DMA_TYPE(ep->dir_in);
 263        iowrite32(value, fotg210->reg + FOTG210_DMACPSR1);
 264
 265        /* set device DMA target FIFO number */
 266        value = ioread32(fotg210->reg + FOTG210_DMATFNR);
 267        if (ep->epnum)
 268                value |= DMATFNR_ACC_FN(ep->epnum - 1);
 269        else
 270                value |= DMATFNR_ACC_CXF;
 271        iowrite32(value, fotg210->reg + FOTG210_DMATFNR);
 272
 273        /* set DMA memory address */
 274        iowrite32(d, fotg210->reg + FOTG210_DMACPSR2);
 275
 276        /* enable MDMA_EROR and MDMA_CMPLT interrupt */
 277        value = ioread32(fotg210->reg + FOTG210_DMISGR2);
 278        value &= ~(DMISGR2_MDMA_CMPLT | DMISGR2_MDMA_ERROR);
 279        iowrite32(value, fotg210->reg + FOTG210_DMISGR2);
 280
 281        /* start DMA */
 282        value = ioread32(fotg210->reg + FOTG210_DMACPSR1);
 283        value |= DMACPSR1_DMA_START;
 284        iowrite32(value, fotg210->reg + FOTG210_DMACPSR1);
 285}
 286
 287static void fotg210_disable_dma(struct fotg210_ep *ep)
 288{
 289        iowrite32(DMATFNR_DISDMA, ep->fotg210->reg + FOTG210_DMATFNR);
 290}
 291
 292static void fotg210_wait_dma_done(struct fotg210_ep *ep)
 293{
 294        u32 value;
 295
 296        do {
 297                value = ioread32(ep->fotg210->reg + FOTG210_DISGR2);
 298                if ((value & DISGR2_USBRST_INT) ||
 299                    (value & DISGR2_DMA_ERROR))
 300                        goto dma_reset;
 301        } while (!(value & DISGR2_DMA_CMPLT));
 302
 303        value &= ~DISGR2_DMA_CMPLT;
 304        iowrite32(value, ep->fotg210->reg + FOTG210_DISGR2);
 305        return;
 306
 307dma_reset:
 308        value = ioread32(ep->fotg210->reg + FOTG210_DMACPSR1);
 309        value |= DMACPSR1_DMA_ABORT;
 310        iowrite32(value, ep->fotg210->reg + FOTG210_DMACPSR1);
 311
 312        /* reset fifo */
 313        if (ep->epnum) {
 314                value = ioread32(ep->fotg210->reg +
 315                                FOTG210_FIBCR(ep->epnum - 1));
 316                value |= FIBCR_FFRST;
 317                iowrite32(value, ep->fotg210->reg +
 318                                FOTG210_FIBCR(ep->epnum - 1));
 319        } else {
 320                value = ioread32(ep->fotg210->reg + FOTG210_DCFESR);
 321                value |= DCFESR_CX_CLR;
 322                iowrite32(value, ep->fotg210->reg + FOTG210_DCFESR);
 323        }
 324}
 325
 326static void fotg210_start_dma(struct fotg210_ep *ep,
 327                        struct fotg210_request *req)
 328{
 329        dma_addr_t d;
 330        u8 *buffer;
 331        u32 length;
 332
 333        if (ep->epnum) {
 334                if (ep->dir_in) {
 335                        buffer = req->req.buf;
 336                        length = req->req.length;
 337                } else {
 338                        buffer = req->req.buf + req->req.actual;
 339                        length = ioread32(ep->fotg210->reg +
 340                                        FOTG210_FIBCR(ep->epnum - 1));
 341                        length &= FIBCR_BCFX;
 342                }
 343        } else {
 344                buffer = req->req.buf + req->req.actual;
 345                if (req->req.length - req->req.actual > ep->ep.maxpacket)
 346                        length = ep->ep.maxpacket;
 347                else
 348                        length = req->req.length;
 349        }
 350
 351        d = dma_map_single(NULL, buffer, length,
 352                        ep->dir_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
 353
 354        if (dma_mapping_error(NULL, d)) {
 355                pr_err("dma_mapping_error\n");
 356                return;
 357        }
 358
 359        dma_sync_single_for_device(NULL, d, length,
 360                                   ep->dir_in ? DMA_TO_DEVICE :
 361                                        DMA_FROM_DEVICE);
 362
 363        fotg210_enable_dma(ep, d, length);
 364
 365        /* check if dma is done */
 366        fotg210_wait_dma_done(ep);
 367
 368        fotg210_disable_dma(ep);
 369
 370        /* update actual transfer length */
 371        req->req.actual += length;
 372
 373        dma_unmap_single(NULL, d, length, DMA_TO_DEVICE);
 374}
 375
 376static void fotg210_ep0_queue(struct fotg210_ep *ep,
 377                                struct fotg210_request *req)
 378{
 379        if (!req->req.length) {
 380                fotg210_done(ep, req, 0);
 381                return;
 382        }
 383        if (ep->dir_in) { /* if IN */
 384                fotg210_start_dma(ep, req);
 385                if ((req->req.length == req->req.actual) ||
 386                    (req->req.actual < ep->ep.maxpacket))
 387                        fotg210_done(ep, req, 0);
 388        } else { /* OUT */
 389                u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR0);
 390
 391                value &= ~DMISGR0_MCX_OUT_INT;
 392                iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR0);
 393        }
 394}
 395
 396static int fotg210_ep_queue(struct usb_ep *_ep, struct usb_request *_req,
 397                                gfp_t gfp_flags)
 398{
 399        struct fotg210_ep *ep;
 400        struct fotg210_request *req;
 401        unsigned long flags;
 402        int request = 0;
 403
 404        ep = container_of(_ep, struct fotg210_ep, ep);
 405        req = container_of(_req, struct fotg210_request, req);
 406
 407        if (ep->fotg210->gadget.speed == USB_SPEED_UNKNOWN)
 408                return -ESHUTDOWN;
 409
 410        spin_lock_irqsave(&ep->fotg210->lock, flags);
 411
 412        if (list_empty(&ep->queue))
 413                request = 1;
 414
 415        list_add_tail(&req->queue, &ep->queue);
 416
 417        req->req.actual = 0;
 418        req->req.status = -EINPROGRESS;
 419
 420        if (!ep->epnum) /* ep0 */
 421                fotg210_ep0_queue(ep, req);
 422        else if (request && !ep->stall)
 423                fotg210_enable_fifo_int(ep);
 424
 425        spin_unlock_irqrestore(&ep->fotg210->lock, flags);
 426
 427        return 0;
 428}
 429
 430static int fotg210_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
 431{
 432        struct fotg210_ep *ep;
 433        struct fotg210_request *req;
 434        unsigned long flags;
 435
 436        ep = container_of(_ep, struct fotg210_ep, ep);
 437        req = container_of(_req, struct fotg210_request, req);
 438
 439        spin_lock_irqsave(&ep->fotg210->lock, flags);
 440        if (!list_empty(&ep->queue))
 441                fotg210_done(ep, req, -ECONNRESET);
 442        spin_unlock_irqrestore(&ep->fotg210->lock, flags);
 443
 444        return 0;
 445}
 446
 447static void fotg210_set_epnstall(struct fotg210_ep *ep)
 448{
 449        struct fotg210_udc *fotg210 = ep->fotg210;
 450        u32 value;
 451        void __iomem *reg;
 452
 453        /* check if IN FIFO is empty before stall */
 454        if (ep->dir_in) {
 455                do {
 456                        value = ioread32(fotg210->reg + FOTG210_DCFESR);
 457                } while (!(value & DCFESR_FIFO_EMPTY(ep->epnum - 1)));
 458        }
 459
 460        reg = (ep->dir_in) ?
 461                fotg210->reg + FOTG210_INEPMPSR(ep->epnum) :
 462                fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum);
 463        value = ioread32(reg);
 464        value |= INOUTEPMPSR_STL_EP;
 465        iowrite32(value, reg);
 466}
 467
 468static void fotg210_clear_epnstall(struct fotg210_ep *ep)
 469{
 470        struct fotg210_udc *fotg210 = ep->fotg210;
 471        u32 value;
 472        void __iomem *reg;
 473
 474        reg = (ep->dir_in) ?
 475                fotg210->reg + FOTG210_INEPMPSR(ep->epnum) :
 476                fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum);
 477        value = ioread32(reg);
 478        value &= ~INOUTEPMPSR_STL_EP;
 479        iowrite32(value, reg);
 480}
 481
 482static int fotg210_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedge)
 483{
 484        struct fotg210_ep *ep;
 485        struct fotg210_udc *fotg210;
 486        unsigned long flags;
 487        int ret = 0;
 488
 489        ep = container_of(_ep, struct fotg210_ep, ep);
 490
 491        fotg210 = ep->fotg210;
 492
 493        spin_lock_irqsave(&ep->fotg210->lock, flags);
 494
 495        if (value) {
 496                fotg210_set_epnstall(ep);
 497                ep->stall = 1;
 498                if (wedge)
 499                        ep->wedged = 1;
 500        } else {
 501                fotg210_reset_tseq(fotg210, ep->epnum);
 502                fotg210_clear_epnstall(ep);
 503                ep->stall = 0;
 504                ep->wedged = 0;
 505                if (!list_empty(&ep->queue))
 506                        fotg210_enable_fifo_int(ep);
 507        }
 508
 509        spin_unlock_irqrestore(&ep->fotg210->lock, flags);
 510        return ret;
 511}
 512
 513static int fotg210_ep_set_halt(struct usb_ep *_ep, int value)
 514{
 515        return fotg210_set_halt_and_wedge(_ep, value, 0);
 516}
 517
 518static int fotg210_ep_set_wedge(struct usb_ep *_ep)
 519{
 520        return fotg210_set_halt_and_wedge(_ep, 1, 1);
 521}
 522
 523static void fotg210_ep_fifo_flush(struct usb_ep *_ep)
 524{
 525}
 526
 527static const struct usb_ep_ops fotg210_ep_ops = {
 528        .enable         = fotg210_ep_enable,
 529        .disable        = fotg210_ep_disable,
 530
 531        .alloc_request  = fotg210_ep_alloc_request,
 532        .free_request   = fotg210_ep_free_request,
 533
 534        .queue          = fotg210_ep_queue,
 535        .dequeue        = fotg210_ep_dequeue,
 536
 537        .set_halt       = fotg210_ep_set_halt,
 538        .fifo_flush     = fotg210_ep_fifo_flush,
 539        .set_wedge      = fotg210_ep_set_wedge,
 540};
 541
 542static void fotg210_clear_tx0byte(struct fotg210_udc *fotg210)
 543{
 544        u32 value = ioread32(fotg210->reg + FOTG210_TX0BYTE);
 545
 546        value &= ~(TX0BYTE_EP1 | TX0BYTE_EP2 | TX0BYTE_EP3
 547                   | TX0BYTE_EP4);
 548        iowrite32(value, fotg210->reg + FOTG210_TX0BYTE);
 549}
 550
 551static void fotg210_clear_rx0byte(struct fotg210_udc *fotg210)
 552{
 553        u32 value = ioread32(fotg210->reg + FOTG210_RX0BYTE);
 554
 555        value &= ~(RX0BYTE_EP1 | RX0BYTE_EP2 | RX0BYTE_EP3
 556                   | RX0BYTE_EP4);
 557        iowrite32(value, fotg210->reg + FOTG210_RX0BYTE);
 558}
 559
 560/* read 8-byte setup packet only */
 561static void fotg210_rdsetupp(struct fotg210_udc *fotg210,
 562                   u8 *buffer)
 563{
 564        int i = 0;
 565        u8 *tmp = buffer;
 566        u32 data;
 567        u32 length = 8;
 568
 569        iowrite32(DMATFNR_ACC_CXF, fotg210->reg + FOTG210_DMATFNR);
 570
 571        for (i = (length >> 2); i > 0; i--) {
 572                data = ioread32(fotg210->reg + FOTG210_CXPORT);
 573                *tmp = data & 0xFF;
 574                *(tmp + 1) = (data >> 8) & 0xFF;
 575                *(tmp + 2) = (data >> 16) & 0xFF;
 576                *(tmp + 3) = (data >> 24) & 0xFF;
 577                tmp = tmp + 4;
 578        }
 579
 580        switch (length % 4) {
 581        case 1:
 582                data = ioread32(fotg210->reg + FOTG210_CXPORT);
 583                *tmp = data & 0xFF;
 584                break;
 585        case 2:
 586                data = ioread32(fotg210->reg + FOTG210_CXPORT);
 587                *tmp = data & 0xFF;
 588                *(tmp + 1) = (data >> 8) & 0xFF;
 589                break;
 590        case 3:
 591                data = ioread32(fotg210->reg + FOTG210_CXPORT);
 592                *tmp = data & 0xFF;
 593                *(tmp + 1) = (data >> 8) & 0xFF;
 594                *(tmp + 2) = (data >> 16) & 0xFF;
 595                break;
 596        default:
 597                break;
 598        }
 599
 600        iowrite32(DMATFNR_DISDMA, fotg210->reg + FOTG210_DMATFNR);
 601}
 602
 603static void fotg210_set_configuration(struct fotg210_udc *fotg210)
 604{
 605        u32 value = ioread32(fotg210->reg + FOTG210_DAR);
 606
 607        value |= DAR_AFT_CONF;
 608        iowrite32(value, fotg210->reg + FOTG210_DAR);
 609}
 610
 611static void fotg210_set_dev_addr(struct fotg210_udc *fotg210, u32 addr)
 612{
 613        u32 value = ioread32(fotg210->reg + FOTG210_DAR);
 614
 615        value |= (addr & 0x7F);
 616        iowrite32(value, fotg210->reg + FOTG210_DAR);
 617}
 618
 619static void fotg210_set_cxstall(struct fotg210_udc *fotg210)
 620{
 621        u32 value = ioread32(fotg210->reg + FOTG210_DCFESR);
 622
 623        value |= DCFESR_CX_STL;
 624        iowrite32(value, fotg210->reg + FOTG210_DCFESR);
 625}
 626
 627static void fotg210_request_error(struct fotg210_udc *fotg210)
 628{
 629        fotg210_set_cxstall(fotg210);
 630        pr_err("request error!!\n");
 631}
 632
 633static void fotg210_set_address(struct fotg210_udc *fotg210,
 634                                struct usb_ctrlrequest *ctrl)
 635{
 636        if (ctrl->wValue >= 0x0100) {
 637                fotg210_request_error(fotg210);
 638        } else {
 639                fotg210_set_dev_addr(fotg210, ctrl->wValue);
 640                fotg210_set_cxdone(fotg210);
 641        }
 642}
 643
 644static void fotg210_set_feature(struct fotg210_udc *fotg210,
 645                                struct usb_ctrlrequest *ctrl)
 646{
 647        switch (ctrl->bRequestType & USB_RECIP_MASK) {
 648        case USB_RECIP_DEVICE:
 649                fotg210_set_cxdone(fotg210);
 650                break;
 651        case USB_RECIP_INTERFACE:
 652                fotg210_set_cxdone(fotg210);
 653                break;
 654        case USB_RECIP_ENDPOINT: {
 655                u8 epnum;
 656                epnum = le16_to_cpu(ctrl->wIndex) & USB_ENDPOINT_NUMBER_MASK;
 657                if (epnum)
 658                        fotg210_set_epnstall(fotg210->ep[epnum]);
 659                else
 660                        fotg210_set_cxstall(fotg210);
 661                fotg210_set_cxdone(fotg210);
 662                }
 663                break;
 664        default:
 665                fotg210_request_error(fotg210);
 666                break;
 667        }
 668}
 669
 670static void fotg210_clear_feature(struct fotg210_udc *fotg210,
 671                                struct usb_ctrlrequest *ctrl)
 672{
 673        struct fotg210_ep *ep =
 674                fotg210->ep[ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK];
 675
 676        switch (ctrl->bRequestType & USB_RECIP_MASK) {
 677        case USB_RECIP_DEVICE:
 678                fotg210_set_cxdone(fotg210);
 679                break;
 680        case USB_RECIP_INTERFACE:
 681                fotg210_set_cxdone(fotg210);
 682                break;
 683        case USB_RECIP_ENDPOINT:
 684                if (ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK) {
 685                        if (ep->wedged) {
 686                                fotg210_set_cxdone(fotg210);
 687                                break;
 688                        }
 689                        if (ep->stall)
 690                                fotg210_set_halt_and_wedge(&ep->ep, 0, 0);
 691                }
 692                fotg210_set_cxdone(fotg210);
 693                break;
 694        default:
 695                fotg210_request_error(fotg210);
 696                break;
 697        }
 698}
 699
 700static int fotg210_is_epnstall(struct fotg210_ep *ep)
 701{
 702        struct fotg210_udc *fotg210 = ep->fotg210;
 703        u32 value;
 704        void __iomem *reg;
 705
 706        reg = (ep->dir_in) ?
 707                fotg210->reg + FOTG210_INEPMPSR(ep->epnum) :
 708                fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum);
 709        value = ioread32(reg);
 710        return value & INOUTEPMPSR_STL_EP ? 1 : 0;
 711}
 712
 713static void fotg210_get_status(struct fotg210_udc *fotg210,
 714                                struct usb_ctrlrequest *ctrl)
 715{
 716        u8 epnum;
 717
 718        switch (ctrl->bRequestType & USB_RECIP_MASK) {
 719        case USB_RECIP_DEVICE:
 720                fotg210->ep0_data = 1 << USB_DEVICE_SELF_POWERED;
 721                break;
 722        case USB_RECIP_INTERFACE:
 723                fotg210->ep0_data = 0;
 724                break;
 725        case USB_RECIP_ENDPOINT:
 726                epnum = ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK;
 727                if (epnum)
 728                        fotg210->ep0_data =
 729                                fotg210_is_epnstall(fotg210->ep[epnum])
 730                                << USB_ENDPOINT_HALT;
 731                else
 732                        fotg210_request_error(fotg210);
 733                break;
 734
 735        default:
 736                fotg210_request_error(fotg210);
 737                return;         /* exit */
 738        }
 739
 740        fotg210->ep0_req->buf = &fotg210->ep0_data;
 741        fotg210->ep0_req->length = 2;
 742
 743        spin_unlock(&fotg210->lock);
 744        fotg210_ep_queue(fotg210->gadget.ep0, fotg210->ep0_req, GFP_KERNEL);
 745        spin_lock(&fotg210->lock);
 746}
 747
 748static int fotg210_setup_packet(struct fotg210_udc *fotg210,
 749                                struct usb_ctrlrequest *ctrl)
 750{
 751        u8 *p = (u8 *)ctrl;
 752        u8 ret = 0;
 753
 754        fotg210_rdsetupp(fotg210, p);
 755
 756        fotg210->ep[0]->dir_in = ctrl->bRequestType & USB_DIR_IN;
 757
 758        if (fotg210->gadget.speed == USB_SPEED_UNKNOWN) {
 759                u32 value = ioread32(fotg210->reg + FOTG210_DMCR);
 760                fotg210->gadget.speed = value & DMCR_HS_EN ?
 761                                USB_SPEED_HIGH : USB_SPEED_FULL;
 762        }
 763
 764        /* check request */
 765        if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
 766                switch (ctrl->bRequest) {
 767                case USB_REQ_GET_STATUS:
 768                        fotg210_get_status(fotg210, ctrl);
 769                        break;
 770                case USB_REQ_CLEAR_FEATURE:
 771                        fotg210_clear_feature(fotg210, ctrl);
 772                        break;
 773                case USB_REQ_SET_FEATURE:
 774                        fotg210_set_feature(fotg210, ctrl);
 775                        break;
 776                case USB_REQ_SET_ADDRESS:
 777                        fotg210_set_address(fotg210, ctrl);
 778                        break;
 779                case USB_REQ_SET_CONFIGURATION:
 780                        fotg210_set_configuration(fotg210);
 781                        ret = 1;
 782                        break;
 783                default:
 784                        ret = 1;
 785                        break;
 786                }
 787        } else {
 788                ret = 1;
 789        }
 790
 791        return ret;
 792}
 793
 794static void fotg210_ep0out(struct fotg210_udc *fotg210)
 795{
 796        struct fotg210_ep *ep = fotg210->ep[0];
 797
 798        if (!list_empty(&ep->queue) && !ep->dir_in) {
 799                struct fotg210_request *req;
 800
 801                req = list_first_entry(&ep->queue,
 802                        struct fotg210_request, queue);
 803
 804                if (req->req.length)
 805                        fotg210_start_dma(ep, req);
 806
 807                if ((req->req.length - req->req.actual) < ep->ep.maxpacket)
 808                        fotg210_done(ep, req, 0);
 809        } else {
 810                pr_err("%s : empty queue\n", __func__);
 811        }
 812}
 813
 814static void fotg210_ep0in(struct fotg210_udc *fotg210)
 815{
 816        struct fotg210_ep *ep = fotg210->ep[0];
 817
 818        if ((!list_empty(&ep->queue)) && (ep->dir_in)) {
 819                struct fotg210_request *req;
 820
 821                req = list_entry(ep->queue.next,
 822                                struct fotg210_request, queue);
 823
 824                if (req->req.length)
 825                        fotg210_start_dma(ep, req);
 826
 827                if ((req->req.length - req->req.actual) < ep->ep.maxpacket)
 828                        fotg210_done(ep, req, 0);
 829        } else {
 830                fotg210_set_cxdone(fotg210);
 831        }
 832}
 833
 834static void fotg210_clear_comabt_int(struct fotg210_udc *fotg210)
 835{
 836        u32 value = ioread32(fotg210->reg + FOTG210_DISGR0);
 837
 838        value &= ~DISGR0_CX_COMABT_INT;
 839        iowrite32(value, fotg210->reg + FOTG210_DISGR0);
 840}
 841
 842static void fotg210_in_fifo_handler(struct fotg210_ep *ep)
 843{
 844        struct fotg210_request *req = list_entry(ep->queue.next,
 845                                        struct fotg210_request, queue);
 846
 847        if (req->req.length)
 848                fotg210_start_dma(ep, req);
 849        fotg210_done(ep, req, 0);
 850}
 851
 852static void fotg210_out_fifo_handler(struct fotg210_ep *ep)
 853{
 854        struct fotg210_request *req = list_entry(ep->queue.next,
 855                                                 struct fotg210_request, queue);
 856
 857        fotg210_start_dma(ep, req);
 858
 859        /* finish out transfer */
 860        if (req->req.length == req->req.actual ||
 861            req->req.actual < ep->ep.maxpacket)
 862                fotg210_done(ep, req, 0);
 863}
 864
 865static irqreturn_t fotg210_irq(int irq, void *_fotg210)
 866{
 867        struct fotg210_udc *fotg210 = _fotg210;
 868        u32 int_grp = ioread32(fotg210->reg + FOTG210_DIGR);
 869        u32 int_msk = ioread32(fotg210->reg + FOTG210_DMIGR);
 870
 871        int_grp &= ~int_msk;
 872
 873        spin_lock(&fotg210->lock);
 874
 875        if (int_grp & DIGR_INT_G2) {
 876                void __iomem *reg = fotg210->reg + FOTG210_DISGR2;
 877                u32 int_grp2 = ioread32(reg);
 878                u32 int_msk2 = ioread32(fotg210->reg + FOTG210_DMISGR2);
 879                u32 value;
 880
 881                int_grp2 &= ~int_msk2;
 882
 883                if (int_grp2 & DISGR2_USBRST_INT) {
 884                        value = ioread32(reg);
 885                        value &= ~DISGR2_USBRST_INT;
 886                        iowrite32(value, reg);
 887                        pr_info("fotg210 udc reset\n");
 888                }
 889                if (int_grp2 & DISGR2_SUSP_INT) {
 890                        value = ioread32(reg);
 891                        value &= ~DISGR2_SUSP_INT;
 892                        iowrite32(value, reg);
 893                        pr_info("fotg210 udc suspend\n");
 894                }
 895                if (int_grp2 & DISGR2_RESM_INT) {
 896                        value = ioread32(reg);
 897                        value &= ~DISGR2_RESM_INT;
 898                        iowrite32(value, reg);
 899                        pr_info("fotg210 udc resume\n");
 900                }
 901                if (int_grp2 & DISGR2_ISO_SEQ_ERR_INT) {
 902                        value = ioread32(reg);
 903                        value &= ~DISGR2_ISO_SEQ_ERR_INT;
 904                        iowrite32(value, reg);
 905                        pr_info("fotg210 iso sequence error\n");
 906                }
 907                if (int_grp2 & DISGR2_ISO_SEQ_ABORT_INT) {
 908                        value = ioread32(reg);
 909                        value &= ~DISGR2_ISO_SEQ_ABORT_INT;
 910                        iowrite32(value, reg);
 911                        pr_info("fotg210 iso sequence abort\n");
 912                }
 913                if (int_grp2 & DISGR2_TX0BYTE_INT) {
 914                        fotg210_clear_tx0byte(fotg210);
 915                        value = ioread32(reg);
 916                        value &= ~DISGR2_TX0BYTE_INT;
 917                        iowrite32(value, reg);
 918                        pr_info("fotg210 transferred 0 byte\n");
 919                }
 920                if (int_grp2 & DISGR2_RX0BYTE_INT) {
 921                        fotg210_clear_rx0byte(fotg210);
 922                        value = ioread32(reg);
 923                        value &= ~DISGR2_RX0BYTE_INT;
 924                        iowrite32(value, reg);
 925                        pr_info("fotg210 received 0 byte\n");
 926                }
 927                if (int_grp2 & DISGR2_DMA_ERROR) {
 928                        value = ioread32(reg);
 929                        value &= ~DISGR2_DMA_ERROR;
 930                        iowrite32(value, reg);
 931                }
 932        }
 933
 934        if (int_grp & DIGR_INT_G0) {
 935                void __iomem *reg = fotg210->reg + FOTG210_DISGR0;
 936                u32 int_grp0 = ioread32(reg);
 937                u32 int_msk0 = ioread32(fotg210->reg + FOTG210_DMISGR0);
 938                struct usb_ctrlrequest ctrl;
 939
 940                int_grp0 &= ~int_msk0;
 941
 942                /* the highest priority in this source register */
 943                if (int_grp0 & DISGR0_CX_COMABT_INT) {
 944                        fotg210_clear_comabt_int(fotg210);
 945                        pr_info("fotg210 CX command abort\n");
 946                }
 947
 948                if (int_grp0 & DISGR0_CX_SETUP_INT) {
 949                        if (fotg210_setup_packet(fotg210, &ctrl)) {
 950                                spin_unlock(&fotg210->lock);
 951                                if (fotg210->driver->setup(&fotg210->gadget,
 952                                                           &ctrl) < 0)
 953                                        fotg210_set_cxstall(fotg210);
 954                                spin_lock(&fotg210->lock);
 955                        }
 956                }
 957                if (int_grp0 & DISGR0_CX_COMEND_INT)
 958                        pr_info("fotg210 cmd end\n");
 959
 960                if (int_grp0 & DISGR0_CX_IN_INT)
 961                        fotg210_ep0in(fotg210);
 962
 963                if (int_grp0 & DISGR0_CX_OUT_INT)
 964                        fotg210_ep0out(fotg210);
 965
 966                if (int_grp0 & DISGR0_CX_COMFAIL_INT) {
 967                        fotg210_set_cxstall(fotg210);
 968                        pr_info("fotg210 ep0 fail\n");
 969                }
 970        }
 971
 972        if (int_grp & DIGR_INT_G1) {
 973                void __iomem *reg = fotg210->reg + FOTG210_DISGR1;
 974                u32 int_grp1 = ioread32(reg);
 975                u32 int_msk1 = ioread32(fotg210->reg + FOTG210_DMISGR1);
 976                int fifo;
 977
 978                int_grp1 &= ~int_msk1;
 979
 980                for (fifo = 0; fifo < FOTG210_MAX_FIFO_NUM; fifo++) {
 981                        if (int_grp1 & DISGR1_IN_INT(fifo))
 982                                fotg210_in_fifo_handler(fotg210->ep[fifo + 1]);
 983
 984                        if ((int_grp1 & DISGR1_OUT_INT(fifo)) ||
 985                            (int_grp1 & DISGR1_SPK_INT(fifo)))
 986                                fotg210_out_fifo_handler(fotg210->ep[fifo + 1]);
 987                }
 988        }
 989
 990        spin_unlock(&fotg210->lock);
 991
 992        return IRQ_HANDLED;
 993}
 994
 995static void fotg210_disable_unplug(struct fotg210_udc *fotg210)
 996{
 997        u32 reg = ioread32(fotg210->reg + FOTG210_PHYTMSR);
 998
 999        reg &= ~PHYTMSR_UNPLUG;
1000        iowrite32(reg, fotg210->reg + FOTG210_PHYTMSR);
1001}
1002
1003static int fotg210_udc_start(struct usb_gadget *g,
1004                struct usb_gadget_driver *driver)
1005{
1006        struct fotg210_udc *fotg210 = gadget_to_fotg210(g);
1007        u32 value;
1008
1009        /* hook up the driver */
1010        driver->driver.bus = NULL;
1011        fotg210->driver = driver;
1012
1013        /* enable device global interrupt */
1014        value = ioread32(fotg210->reg + FOTG210_DMCR);
1015        value |= DMCR_GLINT_EN;
1016        iowrite32(value, fotg210->reg + FOTG210_DMCR);
1017
1018        return 0;
1019}
1020
1021static void fotg210_init(struct fotg210_udc *fotg210)
1022{
1023        u32 value;
1024
1025        /* disable global interrupt and set int polarity to active high */
1026        iowrite32(GMIR_MHC_INT | GMIR_MOTG_INT | GMIR_INT_POLARITY,
1027                  fotg210->reg + FOTG210_GMIR);
1028
1029        /* disable device global interrupt */
1030        value = ioread32(fotg210->reg + FOTG210_DMCR);
1031        value &= ~DMCR_GLINT_EN;
1032        iowrite32(value, fotg210->reg + FOTG210_DMCR);
1033
1034        /* disable all fifo interrupt */
1035        iowrite32(~(u32)0, fotg210->reg + FOTG210_DMISGR1);
1036
1037        /* disable cmd end */
1038        value = ioread32(fotg210->reg + FOTG210_DMISGR0);
1039        value |= DMISGR0_MCX_COMEND;
1040        iowrite32(value, fotg210->reg + FOTG210_DMISGR0);
1041}
1042
1043static int fotg210_udc_stop(struct usb_gadget *g)
1044{
1045        struct fotg210_udc *fotg210 = gadget_to_fotg210(g);
1046        unsigned long   flags;
1047
1048        spin_lock_irqsave(&fotg210->lock, flags);
1049
1050        fotg210_init(fotg210);
1051        fotg210->driver = NULL;
1052
1053        spin_unlock_irqrestore(&fotg210->lock, flags);
1054
1055        return 0;
1056}
1057
1058static const struct usb_gadget_ops fotg210_gadget_ops = {
1059        .udc_start              = fotg210_udc_start,
1060        .udc_stop               = fotg210_udc_stop,
1061};
1062
1063static int fotg210_udc_remove(struct platform_device *pdev)
1064{
1065        struct fotg210_udc *fotg210 = platform_get_drvdata(pdev);
1066
1067        usb_del_gadget_udc(&fotg210->gadget);
1068        iounmap(fotg210->reg);
1069        free_irq(platform_get_irq(pdev, 0), fotg210);
1070
1071        fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req);
1072        kfree(fotg210);
1073
1074        return 0;
1075}
1076
1077static int fotg210_udc_probe(struct platform_device *pdev)
1078{
1079        struct resource *res, *ires;
1080        struct fotg210_udc *fotg210 = NULL;
1081        struct fotg210_ep *_ep[FOTG210_MAX_NUM_EP];
1082        int ret = 0;
1083        int i;
1084
1085        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1086        if (!res) {
1087                pr_err("platform_get_resource error.\n");
1088                return -ENODEV;
1089        }
1090
1091        ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1092        if (!ires) {
1093                pr_err("platform_get_resource IORESOURCE_IRQ error.\n");
1094                return -ENODEV;
1095        }
1096
1097        ret = -ENOMEM;
1098
1099        /* initialize udc */
1100        fotg210 = kzalloc(sizeof(struct fotg210_udc), GFP_KERNEL);
1101        if (fotg210 == NULL)
1102                goto err_alloc;
1103
1104        for (i = 0; i < FOTG210_MAX_NUM_EP; i++) {
1105                _ep[i] = kzalloc(sizeof(struct fotg210_ep), GFP_KERNEL);
1106                if (_ep[i] == NULL)
1107                        goto err_alloc;
1108                fotg210->ep[i] = _ep[i];
1109        }
1110
1111        fotg210->reg = ioremap(res->start, resource_size(res));
1112        if (fotg210->reg == NULL) {
1113                pr_err("ioremap error.\n");
1114                goto err_map;
1115        }
1116
1117        spin_lock_init(&fotg210->lock);
1118
1119        platform_set_drvdata(pdev, fotg210);
1120
1121        fotg210->gadget.ops = &fotg210_gadget_ops;
1122
1123        fotg210->gadget.max_speed = USB_SPEED_HIGH;
1124        fotg210->gadget.dev.parent = &pdev->dev;
1125        fotg210->gadget.dev.dma_mask = pdev->dev.dma_mask;
1126        fotg210->gadget.name = udc_name;
1127
1128        INIT_LIST_HEAD(&fotg210->gadget.ep_list);
1129
1130        for (i = 0; i < FOTG210_MAX_NUM_EP; i++) {
1131                struct fotg210_ep *ep = fotg210->ep[i];
1132
1133                if (i) {
1134                        INIT_LIST_HEAD(&fotg210->ep[i]->ep.ep_list);
1135                        list_add_tail(&fotg210->ep[i]->ep.ep_list,
1136                                      &fotg210->gadget.ep_list);
1137                }
1138                ep->fotg210 = fotg210;
1139                INIT_LIST_HEAD(&ep->queue);
1140                ep->ep.name = fotg210_ep_name[i];
1141                ep->ep.ops = &fotg210_ep_ops;
1142                usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
1143
1144                if (i == 0) {
1145                        ep->ep.caps.type_control = true;
1146                } else {
1147                        ep->ep.caps.type_iso = true;
1148                        ep->ep.caps.type_bulk = true;
1149                        ep->ep.caps.type_int = true;
1150                }
1151
1152                ep->ep.caps.dir_in = true;
1153                ep->ep.caps.dir_out = true;
1154        }
1155        usb_ep_set_maxpacket_limit(&fotg210->ep[0]->ep, 0x40);
1156        fotg210->gadget.ep0 = &fotg210->ep[0]->ep;
1157        INIT_LIST_HEAD(&fotg210->gadget.ep0->ep_list);
1158
1159        fotg210->ep0_req = fotg210_ep_alloc_request(&fotg210->ep[0]->ep,
1160                                GFP_KERNEL);
1161        if (fotg210->ep0_req == NULL)
1162                goto err_req;
1163
1164        fotg210_init(fotg210);
1165
1166        fotg210_disable_unplug(fotg210);
1167
1168        ret = request_irq(ires->start, fotg210_irq, IRQF_SHARED,
1169                          udc_name, fotg210);
1170        if (ret < 0) {
1171                pr_err("request_irq error (%d)\n", ret);
1172                goto err_req;
1173        }
1174
1175        ret = usb_add_gadget_udc(&pdev->dev, &fotg210->gadget);
1176        if (ret)
1177                goto err_add_udc;
1178
1179        dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
1180
1181        return 0;
1182
1183err_add_udc:
1184        free_irq(ires->start, fotg210);
1185
1186err_req:
1187        fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req);
1188
1189err_map:
1190        if (fotg210->reg)
1191                iounmap(fotg210->reg);
1192
1193err_alloc:
1194        kfree(fotg210);
1195
1196        return ret;
1197}
1198
1199static struct platform_driver fotg210_driver = {
1200        .driver         = {
1201                .name = (char *)udc_name,
1202        },
1203        .probe          = fotg210_udc_probe,
1204        .remove         = fotg210_udc_remove,
1205};
1206
1207module_platform_driver(fotg210_driver);
1208
1209MODULE_AUTHOR("Yuan-Hsin Chen, Feng-Hsin Chiang <john453@faraday-tech.com>");
1210MODULE_LICENSE("GPL");
1211MODULE_DESCRIPTION(DRIVER_DESC);
1212