linux/drivers/usb/serial/mos7720.c
<<
>>
Prefs
   1/*
   2 * mos7720.c
   3 *   Controls the Moschip 7720 usb to dual port serial converter
   4 *
   5 * Copyright 2006 Moschip Semiconductor Tech. Ltd.
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation, version 2 of the License.
  10 *
  11 * Developed by:
  12 *      Vijaya Kumar <vijaykumar.gn@gmail.com>
  13 *      Ajay Kumar <naanuajay@yahoo.com>
  14 *      Gurudeva <ngurudeva@yahoo.com>
  15 *
  16 * Cleaned up from the original by:
  17 *      Greg Kroah-Hartman <gregkh@suse.de>
  18 *
  19 * Originally based on drivers/usb/serial/io_edgeport.c which is:
  20 *      Copyright (C) 2000 Inside Out Networks, All rights reserved.
  21 *      Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
  22 */
  23#include <linux/kernel.h>
  24#include <linux/errno.h>
  25#include <linux/slab.h>
  26#include <linux/tty.h>
  27#include <linux/tty_driver.h>
  28#include <linux/tty_flip.h>
  29#include <linux/module.h>
  30#include <linux/spinlock.h>
  31#include <linux/serial.h>
  32#include <linux/serial_reg.h>
  33#include <linux/usb.h>
  34#include <linux/usb/serial.h>
  35#include <linux/uaccess.h>
  36#include <linux/parport.h>
  37
  38#define DRIVER_AUTHOR "Aspire Communications pvt Ltd."
  39#define DRIVER_DESC "Moschip USB Serial Driver"
  40
  41/* default urb timeout */
  42#define MOS_WDR_TIMEOUT 5000
  43
  44#define MOS_MAX_PORT    0x02
  45#define MOS_WRITE       0x0E
  46#define MOS_READ        0x0D
  47
  48/* Interrupt Routines Defines   */
  49#define SERIAL_IIR_RLS  0x06
  50#define SERIAL_IIR_RDA  0x04
  51#define SERIAL_IIR_CTI  0x0c
  52#define SERIAL_IIR_THR  0x02
  53#define SERIAL_IIR_MS   0x00
  54
  55#define NUM_URBS                        16      /* URB Count */
  56#define URB_TRANSFER_BUFFER_SIZE        32      /* URB Size */
  57
  58/* This structure holds all of the local serial port information */
  59struct moschip_port {
  60        __u8    shadowLCR;              /* last LCR value received */
  61        __u8    shadowMCR;              /* last MCR value received */
  62        __u8    shadowMSR;              /* last MSR value received */
  63        char                    open;
  64        struct usb_serial_port  *port;  /* loop back to the owner */
  65        struct urb              *write_urb_pool[NUM_URBS];
  66};
  67
  68static struct usb_serial_driver moschip7720_2port_driver;
  69
  70#define USB_VENDOR_ID_MOSCHIP           0x9710
  71#define MOSCHIP_DEVICE_ID_7720          0x7720
  72#define MOSCHIP_DEVICE_ID_7715          0x7715
  73
  74static const struct usb_device_id id_table[] = {
  75        { USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7720) },
  76        { USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7715) },
  77        { } /* terminating entry */
  78};
  79MODULE_DEVICE_TABLE(usb, id_table);
  80
  81#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
  82
  83/* initial values for parport regs */
  84#define DCR_INIT_VAL       0x0c /* SLCTIN, nINIT */
  85#define ECR_INIT_VAL       0x00 /* SPP mode */
  86
  87struct urbtracker {
  88        struct mos7715_parport  *mos_parport;
  89        struct list_head        urblist_entry;
  90        struct kref             ref_count;
  91        struct urb              *urb;
  92        struct usb_ctrlrequest  *setup;
  93};
  94
  95enum mos7715_pp_modes {
  96        SPP = 0<<5,
  97        PS2 = 1<<5,      /* moschip calls this 'NIBBLE' mode */
  98        PPF = 2<<5,      /* moschip calls this 'CB-FIFO mode */
  99};
 100
 101struct mos7715_parport {
 102        struct parport          *pp;           /* back to containing struct */
 103        struct kref             ref_count;     /* to instance of this struct */
 104        struct list_head        deferred_urbs; /* list deferred async urbs */
 105        struct list_head        active_urbs;   /* list async urbs in flight */
 106        spinlock_t              listlock;      /* protects list access */
 107        bool                    msg_pending;   /* usb sync call pending */
 108        struct completion       syncmsg_compl; /* usb sync call completed */
 109        struct tasklet_struct   urb_tasklet;   /* for sending deferred urbs */
 110        struct usb_serial       *serial;       /* back to containing struct */
 111        __u8                    shadowECR;     /* parallel port regs... */
 112        __u8                    shadowDCR;
 113        atomic_t                shadowDSR;     /* updated in int-in callback */
 114};
 115
 116/* lock guards against dereferencing NULL ptr in parport ops callbacks */
 117static DEFINE_SPINLOCK(release_lock);
 118
 119#endif  /* CONFIG_USB_SERIAL_MOS7715_PARPORT */
 120
 121static const unsigned int dummy; /* for clarity in register access fns */
 122
 123enum mos_regs {
 124        MOS7720_THR,              /* serial port regs */
 125        MOS7720_RHR,
 126        MOS7720_IER,
 127        MOS7720_FCR,
 128        MOS7720_ISR,
 129        MOS7720_LCR,
 130        MOS7720_MCR,
 131        MOS7720_LSR,
 132        MOS7720_MSR,
 133        MOS7720_SPR,
 134        MOS7720_DLL,
 135        MOS7720_DLM,
 136        MOS7720_DPR,              /* parallel port regs */
 137        MOS7720_DSR,
 138        MOS7720_DCR,
 139        MOS7720_ECR,
 140        MOS7720_SP1_REG,          /* device control regs */
 141        MOS7720_SP2_REG,          /* serial port 2 (7720 only) */
 142        MOS7720_PP_REG,
 143        MOS7720_SP_CONTROL_REG,
 144};
 145
 146/*
 147 * Return the correct value for the Windex field of the setup packet
 148 * for a control endpoint message.  See the 7715 datasheet.
 149 */
 150static inline __u16 get_reg_index(enum mos_regs reg)
 151{
 152        static const __u16 mos7715_index_lookup_table[] = {
 153                0x00,           /* MOS7720_THR */
 154                0x00,           /* MOS7720_RHR */
 155                0x01,           /* MOS7720_IER */
 156                0x02,           /* MOS7720_FCR */
 157                0x02,           /* MOS7720_ISR */
 158                0x03,           /* MOS7720_LCR */
 159                0x04,           /* MOS7720_MCR */
 160                0x05,           /* MOS7720_LSR */
 161                0x06,           /* MOS7720_MSR */
 162                0x07,           /* MOS7720_SPR */
 163                0x00,           /* MOS7720_DLL */
 164                0x01,           /* MOS7720_DLM */
 165                0x00,           /* MOS7720_DPR */
 166                0x01,           /* MOS7720_DSR */
 167                0x02,           /* MOS7720_DCR */
 168                0x0a,           /* MOS7720_ECR */
 169                0x01,           /* MOS7720_SP1_REG */
 170                0x02,           /* MOS7720_SP2_REG (7720 only) */
 171                0x04,           /* MOS7720_PP_REG (7715 only) */
 172                0x08,           /* MOS7720_SP_CONTROL_REG */
 173        };
 174        return mos7715_index_lookup_table[reg];
 175}
 176
 177/*
 178 * Return the correct value for the upper byte of the Wvalue field of
 179 * the setup packet for a control endpoint message.
 180 */
 181static inline __u16 get_reg_value(enum mos_regs reg,
 182                                  unsigned int serial_portnum)
 183{
 184        if (reg >= MOS7720_SP1_REG)     /* control reg */
 185                return 0x0000;
 186
 187        else if (reg >= MOS7720_DPR)    /* parallel port reg (7715 only) */
 188                return 0x0100;
 189
 190        else                          /* serial port reg */
 191                return (serial_portnum + 2) << 8;
 192}
 193
 194/*
 195 * Write data byte to the specified device register.  The data is embedded in
 196 * the value field of the setup packet. serial_portnum is ignored for registers
 197 * not specific to a particular serial port.
 198 */
 199static int write_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
 200                         enum mos_regs reg, __u8 data)
 201{
 202        struct usb_device *usbdev = serial->dev;
 203        unsigned int pipe = usb_sndctrlpipe(usbdev, 0);
 204        __u8 request = (__u8)0x0e;
 205        __u8 requesttype = (__u8)0x40;
 206        __u16 index = get_reg_index(reg);
 207        __u16 value = get_reg_value(reg, serial_portnum) + data;
 208        int status = usb_control_msg(usbdev, pipe, request, requesttype, value,
 209                                     index, NULL, 0, MOS_WDR_TIMEOUT);
 210        if (status < 0)
 211                dev_err(&usbdev->dev,
 212                        "mos7720: usb_control_msg() failed: %d\n", status);
 213        return status;
 214}
 215
 216/*
 217 * Read data byte from the specified device register.  The data returned by the
 218 * device is embedded in the value field of the setup packet.  serial_portnum is
 219 * ignored for registers that are not specific to a particular serial port.
 220 */
 221static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
 222                        enum mos_regs reg, __u8 *data)
 223{
 224        struct usb_device *usbdev = serial->dev;
 225        unsigned int pipe = usb_rcvctrlpipe(usbdev, 0);
 226        __u8 request = (__u8)0x0d;
 227        __u8 requesttype = (__u8)0xc0;
 228        __u16 index = get_reg_index(reg);
 229        __u16 value = get_reg_value(reg, serial_portnum);
 230        u8 *buf;
 231        int status;
 232
 233        buf = kmalloc(1, GFP_KERNEL);
 234        if (!buf)
 235                return -ENOMEM;
 236
 237        status = usb_control_msg(usbdev, pipe, request, requesttype, value,
 238                                     index, buf, 1, MOS_WDR_TIMEOUT);
 239        if (status == 1)
 240                *data = *buf;
 241        else if (status < 0)
 242                dev_err(&usbdev->dev,
 243                        "mos7720: usb_control_msg() failed: %d\n", status);
 244        kfree(buf);
 245
 246        return status;
 247}
 248
 249#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
 250
 251static inline int mos7715_change_mode(struct mos7715_parport *mos_parport,
 252                                      enum mos7715_pp_modes mode)
 253{
 254        mos_parport->shadowECR = mode;
 255        write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR,
 256                      mos_parport->shadowECR);
 257        return 0;
 258}
 259
 260static void destroy_mos_parport(struct kref *kref)
 261{
 262        struct mos7715_parport *mos_parport =
 263                container_of(kref, struct mos7715_parport, ref_count);
 264
 265        kfree(mos_parport);
 266}
 267
 268static void destroy_urbtracker(struct kref *kref)
 269{
 270        struct urbtracker *urbtrack =
 271                container_of(kref, struct urbtracker, ref_count);
 272        struct mos7715_parport *mos_parport = urbtrack->mos_parport;
 273
 274        usb_free_urb(urbtrack->urb);
 275        kfree(urbtrack->setup);
 276        kfree(urbtrack);
 277        kref_put(&mos_parport->ref_count, destroy_mos_parport);
 278}
 279
 280/*
 281 * This runs as a tasklet when sending an urb in a non-blocking parallel
 282 * port callback had to be deferred because the disconnect mutex could not be
 283 * obtained at the time.
 284 */
 285static void send_deferred_urbs(unsigned long _mos_parport)
 286{
 287        int ret_val;
 288        unsigned long flags;
 289        struct mos7715_parport *mos_parport = (void *)_mos_parport;
 290        struct urbtracker *urbtrack, *tmp;
 291        struct list_head *cursor, *next;
 292        struct device *dev;
 293
 294        /* if release function ran, game over */
 295        if (unlikely(mos_parport->serial == NULL))
 296                return;
 297
 298        dev = &mos_parport->serial->dev->dev;
 299
 300        /* try again to get the mutex */
 301        if (!mutex_trylock(&mos_parport->serial->disc_mutex)) {
 302                dev_dbg(dev, "%s: rescheduling tasklet\n", __func__);
 303                tasklet_schedule(&mos_parport->urb_tasklet);
 304                return;
 305        }
 306
 307        /* if device disconnected, game over */
 308        if (unlikely(mos_parport->serial->disconnected)) {
 309                mutex_unlock(&mos_parport->serial->disc_mutex);
 310                return;
 311        }
 312
 313        spin_lock_irqsave(&mos_parport->listlock, flags);
 314        if (list_empty(&mos_parport->deferred_urbs)) {
 315                spin_unlock_irqrestore(&mos_parport->listlock, flags);
 316                mutex_unlock(&mos_parport->serial->disc_mutex);
 317                dev_dbg(dev, "%s: deferred_urbs list empty\n", __func__);
 318                return;
 319        }
 320
 321        /* move contents of deferred_urbs list to active_urbs list and submit */
 322        list_for_each_safe(cursor, next, &mos_parport->deferred_urbs)
 323                list_move_tail(cursor, &mos_parport->active_urbs);
 324        list_for_each_entry_safe(urbtrack, tmp, &mos_parport->active_urbs,
 325                            urblist_entry) {
 326                ret_val = usb_submit_urb(urbtrack->urb, GFP_ATOMIC);
 327                dev_dbg(dev, "%s: urb submitted\n", __func__);
 328                if (ret_val) {
 329                        dev_err(dev, "usb_submit_urb() failed: %d\n", ret_val);
 330                        list_del(&urbtrack->urblist_entry);
 331                        kref_put(&urbtrack->ref_count, destroy_urbtracker);
 332                }
 333        }
 334        spin_unlock_irqrestore(&mos_parport->listlock, flags);
 335        mutex_unlock(&mos_parport->serial->disc_mutex);
 336}
 337
 338/* callback for parallel port control urbs submitted asynchronously */
 339static void async_complete(struct urb *urb)
 340{
 341        struct urbtracker *urbtrack = urb->context;
 342        int status = urb->status;
 343
 344        if (unlikely(status))
 345                dev_dbg(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __func__, status);
 346
 347        /* remove the urbtracker from the active_urbs list */
 348        spin_lock(&urbtrack->mos_parport->listlock);
 349        list_del(&urbtrack->urblist_entry);
 350        spin_unlock(&urbtrack->mos_parport->listlock);
 351        kref_put(&urbtrack->ref_count, destroy_urbtracker);
 352}
 353
 354static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport,
 355                                      enum mos_regs reg, __u8 data)
 356{
 357        struct urbtracker *urbtrack;
 358        int ret_val;
 359        unsigned long flags;
 360        struct usb_serial *serial = mos_parport->serial;
 361        struct usb_device *usbdev = serial->dev;
 362
 363        /* create and initialize the control urb and containing urbtracker */
 364        urbtrack = kmalloc(sizeof(struct urbtracker), GFP_ATOMIC);
 365        if (!urbtrack)
 366                return -ENOMEM;
 367
 368        kref_get(&mos_parport->ref_count);
 369        urbtrack->mos_parport = mos_parport;
 370        urbtrack->urb = usb_alloc_urb(0, GFP_ATOMIC);
 371        if (!urbtrack->urb) {
 372                kfree(urbtrack);
 373                return -ENOMEM;
 374        }
 375        urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_ATOMIC);
 376        if (!urbtrack->setup) {
 377                usb_free_urb(urbtrack->urb);
 378                kfree(urbtrack);
 379                return -ENOMEM;
 380        }
 381        urbtrack->setup->bRequestType = (__u8)0x40;
 382        urbtrack->setup->bRequest = (__u8)0x0e;
 383        urbtrack->setup->wValue = cpu_to_le16(get_reg_value(reg, dummy));
 384        urbtrack->setup->wIndex = cpu_to_le16(get_reg_index(reg));
 385        urbtrack->setup->wLength = 0;
 386        usb_fill_control_urb(urbtrack->urb, usbdev,
 387                             usb_sndctrlpipe(usbdev, 0),
 388                             (unsigned char *)urbtrack->setup,
 389                             NULL, 0, async_complete, urbtrack);
 390        kref_init(&urbtrack->ref_count);
 391        INIT_LIST_HEAD(&urbtrack->urblist_entry);
 392
 393        /*
 394         * get the disconnect mutex, or add tracker to the deferred_urbs list
 395         * and schedule a tasklet to try again later
 396         */
 397        if (!mutex_trylock(&serial->disc_mutex)) {
 398                spin_lock_irqsave(&mos_parport->listlock, flags);
 399                list_add_tail(&urbtrack->urblist_entry,
 400                              &mos_parport->deferred_urbs);
 401                spin_unlock_irqrestore(&mos_parport->listlock, flags);
 402                tasklet_schedule(&mos_parport->urb_tasklet);
 403                dev_dbg(&usbdev->dev, "tasklet scheduled\n");
 404                return 0;
 405        }
 406
 407        /* bail if device disconnected */
 408        if (serial->disconnected) {
 409                kref_put(&urbtrack->ref_count, destroy_urbtracker);
 410                mutex_unlock(&serial->disc_mutex);
 411                return -ENODEV;
 412        }
 413
 414        /* add the tracker to the active_urbs list and submit */
 415        spin_lock_irqsave(&mos_parport->listlock, flags);
 416        list_add_tail(&urbtrack->urblist_entry, &mos_parport->active_urbs);
 417        spin_unlock_irqrestore(&mos_parport->listlock, flags);
 418        ret_val = usb_submit_urb(urbtrack->urb, GFP_ATOMIC);
 419        mutex_unlock(&serial->disc_mutex);
 420        if (ret_val) {
 421                dev_err(&usbdev->dev,
 422                        "%s: submit_urb() failed: %d\n", __func__, ret_val);
 423                spin_lock_irqsave(&mos_parport->listlock, flags);
 424                list_del(&urbtrack->urblist_entry);
 425                spin_unlock_irqrestore(&mos_parport->listlock, flags);
 426                kref_put(&urbtrack->ref_count, destroy_urbtracker);
 427                return ret_val;
 428        }
 429        return 0;
 430}
 431
 432/*
 433 * This is the the common top part of all parallel port callback operations that
 434 * send synchronous messages to the device.  This implements convoluted locking
 435 * that avoids two scenarios: (1) a port operation is called after usbserial
 436 * has called our release function, at which point struct mos7715_parport has
 437 * been destroyed, and (2) the device has been disconnected, but usbserial has
 438 * not called the release function yet because someone has a serial port open.
 439 * The shared release_lock prevents the first, and the mutex and disconnected
 440 * flag maintained by usbserial covers the second.  We also use the msg_pending
 441 * flag to ensure that all synchronous usb message calls have completed before
 442 * our release function can return.
 443 */
 444static int parport_prologue(struct parport *pp)
 445{
 446        struct mos7715_parport *mos_parport;
 447
 448        spin_lock(&release_lock);
 449        mos_parport = pp->private_data;
 450        if (unlikely(mos_parport == NULL)) {
 451                /* release fn called, port struct destroyed */
 452                spin_unlock(&release_lock);
 453                return -1;
 454        }
 455        mos_parport->msg_pending = true;   /* synch usb call pending */
 456        reinit_completion(&mos_parport->syncmsg_compl);
 457        spin_unlock(&release_lock);
 458
 459        mutex_lock(&mos_parport->serial->disc_mutex);
 460        if (mos_parport->serial->disconnected) {
 461                /* device disconnected */
 462                mutex_unlock(&mos_parport->serial->disc_mutex);
 463                mos_parport->msg_pending = false;
 464                complete(&mos_parport->syncmsg_compl);
 465                return -1;
 466        }
 467
 468        return 0;
 469}
 470
 471/*
 472 * This is the common bottom part of all parallel port functions that send
 473 * synchronous messages to the device.
 474 */
 475static inline void parport_epilogue(struct parport *pp)
 476{
 477        struct mos7715_parport *mos_parport = pp->private_data;
 478        mutex_unlock(&mos_parport->serial->disc_mutex);
 479        mos_parport->msg_pending = false;
 480        complete(&mos_parport->syncmsg_compl);
 481}
 482
 483static void parport_mos7715_write_data(struct parport *pp, unsigned char d)
 484{
 485        struct mos7715_parport *mos_parport = pp->private_data;
 486
 487        if (parport_prologue(pp) < 0)
 488                return;
 489        mos7715_change_mode(mos_parport, SPP);
 490        write_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, (__u8)d);
 491        parport_epilogue(pp);
 492}
 493
 494static unsigned char parport_mos7715_read_data(struct parport *pp)
 495{
 496        struct mos7715_parport *mos_parport = pp->private_data;
 497        unsigned char d;
 498
 499        if (parport_prologue(pp) < 0)
 500                return 0;
 501        read_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, &d);
 502        parport_epilogue(pp);
 503        return d;
 504}
 505
 506static void parport_mos7715_write_control(struct parport *pp, unsigned char d)
 507{
 508        struct mos7715_parport *mos_parport = pp->private_data;
 509        __u8 data;
 510
 511        if (parport_prologue(pp) < 0)
 512                return;
 513        data = ((__u8)d & 0x0f) | (mos_parport->shadowDCR & 0xf0);
 514        write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, data);
 515        mos_parport->shadowDCR = data;
 516        parport_epilogue(pp);
 517}
 518
 519static unsigned char parport_mos7715_read_control(struct parport *pp)
 520{
 521        struct mos7715_parport *mos_parport = pp->private_data;
 522        __u8 dcr;
 523
 524        spin_lock(&release_lock);
 525        mos_parport = pp->private_data;
 526        if (unlikely(mos_parport == NULL)) {
 527                spin_unlock(&release_lock);
 528                return 0;
 529        }
 530        dcr = mos_parport->shadowDCR & 0x0f;
 531        spin_unlock(&release_lock);
 532        return dcr;
 533}
 534
 535static unsigned char parport_mos7715_frob_control(struct parport *pp,
 536                                                  unsigned char mask,
 537                                                  unsigned char val)
 538{
 539        struct mos7715_parport *mos_parport = pp->private_data;
 540        __u8 dcr;
 541
 542        mask &= 0x0f;
 543        val &= 0x0f;
 544        if (parport_prologue(pp) < 0)
 545                return 0;
 546        mos_parport->shadowDCR = (mos_parport->shadowDCR & (~mask)) ^ val;
 547        write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
 548                      mos_parport->shadowDCR);
 549        dcr = mos_parport->shadowDCR & 0x0f;
 550        parport_epilogue(pp);
 551        return dcr;
 552}
 553
 554static unsigned char parport_mos7715_read_status(struct parport *pp)
 555{
 556        unsigned char status;
 557        struct mos7715_parport *mos_parport = pp->private_data;
 558
 559        spin_lock(&release_lock);
 560        mos_parport = pp->private_data;
 561        if (unlikely(mos_parport == NULL)) {    /* release called */
 562                spin_unlock(&release_lock);
 563                return 0;
 564        }
 565        status = atomic_read(&mos_parport->shadowDSR) & 0xf8;
 566        spin_unlock(&release_lock);
 567        return status;
 568}
 569
 570static void parport_mos7715_enable_irq(struct parport *pp)
 571{
 572}
 573
 574static void parport_mos7715_disable_irq(struct parport *pp)
 575{
 576}
 577
 578static void parport_mos7715_data_forward(struct parport *pp)
 579{
 580        struct mos7715_parport *mos_parport = pp->private_data;
 581
 582        if (parport_prologue(pp) < 0)
 583                return;
 584        mos7715_change_mode(mos_parport, PS2);
 585        mos_parport->shadowDCR &=  ~0x20;
 586        write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
 587                      mos_parport->shadowDCR);
 588        parport_epilogue(pp);
 589}
 590
 591static void parport_mos7715_data_reverse(struct parport *pp)
 592{
 593        struct mos7715_parport *mos_parport = pp->private_data;
 594
 595        if (parport_prologue(pp) < 0)
 596                return;
 597        mos7715_change_mode(mos_parport, PS2);
 598        mos_parport->shadowDCR |= 0x20;
 599        write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
 600                      mos_parport->shadowDCR);
 601        parport_epilogue(pp);
 602}
 603
 604static void parport_mos7715_init_state(struct pardevice *dev,
 605                                       struct parport_state *s)
 606{
 607        s->u.pc.ctr = DCR_INIT_VAL;
 608        s->u.pc.ecr = ECR_INIT_VAL;
 609}
 610
 611/* N.B. Parport core code requires that this function not block */
 612static void parport_mos7715_save_state(struct parport *pp,
 613                                       struct parport_state *s)
 614{
 615        struct mos7715_parport *mos_parport;
 616
 617        spin_lock(&release_lock);
 618        mos_parport = pp->private_data;
 619        if (unlikely(mos_parport == NULL)) {    /* release called */
 620                spin_unlock(&release_lock);
 621                return;
 622        }
 623        s->u.pc.ctr = mos_parport->shadowDCR;
 624        s->u.pc.ecr = mos_parport->shadowECR;
 625        spin_unlock(&release_lock);
 626}
 627
 628/* N.B. Parport core code requires that this function not block */
 629static void parport_mos7715_restore_state(struct parport *pp,
 630                                          struct parport_state *s)
 631{
 632        struct mos7715_parport *mos_parport;
 633
 634        spin_lock(&release_lock);
 635        mos_parport = pp->private_data;
 636        if (unlikely(mos_parport == NULL)) {    /* release called */
 637                spin_unlock(&release_lock);
 638                return;
 639        }
 640        write_parport_reg_nonblock(mos_parport, MOS7720_DCR,
 641                                   mos_parport->shadowDCR);
 642        write_parport_reg_nonblock(mos_parport, MOS7720_ECR,
 643                                   mos_parport->shadowECR);
 644        spin_unlock(&release_lock);
 645}
 646
 647static size_t parport_mos7715_write_compat(struct parport *pp,
 648                                           const void *buffer,
 649                                           size_t len, int flags)
 650{
 651        int retval;
 652        struct mos7715_parport *mos_parport = pp->private_data;
 653        int actual_len;
 654
 655        if (parport_prologue(pp) < 0)
 656                return 0;
 657        mos7715_change_mode(mos_parport, PPF);
 658        retval = usb_bulk_msg(mos_parport->serial->dev,
 659                              usb_sndbulkpipe(mos_parport->serial->dev, 2),
 660                              (void *)buffer, len, &actual_len,
 661                              MOS_WDR_TIMEOUT);
 662        parport_epilogue(pp);
 663        if (retval) {
 664                dev_err(&mos_parport->serial->dev->dev,
 665                        "mos7720: usb_bulk_msg() failed: %d\n", retval);
 666                return 0;
 667        }
 668        return actual_len;
 669}
 670
 671static struct parport_operations parport_mos7715_ops = {
 672        .owner =                THIS_MODULE,
 673        .write_data =           parport_mos7715_write_data,
 674        .read_data =            parport_mos7715_read_data,
 675
 676        .write_control =        parport_mos7715_write_control,
 677        .read_control =         parport_mos7715_read_control,
 678        .frob_control =         parport_mos7715_frob_control,
 679
 680        .read_status =          parport_mos7715_read_status,
 681
 682        .enable_irq =           parport_mos7715_enable_irq,
 683        .disable_irq =          parport_mos7715_disable_irq,
 684
 685        .data_forward =         parport_mos7715_data_forward,
 686        .data_reverse =         parport_mos7715_data_reverse,
 687
 688        .init_state =           parport_mos7715_init_state,
 689        .save_state =           parport_mos7715_save_state,
 690        .restore_state =        parport_mos7715_restore_state,
 691
 692        .compat_write_data =    parport_mos7715_write_compat,
 693
 694        .nibble_read_data =     parport_ieee1284_read_nibble,
 695        .byte_read_data =       parport_ieee1284_read_byte,
 696};
 697
 698/*
 699 * Allocate and initialize parallel port control struct, initialize
 700 * the parallel port hardware device, and register with the parport subsystem.
 701 */
 702static int mos7715_parport_init(struct usb_serial *serial)
 703{
 704        struct mos7715_parport *mos_parport;
 705
 706        /* allocate and initialize parallel port control struct */
 707        mos_parport = kzalloc(sizeof(struct mos7715_parport), GFP_KERNEL);
 708        if (!mos_parport)
 709                return -ENOMEM;
 710
 711        mos_parport->msg_pending = false;
 712        kref_init(&mos_parport->ref_count);
 713        spin_lock_init(&mos_parport->listlock);
 714        INIT_LIST_HEAD(&mos_parport->active_urbs);
 715        INIT_LIST_HEAD(&mos_parport->deferred_urbs);
 716        usb_set_serial_data(serial, mos_parport); /* hijack private pointer */
 717        mos_parport->serial = serial;
 718        tasklet_init(&mos_parport->urb_tasklet, send_deferred_urbs,
 719                     (unsigned long) mos_parport);
 720        init_completion(&mos_parport->syncmsg_compl);
 721
 722        /* cycle parallel port reset bit */
 723        write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x80);
 724        write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x00);
 725
 726        /* initialize device registers */
 727        mos_parport->shadowDCR = DCR_INIT_VAL;
 728        write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
 729                      mos_parport->shadowDCR);
 730        mos_parport->shadowECR = ECR_INIT_VAL;
 731        write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR,
 732                      mos_parport->shadowECR);
 733
 734        /* register with parport core */
 735        mos_parport->pp = parport_register_port(0, PARPORT_IRQ_NONE,
 736                                                PARPORT_DMA_NONE,
 737                                                &parport_mos7715_ops);
 738        if (mos_parport->pp == NULL) {
 739                dev_err(&serial->interface->dev,
 740                        "Could not register parport\n");
 741                kref_put(&mos_parport->ref_count, destroy_mos_parport);
 742                return -EIO;
 743        }
 744        mos_parport->pp->private_data = mos_parport;
 745        mos_parport->pp->modes = PARPORT_MODE_COMPAT | PARPORT_MODE_PCSPP;
 746        mos_parport->pp->dev = &serial->interface->dev;
 747        parport_announce_port(mos_parport->pp);
 748
 749        return 0;
 750}
 751#endif  /* CONFIG_USB_SERIAL_MOS7715_PARPORT */
 752
 753/*
 754 * mos7720_interrupt_callback
 755 *      this is the callback function for when we have received data on the
 756 *      interrupt endpoint.
 757 */
 758static void mos7720_interrupt_callback(struct urb *urb)
 759{
 760        int result;
 761        int length;
 762        int status = urb->status;
 763        struct device *dev = &urb->dev->dev;
 764        __u8 *data;
 765        __u8 sp1;
 766        __u8 sp2;
 767
 768        switch (status) {
 769        case 0:
 770                /* success */
 771                break;
 772        case -ECONNRESET:
 773        case -ENOENT:
 774        case -ESHUTDOWN:
 775                /* this urb is terminated, clean up */
 776                dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
 777                return;
 778        default:
 779                dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
 780                goto exit;
 781        }
 782
 783        length = urb->actual_length;
 784        data = urb->transfer_buffer;
 785
 786        /* Moschip get 4 bytes
 787         * Byte 1 IIR Port 1 (port.number is 0)
 788         * Byte 2 IIR Port 2 (port.number is 1)
 789         * Byte 3 --------------
 790         * Byte 4 FIFO status for both */
 791
 792        /* the above description is inverted
 793         *      oneukum 2007-03-14 */
 794
 795        if (unlikely(length != 4)) {
 796                dev_dbg(dev, "Wrong data !!!\n");
 797                return;
 798        }
 799
 800        sp1 = data[3];
 801        sp2 = data[2];
 802
 803        if ((sp1 | sp2) & 0x01) {
 804                /* No Interrupt Pending in both the ports */
 805                dev_dbg(dev, "No Interrupt !!!\n");
 806        } else {
 807                switch (sp1 & 0x0f) {
 808                case SERIAL_IIR_RLS:
 809                        dev_dbg(dev, "Serial Port 1: Receiver status error or address bit detected in 9-bit mode\n");
 810                        break;
 811                case SERIAL_IIR_CTI:
 812                        dev_dbg(dev, "Serial Port 1: Receiver time out\n");
 813                        break;
 814                case SERIAL_IIR_MS:
 815                        /* dev_dbg(dev, "Serial Port 1: Modem status change\n"); */
 816                        break;
 817                }
 818
 819                switch (sp2 & 0x0f) {
 820                case SERIAL_IIR_RLS:
 821                        dev_dbg(dev, "Serial Port 2: Receiver status error or address bit detected in 9-bit mode\n");
 822                        break;
 823                case SERIAL_IIR_CTI:
 824                        dev_dbg(dev, "Serial Port 2: Receiver time out\n");
 825                        break;
 826                case SERIAL_IIR_MS:
 827                        /* dev_dbg(dev, "Serial Port 2: Modem status change\n"); */
 828                        break;
 829                }
 830        }
 831
 832exit:
 833        result = usb_submit_urb(urb, GFP_ATOMIC);
 834        if (result)
 835                dev_err(dev, "%s - Error %d submitting control urb\n", __func__, result);
 836}
 837
 838/*
 839 * mos7715_interrupt_callback
 840 *      this is the 7715's callback function for when we have received data on
 841 *      the interrupt endpoint.
 842 */
 843static void mos7715_interrupt_callback(struct urb *urb)
 844{
 845        int result;
 846        int length;
 847        int status = urb->status;
 848        struct device *dev = &urb->dev->dev;
 849        __u8 *data;
 850        __u8 iir;
 851
 852        switch (status) {
 853        case 0:
 854                /* success */
 855                break;
 856        case -ECONNRESET:
 857        case -ENOENT:
 858        case -ESHUTDOWN:
 859        case -ENODEV:
 860                /* this urb is terminated, clean up */
 861                dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
 862                return;
 863        default:
 864                dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
 865                goto exit;
 866        }
 867
 868        length = urb->actual_length;
 869        data = urb->transfer_buffer;
 870
 871        /* Structure of data from 7715 device:
 872         * Byte 1: IIR serial Port
 873         * Byte 2: unused
 874         * Byte 2: DSR parallel port
 875         * Byte 4: FIFO status for both */
 876
 877        if (unlikely(length != 4)) {
 878                dev_dbg(dev, "Wrong data !!!\n");
 879                return;
 880        }
 881
 882        iir = data[0];
 883        if (!(iir & 0x01)) {    /* serial port interrupt pending */
 884                switch (iir & 0x0f) {
 885                case SERIAL_IIR_RLS:
 886                        dev_dbg(dev, "Serial Port: Receiver status error or address bit detected in 9-bit mode\n");
 887                        break;
 888                case SERIAL_IIR_CTI:
 889                        dev_dbg(dev, "Serial Port: Receiver time out\n");
 890                        break;
 891                case SERIAL_IIR_MS:
 892                        /* dev_dbg(dev, "Serial Port: Modem status change\n"); */
 893                        break;
 894                }
 895        }
 896
 897#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
 898        {       /* update local copy of DSR reg */
 899                struct usb_serial_port *port = urb->context;
 900                struct mos7715_parport *mos_parport = port->serial->private;
 901                if (unlikely(mos_parport == NULL))
 902                        return;
 903                atomic_set(&mos_parport->shadowDSR, data[2]);
 904        }
 905#endif
 906
 907exit:
 908        result = usb_submit_urb(urb, GFP_ATOMIC);
 909        if (result)
 910                dev_err(dev, "%s - Error %d submitting control urb\n", __func__, result);
 911}
 912
 913/*
 914 * mos7720_bulk_in_callback
 915 *      this is the callback function for when we have received data on the
 916 *      bulk in endpoint.
 917 */
 918static void mos7720_bulk_in_callback(struct urb *urb)
 919{
 920        int retval;
 921        unsigned char *data ;
 922        struct usb_serial_port *port;
 923        int status = urb->status;
 924
 925        if (status) {
 926                dev_dbg(&urb->dev->dev, "nonzero read bulk status received: %d\n", status);
 927                return;
 928        }
 929
 930        port = urb->context;
 931
 932        dev_dbg(&port->dev, "Entering...%s\n", __func__);
 933
 934        data = urb->transfer_buffer;
 935
 936        if (urb->actual_length) {
 937                tty_insert_flip_string(&port->port, data, urb->actual_length);
 938                tty_flip_buffer_push(&port->port);
 939        }
 940
 941        if (port->read_urb->status != -EINPROGRESS) {
 942                retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
 943                if (retval)
 944                        dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, retval = %d\n", retval);
 945        }
 946}
 947
 948/*
 949 * mos7720_bulk_out_data_callback
 950 *      this is the callback function for when we have finished sending serial
 951 *      data on the bulk out endpoint.
 952 */
 953static void mos7720_bulk_out_data_callback(struct urb *urb)
 954{
 955        struct moschip_port *mos7720_port;
 956        int status = urb->status;
 957
 958        if (status) {
 959                dev_dbg(&urb->dev->dev, "nonzero write bulk status received:%d\n", status);
 960                return;
 961        }
 962
 963        mos7720_port = urb->context;
 964        if (!mos7720_port) {
 965                dev_dbg(&urb->dev->dev, "NULL mos7720_port pointer\n");
 966                return ;
 967        }
 968
 969        if (mos7720_port->open)
 970                tty_port_tty_wakeup(&mos7720_port->port->port);
 971}
 972
 973/*
 974 * mos77xx_probe
 975 *      this function installs the appropriate read interrupt endpoint callback
 976 *      depending on whether the device is a 7720 or 7715, thus avoiding costly
 977 *      run-time checks in the high-frequency callback routine itself.
 978 */
 979static int mos77xx_probe(struct usb_serial *serial,
 980                         const struct usb_device_id *id)
 981{
 982        if (id->idProduct == MOSCHIP_DEVICE_ID_7715)
 983                moschip7720_2port_driver.read_int_callback =
 984                        mos7715_interrupt_callback;
 985        else
 986                moschip7720_2port_driver.read_int_callback =
 987                        mos7720_interrupt_callback;
 988
 989        return 0;
 990}
 991
 992static int mos77xx_calc_num_ports(struct usb_serial *serial)
 993{
 994        u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
 995        if (product == MOSCHIP_DEVICE_ID_7715)
 996                return 1;
 997
 998        return 2;
 999}
