linux/drivers/usb/gadget/udc/s3c2410_udc.c
<<
>>
Prefs
   1/*
   2 * linux/drivers/usb/gadget/s3c2410_udc.c
   3 *
   4 * Samsung S3C24xx series on-chip full speed USB device controllers
   5 *
   6 * Copyright (C) 2004-2007 Herbert Pötzl - Arnaud Patard
   7 *      Additional cleanups by Ben Dooks <ben-linux@fluff.org>
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation; either version 2 of the License, or
  12 * (at your option) any later version.
  13 */
  14
  15#define pr_fmt(fmt) "s3c2410_udc: " fmt
  16
  17#include <linux/module.h>
  18#include <linux/kernel.h>
  19#include <linux/delay.h>
  20#include <linux/ioport.h>
  21#include <linux/sched.h>
  22#include <linux/slab.h>
  23#include <linux/errno.h>
  24#include <linux/init.h>
  25#include <linux/timer.h>
  26#include <linux/list.h>
  27#include <linux/interrupt.h>
  28#include <linux/platform_device.h>
  29#include <linux/clk.h>
  30#include <linux/gpio.h>
  31#include <linux/prefetch.h>
  32#include <linux/io.h>
  33
  34#include <linux/debugfs.h>
  35#include <linux/seq_file.h>
  36
  37#include <linux/usb.h>
  38#include <linux/usb/gadget.h>
  39
  40#include <asm/byteorder.h>
  41#include <asm/irq.h>
  42#include <asm/unaligned.h>
  43#include <mach/irqs.h>
  44
  45#include <mach/hardware.h>
  46
  47#include <plat/regs-udc.h>
  48#include <linux/platform_data/usb-s3c2410_udc.h>
  49
  50
  51#include "s3c2410_udc.h"
  52
  53#define DRIVER_DESC     "S3C2410 USB Device Controller Gadget"
  54#define DRIVER_VERSION  "29 Apr 2007"
  55#define DRIVER_AUTHOR   "Herbert Pötzl <herbert@13thfloor.at>, " \
  56                        "Arnaud Patard <arnaud.patard@rtp-net.org>"
  57
  58static const char               gadget_name[] = "s3c2410_udc";
  59static const char               driver_desc[] = DRIVER_DESC;
  60
  61static struct s3c2410_udc       *the_controller;
  62static struct clk               *udc_clock;
  63static struct clk               *usb_bus_clock;
  64static void __iomem             *base_addr;
  65static u64                      rsrc_start;
  66static u64                      rsrc_len;
  67static struct dentry            *s3c2410_udc_debugfs_root;
  68
  69static inline u32 udc_read(u32 reg)
  70{
  71        return readb(base_addr + reg);
  72}
  73
  74static inline void udc_write(u32 value, u32 reg)
  75{
  76        writeb(value, base_addr + reg);
  77}
  78
  79static inline void udc_writeb(void __iomem *base, u32 value, u32 reg)
  80{
  81        writeb(value, base + reg);
  82}
  83
  84static struct s3c2410_udc_mach_info *udc_info;
  85
  86/*************************** DEBUG FUNCTION ***************************/
  87#define DEBUG_NORMAL    1
  88#define DEBUG_VERBOSE   2
  89
  90#ifdef CONFIG_USB_S3C2410_DEBUG
  91#define USB_S3C2410_DEBUG_LEVEL 0
  92
  93static uint32_t s3c2410_ticks = 0;
  94
  95static int dprintk(int level, const char *fmt, ...)
  96{
  97        static char printk_buf[1024];
  98        static long prevticks;
  99        static int invocation;
 100        va_list args;
 101        int len;
 102
 103        if (level > USB_S3C2410_DEBUG_LEVEL)
 104                return 0;
 105
 106        if (s3c2410_ticks != prevticks) {
 107                prevticks = s3c2410_ticks;
 108                invocation = 0;
 109        }
 110
 111        len = scnprintf(printk_buf,
 112                        sizeof(printk_buf), "%1lu.%02d USB: ",
 113                        prevticks, invocation++);
 114
 115        va_start(args, fmt);
 116        len = vscnprintf(printk_buf+len,
 117                        sizeof(printk_buf)-len, fmt, args);
 118        va_end(args);
 119
 120        pr_debug("%s", printk_buf);
 121        return len;
 122}
 123#else
 124static int dprintk(int level, const char *fmt, ...)
 125{
 126        return 0;
 127}
 128#endif
 129static int s3c2410_udc_debugfs_seq_show(struct seq_file *m, void *p)
 130{
 131        u32 addr_reg, pwr_reg, ep_int_reg, usb_int_reg;
 132        u32 ep_int_en_reg, usb_int_en_reg, ep0_csr;
 133        u32 ep1_i_csr1, ep1_i_csr2, ep1_o_csr1, ep1_o_csr2;
 134        u32 ep2_i_csr1, ep2_i_csr2, ep2_o_csr1, ep2_o_csr2;
 135
 136        addr_reg       = udc_read(S3C2410_UDC_FUNC_ADDR_REG);
 137        pwr_reg        = udc_read(S3C2410_UDC_PWR_REG);
 138        ep_int_reg     = udc_read(S3C2410_UDC_EP_INT_REG);
 139        usb_int_reg    = udc_read(S3C2410_UDC_USB_INT_REG);
 140        ep_int_en_reg  = udc_read(S3C2410_UDC_EP_INT_EN_REG);
 141        usb_int_en_reg = udc_read(S3C2410_UDC_USB_INT_EN_REG);
 142        udc_write(0, S3C2410_UDC_INDEX_REG);
 143        ep0_csr        = udc_read(S3C2410_UDC_IN_CSR1_REG);
 144        udc_write(1, S3C2410_UDC_INDEX_REG);
 145        ep1_i_csr1     = udc_read(S3C2410_UDC_IN_CSR1_REG);
 146        ep1_i_csr2     = udc_read(S3C2410_UDC_IN_CSR2_REG);
 147        ep1_o_csr1     = udc_read(S3C2410_UDC_IN_CSR1_REG);
 148        ep1_o_csr2     = udc_read(S3C2410_UDC_IN_CSR2_REG);
 149        udc_write(2, S3C2410_UDC_INDEX_REG);
 150        ep2_i_csr1     = udc_read(S3C2410_UDC_IN_CSR1_REG);
 151        ep2_i_csr2     = udc_read(S3C2410_UDC_IN_CSR2_REG);
 152        ep2_o_csr1     = udc_read(S3C2410_UDC_IN_CSR1_REG);
 153        ep2_o_csr2     = udc_read(S3C2410_UDC_IN_CSR2_REG);
 154
 155        seq_printf(m, "FUNC_ADDR_REG  : 0x%04X\n"
 156                 "PWR_REG        : 0x%04X\n"
 157                 "EP_INT_REG     : 0x%04X\n"
 158                 "USB_INT_REG    : 0x%04X\n"
 159                 "EP_INT_EN_REG  : 0x%04X\n"
 160                 "USB_INT_EN_REG : 0x%04X\n"
 161                 "EP0_CSR        : 0x%04X\n"
 162                 "EP1_I_CSR1     : 0x%04X\n"
 163                 "EP1_I_CSR2     : 0x%04X\n"
 164                 "EP1_O_CSR1     : 0x%04X\n"
 165                 "EP1_O_CSR2     : 0x%04X\n"
 166                 "EP2_I_CSR1     : 0x%04X\n"
 167                 "EP2_I_CSR2     : 0x%04X\n"
 168                 "EP2_O_CSR1     : 0x%04X\n"
 169                 "EP2_O_CSR2     : 0x%04X\n",
 170                        addr_reg, pwr_reg, ep_int_reg, usb_int_reg,
 171                        ep_int_en_reg, usb_int_en_reg, ep0_csr,
 172                        ep1_i_csr1, ep1_i_csr2, ep1_o_csr1, ep1_o_csr2,
 173                        ep2_i_csr1, ep2_i_csr2, ep2_o_csr1, ep2_o_csr2
 174                );
 175
 176        return 0;
 177}
 178
 179static int s3c2410_udc_debugfs_fops_open(struct inode *inode,
 180                                         struct file *file)
 181{
 182        return single_open(file, s3c2410_udc_debugfs_seq_show, NULL);
 183}
 184
 185static const struct file_operations s3c2410_udc_debugfs_fops = {
 186        .open           = s3c2410_udc_debugfs_fops_open,
 187        .read           = seq_read,
 188        .llseek         = seq_lseek,
 189        .release        = single_release,
 190        .owner          = THIS_MODULE,
 191};
 192
 193/* io macros */
 194
 195static inline void s3c2410_udc_clear_ep0_opr(void __iomem *base)
 196{
 197        udc_writeb(base, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 198        udc_writeb(base, S3C2410_UDC_EP0_CSR_SOPKTRDY,
 199                        S3C2410_UDC_EP0_CSR_REG);
 200}
 201
 202static inline void s3c2410_udc_clear_ep0_sst(void __iomem *base)
 203{
 204        udc_writeb(base, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 205        writeb(0x00, base + S3C2410_UDC_EP0_CSR_REG);
 206}
 207
 208static inline void s3c2410_udc_clear_ep0_se(void __iomem *base)
 209{
 210        udc_writeb(base, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 211        udc_writeb(base, S3C2410_UDC_EP0_CSR_SSE, S3C2410_UDC_EP0_CSR_REG);
 212}
 213
 214static inline void s3c2410_udc_set_ep0_ipr(void __iomem *base)
 215{
 216        udc_writeb(base, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 217        udc_writeb(base, S3C2410_UDC_EP0_CSR_IPKRDY, S3C2410_UDC_EP0_CSR_REG);
 218}
 219
 220static inline void s3c2410_udc_set_ep0_de(void __iomem *base)
 221{
 222        udc_writeb(base, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 223        udc_writeb(base, S3C2410_UDC_EP0_CSR_DE, S3C2410_UDC_EP0_CSR_REG);
 224}
 225
 226inline void s3c2410_udc_set_ep0_ss(void __iomem *b)
 227{
 228        udc_writeb(b, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 229        udc_writeb(b, S3C2410_UDC_EP0_CSR_SENDSTL, S3C2410_UDC_EP0_CSR_REG);
 230}
 231
 232static inline void s3c2410_udc_set_ep0_de_out(void __iomem *base)
 233{
 234        udc_writeb(base, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 235
 236        udc_writeb(base, (S3C2410_UDC_EP0_CSR_SOPKTRDY
 237                                | S3C2410_UDC_EP0_CSR_DE),
 238                        S3C2410_UDC_EP0_CSR_REG);
 239}
 240
 241static inline void s3c2410_udc_set_ep0_de_in(void __iomem *base)
 242{
 243        udc_writeb(base, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 244        udc_writeb(base, (S3C2410_UDC_EP0_CSR_IPKRDY
 245                        | S3C2410_UDC_EP0_CSR_DE),
 246                S3C2410_UDC_EP0_CSR_REG);
 247}
 248
 249/*------------------------- I/O ----------------------------------*/
 250
 251/*
 252 *      s3c2410_udc_done
 253 */
 254static void s3c2410_udc_done(struct s3c2410_ep *ep,
 255                struct s3c2410_request *req, int status)
 256{
 257        unsigned halted = ep->halted;
 258
 259        list_del_init(&req->queue);
 260
 261        if (likely(req->req.status == -EINPROGRESS))
 262                req->req.status = status;
 263        else
 264                status = req->req.status;
 265
 266        ep->halted = 1;
 267        usb_gadget_giveback_request(&ep->ep, &req->req);
 268        ep->halted = halted;
 269}
 270
 271static void s3c2410_udc_nuke(struct s3c2410_udc *udc,
 272                struct s3c2410_ep *ep, int status)
 273{
 274        /* Sanity check */
 275        if (&ep->queue == NULL)
 276                return;
 277
 278        while (!list_empty(&ep->queue)) {
 279                struct s3c2410_request *req;
 280                req = list_entry(ep->queue.next, struct s3c2410_request,
 281                                queue);
 282                s3c2410_udc_done(ep, req, status);
 283        }
 284}
 285
 286static inline int s3c2410_udc_fifo_count_out(void)
 287{
 288        int tmp;
 289
 290        tmp = udc_read(S3C2410_UDC_OUT_FIFO_CNT2_REG) << 8;
 291        tmp |= udc_read(S3C2410_UDC_OUT_FIFO_CNT1_REG);
 292        return tmp;
 293}
 294
 295/*
 296 *      s3c2410_udc_write_packet
 297 */
 298static inline int s3c2410_udc_write_packet(int fifo,
 299                struct s3c2410_request *req,
 300                unsigned max)
 301{
 302        unsigned len = min(req->req.length - req->req.actual, max);
 303        u8 *buf = req->req.buf + req->req.actual;
 304
 305        prefetch(buf);
 306
 307        dprintk(DEBUG_VERBOSE, "%s %d %d %d %d\n", __func__,
 308                req->req.actual, req->req.length, len, req->req.actual + len);
 309
 310        req->req.actual += len;
 311
 312        udelay(5);
 313        writesb(base_addr + fifo, buf, len);
 314        return len;
 315}
 316
 317/*
 318 *      s3c2410_udc_write_fifo
 319 *
 320 * return:  0 = still running, 1 = completed, negative = errno
 321 */
 322static int s3c2410_udc_write_fifo(struct s3c2410_ep *ep,
 323                struct s3c2410_request *req)
 324{
 325        unsigned        count;
 326        int             is_last;
 327        u32             idx;
 328        int             fifo_reg;
 329        u32             ep_csr;
 330
 331        idx = ep->bEndpointAddress & 0x7F;
 332        switch (idx) {
 333        default:
 334                idx = 0;
 335        case 0:
 336                fifo_reg = S3C2410_UDC_EP0_FIFO_REG;
 337                break;
 338        case 1:
 339                fifo_reg = S3C2410_UDC_EP1_FIFO_REG;
 340                break;
 341        case 2:
 342                fifo_reg = S3C2410_UDC_EP2_FIFO_REG;
 343                break;
 344        case 3:
 345                fifo_reg = S3C2410_UDC_EP3_FIFO_REG;
 346                break;
 347        case 4:
 348                fifo_reg = S3C2410_UDC_EP4_FIFO_REG;
 349                break;
 350        }
 351
 352        count = s3c2410_udc_write_packet(fifo_reg, req, ep->ep.maxpacket);
 353
 354        /* last packet is often short (sometimes a zlp) */
 355        if (count != ep->ep.maxpacket)
 356                is_last = 1;
 357        else if (req->req.length != req->req.actual || req->req.zero)
 358                is_last = 0;
 359        else
 360                is_last = 2;
 361
 362        /* Only ep0 debug messages are interesting */
 363        if (idx == 0)
 364                dprintk(DEBUG_NORMAL,
 365                        "Written ep%d %d.%d of %d b [last %d,z %d]\n",
 366                        idx, count, req->req.actual, req->req.length,
 367                        is_last, req->req.zero);
 368
 369        if (is_last) {
 370                /* The order is important. It prevents sending 2 packets
 371                 * at the same time */
 372
 373                if (idx == 0) {
 374                        /* Reset signal => no need to say 'data sent' */
 375                        if (!(udc_read(S3C2410_UDC_USB_INT_REG)
 376                                        & S3C2410_UDC_USBINT_RESET))
 377                                s3c2410_udc_set_ep0_de_in(base_addr);
 378                        ep->dev->ep0state = EP0_IDLE;
 379                } else {
 380                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 381                        ep_csr = udc_read(S3C2410_UDC_IN_CSR1_REG);
 382                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 383                        udc_write(ep_csr | S3C2410_UDC_ICSR1_PKTRDY,
 384                                        S3C2410_UDC_IN_CSR1_REG);
 385                }
 386
 387                s3c2410_udc_done(ep, req, 0);
 388                is_last = 1;
 389        } else {
 390                if (idx == 0) {
 391                        /* Reset signal => no need to say 'data sent' */
 392                        if (!(udc_read(S3C2410_UDC_USB_INT_REG)
 393                                        & S3C2410_UDC_USBINT_RESET))
 394                                s3c2410_udc_set_ep0_ipr(base_addr);
 395                } else {
 396                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 397                        ep_csr = udc_read(S3C2410_UDC_IN_CSR1_REG);
 398                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 399                        udc_write(ep_csr | S3C2410_UDC_ICSR1_PKTRDY,
 400                                        S3C2410_UDC_IN_CSR1_REG);
 401                }
 402        }
 403
 404        return is_last;
 405}
 406
 407static inline int s3c2410_udc_read_packet(int fifo, u8 *buf,
 408                struct s3c2410_request *req, unsigned avail)
 409{
 410        unsigned len;
 411
 412        len = min(req->req.length - req->req.actual, avail);
 413        req->req.actual += len;
 414
 415        readsb(fifo + base_addr, buf, len);
 416        return len;
 417}
 418
 419/*
 420 * return:  0 = still running, 1 = queue empty, negative = errno
 421 */
 422static int s3c2410_udc_read_fifo(struct s3c2410_ep *ep,
 423                                 struct s3c2410_request *req)
 424{
 425        u8              *buf;
 426        u32             ep_csr;
 427        unsigned        bufferspace;
 428        int             is_last = 1;
 429        unsigned        avail;
 430        int             fifo_count = 0;
 431        u32             idx;
 432        int             fifo_reg;
 433
 434        idx = ep->bEndpointAddress & 0x7F;
 435
 436        switch (idx) {
 437        default:
 438                idx = 0;
 439        case 0:
 440                fifo_reg = S3C2410_UDC_EP0_FIFO_REG;
 441                break;
 442        case 1:
 443                fifo_reg = S3C2410_UDC_EP1_FIFO_REG;
 444                break;
 445        case 2:
 446                fifo_reg = S3C2410_UDC_EP2_FIFO_REG;
 447                break;
 448        case 3:
 449                fifo_reg = S3C2410_UDC_EP3_FIFO_REG;
 450                break;
 451        case 4:
 452                fifo_reg = S3C2410_UDC_EP4_FIFO_REG;
 453                break;
 454        }
 455
 456        if (!req->req.length)
 457                return 1;
 458
 459        buf = req->req.buf + req->req.actual;
 460        bufferspace = req->req.length - req->req.actual;
 461        if (!bufferspace) {
 462                dprintk(DEBUG_NORMAL, "%s: buffer full!\n", __func__);
 463                return -1;
 464        }
 465
 466        udc_write(idx, S3C2410_UDC_INDEX_REG);
 467
 468        fifo_count = s3c2410_udc_fifo_count_out();
 469        dprintk(DEBUG_NORMAL, "%s fifo count : %d\n", __func__, fifo_count);
 470
 471        if (fifo_count > ep->ep.maxpacket)
 472                avail = ep->ep.maxpacket;
 473        else
 474                avail = fifo_count;
 475
 476        fifo_count = s3c2410_udc_read_packet(fifo_reg, buf, req, avail);
 477
 478        /* checking this with ep0 is not accurate as we already
 479         * read a control request
 480         **/
 481        if (idx != 0 && fifo_count < ep->ep.maxpacket) {
 482                is_last = 1;
 483                /* overflowed this request?  flush extra data */
 484                if (fifo_count != avail)
 485                        req->req.status = -EOVERFLOW;
 486        } else {
 487                is_last = (req->req.length <= req->req.actual) ? 1 : 0;
 488        }
 489
 490        udc_write(idx, S3C2410_UDC_INDEX_REG);
 491        fifo_count = s3c2410_udc_fifo_count_out();
 492
 493        /* Only ep0 debug messages are interesting */
 494        if (idx == 0)
 495                dprintk(DEBUG_VERBOSE, "%s fifo count : %d [last %d]\n",
 496                        __func__, fifo_count, is_last);
 497
 498        if (is_last) {
 499                if (idx == 0) {
 500                        s3c2410_udc_set_ep0_de_out(base_addr);
 501                        ep->dev->ep0state = EP0_IDLE;
 502                } else {
 503                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 504                        ep_csr = udc_read(S3C2410_UDC_OUT_CSR1_REG);
 505                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 506                        udc_write(ep_csr & ~S3C2410_UDC_OCSR1_PKTRDY,
 507                                        S3C2410_UDC_OUT_CSR1_REG);
 508                }
 509
 510                s3c2410_udc_done(ep, req, 0);
 511        } else {
 512                if (idx == 0) {
 513                        s3c2410_udc_clear_ep0_opr(base_addr);
 514                } else {
 515                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 516                        ep_csr = udc_read(S3C2410_UDC_OUT_CSR1_REG);
 517                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 518                        udc_write(ep_csr & ~S3C2410_UDC_OCSR1_PKTRDY,
 519                                        S3C2410_UDC_OUT_CSR1_REG);
 520                }
 521        }
 522
 523        return is_last;
 524}
 525
 526static int s3c2410_udc_read_fifo_crq(struct usb_ctrlrequest *crq)
 527{
 528        unsigned char *outbuf = (unsigned char *)crq;
 529        int bytes_read = 0;
 530
 531        udc_write(0, S3C2410_UDC_INDEX_REG);
 532
 533        bytes_read = s3c2410_udc_fifo_count_out();
 534
 535        dprintk(DEBUG_NORMAL, "%s: fifo_count=%d\n", __func__, bytes_read);
 536
 537        if (bytes_read > sizeof(struct usb_ctrlrequest))
 538                bytes_read = sizeof(struct usb_ctrlrequest);
 539
 540        readsb(S3C2410_UDC_EP0_FIFO_REG + base_addr, outbuf, bytes_read);
 541
 542        dprintk(DEBUG_VERBOSE, "%s: len=%d %02x:%02x {%x,%x,%x}\n", __func__,
 543                bytes_read, crq->bRequest, crq->bRequestType,
 544                crq->wValue, crq->wIndex, crq->wLength);
 545
 546        return bytes_read;
 547}
 548
 549static int s3c2410_udc_get_status(struct s3c2410_udc *dev,
 550                struct usb_ctrlrequest *crq)
 551{
 552        u16 status = 0;
 553        u8 ep_num = crq->wIndex & 0x7F;
 554        u8 is_in = crq->wIndex & USB_DIR_IN;
 555
 556        switch (crq->bRequestType & USB_RECIP_MASK) {
 557        case USB_RECIP_INTERFACE:
 558                break;
 559
 560        case USB_RECIP_DEVICE:
 561                status = dev->devstatus;
 562                break;
 563
 564        case USB_RECIP_ENDPOINT:
 565                if (ep_num > 4 || crq->wLength > 2)
 566                        return 1;
 567
 568                if (ep_num == 0) {
 569                        udc_write(0, S3C2410_UDC_INDEX_REG);
 570                        status = udc_read(S3C2410_UDC_IN_CSR1_REG);
 571                        status = status & S3C2410_UDC_EP0_CSR_SENDSTL;
 572                } else {
 573                        udc_write(ep_num, S3C2410_UDC_INDEX_REG);
 574                        if (is_in) {
 575                                status = udc_read(S3C2410_UDC_IN_CSR1_REG);
 576                                status = status & S3C2410_UDC_ICSR1_SENDSTL;
 577                        } else {
 578                                status = udc_read(S3C2410_UDC_OUT_CSR1_REG);
 579                                status = status & S3C2410_UDC_OCSR1_SENDSTL;
 580                        }
 581                }
 582
 583                status = status ? 1 : 0;
 584                break;
 585
 586        default:
 587                return 1;
 588        }
 589
 590        /* Seems to be needed to get it working. ouch :( */
 591        udelay(5);
 592        udc_write(status & 0xFF, S3C2410_UDC_EP0_FIFO_REG);
 593        udc_write(status >> 8, S3C2410_UDC_EP0_FIFO_REG);
 594        s3c2410_udc_set_ep0_de_in(base_addr);
 595
 596        return 0;
 597}
 598/*------------------------- usb state machine -------------------------------*/
 599static int s3c2410_udc_set_halt(struct usb_ep *_ep, int value);
 600
 601static void s3c2410_udc_handle_ep0_idle(struct s3c2410_udc *dev,
 602                                        struct s3c2410_ep *ep,
 603                                        struct usb_ctrlrequest *crq,
 604                                        u32 ep0csr)
 605{
 606        int len, ret, tmp;
 607
 608        /* start control request? */
 609        if (!(ep0csr & S3C2410_UDC_EP0_CSR_OPKRDY))
 610                return;
 611
 612        s3c2410_udc_nuke(dev, ep, -EPROTO);
 613
 614        len = s3c2410_udc_read_fifo_crq(crq);
 615        if (len != sizeof(*crq)) {
 616                dprintk(DEBUG_NORMAL, "setup begin: fifo READ ERROR"
 617                        " wanted %d bytes got %d. Stalling out...\n",
 618                        sizeof(*crq), len);
 619                s3c2410_udc_set_ep0_ss(base_addr);
 620                return;
 621        }
 622
 623        dprintk(DEBUG_NORMAL, "bRequest = %d bRequestType %d wLength = %d\n",
 624                crq->bRequest, crq->bRequestType, crq->wLength);
 625
 626        /* cope with automagic for some standard requests. */
 627        dev->req_std = (crq->bRequestType & USB_TYPE_MASK)
 628                == USB_TYPE_STANDARD;
 629        dev->req_config = 0;
 630        dev->req_pending = 1;
 631
 632        switch (crq->bRequest) {
 633        case USB_REQ_SET_CONFIGURATION:
 634                dprintk(DEBUG_NORMAL, "USB_REQ_SET_CONFIGURATION ...\n");
 635
 636                if (crq->bRequestType == USB_RECIP_DEVICE) {
 637                        dev->req_config = 1;
 638                        s3c2410_udc_set_ep0_de_out(base_addr);
 639                }
 640                break;
 641
 642        case USB_REQ_SET_INTERFACE:
 643                dprintk(DEBUG_NORMAL, "USB_REQ_SET_INTERFACE ...\n");
 644
 645                if (crq->bRequestType == USB_RECIP_INTERFACE) {
 646                        dev->req_config = 1;
 647                        s3c2410_udc_set_ep0_de_out(base_addr);
 648                }
 649                break;
 650
 651        case USB_REQ_SET_ADDRESS:
 652                dprintk(DEBUG_NORMAL, "USB_REQ_SET_ADDRESS ...\n");
 653
 654                if (crq->bRequestType == USB_RECIP_DEVICE) {
 655                        tmp = crq->wValue & 0x7F;
 656                        dev->address = tmp;
 657                        udc_write((tmp | S3C2410_UDC_FUNCADDR_UPDATE),
 658                                        S3C2410_UDC_FUNC_ADDR_REG);
 659                        s3c2410_udc_set_ep0_de_out(base_addr);
 660                        return;
 661                }
 662                break;
 663
 664        case USB_REQ_GET_STATUS:
 665                dprintk(DEBUG_NORMAL, "USB_REQ_GET_STATUS ...\n");
 666                s3c2410_udc_clear_ep0_opr(base_addr);
 667
 668                if (dev->req_std) {
 669                        if (!s3c2410_udc_get_status(dev, crq))
 670                                return;
 671                }
 672                break;
 673
 674        case USB_REQ_CLEAR_FEATURE:
 675                s3c2410_udc_clear_ep0_opr(base_addr);
 676
 677                if (crq->bRequestType != USB_RECIP_ENDPOINT)
 678                        break;
 679
 680                if (crq->wValue != USB_ENDPOINT_HALT || crq->wLength != 0)
 681                        break;
 682
 683                s3c2410_udc_set_halt(&dev->ep[crq->wIndex & 0x7f].ep, 0);
 684                s3c2410_udc_set_ep0_de_out(base_addr);
 685                return;
 686
 687        case USB_REQ_SET_FEATURE:
 688                s3c2410_udc_clear_ep0_opr(base_addr);
 689
 690                if (crq->bRequestType != USB_RECIP_ENDPOINT)
 691                        break;
 692
 693                if (crq->wValue != USB_ENDPOINT_HALT || crq->wLength != 0)
 694                        break;
 695
 696                s3c2410_udc_set_halt(&dev->ep[crq->wIndex & 0x7f].ep, 1);
 697                s3c2410_udc_set_ep0_de_out(base_addr);
 698                return;
 699
 700        default:
 701                s3c2410_udc_clear_ep0_opr(base_addr);
 702                break;
 703        }
 704
 705        if (crq->bRequestType & USB_DIR_IN)
 706                dev->ep0state = EP0_IN_DATA_PHASE;
 707        else
 708                dev->ep0state = EP0_OUT_DATA_PHASE;
 709
 710        if (!dev->driver)
 711                return;
 712
 713        /* deliver the request to the gadget driver */
 714        ret = dev->driver->setup(&dev->gadget, crq);
 715        if (ret < 0) {
 716                if (dev->req_config) {
 717                        dprintk(DEBUG_NORMAL, "config change %02x fail %d?\n",
 718                                crq->bRequest, ret);
 719                        return;
 720                }
 721
 722                if (ret == -EOPNOTSUPP)
 723                        dprintk(DEBUG_NORMAL, "Operation not supported\n");
 724                else
 725                        dprintk(DEBUG_NORMAL,
 726                                "dev->driver->setup failed. (%d)\n", ret);
 727
 728                udelay(5);
 729                s3c2410_udc_set_ep0_ss(base_addr);
 730                s3c2410_udc_set_ep0_de_out(base_addr);
 731                dev->ep0state = EP0_IDLE;
 732                /* deferred i/o == no response yet */
 733        } else if (dev->req_pending) {
 734                dprintk(DEBUG_VERBOSE, "dev->req_pending... what now?\n");
 735                dev->req_pending = 0;
 736        }
 737
 738        dprintk(DEBUG_VERBOSE, "ep0state %s\n", ep0states[dev->ep0state]);
 739}
 740
 741static void s3c2410_udc_handle_ep0(struct s3c2410_udc *dev)
 742{
 743        u32                     ep0csr;
 744        struct s3c2410_ep       *ep = &dev->ep[0];
 745        struct s3c2410_request  *req;
 746        struct usb_ctrlrequest  crq;
 747
 748        if (list_empty(&ep->queue))
 749                req = NULL;
 750        else
 751                req = list_entry(ep->queue.next, struct s3c2410_request, queue);
 752
 753        /* We make the assumption that S3C2410_UDC_IN_CSR1_REG equal to
 754         * S3C2410_UDC_EP0_CSR_REG when index is zero */
 755
 756        udc_write(0, S3C2410_UDC_INDEX_REG);
 757        ep0csr = udc_read(S3C2410_UDC_IN_CSR1_REG);
 758
 759        dprintk(DEBUG_NORMAL, "ep0csr %x ep0state %s\n",
 760                ep0csr, ep0states[dev->ep0state]);
 761
 762        /* clear stall status */
 763        if (ep0csr & S3C2410_UDC_EP0_CSR_SENTSTL) {
 764                s3c2410_udc_nuke(dev, ep, -EPIPE);
 765                dprintk(DEBUG_NORMAL, "... clear SENT_STALL ...\n");
 766                s3c2410_udc_clear_ep0_sst(base_addr);
 767                dev->ep0state = EP0_IDLE;
 768                return;
 769        }
 770
 771        /* clear setup end */
 772        if (ep0csr & S3C2410_UDC_EP0_CSR_SE) {
 773                dprintk(DEBUG_NORMAL, "... serviced SETUP_END ...\n");
 774                s3c2410_udc_nuke(dev, ep, 0);
 775                s3c2410_udc_clear_ep0_se(base_addr);
 776                dev->ep0state = EP0_IDLE;
 777        }
 778
 779        switch (dev->ep0state) {
 780        case EP0_IDLE:
 781                s3c2410_udc_handle_ep0_idle(dev, ep, &crq, ep0csr);
 782                break;
 783
 784        case EP0_IN_DATA_PHASE:                 /* GET_DESCRIPTOR etc */
 785                dprintk(DEBUG_NORMAL, "EP0_IN_DATA_PHASE ... what now?\n");
 786                if (!(ep0csr & S3C2410_UDC_EP0_CSR_IPKRDY) && req)
 787                        s3c2410_udc_write_fifo(ep, req);
 788                break;
 789
 790        case EP0_OUT_DATA_PHASE:                /* SET_DESCRIPTOR etc */
 791                dprintk(DEBUG_NORMAL, "EP0_OUT_DATA_PHASE ... what now?\n");
 792                if ((ep0csr & S3C2410_UDC_EP0_CSR_OPKRDY) && req)
 793                        s3c2410_udc_read_fifo(ep, req);
 794                break;
 795
 796        case EP0_END_XFER:
 797                dprintk(DEBUG_NORMAL, "EP0_END_XFER ... what now?\n");
 798                dev->ep0state = EP0_IDLE;
 799                break;
 800
 801        case EP0_STALL:
 802                dprintk(DEBUG_NORMAL, "EP0_STALL ... what now?\n");
 803                dev->ep0state = EP0_IDLE;
 804                break;
 805        }
 806}
 807
 808/*
 809 *      handle_ep - Manage I/O endpoints
 810 */
 811
 812static void s3c2410_udc_handle_ep(struct s3c2410_ep *ep)
 813{
 814        struct s3c2410_request  *req;
 815        int                     is_in = ep->bEndpointAddress & USB_DIR_IN;
 816        u32                     ep_csr1;
 817        u32                     idx;
 818
 819        if (likely(!list_empty(&ep->queue)))
 820                req = list_entry(ep->queue.next,
 821                                struct s3c2410_request, queue);
 822        else
 823                req = NULL;
 824
 825        idx = ep->bEndpointAddress & 0x7F;
 826
 827        if (is_in) {
 828                udc_write(idx, S3C2410_UDC_INDEX_REG);
 829                ep_csr1 = udc_read(S3C2410_UDC_IN_CSR1_REG);
 830                dprintk(DEBUG_VERBOSE, "ep%01d write csr:%02x %d\n",
 831                        idx, ep_csr1, req ? 1 : 0);
 832
 833                if (ep_csr1 & S3C2410_UDC_ICSR1_SENTSTL) {
 834                        dprintk(DEBUG_VERBOSE, "st\n");
 835                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 836                        udc_write(ep_csr1 & ~S3C2410_UDC_ICSR1_SENTSTL,
 837                                        S3C2410_UDC_IN_CSR1_REG);
 838                        return;
 839                }
 840
 841                if (!(ep_csr1 & S3C2410_UDC_ICSR1_PKTRDY) && req)
 842                        s3c2410_udc_write_fifo(ep, req);
 843        } else {
 844                udc_write(idx, S3C2410_UDC_INDEX_REG);
 845                ep_csr1 = udc_read(S3C2410_UDC_OUT_CSR1_REG);
 846                dprintk(DEBUG_VERBOSE, "ep%01d rd csr:%02x\n", idx, ep_csr1);
 847
 848                if (ep_csr1 & S3C2410_UDC_OCSR1_SENTSTL) {
 849                        udc_write(idx, S3C2410_UDC_INDEX_REG);
 850                        udc_write(ep_csr1 & ~S3C2410_UDC_OCSR1_SENTSTL,
 851                                        S3C2410_UDC_OUT_CSR1_REG);
 852                        return;
 853                }
 854
 855                if ((ep_csr1 & S3C2410_UDC_OCSR1_PKTRDY) && req)
 856                        s3c2410_udc_read_fifo(ep, req);
 857        }
 858}
 859
 860#include <mach/regs-irq.h>
 861
 862/*
 863 *      s3c2410_udc_irq - interrupt handler
 864 */
 865static irqreturn_t s3c2410_udc_irq(int dummy, void *_dev)
 866{
 867        struct s3c2410_udc *dev = _dev;
 868        int usb_status;
 869        int usbd_status;
 870        int pwr_reg;
 871        int ep0csr;
 872        int i;
 873        u32 idx, idx2;
 874        unsigned long flags;
 875
 876        spin_lock_irqsave(&dev->lock, flags);
 877
 878        /* Driver connected ? */
 879        if (!dev->driver) {
 880                /* Clear interrupts */
 881                udc_write(udc_read(S3C2410_UDC_USB_INT_REG),
 882                                S3C2410_UDC_USB_INT_REG);
 883                udc_write(udc_read(S3C2410_UDC_EP_INT_REG),
 884                                S3C2410_UDC_EP_INT_REG);
 885        }
 886
 887        /* Save index */
 888        idx = udc_read(S3C2410_UDC_INDEX_REG);
 889
 890        /* Read status registers */
 891        usb_status = udc_read(S3C2410_UDC_USB_INT_REG);
 892        usbd_status = udc_read(S3C2410_UDC_EP_INT_REG);
 893        pwr_reg = udc_read(S3C2410_UDC_PWR_REG);
 894
 895        udc_writeb(base_addr, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
 896        ep0csr = udc_read(S3C2410_UDC_IN_CSR1_REG);
 897
 898        dprintk(DEBUG_NORMAL, "usbs=%02x, usbds=%02x, pwr=%02x ep0csr=%02x\n",
 899                usb_status, usbd_status, pwr_reg, ep0csr);
 900
 901        /*
 902         * Now, handle interrupts. There's two types :
 903         * - Reset, Resume, Suspend coming -> usb_int_reg
 904         * - EP -> ep_int_reg
 905         */
 906
 907        /* RESET */
 908        if (usb_status & S3C2410_UDC_USBINT_RESET) {
 909                /* two kind of reset :
 910                 * - reset start -> pwr reg = 8
 911                 * - reset end   -> pwr reg = 0
 912                 **/
 913                dprintk(DEBUG_NORMAL, "USB reset csr %x pwr %x\n",
 914                        ep0csr, pwr_reg);
 915
 916                dev->gadget.speed = USB_SPEED_UNKNOWN;
 917                udc_write(0x00, S3C2410_UDC_INDEX_REG);
 918                udc_write((dev->ep[0].ep.maxpacket & 0x7ff) >> 3,
 919                                S3C2410_UDC_MAXP_REG);
 920                dev->address = 0;
 921
 922                dev->ep0state = EP0_IDLE;
 923                dev->gadget.speed = USB_SPEED_FULL;
 924
 925                /* clear interrupt */
 926                udc_write(S3C2410_UDC_USBINT_RESET,
 927                                S3C2410_UDC_USB_INT_REG);
 928
 929                udc_write(idx, S3C2410_UDC_INDEX_REG);
 930                spin_unlock_irqrestore(&dev->lock, flags);
 931                return IRQ_HANDLED;
 932        }
 933
 934        /* RESUME */
 935        if (usb_status & S3C2410_UDC_USBINT_RESUME) {
 936                dprintk(DEBUG_NORMAL, "USB resume\n");
 937
 938                /* clear interrupt */
 939                udc_write(S3C2410_UDC_USBINT_RESUME,
 940                                S3C2410_UDC_USB_INT_REG);
 941
 942                if (dev->gadget.speed != USB_SPEED_UNKNOWN
 943                                && dev->driver
 944                                && dev->driver->resume)
 945                        dev->driver->resume(&dev->gadget);
 946        }
 947
 948        /* SUSPEND */
 949        if (usb_status & S3C2410_UDC_USBINT_SUSPEND) {
 950                dprintk(DEBUG_NORMAL, "USB suspend\n");
 951
 952                /* clear interrupt */
 953                udc_write(S3C2410_UDC_USBINT_SUSPEND,
 954                                S3C2410_UDC_USB_INT_REG);
 955
 956                if (dev->gadget.speed != USB_SPEED_UNKNOWN
 957                                && dev->driver
 958                                && dev->driver->suspend)
 959                        dev->driver->suspend(&dev->gadget);
 960
 961                dev->ep0state = EP0_IDLE;
 962        }
 963
 964        /* EP */
 965        /* control traffic */
 966        /* check on ep0csr != 0 is not a good idea as clearing in_pkt_ready
 967         * generate an interrupt
 968         */
 969        if (usbd_status & S3C2410_UDC_INT_EP0) {
 970                dprintk(DEBUG_VERBOSE, "USB ep0 irq\n");
 971                /* Clear the interrupt bit by setting it to 1 */
 972                udc_write(S3C2410_UDC_INT_EP0, S3C2410_UDC_EP_INT_REG);
 973                s3c2410_udc_handle_ep0(dev);
 974        }
 975
 976        /* endpoint data transfers */
 977        for (i = 1; i < S3C2410_ENDPOINTS; i++) {
 978                u32 tmp = 1 << i;
 979                if (usbd_status & tmp) {
 980                        dprintk(DEBUG_VERBOSE, "USB ep%d irq\n", i);
 981
 982                        /* Clear the interrupt bit by setting it to 1 */
 983                        udc_write(tmp, S3C2410_UDC_EP_INT_REG);
 984                        s3c2410_udc_handle_ep(&dev->ep[i]);
 985                }
 986        }
 987
 988        /* what else causes this interrupt? a receive! who is it? */
 989        if (!usb_status && !usbd_status && !pwr_reg && !ep0csr) {
 990                for (i = 1; i < S3C2410_ENDPOINTS; i++) {
 991                        idx2 = udc_read(S3C2410_UDC_INDEX_REG);
 992                        udc_write(i, S3C2410_UDC_INDEX_REG);
 993
 994                        if (udc_read(S3C2410_UDC_OUT_CSR1_REG) & 0x1)
 995                                s3c2410_udc_handle_ep(&dev->ep[i]);
 996
 997                        /* restore index */
 998                        udc_write(idx2, S3C2410_UDC_INDEX_REG);
 999                }
1000        }
1001
1002        dprintk(DEBUG_VERBOSE, "irq: %d s3c2410_udc_done.\n", IRQ_USBD);
1003
1004        /* Restore old index */
1005        udc_write(idx, S3C2410_UDC_INDEX_REG);
1006
1007        spin_unlock_irqrestore(&dev->lock, flags);
1008
1009        return IRQ_HANDLED;
1010}
1011/*------------------------- s3c2410_ep_ops ----------------------------------*/
1012
1013static inline struct s3c2410_ep *to_s3c2410_ep(struct usb_ep *ep)
1014{
1015        return container_of(ep, struct s3c2410_ep, ep);
1016}
1017
1018static inline struct s3c2410_udc *to_s3c2410_udc(struct usb_gadget *gadget)
1019{
1020        return container_of(gadget, struct s3c2410_udc, gadget);
1021}
1022
1023static inline struct s3c2410_request *to_s3c2410_req(struct usb_request *req)
1024{
1025        return container_of(req, struct s3c2410_request, req);
1026}
1027
1028/*
1029 *      s3c2410_udc_ep_enable
1030 */
1031static int s3c2410_udc_ep_enable(struct usb_ep *_ep,
1032                                 const struct usb_endpoint_descriptor *desc)
1033{
1034        struct s3c2410_udc      *dev;
1035        struct s3c2410_ep       *ep;
1036        u32                     max, tmp;
1037        unsigned long           flags;
1038        u32                     csr1, csr2;
1039        u32                     int_en_reg;
1040
1041        ep = to_s3c2410_ep(_ep);
1042
1043        if (!_ep || !desc
1044                        || _ep->name == ep0name
1045                        || desc->bDescriptorType != USB_DT_ENDPOINT)
1046                return -EINVAL;
1047
1048        dev = ep->dev;
1049        if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)
1050                return -ESHUTDOWN;
1051
1052        max = usb_endpoint_maxp(desc) & 0x1fff;
1053
1054        local_irq_save(flags);
1055        _ep->maxpacket = max & 0x7ff;
1056        ep->ep.desc = desc;
1057        ep->halted = 0;
1058        ep->bEndpointAddress = desc->bEndpointAddress;
1059
1060        /* set max packet */
1061        udc_write(ep->num, S3C2410_UDC_INDEX_REG);
1062        udc_write(max >> 3, S3C2410_UDC_MAXP_REG);
1063
1064        /* set type, direction, address; reset fifo counters */
1065        if (desc->bEndpointAddress & USB_DIR_IN) {
1066                csr1 = S3C2410_UDC_ICSR1_FFLUSH|S3C2410_UDC_ICSR1_CLRDT;
1067                csr2 = S3C2410_UDC_ICSR2_MODEIN|S3C2410_UDC_ICSR2_DMAIEN;
1068
1069                udc_write(ep->num, S3C2410_UDC_INDEX_REG);
1070                udc_write(csr1, S3C2410_UDC_IN_CSR1_REG);
1071                udc_write(ep->num, S3C2410_UDC_INDEX_REG);
1072                udc_write(csr2, S3C2410_UDC_IN_CSR2_REG);
1073        } else {
1074                /* don't flush in fifo or it will cause endpoint interrupt */
1075                csr1 = S3C2410_UDC_ICSR1_CLRDT;
1076                csr2 = S3C2410_UDC_ICSR2_DMAIEN;
1077
1078                udc_write(ep->num, S3C2410_UDC_INDEX_REG);
1079                udc_write(csr1, S3C2410_UDC_IN_CSR1_REG);
1080                udc_write(ep->num, S3C2410_UDC_INDEX_REG);
1081                udc_write(csr2, S3C2410_UDC_IN_CSR2_REG);
1082
1083                csr1 = S3C2410_UDC_OCSR1_FFLUSH | S3C2410_UDC_OCSR1_CLRDT;
1084                csr2 = S3C2410_UDC_OCSR2_DMAIEN;
1085
1086                udc_write(ep->num, S3C2410_UDC_INDEX_REG);
1087                udc_write(csr1, S3C2410_UDC_OUT_CSR1_REG);
1088                udc_write(ep->num, S3C2410_UDC_INDEX_REG);
1089                udc_write(csr2, S3C2410_UDC_OUT_CSR2_REG);
1090        }
1091
1092        /* enable irqs */
1093        int_en_reg = udc_read(S3C2410_UDC_EP_INT_EN_REG);
1094        udc_write(int_en_reg | (1 << ep->num), S3C2410_UDC_EP_INT_EN_REG);
1095
1096        /* print some debug message */
1097        tmp = desc->bEndpointAddress;
1098        dprintk(DEBUG_NORMAL, "enable %s(%d) ep%x%s-blk max %02x\n",
1099                 _ep->name, ep->num, tmp,
1100                 desc->bEndpointAddress & USB_DIR_IN ? "in" : "out", max);
1101
1102        local_irq_restore(flags);
1103        s3c2410_udc_set_halt(_ep, 0);
1104
1105        return 0;
1106}
1107
1108/*
1109 * s3c2410_udc_ep_disable
1110 */
1111static int s3c2410_udc_ep_disable(struct usb_ep *_ep)
1112{
1113        struct s3c2410_ep *ep = to_s3c2410_ep(_ep);
1114        unsigned long flags;
1115        u32 int_en_reg;
1116
1117        if (!_ep || !ep->ep.desc) {
1118                dprintk(DEBUG_NORMAL, "%s not enabled\n",
1119                        _ep ? ep->ep.name : NULL);
1120                return -EINVAL;
1121        }
1122
1123        local_irq_save(flags);
1124
1125        dprintk(DEBUG_NORMAL, "ep_disable: %s\n", _ep->name);
1126
1127        ep->ep.desc = NULL;
1128        ep->halted = 1;
1129
1130        s3c2410_udc_nuke(ep->dev, ep, -ESHUTDOWN);
1131
1132        /* disable irqs */
1133        int_en_reg = udc_read(S3C2410_UDC_EP_INT_EN_REG);
1134        udc_write(int_en_reg & ~(1<<ep->num), S3C2410_UDC_EP_INT_EN_REG);
1135
1136        local_irq_restore(flags);
1137
1138        dprintk(DEBUG_NORMAL, "%s disabled\n", _ep->name);
1139
1140        return 0;
1141}
1142
1143/*
1144 * s3c2410_udc_alloc_request
1145 */
1146static struct usb_request *
1147s3c2410_udc_alloc_request(struct usb_ep *_ep, gfp_t mem_flags)
1148{
1149        struct s3c2410_request *req;
1150
1151        dprintk(DEBUG_VERBOSE, "%s(%p,%d)\n", __func__, _ep, mem_flags);
1152
1153        if (!_ep)
1154                return NULL;
1155
1156        req = kzalloc(sizeof(struct s3c2410_request), mem_flags);
1157        if (!req)
1158                return NULL;
1159
1160        INIT_LIST_HEAD(&req->queue);
1161        return &req->req;
1162}
1163
1164/*
1165 * s3c2410_udc_free_request
1166 */
1167static void
1168s3c2410_udc_free_request(struct usb_ep *_ep, struct usb_request *_req)
1169{
1170        struct s3c2410_ep       *ep = to_s3c2410_ep(_ep);
1171        struct s3c2410_request  *req = to_s3c2410_req(_req);
1172
1173        dprintk(DEBUG_VERBOSE, "%s(%p,%p)\n", __func__, _ep, _req);
1174
1175        if (!ep || !_req || (!ep->ep.desc && _ep->name != ep0name))
1176                return;
1177
1178        WARN_ON(!list_empty(&req->queue));
1179        kfree(req);
1180}
1181
1182/*
1183 *      s3c2410_udc_queue
1184 */
1185static int s3c2410_udc_queue(struct usb_ep *_ep, struct usb_request *_req,
1186                gfp_t gfp_flags)
1187{
1188        struct s3c2410_request  *req = to_s3c2410_req(_req);
1189        struct s3c2410_ep       *ep = to_s3c2410_ep(_ep);
1190        struct s3c2410_udc      *dev;
1191        u32                     ep_csr = 0;
1192        int                     fifo_count = 0;
1193        unsigned long           flags;
1194
1195        if (unlikely(!_ep || (!ep->ep.desc && ep->ep.name != ep0name))) {
1196                dprintk(DEBUG_NORMAL, "%s: invalid args\n", __func__);
1197                return -EINVAL;
1198        }
1199
1200        dev = ep->dev;
1201        if (unlikely(!dev->driver
1202                        || dev->gadget.speed == USB_SPEED_UNKNOWN)) {
1203                return -ESHUTDOWN;
1204        }
1205
1206        local_irq_save(flags);
1207
1208        if (unlikely(!_req || !_req->complete
1209                        || !_req->buf || !list_empty(&req->queue))) {
1210                if (!_req)
1211                        dprintk(DEBUG_NORMAL, "%s: 1 X X X\n", __func__);
1212                else {
1213                        dprintk(DEBUG_NORMAL, "%s: 0 %01d %01d %01d\n",
1214                                __func__, !_req->complete, !_req->buf,
1215                                !list_empty(&req->queue));
1216                }
1217
1218                local_irq_restore(flags);
1219                return -EINVAL;
1220        }
1221
1222        _req->status = -EINPROGRESS;
1223        _req->actual = 0;
1224
1225        dprintk(DEBUG_VERBOSE, "%s: ep%x len %d\n",
1226                 __func__, ep->bEndpointAddress, _req->length);
1227
1228        if (ep->bEndpointAddress) {
1229                udc_write(ep->bEndpointAddress & 0x7F, S3C2410_UDC_INDEX_REG);
1230
1231                ep_csr = udc_read((ep->bEndpointAddress & USB_DIR_IN)
1232                                ? S3C2410_UDC_IN_CSR1_REG
1233                                : S3C2410_UDC_OUT_CSR1_REG);
1234                fifo_count = s3c2410_udc_fifo_count_out();
1235        } else {
1236                udc_write(0, S3C2410_UDC_INDEX_REG);
1237                ep_csr = udc_read(S3C2410_UDC_IN_CSR1_REG);
1238                fifo_count = s3c2410_udc_fifo_count_out();
1239        }
1240
1241        /* kickstart this i/o queue? */
1242        if (list_empty(&ep->queue) && !ep->halted) {
1243                if (ep->bEndpointAddress == 0 /* ep0 */) {
1244                        switch (dev->ep0state) {
1245                        case EP0_IN_DATA_PHASE:
1246                                if (!(ep_csr&S3C2410_UDC_EP0_CSR_IPKRDY)
1247                                                && s3c2410_udc_write_fifo(ep,
1248                                                        req)) {
1249                                        dev->ep0state = EP0_IDLE;
1250                                        req = NULL;
1251                                }
1252                                break;
1253
1254                        case EP0_OUT_DATA_PHASE:
1255                                if ((!_req->length)
1256                                        || ((ep_csr & S3C2410_UDC_OCSR1_PKTRDY)
1257                                                && s3c2410_udc_read_fifo(ep,
1258                                                        req))) {
1259                                        dev->ep0state = EP0_IDLE;
1260                                        req = NULL;
1261                                }
1262                                break;
1263
1264                        default:
1265                                local_irq_restore(flags);
1266                                return -EL2HLT;
1267                        }
1268                } else if ((ep->bEndpointAddress & USB_DIR_IN) != 0
1269                                && (!(ep_csr&S3C2410_UDC_OCSR1_PKTRDY))
1270                                && s3c2410_udc_write_fifo(ep, req)) {
1271                        req = NULL;
1272                } else if ((ep_csr & S3C2410_UDC_OCSR1_PKTRDY)
1273                                && fifo_count
1274                                && s3c2410_udc_read_fifo(ep, req)) {
1275                        req = NULL;
1276                }
1277        }
1278
1279        /* pio or dma irq handler advances the queue. */
1280        if (likely(req))
1281                list_add_tail(&req->queue, &ep->queue);
1282
1283        local_irq_restore(flags);
1284
1285        dprintk(DEBUG_VERBOSE, "%s ok\n", __func__);
1286        return 0;
1287}
1288
1289/*
1290 *      s3c2410_udc_dequeue
1291 */
1292static int s3c2410_udc_dequeue(struct usb_ep *_ep, struct usb_request *_req)
1293{
1294        struct s3c2410_ep       *ep = to_s3c2410_ep(_ep);
1295        struct s3c2410_udc      *udc;
1296        int                     retval = -EINVAL;
1297        unsigned long           flags;
1298        struct s3c2410_request  *req = NULL;
1299
1300        dprintk(DEBUG_VERBOSE, "%s(%p,%p)\n", __func__, _ep, _req);
1301
1302        if (!the_controller->driver)
1303                return -ESHUTDOWN;
1304
1305        if (!_ep || !_req)
1306                return retval;
1307
1308        udc = to_s3c2410_udc(ep->gadget);
1309
1310        local_irq_save(flags);
1311
1312        list_for_each_entry(req, &ep->queue, queue) {
1313                if (&req->req == _req) {
1314                        list_del_init(&req->queue);
1315                        _req->status = -ECONNRESET;
1316                        retval = 0;
1317                        break;
1318                }
1319        }
1320
1321        if (retval == 0) {
1322                dprintk(DEBUG_VERBOSE,
1323                        "dequeued req %p from %s, len %d buf %p\n",
1324                        req, _ep->name, _req->length, _req->buf);
1325
1326                s3c2410_udc_done(ep, req, -ECONNRESET);
1327        }
1328
1329        local_irq_restore(flags);
1330        return retval;
1331}
1332
1333/*
1334 * s3c2410_udc_set_halt
1335 */
1336static int s3c2410_udc_set_halt(struct usb_ep *_ep, int value)
1337{
1338        struct s3c2410_ep       *ep = to_s3c2410_ep(_ep);
1339        u32                     ep_csr = 0;
1340        unsigned long           flags;
1341        u32                     idx;
1342
1343        if (unlikely(!_ep || (!ep->ep.desc && ep->ep.name != ep0name))) {
1344                dprintk(DEBUG_NORMAL, "%s: inval 2\n", __func__);
1345                return -EINVAL;
1346        }
1347
1348        local_irq_save(flags);
1349
1350        idx = ep->bEndpointAddress & 0x7F;
1351
1352        if (idx == 0) {
1353                s3c2410_udc_set_ep0_ss(base_addr);
1354                s3c2410_udc_set_ep0_de_out(base_addr);
1355        } else {
1356                udc_write(idx, S3C2410_UDC_INDEX_REG);
1357                ep_csr = udc_read((ep->bEndpointAddress & USB_DIR_IN)
1358                                ? S3C2410_UDC_IN_CSR1_REG
1359                                : S3C2410_UDC_OUT_CSR1_REG);
1360
1361                if ((ep->bEndpointAddress & USB_DIR_IN) != 0) {
1362                        if (value)
1363                                udc_write(ep_csr | S3C2410_UDC_ICSR1_SENDSTL,
1364                                        S3C2410_UDC_IN_CSR1_REG);
1365                        else {
1366                                ep_csr &= ~S3C2410_UDC_ICSR1_SENDSTL;
1367                                udc_write(ep_csr, S3C2410_UDC_IN_CSR1_REG);
1368                                ep_csr |= S3C2410_UDC_ICSR1_CLRDT;
1369                                udc_write(ep_csr, S3C2410_UDC_IN_CSR1_REG);
1370                        }
1371                } else {
1372                        if (value)
1373                                udc_write(ep_csr | S3C2410_UDC_OCSR1_SENDSTL,
1374                                        S3C2410_UDC_OUT_CSR1_REG);
1375                        else {
1376                                ep_csr &= ~S3C2410_UDC_OCSR1_SENDSTL;
1377                                udc_write(ep_csr, S3C2410_UDC_OUT_CSR1_REG);
1378                                ep_csr |= S3C2410_UDC_OCSR1_CLRDT;
1379                                udc_write(ep_csr, S3C2410_UDC_OUT_CSR1_REG);
1380                        }
1381                }
1382        }
1383
1384        ep->halted = value ? 1 : 0;
1385        local_irq_restore(flags);
1386
1387        return 0;
1388}
1389
1390static const struct usb_ep_ops s3c2410_ep_ops = {
1391        .enable         = s3c2410_udc_ep_enable,
1392        .disable        = s3c2410_udc_ep_disable,
1393
1394        .alloc_request  = s3c2410_udc_alloc_request,
1395        .free_request   = s3c2410_udc_free_request,
1396
1397        .queue          = s3c2410_udc_queue,
1398        .dequeue        = s3c2410_udc_dequeue,
1399
1400        .set_halt       = s3c2410_udc_set_halt,
1401};
1402
1403/*------------------------- usb_gadget_ops ----------------------------------*/
1404
1405/*
1406 *      s3c2410_udc_get_frame
1407 */
1408static int s3c2410_udc_get_frame(struct usb_gadget *_gadget)
1409{
1410        int tmp;
1411
1412        dprintk(DEBUG_VERBOSE, "%s()\n", __func__);
1413
1414        tmp = udc_read(S3C2410_UDC_FRAME_NUM2_REG) << 8;
1415        tmp |= udc_read(S3C2410_UDC_FRAME_NUM1_REG);
1416        return tmp;
1417}
1418
1419/*
1420 *      s3c2410_udc_wakeup
1421 */
1422static int s3c2410_udc_wakeup(struct usb_gadget *_gadget)
1423{
1424        dprintk(DEBUG_NORMAL, "%s()\n", __func__);
1425        return 0;
1426}
1427
1428/*
1429 *      s3c2410_udc_set_selfpowered
1430 */
1431static int s3c2410_udc_set_selfpowered(struct usb_gadget *gadget, int value)
1432{
1433        struct s3c2410_udc *udc = to_s3c2410_udc(gadget);
1434
1435        dprintk(DEBUG_NORMAL, "%s()\n", __func__);
1436
1437        gadget->is_selfpowered = (value != 0);
1438        if (value)
1439                udc->devstatus |= (1 << USB_DEVICE_SELF_POWERED);
1440        else
1441                udc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
1442
1443        return 0;
1444}
1445
1446static void s3c2410_udc_disable(struct s3c2410_udc *dev);
1447static void s3c2410_udc_enable(struct s3c2410_udc *dev);
1448
1449static int s3c2410_udc_set_pullup(struct s3c2410_udc *udc, int is_on)
1450{
1451        dprintk(DEBUG_NORMAL, "%s()\n", __func__);
1452
1453        if (udc_info && (udc_info->udc_command ||
1454                gpio_is_valid(udc_info->pullup_pin))) {
1455
1456                if (is_on)
1457                        s3c2410_udc_enable(udc);
1458                else {
1459                        if (udc->gadget.speed != USB_SPEED_UNKNOWN) {
1460                                if (udc->driver && udc->driver->disconnect)
1461                                        udc->driver->disconnect(&udc->gadget);
1462
1463                        }
1464                        s3c2410_udc_disable(udc);
1465                }
1466        } else {
1467                return -EOPNOTSUPP;
1468        }
1469
1470        return 0;
1471}
1472
1473static int s3c2410_udc_vbus_session(struct usb_gadget *gadget, int is_active)
1474{
1475        struct s3c2410_udc *udc = to_s3c2410_udc(gadget);
1476
1477        dprintk(DEBUG_NORMAL, "%s()\n", __func__);
1478
1479        udc->vbus = (is_active != 0);
1480        s3c2410_udc_set_pullup(udc, is_active);
1481        return 0;
1482}
1483
1484static int s3c2410_udc_pullup(struct usb_gadget *gadget, int is_on)
1485{
1486        struct s3c2410_udc *udc = to_s3c2410_udc(gadget);
1487
1488        dprintk(DEBUG_NORMAL, "%s()\n", __func__);
1489
1490        s3c2410_udc_set_pullup(udc, is_on ? 0 : 1);
1491        return 0;
1492}
1493
1494static irqreturn_t s3c2410_udc_vbus_irq(int irq, void *_dev)
1495{
1496        struct s3c2410_udc      *dev = _dev;
1497        unsigned int            value;
1498
1499        dprintk(DEBUG_NORMAL, "%s()\n", __func__);
1500
1501        value = gpio_get_value(udc_info->vbus_pin) ? 1 : 0;
1502        if (udc_info->vbus_pin_inverted)
1503                value = !value;
1504
1505        if (value != dev->vbus)
1506                s3c2410_udc_vbus_session(&dev->gadget, value);
1507
1508        return IRQ_HANDLED;
1509}
1510
1511static int s3c2410_vbus_draw(struct usb_gadget *_gadget, unsigned ma)
1512{
1513        dprintk(DEBUG_NORMAL, "%s()\n", __func__);
1514
1515        if (udc_info && udc_info->vbus_draw) {
1516                udc_info->vbus_draw(ma);
1517                return 0;
1518        }
1519
1520        return -ENOTSUPP;
1521}
1522
1523static int s3c2410_udc_start(struct usb_gadget *g,
1524                struct usb_gadget_driver *driver);
1525static int s3c2410_udc_stop(struct usb_gadget *g);
1526
1527static const struct usb_gadget_ops s3c2410_ops = {
1528        .get_frame              = s3c2410_udc_get_frame,
1529        .wakeup                 = s3c2410_udc_wakeup,
1530        .set_selfpowered        = s3c2410_udc_set_selfpowered,
1531        .pullup                 = s3c2410_udc_pullup,
1532        .vbus_session           = s3c2410_udc_vbus_session,
1533        .vbus_draw              = s3c2410_vbus_draw,
1534        .udc_start              = s3c2410_udc_start,
1535        .udc_stop               = s3c2410_udc_stop,
1536};
1537
1538static void s3c2410_udc_command(enum s3c2410_udc_cmd_e cmd)
1539{
1540        if (!udc_info)
1541                return;
1542
1543        if (udc_info->udc_command) {
1544                udc_info->udc_command(cmd);
1545        } else if (gpio_is_valid(udc_info->pullup_pin)) {
1546                int value;
1547
1548                switch (cmd) {
1549                case S3C2410_UDC_P_ENABLE:
1550                        value = 1;
1551                        break;
1552                case S3C2410_UDC_P_DISABLE:
1553                        value = 0;
1554                        break;
1555                default:
1556                        return;
1557                }
1558                value ^= udc_info->pullup_pin_inverted;
1559
1560                gpio_set_value(udc_info->pullup_pin, value);
1561        }
1562}
1563
1564/*------------------------- gadget driver handling---------------------------*/
1565/*
1566 * s3c2410_udc_disable
1567 */
1568static void s3c2410_udc_disable(struct s3c2410_udc *dev)
1569{
1570        dprintk(DEBUG_NORMAL, "%s()\n", __func__);
1571
1572        /* Disable all interrupts */
1573        udc_write(0x00, S3C2410_UDC_USB_INT_EN_REG);
1574        udc_write(0x00, S3C2410_UDC_EP_INT_EN_REG);
1575
1576        /* Clear the interrupt registers */
1577        udc_write(S3C2410_UDC_USBINT_RESET
1578                                | S3C2410_UDC_USBINT_RESUME
1579                                | S3C2410_UDC_USBINT_SUSPEND,
1580                        S3C2410_UDC_USB_INT_REG);
1581
1582        udc_write(0x1F, S3C2410_UDC_EP_INT_REG);
1583
1584        /* Good bye, cruel world */
1585        s3c2410_udc_command(S3C2410_UDC_P_DISABLE);
1586
1587        /* Set speed to unknown */
1588        dev->gadget.speed = USB_SPEED_UNKNOWN;
1589}
1590
1591/*
1592 * s3c2410_udc_reinit
1593 */
1594static void s3c2410_udc_reinit(struct s3c2410_udc *dev)
1595{
1596        u32 i;
1597
1598        /* device/ep0 records init */
1599        INIT_LIST_HEAD(&dev->gadget.ep_list);
1600        INIT_LIST_HEAD(&dev->gadget.ep0->ep_list);
1601        dev->ep0state = EP0_IDLE;
1602
1603        for (i = 0; i < S3C2410_ENDPOINTS; i++) {
1604                struct s3c2410_ep *ep = &dev->ep[i];
1605
1606                if (i != 0)
1607                        list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list);
1608
1609                ep->dev = dev;
1610                ep->ep.desc = NULL;
1611                ep->halted = 0;
1612                INIT_LIST_HEAD(&ep->queue);
1613                usb_ep_set_maxpacket_limit(&ep->ep, ep->ep.maxpacket);
1614        }
1615}
1616
1617/*
1618 * s3c2410_udc_enable
1619 */
1620static void s3c2410_udc_enable(struct s3c2410_udc *dev)
1621{
1622        int i;
1623
1624        dprintk(DEBUG_NORMAL, "s3c2410_udc_enable called\n");
1625
1626        /* dev->gadget.speed = USB_SPEED_UNKNOWN; */
1627        dev->gadget.speed = USB_SPEED_FULL;
1628
1629        /* Set MAXP for all endpoints */
1630        for (i = 0; i < S3C2410_ENDPOINTS; i++) {
1631                udc_write(i, S3C2410_UDC_INDEX_REG);
1632                udc_write((dev->ep[i].ep.maxpacket & 0x7ff) >> 3,
1633                                S3C2410_UDC_MAXP_REG);
1634        }
1635
1636        /* Set default power state */
1637        udc_write(DEFAULT_POWER_STATE, S3C2410_UDC_PWR_REG);
1638
1639        /* Enable reset and suspend interrupt interrupts */
1640        udc_write(S3C2410_UDC_USBINT_RESET | S3C2410_UDC_USBINT_SUSPEND,
1641                        S3C2410_UDC_USB_INT_EN_REG);
1642
1643        /* Enable ep0 interrupt */
1644        udc_write(S3C2410_UDC_INT_EP0, S3C2410_UDC_EP_INT_EN_REG);
1645
1646        /* time to say "hello, world" */
1647        s3c2410_udc_command(S3C2410_UDC_P_ENABLE);
1648}
1649
1650static int s3c2410_udc_start(struct usb_gadget *g,
1651                struct usb_gadget_driver *driver)
1652{
1653        struct s3c2410_udc *udc = to_s3c2410(g);
1654
1655        dprintk(DEBUG_NORMAL, "%s() '%s'\n", __func__, driver->driver.name);
1656
1657        /* Hook the driver */
1658        udc->driver = driver;
1659
1660        /* Enable udc */
1661        s3c2410_udc_enable(udc);
1662
1663        return 0;
1664}
1665
1666static int s3c2410_udc_stop(struct usb_gadget *g)
1667{
1668        struct s3c2410_udc *udc = to_s3c2410(g);
1669
1670        udc->driver = NULL;
1671
1672        /* Disable udc */
1673        s3c2410_udc_disable(udc);
1674
1675        return 0;
1676}
1677
1678/*---------------------------------------------------------------------------*/
1679static struct s3c2410_udc memory = {
1680        .gadget = {
1681                .ops            = &s3c2410_ops,
1682                .ep0            = &memory.ep[0].ep,
1683                .name           = gadget_name,
1684                .dev = {
1685                        .init_name      = "gadget",
1686                },
1687        },
1688
1689        /* control endpoint */
1690        .ep[0] = {
1691                .num            = 0,
1692                .ep = {
1693                        .name           = ep0name,
1694                        .ops            = &s3c2410_ep_ops,
1695                        .maxpacket      = EP0_FIFO_SIZE,
1696                },
1697                .dev            = &memory,
1698        },
1699
1700        /* first group of endpoints */
1701        .ep[1] = {
1702                .num            = 1,
1703                .ep = {
1704                        .name           = "ep1-bulk",
1705                        .ops            = &s3c2410_ep_ops,
1706                        .maxpacket      = EP_FIFO_SIZE,
1707                },
1708                .dev            = &memory,
1709                .fifo_size      = EP_FIFO_SIZE,
1710                .bEndpointAddress = 1,
1711                .bmAttributes   = USB_ENDPOINT_XFER_BULK,
1712        },
1713        .ep[2] = {
1714                .num            = 2,
1715                .ep = {
1716                        .name           = "ep2-bulk",
1717                        .ops            = &s3c2410_ep_ops,
1718                        .maxpacket      = EP_FIFO_SIZE,
1719                },
1720                .dev            = &memory,
1721                .fifo_size      = EP_FIFO_SIZE,
1722                .bEndpointAddress = 2,
1723                .bmAttributes   = USB_ENDPOINT_XFER_BULK,
1724        },
1725        .ep[3] = {
1726                .num            = 3,
1727                .ep = {
1728                        .name           = "ep3-bulk",
1729                        .ops            = &s3c2410_ep_ops,
1730                        .maxpacket      = EP_FIFO_SIZE,
1731                },
1732                .dev            = &memory,
1733                .fifo_size      = EP_FIFO_SIZE,
1734                .bEndpointAddress = 3,
1735                .bmAttributes   = USB_ENDPOINT_XFER_BULK,
1736        },
1737        .ep[4] = {
1738                .num            = 4,
1739                .ep = {
1740                        .name           = "ep4-bulk",
1741                        .ops            = &s3c2410_ep_ops,
1742                        .maxpacket      = EP_FIFO_SIZE,
1743                },
1744                .dev            = &memory,
1745                .fifo_size      = EP_FIFO_SIZE,
1746                .bEndpointAddress = 4,
1747                .bmAttributes   = USB_ENDPOINT_XFER_BULK,
1748        }
1749
1750};
1751
1752/*
1753 *      probe - binds to the platform device
1754 */
1755static int s3c2410_udc_probe(struct platform_device *pdev)
1756{
1757        struct s3c2410_udc *udc = &memory;
1758        struct device *dev = &pdev->dev;
1759        int retval;
1760        int irq;
1761
1762        dev_dbg(dev, "%s()\n", __func__);
1763
1764        usb_bus_clock = clk_get(NULL, "usb-bus-gadget");
1765        if (IS_ERR(usb_bus_clock)) {
1766                dev_err(dev, "failed to get usb bus clock source\n");
1767                return PTR_ERR(usb_bus_clock);
1768        }
1769
1770        clk_prepare_enable(usb_bus_clock);
1771
1772        udc_clock = clk_get(NULL, "usb-device");
1773        if (IS_ERR(udc_clock)) {
1774                dev_err(dev, "failed to get udc clock source\n");
1775                return PTR_ERR(udc_clock);
1776        }
1777
1778        clk_prepare_enable(udc_clock);
1779
1780        mdelay(10);
1781
1782        dev_dbg(dev, "got and enabled clocks\n");
1783
1784        if (strncmp(pdev->name, "s3c2440", 7) == 0) {
1785                dev_info(dev, "S3C2440: increasing FIFO to 128 bytes\n");
1786                memory.ep[1].fifo_size = S3C2440_EP_FIFO_SIZE;
1787                memory.ep[2].fifo_size = S3C2440_EP_FIFO_SIZE;
1788                memory.ep[3].fifo_size = S3C2440_EP_FIFO_SIZE;
1789                memory.ep[4].fifo_size = S3C2440_EP_FIFO_SIZE;
1790        }
1791
1792        spin_lock_init(&udc->lock);
1793        udc_info = dev_get_platdata(&pdev->dev);
1794
1795        rsrc_start = S3C2410_PA_USBDEV;
1796        rsrc_len   = S3C24XX_SZ_USBDEV;
1797
1798        if (!request_mem_region(rsrc_start, rsrc_len, gadget_name))
1799                return -EBUSY;
1800
1801        base_addr = ioremap(rsrc_start, rsrc_len);
1802        if (!base_addr) {
1803                retval = -ENOMEM;
1804                goto err_mem;
1805        }
1806
1807        the_controller = udc;
1808        platform_set_drvdata(pdev, udc);
1809
1810        s3c2410_udc_disable(udc);
1811        s3c2410_udc_reinit(udc);
1812
1813        /* irq setup after old hardware state is cleaned up */
1814        retval = request_irq(IRQ_USBD, s3c2410_udc_irq,
1815                             0, gadget_name, udc);
1816
1817        if (retval != 0) {
1818                dev_err(dev, "cannot get irq %i, err %d\n", IRQ_USBD, retval);
1819                retval = -EBUSY;
1820                goto err_map;
1821        }
1822
1823        dev_dbg(dev, "got irq %i\n", IRQ_USBD);
1824
1825        if (udc_info && udc_info->vbus_pin > 0) {
1826                retval = gpio_request(udc_info->vbus_pin, "udc vbus");
1827                if (retval < 0) {
1828                        dev_err(dev, "cannot claim vbus pin\n");
1829                        goto err_int;
1830                }
1831
1832                irq = gpio_to_irq(udc_info->vbus_pin);
1833                if (irq < 0) {
1834                        dev_err(dev, "no irq for gpio vbus pin\n");
1835                        retval = irq;
1836                        goto err_gpio_claim;
1837                }
1838
1839                retval = request_irq(irq, s3c2410_udc_vbus_irq,
1840                                     IRQF_TRIGGER_RISING
1841                                     | IRQF_TRIGGER_FALLING | IRQF_SHARED,
1842                                     gadget_name, udc);
1843
1844                if (retval != 0) {
1845                        dev_err(dev, "can't get vbus irq %d, err %d\n",
1846                                irq, retval);
1847                        retval = -EBUSY;
1848                        goto err_gpio_claim;
1849                }
1850
1851                dev_dbg(dev, "got irq %i\n", irq);
1852        } else {
1853                udc->vbus = 1;
1854        }
1855
1856        if (udc_info && !udc_info->udc_command &&
1857                gpio_is_valid(udc_info->pullup_pin)) {
1858
1859                retval = gpio_request_one(udc_info->pullup_pin,
1860                                udc_info->vbus_pin_inverted ?
1861                                GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
1862                                "udc pullup");
1863                if (retval)
1864                        goto err_vbus_irq;
1865        }
1866
1867        retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
1868        if (retval)
1869                goto err_add_udc;
1870
1871        if (s3c2410_udc_debugfs_root) {
1872                udc->regs_info = debugfs_create_file("registers", S_IRUGO,
1873                                s3c2410_udc_debugfs_root,
1874                                udc, &s3c2410_udc_debugfs_fops);
1875                if (!udc->regs_info)
1876                        dev_warn(dev, "debugfs file creation failed\n");
1877        }
1878
1879        dev_dbg(dev, "probe ok\n");
1880
1881        return 0;
1882
1883err_add_udc:
1884        if (udc_info && !udc_info->udc_command &&
1885                        gpio_is_valid(udc_info->pullup_pin))
1886                gpio_free(udc_info->pullup_pin);
1887err_vbus_irq:
1888        if (udc_info && udc_info->vbus_pin > 0)
1889                free_irq(gpio_to_irq(udc_info->vbus_pin), udc);
1890err_gpio_claim:
1891        if (udc_info && udc_info->vbus_pin > 0)
1892                gpio_free(udc_info->vbus_pin);
1893err_int:
1894        free_irq(IRQ_USBD, udc);
1895err_map:
1896        iounmap(base_addr);
1897err_mem:
1898        release_mem_region(rsrc_start, rsrc_len);
1899
1900        return retval;
1901}
1902
1903/*
1904 *      s3c2410_udc_remove
1905 */
1906static int s3c2410_udc_remove(struct platform_device *pdev)
1907{
1908        struct s3c2410_udc *udc = platform_get_drvdata(pdev);
1909        unsigned int irq;
1910
1911        dev_dbg(&pdev->dev, "%s()\n", __func__);
1912
1913        if (udc->driver)
1914                return -EBUSY;
1915
1916        usb_del_gadget_udc(&udc->gadget);
1917        debugfs_remove(udc->regs_info);
1918
1919        if (udc_info && !udc_info->udc_command &&
1920                gpio_is_valid(udc_info->pullup_pin))
1921                gpio_free(udc_info->pullup_pin);
1922
1923        if (udc_info && udc_info->vbus_pin > 0) {
1924                irq = gpio_to_irq(udc_info->vbus_pin);
1925                free_irq(irq, udc);
1926        }
1927
1928        free_irq(IRQ_USBD, udc);
1929
1930        iounmap(base_addr);
1931        release_mem_region(rsrc_start, rsrc_len);
1932
1933        if (!IS_ERR(udc_clock) && udc_clock != NULL) {
1934                clk_disable_unprepare(udc_clock);
1935                clk_put(udc_clock);
1936                udc_clock = NULL;
1937        }
1938
1939        if (!IS_ERR(usb_bus_clock) && usb_bus_clock != NULL) {
1940                clk_disable_unprepare(usb_bus_clock);
1941                clk_put(usb_bus_clock);
1942                usb_bus_clock = NULL;
1943        }
1944
1945        dev_dbg(&pdev->dev, "%s: remove ok\n", __func__);
1946        return 0;
1947}
1948
1949#ifdef CONFIG_PM
1950static int
1951s3c2410_udc_suspend(struct platform_device *pdev, pm_message_t message)
1952{
1953        s3c2410_udc_command(S3C2410_UDC_P_DISABLE);
1954
1955        return 0;
1956}
1957
1958static int s3c2410_udc_resume(struct platform_device *pdev)
1959{
1960        s3c2410_udc_command(S3C2410_UDC_P_ENABLE);
1961
1962        return 0;
1963}
1964#else
1965#define s3c2410_udc_suspend     NULL
1966#define s3c2410_udc_resume      NULL
1967#endif
1968
1969static const struct platform_device_id s3c_udc_ids[] = {
1970        { "s3c2410-usbgadget", },
1971        { "s3c2440-usbgadget", },
1972        { }
1973};
1974MODULE_DEVICE_TABLE(platform, s3c_udc_ids);
1975
1976static struct platform_driver udc_driver_24x0 = {
1977        .driver         = {
1978                .name   = "s3c24x0-usbgadget",
1979        },
1980        .probe          = s3c2410_udc_probe,
1981        .remove         = s3c2410_udc_remove,
1982        .suspend        = s3c2410_udc_suspend,
1983        .resume         = s3c2410_udc_resume,
1984        .id_table       = s3c_udc_ids,
1985};
1986
1987static int __init udc_init(void)
1988{
1989        int retval;
1990
1991        dprintk(DEBUG_NORMAL, "%s: version %s\n", gadget_name, DRIVER_VERSION);
1992
1993        s3c2410_udc_debugfs_root = debugfs_create_dir(gadget_name, NULL);
1994        if (IS_ERR(s3c2410_udc_debugfs_root)) {
1995                pr_err("%s: debugfs dir creation failed %ld\n",
1996                        gadget_name, PTR_ERR(s3c2410_udc_debugfs_root));
1997                s3c2410_udc_debugfs_root = NULL;
1998        }
1999
2000        retval = platform_driver_register(&udc_driver_24x0);
2001        if (retval)
2002                goto err;
2003
2004        return 0;
2005
2006err:
2007        debugfs_remove(s3c2410_udc_debugfs_root);
2008        return retval;
2009}
2010
2011static void __exit udc_exit(void)
2012{
2013        platform_driver_unregister(&udc_driver_24x0);
2014        debugfs_remove(s3c2410_udc_debugfs_root);
2015}
2016
2017module_init(udc_init);
2018module_exit(udc_exit);
2019
2020MODULE_AUTHOR(DRIVER_AUTHOR);
2021MODULE_DESCRIPTION(DRIVER_DESC);
2022MODULE_VERSION(DRIVER_VERSION);
2023MODULE_LICENSE("GPL");
2024