1000
1001static int mos7720_open(struct tty_struct *tty, struct usb_serial_port *port)
1002{
1003        struct usb_serial *serial;
1004        struct urb *urb;
1005        struct moschip_port *mos7720_port;
1006        int response;
1007        int port_number;
1008        __u8 data;
1009        int allocated_urbs = 0;
1010        int j;
1011
1012        serial = port->serial;
1013
1014        mos7720_port = usb_get_serial_port_data(port);
1015        if (mos7720_port == NULL)
1016                return -ENODEV;
1017
1018        usb_clear_halt(serial->dev, port->write_urb->pipe);
1019        usb_clear_halt(serial->dev, port->read_urb->pipe);
1020
1021        /* Initialising the write urb pool */
1022        for (j = 0; j < NUM_URBS; ++j) {
1023                urb = usb_alloc_urb(0, GFP_KERNEL);
1024                mos7720_port->write_urb_pool[j] = urb;
1025                if (!urb)
1026                        continue;
1027
1028                urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
1029                                               GFP_KERNEL);
1030                if (!urb->transfer_buffer) {
1031                        usb_free_urb(mos7720_port->write_urb_pool[j]);
1032                        mos7720_port->write_urb_pool[j] = NULL;
1033                        continue;
1034                }
1035                allocated_urbs++;
1036        }
1037
1038        if (!allocated_urbs)
1039                return -ENOMEM;
1040
1041         /* Initialize MCS7720 -- Write Init values to corresponding Registers
1042          *
1043          * Register Index
1044          * 0 : MOS7720_THR/MOS7720_RHR
1045          * 1 : MOS7720_IER
1046          * 2 : MOS7720_FCR
1047          * 3 : MOS7720_LCR
1048          * 4 : MOS7720_MCR
1049          * 5 : MOS7720_LSR
1050          * 6 : MOS7720_MSR
1051          * 7 : MOS7720_SPR
1052          *
1053          * 0x08 : SP1/2 Control Reg
1054          */
1055        port_number = port->port_number;
1056        read_mos_reg(serial, port_number, MOS7720_LSR, &data);
1057
1058        dev_dbg(&port->dev, "SS::%p LSR:%x\n", mos7720_port, data);
1059
1060        write_mos_reg(serial, dummy, MOS7720_SP1_REG, 0x02);
1061        write_mos_reg(serial, dummy, MOS7720_SP2_REG, 0x02);
1062
1063        write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1064        write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1065
1066        write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1067        mos7720_port->shadowLCR = 0x03;
1068        write_mos_reg(serial, port_number, MOS7720_LCR,
1069                      mos7720_port->shadowLCR);
1070        mos7720_port->shadowMCR = 0x0b;
1071        write_mos_reg(serial, port_number, MOS7720_MCR,
1072                      mos7720_port->shadowMCR);
1073
1074        write_mos_reg(serial, port_number, MOS7720_SP_CONTROL_REG, 0x00);
1075        read_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, &data);
1076        data = data | (port->port_number + 1);
1077        write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, data);
1078        mos7720_port->shadowLCR = 0x83;
1079        write_mos_reg(serial, port_number, MOS7720_LCR,
1080                      mos7720_port->shadowLCR);
1081        write_mos_reg(serial, port_number, MOS7720_THR, 0x0c);
1082        write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1083        mos7720_port->shadowLCR = 0x03;
1084        write_mos_reg(serial, port_number, MOS7720_LCR,
1085                      mos7720_port->shadowLCR);
1086        write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1087
1088        response = usb_submit_urb(port->read_urb, GFP_KERNEL);
1089        if (response)
1090                dev_err(&port->dev, "%s - Error %d submitting read urb\n",
1091                                                        __func__, response);
1092
1093        /* initialize our port settings */
1094        mos7720_port->shadowMCR = UART_MCR_OUT2; /* Must set to enable ints! */
1095
1096        /* send a open port command */
1097        mos7720_port->open = 1;
1098
1099        return 0;
1100}
1101
1102/*
1103 * mos7720_chars_in_buffer
1104 *      this function is called by the tty driver when it wants to know how many
1105 *      bytes of data we currently have outstanding in the port (data that has
1106 *      been written, but hasn't made it out the port yet)
1107 *      If successful, we return the number of bytes left to be written in the
1108 *      system,
1109 *      Otherwise we return a negative error number.
1110 */
1111static int mos7720_chars_in_buffer(struct tty_struct *tty)
1112{
1113        struct usb_serial_port *port = tty->driver_data;
1114        int i;
1115        int chars = 0;
1116        struct moschip_port *mos7720_port;
1117
1118        mos7720_port = usb_get_serial_port_data(port);
1119        if (mos7720_port == NULL)
1120                return 0;
1121
1122        for (i = 0; i < NUM_URBS; ++i) {
1123                if (mos7720_port->write_urb_pool[i] &&
1124                    mos7720_port->write_urb_pool[i]->status == -EINPROGRESS)
1125                        chars += URB_TRANSFER_BUFFER_SIZE;
1126        }
1127        dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
1128        return chars;
1129}
1130
1131static void mos7720_close(struct usb_serial_port *port)
1132{
1133        struct usb_serial *serial;
1134        struct moschip_port *mos7720_port;
1135        int j;
1136
1137        serial = port->serial;
1138
1139        mos7720_port = usb_get_serial_port_data(port);
1140        if (mos7720_port == NULL)
1141                return;
1142
1143        for (j = 0; j < NUM_URBS; ++j)
1144                usb_kill_urb(mos7720_port->write_urb_pool[j]);
1145
1146        /* Freeing Write URBs */
1147        for (j = 0; j < NUM_URBS; ++j) {
1148                if (mos7720_port->write_urb_pool[j]) {
1149                        kfree(mos7720_port->write_urb_pool[j]->transfer_buffer);
1150                        usb_free_urb(mos7720_port->write_urb_pool[j]);
1151                }
1152        }
1153
1154        /* While closing port, shutdown all bulk read, write  *
1155         * and interrupt read if they exists, otherwise nop   */
1156        usb_kill_urb(port->write_urb);
1157        usb_kill_urb(port->read_urb);
1158
1159        write_mos_reg(serial, port->port_number, MOS7720_MCR, 0x00);
1160        write_mos_reg(serial, port->port_number, MOS7720_IER, 0x00);
1161
1162        mos7720_port->open = 0;
1163}
1164
1165static void mos7720_break(struct tty_struct *tty, int break_state)
1166{
1167        struct usb_serial_port *port = tty->driver_data;
1168        unsigned char data;
1169        struct usb_serial *serial;
1170        struct moschip_port *mos7720_port;
1171
1172        serial = port->serial;
1173
1174        mos7720_port = usb_get_serial_port_data(port);
1175        if (mos7720_port == NULL)
1176                return;
1177
1178        if (break_state == -1)
1179                data = mos7720_port->shadowLCR | UART_LCR_SBC;
1180        else
1181                data = mos7720_port->shadowLCR & ~UART_LCR_SBC;
1182
1183        mos7720_port->shadowLCR  = data;
1184        write_mos_reg(serial, port->port_number, MOS7720_LCR,
1185                      mos7720_port->shadowLCR);
1186}
1187
1188/*
1189 * mos7720_write_room
1190 *      this function is called by the tty driver when it wants to know how many
1191 *      bytes of data we can accept for a specific port.
1192 *      If successful, we return the amount of room that we have for this port
1193 *      Otherwise we return a negative error number.
1194 */
1195static int mos7720_write_room(struct tty_struct *tty)
1196{
1197        struct usb_serial_port *port = tty->driver_data;
1198        struct moschip_port *mos7720_port;
1199        int room = 0;
1200        int i;
1201
1202        mos7720_port = usb_get_serial_port_data(port);
1203        if (mos7720_port == NULL)
1204                return -ENODEV;
1205
1206        /* FIXME: Locking */
1207        for (i = 0; i < NUM_URBS; ++i) {
1208                if (mos7720_port->write_urb_pool[i] &&
1209                    mos7720_port->write_urb_pool[i]->status != -EINPROGRESS)
1210                        room += URB_TRANSFER_BUFFER_SIZE;
1211        }
1212
1213        dev_dbg(&port->dev, "%s - returns %d\n", __func__, room);
1214        return room;
1215}
1216
1217static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port,
1218                                 const unsigned char *data, int count)
1219{
1220        int status;
1221        int i;
1222        int bytes_sent = 0;
1223        int transfer_size;
1224
1225        struct moschip_port *mos7720_port;
1226        struct usb_serial *serial;
1227        struct urb    *urb;
1228        const unsigned char *current_position = data;
1229
1230        serial = port->serial;
1231
1232        mos7720_port = usb_get_serial_port_data(port);
1233        if (mos7720_port == NULL)
1234                return -ENODEV;
1235
1236        /* try to find a free urb in the list */
1237        urb = NULL;
1238
1239        for (i = 0; i < NUM_URBS; ++i) {
1240                if (mos7720_port->write_urb_pool[i] &&
1241                    mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) {
1242                        urb = mos7720_port->write_urb_pool[i];
1243                        dev_dbg(&port->dev, "URB:%d\n", i);
1244                        break;
1245                }
1246        }
1247
1248        if (urb == NULL) {
1249                dev_dbg(&port->dev, "%s - no more free urbs\n", __func__);
1250                goto exit;
1251        }
1252
1253        if (urb->transfer_buffer == NULL) {
1254                urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
1255                                               GFP_ATOMIC);
1256                if (!urb->transfer_buffer)
1257                        goto exit;
1258        }
1259        transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
1260
1261        memcpy(urb->transfer_buffer, current_position, transfer_size);
1262        usb_serial_debug_data(&port->dev, __func__, transfer_size,
1263                              urb->transfer_buffer);
1264
1265        /* fill urb with data and submit  */
1266        usb_fill_bulk_urb(urb, serial->dev,
1267                          usb_sndbulkpipe(serial->dev,
1268                                        port->bulk_out_endpointAddress),
1269                          urb->transfer_buffer, transfer_size,
1270                          mos7720_bulk_out_data_callback, mos7720_port);
1271
1272        /* send it down the pipe */
1273        status = usb_submit_urb(urb, GFP_ATOMIC);
1274        if (status) {
1275                dev_err_console(port, "%s - usb_submit_urb(write bulk) failed "
1276                        "with status = %d\n", __func__, status);
1277                bytes_sent = status;
1278                goto exit;
1279        }
1280        bytes_sent = transfer_size;
1281
1282exit:
1283        return bytes_sent;
1284}
1285
1286static void mos7720_throttle(struct tty_struct *tty)
1287{
1288        struct usb_serial_port *port = tty->driver_data;
1289        struct moschip_port *mos7720_port;
1290        int status;
1291
1292        mos7720_port = usb_get_serial_port_data(port);
1293
1294        if (mos7720_port == NULL)
1295                return;
1296
1297        if (!mos7720_port->open) {
1298                dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1299                return;
1300        }
1301
1302        /* if we are implementing XON/XOFF, send the stop character */
1303        if (I_IXOFF(tty)) {
1304                unsigned char stop_char = STOP_CHAR(tty);
1305                status = mos7720_write(tty, port, &stop_char, 1);
1306                if (status <= 0)
1307                        return;
1308        }
1309
1310        /* if we are implementing RTS/CTS, toggle that line */
1311        if (C_CRTSCTS(tty)) {
1312                mos7720_port->shadowMCR &= ~UART_MCR_RTS;
1313                write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1314                              mos7720_port->shadowMCR);
1315        }
1316}
1317
1318static void mos7720_unthrottle(struct tty_struct *tty)
1319{
1320        struct usb_serial_port *port = tty->driver_data;
1321        struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1322        int status;
1323
1324        if (mos7720_port == NULL)
1325                return;
1326
1327        if (!mos7720_port->open) {
1328                dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1329                return;
1330        }
1331
1332        /* if we are implementing XON/XOFF, send the start character */
1333        if (I_IXOFF(tty)) {
1334                unsigned char start_char = START_CHAR(tty);
1335                status = mos7720_write(tty, port, &start_char, 1);
1336                if (status <= 0)
1337                        return;
1338        }
1339
1340        /* if we are implementing RTS/CTS, toggle that line */
1341        if (C_CRTSCTS(tty)) {
1342                mos7720_port->shadowMCR |= UART_MCR_RTS;
1343                write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1344                              mos7720_port->shadowMCR);
1345        }
1346}
1347
1348/* FIXME: this function does not work */
1349static int set_higher_rates(struct moschip_port *mos7720_port,
1350                            unsigned int baud)
1351{
1352        struct usb_serial_port *port;
1353        struct usb_serial *serial;
1354        int port_number;
1355        enum mos_regs sp_reg;
1356        if (mos7720_port == NULL)
1357                return -EINVAL;
1358
1359        port = mos7720_port->port;
1360        serial = port->serial;
1361
1362         /***********************************************
1363         *      Init Sequence for higher rates
1364         ***********************************************/
1365        dev_dbg(&port->dev, "Sending Setting Commands ..........\n");
1366        port_number = port->port_number;
1367
1368        write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1369        write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1370        write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1371        mos7720_port->shadowMCR = 0x0b;
1372        write_mos_reg(serial, port_number, MOS7720_MCR,
1373                      mos7720_port->shadowMCR);
1374        write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x00);
1375
1376        /***********************************************
1377         *              Set for higher rates           *
1378         ***********************************************/
1379        /* writing baud rate verbatum into uart clock field clearly not right */
1380        if (port_number == 0)
1381                sp_reg = MOS7720_SP1_REG;
1382        else
1383                sp_reg = MOS7720_SP2_REG;
1384        write_mos_reg(serial, dummy, sp_reg, baud * 0x10);
1385        write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x03);
1386        mos7720_port->shadowMCR = 0x2b;
1387        write_mos_reg(serial, port_number, MOS7720_MCR,
1388                      mos7720_port->shadowMCR);
1389
1390        /***********************************************
1391         *              Set DLL/DLM
1392         ***********************************************/
1393        mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB;
1394        write_mos_reg(serial, port_number, MOS7720_LCR,
1395                      mos7720_port->shadowLCR);
1396        write_mos_reg(serial, port_number, MOS7720_DLL, 0x01);
1397        write_mos_reg(serial, port_number, MOS7720_DLM, 0x00);
1398        mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB;
1399        write_mos_reg(serial, port_number, MOS7720_LCR,
1400                      mos7720_port->shadowLCR);
1401
1402        return 0;
1403}
1404
1405/* baud rate information */
1406struct divisor_table_entry {
1407        __u32  baudrate;
1408        __u16  divisor;
1409};
1410
1411/* Define table of divisors for moschip 7720 hardware      *
1412 * These assume a 3.6864MHz crystal, the standard /16, and *
1413 * MCR.7 = 0.                                              */
1414static struct divisor_table_entry divisor_table[] = {
1415        {   50,         2304},
1416        {   110,        1047},  /* 2094.545455 => 230450   => .0217 % over */
1417        {   134,        857},   /* 1713.011152 => 230398.5 => .00065% under */
1418        {   150,        768},
1419        {   300,        384},
1420        {   600,        192},
1421        {   1200,       96},
1422        {   1800,       64},
1423        {   2400,       48},
1424        {   4800,       24},
1425        {   7200,       16},
1426        {   9600,       12},
1427        {   19200,      6},
1428        {   38400,      3},
1429        {   57600,      2},
1430        {   115200,     1},
1431};
1432
1433/*****************************************************************************
1434 * calc_baud_rate_divisor
1435 *      this function calculates the proper baud rate divisor for the specified
1436 *      baud rate.
1437 *****************************************************************************/
1438static int calc_baud_rate_divisor(struct usb_serial_port *port, int baudrate, int *divisor)
1439{
1440        int i;
1441        __u16 custom;
1442        __u16 round1;
1443        __u16 round;
1444
1445
1446        dev_dbg(&port->dev, "%s - %d\n", __func__, baudrate);
1447
1448        for (i = 0; i < ARRAY_SIZE(divisor_table); i++) {
1449                if (divisor_table[i].baudrate == baudrate) {
1450                        *divisor = divisor_table[i].divisor;
1451                        return 0;
1452                }
1453        }
1454
1455        /* After trying for all the standard baud rates    *
1456         * Try calculating the divisor for this baud rate  */
1457        if (baudrate > 75 &&  baudrate < 230400) {
1458                /* get the divisor */
1459                custom = (__u16)(230400L  / baudrate);
1460
1461                /* Check for round off */
1462                round1 = (__u16)(2304000L / baudrate);
1463                round = (__u16)(round1 - (custom * 10));
1464                if (round > 4)
1465                        custom++;
1466                *divisor = custom;
1467
1468                dev_dbg(&port->dev, "Baud %d = %d\n", baudrate, custom);
1469                return 0;
1470        }
1471
1472        dev_dbg(&port->dev, "Baud calculation Failed...\n");
1473        return -EINVAL;
1474}
1475
1476/*
1477 * send_cmd_write_baud_rate
1478 *      this function sends the proper command to change the baud rate of the
1479 *      specified port.
1480 */
1481static int send_cmd_write_baud_rate(struct moschip_port *mos7720_port,
1482                                    int baudrate)
1483{
1484        struct usb_serial_port *port;
1485        struct usb_serial *serial;
1486        int divisor;
1487        int status;
1488        unsigned char number;
1489
1490        if (mos7720_port == NULL)
1491                return -1;
1492
1493        port = mos7720_port->port;
1494        serial = port->serial;
1495
1496        number = port->port_number;
1497        dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudrate);
1498
1499        /* Calculate the Divisor */
1500        status = calc_baud_rate_divisor(port, baudrate, &divisor);
1501        if (status) {
1502                dev_err(&port->dev, "%s - bad baud rate\n", __func__);
1503                return status;
1504        }
1505
1506        /* Enable access to divisor latch */
1507        mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB;
1508        write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR);
1509
1510        /* Write the divisor */
1511        write_mos_reg(serial, number, MOS7720_DLL, (__u8)(divisor & 0xff));
1512        write_mos_reg(serial, number, MOS7720_DLM,
1513                      (__u8)((divisor & 0xff00) >> 8));
1514
1515        /* Disable access to divisor latch */
1516        mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB;
1517        write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR);
1518
1519        return status;
1520}
1521
1522/*
1523 * change_port_settings
1524 *      This routine is called to set the UART on the device to match
1525 *      the specified new settings.
1526 */
1527static void change_port_settings(struct tty_struct *tty,
1528                                 struct moschip_port *mos7720_port,
1529                                 struct ktermios *old_termios)
1530{
1531        struct usb_serial_port *port;
1532        struct usb_serial *serial;
1533        int baud;
1534        unsigned cflag;
1535        unsigned iflag;
1536        __u8 mask = 0xff;
1537        __u8 lData;
1538        __u8 lParity;
1539        __u8 lStop;
1540        int status;
1541        int port_number;
1542
1543        if (mos7720_port == NULL)
1544                return ;
1545
1546        port = mos7720_port->port;
1547        serial = port->serial;
1548        port_number = port->port_number;
1549
1550        if (!mos7720_port->open) {
1551                dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1552                return;
1553        }
1554
1555        lData = UART_LCR_WLEN8;
1556        lStop = 0x00;   /* 1 stop bit */
1557        lParity = 0x00; /* No parity */
1558
1559        cflag = tty->termios.c_cflag;
1560        iflag = tty->termios.c_iflag;
1561
1562        /* Change the number of bits */
1563        switch (cflag & CSIZE) {
1564        case CS5:
1565                lData = UART_LCR_WLEN5;
1566                mask = 0x1f;
1567                break;
1568
1569        case CS6:
1570                lData = UART_LCR_WLEN6;
1571                mask = 0x3f;
1572                break;
1573
1574        case CS7:
1575                lData = UART_LCR_WLEN7;
1576                mask = 0x7f;
1577                break;
1578        default:
1579        case CS8:
1580                lData = UART_LCR_WLEN8;
1581                break;
1582        }
1583
1584        /* Change the Parity bit */
1585        if (cflag & PARENB) {
1586                if (cflag & PARODD) {
1587                        lParity = UART_LCR_PARITY;
1588                        dev_dbg(&port->dev, "%s - parity = odd\n", __func__);
1589                } else {
1590                        lParity = (UART_LCR_EPAR | UART_LCR_PARITY);
1591                        dev_dbg(&port->dev, "%s - parity = even\n", __func__);
1592                }
1593
1594        } else {
1595                dev_dbg(&port->dev, "%s - parity = none\n", __func__);
1596        }
1597
1598        if (cflag & CMSPAR)
1599                lParity = lParity | 0x20;
1600
1601        /* Change the Stop bit */
1602        if (cflag & CSTOPB) {
1603                lStop = UART_LCR_STOP;
1604                dev_dbg(&port->dev, "%s - stop bits = 2\n", __func__);
1605        } else {
1606                lStop = 0x00;
1607                dev_dbg(&port->dev, "%s - stop bits = 1\n", __func__);
1608        }
1609
1610#define LCR_BITS_MASK           0x03    /* Mask for bits/char field */
1611#define LCR_STOP_MASK           0x04    /* Mask for stop bits field */
1612#define LCR_PAR_MASK            0x38    /* Mask for parity field */
1613
1614        /* Update the LCR with the correct value */
1615        mos7720_port->shadowLCR &=
1616                ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK);
1617        mos7720_port->shadowLCR |= (lData | lParity | lStop);
1618
1619
1620        /* Disable Interrupts */
1621        write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1622        write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1623        write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1624
1625        /* Send the updated LCR value to the mos7720 */
1626        write_mos_reg(serial, port_number, MOS7720_LCR,
1627                      mos7720_port->shadowLCR);
1628        mos7720_port->shadowMCR = 0x0b;
1629        write_mos_reg(serial, port_number, MOS7720_MCR,
1630                      mos7720_port->shadowMCR);
1631
1632        /* set up the MCR register and send it to the mos7720 */
1633        mos7720_port->shadowMCR = UART_MCR_OUT2;
1634        if (cflag & CBAUD)
1635                mos7720_port->shadowMCR |= (UART_MCR_DTR | UART_MCR_RTS);
1636
1637        if (cflag & CRTSCTS) {
1638                mos7720_port->shadowMCR |= (UART_MCR_XONANY);
1639                /* To set hardware flow control to the specified *
1640                 * serial port, in SP1/2_CONTROL_REG             */
1641                if (port_number)
1642                        write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG,
1643                                      0x01);
1644                else
1645                        write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG,
1646                                      0x02);
1647
1648        } else
1649                mos7720_port->shadowMCR &= ~(UART_MCR_XONANY);
1650
1651        write_mos_reg(serial, port_number, MOS7720_MCR,
1652                      mos7720_port->shadowMCR);
1653
1654        /* Determine divisor based on baud rate */
1655        baud = tty_get_baud_rate(tty);
1656        if (!baud) {
1657                /* pick a default, any default... */
1658                dev_dbg(&port->dev, "Picked default baud...\n");
1659                baud = 9600;
1660        }
1661
1662        if (baud >= 230400) {
1663                set_higher_rates(mos7720_port, baud);
1664                /* Enable Interrupts */
1665                write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1666                return;
1667        }
1668
1669        dev_dbg(&port->dev, "%s - baud rate = %d\n", __func__, baud);
1670        status = send_cmd_write_baud_rate(mos7720_port, baud);
1671        /* FIXME: needs to write actual resulting baud back not just
1672           blindly do so */
1673        if (cflag & CBAUD)
1674                tty_encode_baud_rate(tty, baud, baud);
1675        /* Enable Interrupts */
1676        write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1677
1678        if (port->read_urb->status != -EINPROGRESS) {
1679                status = usb_submit_urb(port->read_urb, GFP_KERNEL);
1680                if (status)
1681                        dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status);
1682        }
1683}
1684
1685/*
1686 * mos7720_set_termios
1687 *      this function is called by the tty driver when it wants to change the
1688 *      termios structure.
1689 */
1690static void mos7720_set_termios(struct tty_struct *tty,
1691                struct usb_serial_port *port, struct ktermios *old_termios)
1692{
1693        int status;
1694        unsigned int cflag;
1695        struct usb_serial *serial;
1696        struct moschip_port *mos7720_port;
1697
1698        serial = port->serial;
1699
1700        mos7720_port = usb_get_serial_port_data(port);
1701
1702        if (mos7720_port == NULL)
1703                return;
1704
1705        if (!mos7720_port->open) {
1706                dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1707                return;
1708        }
1709
1710        dev_dbg(&port->dev, "setting termios - ASPIRE\n");
1711
1712        cflag = tty->termios.c_cflag;
1713
1714        dev_dbg(&port->dev, "%s - cflag %08x iflag %08x\n", __func__,
1715                tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag));
1716
1717        dev_dbg(&port->dev, "%s - old cflag %08x old iflag %08x\n", __func__,
1718                old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag));
1719
1720        /* change the port settings to the new ones specified */
1721        change_port_settings(tty, mos7720_port, old_termios);
1722
1723        if (port->read_urb->status != -EINPROGRESS) {
1724                status = usb_submit_urb(port->read_urb, GFP_KERNEL);
1725                if (status)
1726                        dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status);
1727        }
1728}
1729
1730/*
1731 * get_lsr_info - get line status register info
1732 *
1733 * Purpose: Let user call ioctl() to get info when the UART physically
1734 *          is emptied.  On bus types like RS485, the transmitter must
1735 *          release the bus after transmitting. This must be done when
1736 *          the transmit shift register is empty, not be done when the
1737 *          transmit holding register is empty.  This functionality
1738 *          allows an RS485 driver to be written in user space.
1739 */
1740static int get_lsr_info(struct tty_struct *tty,
1741                struct moschip_port *mos7720_port, unsigned int __user *value)
1742{
1743        struct usb_serial_port *port = tty->driver_data;
1744        unsigned int result = 0;
1745        unsigned char data = 0;
1746        int port_number = port->port_number;
1747        int count;
1748
1749        count = mos7720_chars_in_buffer(tty);
1750        if (count == 0) {
1751                read_mos_reg(port->serial, port_number, MOS7720_LSR, &data);
1752                if ((data & (UART_LSR_TEMT | UART_LSR_THRE))
1753                                        == (UART_LSR_TEMT | UART_LSR_THRE)) {
1754                        dev_dbg(&port->dev, "%s -- Empty\n", __func__);
1755                        result = TIOCSER_TEMT;
1756                }
1757        }
1758        if (copy_to_user(value, &result, sizeof(int)))
1759                return -EFAULT;
1760        return 0;
1761}
1762
1763static int mos7720_tiocmget(struct tty_struct *tty)
1764{
1765        struct usb_serial_port *port = tty->driver_data;
1766        struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1767        unsigned int result = 0;
1768        unsigned int mcr ;
1769        unsigned int msr ;
1770
1771        mcr = mos7720_port->shadowMCR;
1772        msr = mos7720_port->shadowMSR;
1773
1774        result = ((mcr & UART_MCR_DTR)  ? TIOCM_DTR : 0)   /* 0x002 */
1775          | ((mcr & UART_MCR_RTS)   ? TIOCM_RTS : 0)   /* 0x004 */
1776          | ((msr & UART_MSR_CTS)   ? TIOCM_CTS : 0)   /* 0x020 */
1777          | ((msr & UART_MSR_DCD)   ? TIOCM_CAR : 0)   /* 0x040 */
1778          | ((msr & UART_MSR_RI)    ? TIOCM_RI :  0)   /* 0x080 */
1779          | ((msr & UART_MSR_DSR)   ? TIOCM_DSR : 0);  /* 0x100 */
1780
1781        return result;
1782}
1783
1784static int mos7720_tiocmset(struct tty_struct *tty,
1785                            unsigned int set, unsigned int clear)
1786{
1787        struct usb_serial_port *port = tty->driver_data;
1788        struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1789        unsigned int mcr ;
1790
1791        mcr = mos7720_port->shadowMCR;
1792
1793        if (set & TIOCM_RTS)
1794                mcr |= UART_MCR_RTS;
1795        if (set & TIOCM_DTR)
1796                mcr |= UART_MCR_DTR;
1797        if (set & TIOCM_LOOP)
1798                mcr |= UART_MCR_LOOP;
1799
1800        if (clear & TIOCM_RTS)
1801                mcr &= ~UART_MCR_RTS;
1802        if (clear & TIOCM_DTR)
1803                mcr &= ~UART_MCR_DTR;
1804        if (clear & TIOCM_LOOP)
1805                mcr &= ~UART_MCR_LOOP;
1806
1807        mos7720_port->shadowMCR = mcr;
1808        write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1809                      mos7720_port->shadowMCR);
1810
1811        return 0;
1812}
1813
1814static int set_modem_info(struct moschip_port *mos7720_port, unsigned int cmd,
1815                          unsigned int __user *value)
1816{
1817        unsigned int mcr;
1818        unsigned int arg;
1819
1820        struct usb_serial_port *port;
1821
1822        if (mos7720_port == NULL)
1823                return -1;
1824
1825        port = (struct usb_serial_port *)mos7720_port->port;
1826        mcr = mos7720_port->shadowMCR;
1827
1828        if (copy_from_user(&arg, value, sizeof(int)))
1829                return -EFAULT;
1830
1831        switch (cmd) {
1832        case TIOCMBIS:
1833                if (arg & TIOCM_RTS)
1834                        mcr |= UART_MCR_RTS;
1835                if (arg & TIOCM_DTR)
1836                        mcr |= UART_MCR_RTS;
1837                if (arg & TIOCM_LOOP)
1838                        mcr |= UART_MCR_LOOP;
1839                break;
1840
1841        case TIOCMBIC:
1842                if (arg & TIOCM_RTS)
1843                        mcr &= ~UART_MCR_RTS;
1844                if (arg & TIOCM_DTR)
1845                        mcr &= ~UART_MCR_RTS;
1846                if (arg & TIOCM_LOOP)
1847                        mcr &= ~UART_MCR_LOOP;
1848                break;
1849
1850        }
1851
1852        mos7720_port->shadowMCR = mcr;
1853        write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1854                      mos7720_port->shadowMCR);
1855
1856        return 0;
1857}
1858
1859static int get_serial_info(struct moschip_port *mos7720_port,
1860                           struct serial_struct __user *retinfo)
1861{
1862        struct serial_struct tmp;
1863
1864        if (!retinfo)
1865                return -EFAULT;
1866
1867        memset(&tmp, 0, sizeof(tmp));
1868
1869        tmp.type                = PORT_16550A;
1870        tmp.line                = mos7720_port->port->minor;
1871        tmp.port                = mos7720_port->port->port_number;
1872        tmp.irq                 = 0;
1873        tmp.flags               = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
1874        tmp.xmit_fifo_size      = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
1875        tmp.baud_base           = 9600;
1876        tmp.close_delay         = 5*HZ;
1877        tmp.closing_wait        = 30*HZ;
1878
1879        if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1880                return -EFAULT;
1881        return 0;
1882}
1883
1884static int mos7720_ioctl(struct tty_struct *tty,
1885                         unsigned int cmd, unsigned long arg)
1886{
1887        struct usb_serial_port *port = tty->driver_data;
1888        struct moschip_port *mos7720_port;
1889
1890        mos7720_port = usb_get_serial_port_data(port);
1891        if (mos7720_port == NULL)
1892                return -ENODEV;
1893
1894        switch (cmd) {
1895        case TIOCSERGETLSR:
1896                dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
1897                return get_lsr_info(tty, mos7720_port,
1898                                        (unsigned int __user *)arg);
1899
1900        /* FIXME: These should be using the mode methods */
1901        case TIOCMBIS:
1902        case TIOCMBIC:
1903                dev_dbg(&port->dev, "%s TIOCMSET/TIOCMBIC/TIOCMSET\n", __func__);
1904                return set_modem_info(mos7720_port, cmd,
1905                                      (unsigned int __user *)arg);
1906
1907        case TIOCGSERIAL:
1908                dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__);
1909                return get_serial_info(mos7720_port,
1910                                       (struct serial_struct __user *)arg);
1911        }
1912
1913        return -ENOIOCTLCMD;
1914}
1915
1916static int mos7720_startup(struct usb_serial *serial)
1917{
1918        struct usb_device *dev;
1919        char data;
1920        u16 product;
1921        int ret_val;
1922
1923        product = le16_to_cpu(serial->dev->descriptor.idProduct);
1924        dev = serial->dev;
1925
1926        /*
1927         * The 7715 uses the first bulk in/out endpoint pair for the parallel
1928         * port, and the second for the serial port.  Because the usbserial core
1929         * assumes both pairs are serial ports, we must engage in a bit of
1930         * subterfuge and swap the pointers for ports 0 and 1 in order to make
1931         * port 0 point to the serial port.  However, both moschip devices use a
1932         * single interrupt-in endpoint for both ports (as mentioned a little
1933         * further down), and this endpoint was assigned to port 0.  So after
1934         * the swap, we must copy the interrupt endpoint elements from port 1
1935         * (as newly assigned) to port 0, and null out port 1 pointers.
1936         */
1937        if (product == MOSCHIP_DEVICE_ID_7715) {
1938                struct usb_serial_port *tmp = serial->port[0];
1939                serial->port[0] = serial->port[1];
1940                serial->port[1] = tmp;
1941                serial->port[0]->interrupt_in_urb = tmp->interrupt_in_urb;
1942                serial->port[0]->interrupt_in_buffer = tmp->interrupt_in_buffer;
1943                serial->port[0]->interrupt_in_endpointAddress =
1944                        tmp->interrupt_in_endpointAddress;
1945                serial->port[1]->interrupt_in_urb = NULL;
1946                serial->port[1]->interrupt_in_buffer = NULL;
1947        }
1948
1949        /* setting configuration feature to one */
1950        usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
1951                        (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);
1952
1953        /* start the interrupt urb */
1954        ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL);
1955        if (ret_val)
1956                dev_err(&dev->dev,
1957                        "%s - Error %d submitting control urb\n",
1958                        __func__, ret_val);
1959
1960#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
1961        if (product == MOSCHIP_DEVICE_ID_7715) {
1962                ret_val = mos7715_parport_init(serial);
1963                if (ret_val < 0)
1964                        return ret_val;
1965        }
1966#endif
1967        /* LSR For Port 1 */
1968        read_mos_reg(serial, 0, MOS7720_LSR, &data);
1969        dev_dbg(&dev->dev, "LSR:%x\n", data);
1970
1971        return 0;
1972}
1973
1974static void mos7720_release(struct usb_serial *serial)
1975{
1976#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
1977        /* close the parallel port */
1978
1979        if (le16_to_cpu(serial->dev->descriptor.idProduct)
1980            == MOSCHIP_DEVICE_ID_7715) {
1981                struct urbtracker *urbtrack;
1982                unsigned long flags;
1983                struct mos7715_parport *mos_parport =
1984                        usb_get_serial_data(serial);
1985
1986                /* prevent NULL ptr dereference in port callbacks */
1987                spin_lock(&release_lock);
1988                mos_parport->pp->private_data = NULL;
1989                spin_unlock(&release_lock);
1990
1991                /* wait for synchronous usb calls to return */
1992                if (mos_parport->msg_pending)
1993                        wait_for_completion_timeout(&mos_parport->syncmsg_compl,
1994                                            msecs_to_jiffies(MOS_WDR_TIMEOUT));
1995
1996                parport_remove_port(mos_parport->pp);
1997                usb_set_serial_data(serial, NULL);
1998                mos_parport->serial = NULL;
1999
2000                /* if tasklet currently scheduled, wait for it to complete */
2001                tasklet_kill(&mos_parport->urb_tasklet);
2002
2003                /* unlink any urbs sent by the tasklet  */
2004                spin_lock_irqsave(&mos_parport->listlock, flags);
2005                list_for_each_entry(urbtrack,
2006                                    &mos_parport->active_urbs,
2007                                    urblist_entry)
2008                        usb_unlink_urb(urbtrack->urb);
2009                spin_unlock_irqrestore(&mos_parport->listlock, flags);
2010                parport_del_port(mos_parport->pp);
2011
2012                kref_put(&mos_parport->ref_count, destroy_mos_parport);
2013        }
2014#endif
2015}
2016
2017static int mos7720_port_probe(struct usb_serial_port *port)
2018{
2019        struct moschip_port *mos7720_port;
2020
2021        mos7720_port = kzalloc(sizeof(*mos7720_port), GFP_KERNEL);
2022        if (!mos7720_port)
2023                return -ENOMEM;
2024
2025        /* Initialize all port interrupt end point to port 0 int endpoint.
2026         * Our device has only one interrupt endpoint common to all ports.
2027         */
2028        port->interrupt_in_endpointAddress =
2029                port->serial->port[0]->interrupt_in_endpointAddress;
2030        mos7720_port->port = port;
2031
2032        usb_set_serial_port_data(port, mos7720_port);
2033
2034        return 0;
2035}
2036
2037static int mos7720_port_remove(struct usb_serial_port *port)
2038{
2039        struct moschip_port *mos7720_port;
2040
2041        mos7720_port = usb_get_serial_port_data(port);
2042        kfree(mos7720_port);
2043
2044        return 0;
2045}
2046
2047static struct usb_serial_driver moschip7720_2port_driver = {
2048        .driver = {
2049                .owner =        THIS_MODULE,
2050                .name =         "moschip7720",
2051        },
2052        .description            = "Moschip 2 port adapter",
2053        .id_table               = id_table,
2054        .calc_num_ports         = mos77xx_calc_num_ports,
2055        .open                   = mos7720_open,
2056        .close                  = mos7720_close,
2057        .throttle               = mos7720_throttle,
2058        .unthrottle             = mos7720_unthrottle,
2059        .probe                  = mos77xx_probe,
2060        .attach                 = mos7720_startup,
2061        .release                = mos7720_release,
2062        .port_probe             = mos7720_port_probe,
2063        .port_remove            = mos7720_port_remove,
2064        .ioctl                  = mos7720_ioctl,
2065        .tiocmget               = mos7720_tiocmget,
2066        .tiocmset               = mos7720_tiocmset,
2067        .set_termios            = mos7720_set_termios,
2068        .write                  = mos7720_write,
2069        .write_room             = mos7720_write_room,
2070        .chars_in_buffer        = mos7720_chars_in_buffer,
2071        .break_ctl              = mos7720_break,
2072        .read_bulk_callback     = mos7720_bulk_in_callback,
2073        .read_int_callback      = NULL  /* dynamically assigned in probe() */
2074};
2075
2076static struct usb_serial_driver * const serial_drivers[] = {
2077        &moschip7720_2port_driver, NULL
2078};
2079
2080module_usb_serial_driver(serial_drivers, id_table);
2081
2082MODULE_AUTHOR(DRIVER_AUTHOR);
2083MODULE_DESCRIPTION(DRIVER_DESC);
2084MODULE_LICENSE("GPL");
2085