linux/drivers/usb/serial/mos7840.c
<<
>>
Prefs
   1/*
   2 * This program is free software; you can redistribute it and/or modify
   3 * it under the terms of the GNU General Public License as published by
   4 * the Free Software Foundation; either version 2 of the License, or
   5 * (at your option) any later version.
   6 *
   7 * This program is distributed in the hope that it will be useful,
   8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
   9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10 * GNU General Public License for more details.
  11 *
  12 * You should have received a copy of the GNU General Public License
  13 * along with this program; if not, write to the Free Software
  14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15 *
  16 * Clean ups from Moschip version and a few ioctl implementations by:
  17 *      Paul B Schroeder <pschroeder "at" uplogix "dot" com>
  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 */
  24
  25#include <linux/kernel.h>
  26#include <linux/errno.h>
  27#include <linux/slab.h>
  28#include <linux/tty.h>
  29#include <linux/tty_driver.h>
  30#include <linux/tty_flip.h>
  31#include <linux/module.h>
  32#include <linux/serial.h>
  33#include <linux/usb.h>
  34#include <linux/usb/serial.h>
  35#include <linux/uaccess.h>
  36
  37#define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver"
  38
  39/*
  40 * 16C50 UART register defines
  41 */
  42
  43#define LCR_BITS_5             0x00     /* 5 bits/char */
  44#define LCR_BITS_6             0x01     /* 6 bits/char */
  45#define LCR_BITS_7             0x02     /* 7 bits/char */
  46#define LCR_BITS_8             0x03     /* 8 bits/char */
  47#define LCR_BITS_MASK          0x03     /* Mask for bits/char field */
  48
  49#define LCR_STOP_1             0x00     /* 1 stop bit */
  50#define LCR_STOP_1_5           0x04     /* 1.5 stop bits (if 5   bits/char) */
  51#define LCR_STOP_2             0x04     /* 2 stop bits   (if 6-8 bits/char) */
  52#define LCR_STOP_MASK          0x04     /* Mask for stop bits field */
  53
  54#define LCR_PAR_NONE           0x00     /* No parity */
  55#define LCR_PAR_ODD            0x08     /* Odd parity */
  56#define LCR_PAR_EVEN           0x18     /* Even parity */
  57#define LCR_PAR_MARK           0x28     /* Force parity bit to 1 */
  58#define LCR_PAR_SPACE          0x38     /* Force parity bit to 0 */
  59#define LCR_PAR_MASK           0x38     /* Mask for parity field */
  60
  61#define LCR_SET_BREAK          0x40     /* Set Break condition */
  62#define LCR_DL_ENABLE          0x80     /* Enable access to divisor latch */
  63
  64#define MCR_DTR                0x01     /* Assert DTR */
  65#define MCR_RTS                0x02     /* Assert RTS */
  66#define MCR_OUT1               0x04     /* Loopback only: Sets state of RI */
  67#define MCR_MASTER_IE          0x08     /* Enable interrupt outputs */
  68#define MCR_LOOPBACK           0x10     /* Set internal (digital) loopback mode */
  69#define MCR_XON_ANY            0x20     /* Enable any char to exit XOFF mode */
  70
  71#define MOS7840_MSR_CTS        0x10     /* Current state of CTS */
  72#define MOS7840_MSR_DSR        0x20     /* Current state of DSR */
  73#define MOS7840_MSR_RI         0x40     /* Current state of RI */
  74#define MOS7840_MSR_CD         0x80     /* Current state of CD */
  75
  76/*
  77 * Defines used for sending commands to port
  78 */
  79
  80#define MOS_WDR_TIMEOUT         5000    /* default urb timeout */
  81
  82#define MOS_PORT1       0x0200
  83#define MOS_PORT2       0x0300
  84#define MOS_VENREG      0x0000
  85#define MOS_MAX_PORT    0x02
  86#define MOS_WRITE       0x0E
  87#define MOS_READ        0x0D
  88
  89/* Requests */
  90#define MCS_RD_RTYPE    0xC0
  91#define MCS_WR_RTYPE    0x40
  92#define MCS_RDREQ       0x0D
  93#define MCS_WRREQ       0x0E
  94#define MCS_CTRL_TIMEOUT        500
  95#define VENDOR_READ_LENGTH      (0x01)
  96
  97#define MAX_NAME_LEN    64
  98
  99#define ZLP_REG1  0x3A          /* Zero_Flag_Reg1    58 */
 100#define ZLP_REG5  0x3E          /* Zero_Flag_Reg5    62 */
 101
 102/* For higher baud Rates use TIOCEXBAUD */
 103#define TIOCEXBAUD     0x5462
 104
 105/* vendor id and device id defines */
 106
 107/* The native mos7840/7820 component */
 108#define USB_VENDOR_ID_MOSCHIP           0x9710
 109#define MOSCHIP_DEVICE_ID_7840          0x7840
 110#define MOSCHIP_DEVICE_ID_7820          0x7820
 111#define MOSCHIP_DEVICE_ID_7810          0x7810
 112/* The native component can have its vendor/device id's overridden
 113 * in vendor-specific implementations.  Such devices can be handled
 114 * by making a change here, in id_table.
 115 */
 116#define USB_VENDOR_ID_BANDB              0x0856
 117#define BANDB_DEVICE_ID_USO9ML2_2        0xAC22
 118#define BANDB_DEVICE_ID_USO9ML2_2P       0xBC00
 119#define BANDB_DEVICE_ID_USO9ML2_4        0xAC24
 120#define BANDB_DEVICE_ID_USO9ML2_4P       0xBC01
 121#define BANDB_DEVICE_ID_US9ML2_2         0xAC29
 122#define BANDB_DEVICE_ID_US9ML2_4         0xAC30
 123#define BANDB_DEVICE_ID_USPTL4_2         0xAC31
 124#define BANDB_DEVICE_ID_USPTL4_4         0xAC32
 125#define BANDB_DEVICE_ID_USOPTL4_2        0xAC42
 126#define BANDB_DEVICE_ID_USOPTL4_2P       0xBC02
 127#define BANDB_DEVICE_ID_USOPTL4_4        0xAC44
 128#define BANDB_DEVICE_ID_USOPTL4_4P       0xBC03
 129#define BANDB_DEVICE_ID_USOPTL2_4        0xAC24
 130
 131/* This driver also supports
 132 * ATEN UC2324 device using Moschip MCS7840
 133 * ATEN UC2322 device using Moschip MCS7820
 134 */
 135#define USB_VENDOR_ID_ATENINTL          0x0557
 136#define ATENINTL_DEVICE_ID_UC2324       0x2011
 137#define ATENINTL_DEVICE_ID_UC2322       0x7820
 138
 139/* Interrupt Routine Defines    */
 140
 141#define SERIAL_IIR_RLS      0x06
 142#define SERIAL_IIR_MS       0x00
 143
 144/*
 145 *  Emulation of the bit mask on the LINE STATUS REGISTER.
 146 */
 147#define SERIAL_LSR_DR       0x0001
 148#define SERIAL_LSR_OE       0x0002
 149#define SERIAL_LSR_PE       0x0004
 150#define SERIAL_LSR_FE       0x0008
 151#define SERIAL_LSR_BI       0x0010
 152
 153#define MOS_MSR_DELTA_CTS   0x10
 154#define MOS_MSR_DELTA_DSR   0x20
 155#define MOS_MSR_DELTA_RI    0x40
 156#define MOS_MSR_DELTA_CD    0x80
 157
 158/* Serial Port register Address */
 159#define INTERRUPT_ENABLE_REGISTER  ((__u16)(0x01))
 160#define FIFO_CONTROL_REGISTER      ((__u16)(0x02))
 161#define LINE_CONTROL_REGISTER      ((__u16)(0x03))
 162#define MODEM_CONTROL_REGISTER     ((__u16)(0x04))
 163#define LINE_STATUS_REGISTER       ((__u16)(0x05))
 164#define MODEM_STATUS_REGISTER      ((__u16)(0x06))
 165#define SCRATCH_PAD_REGISTER       ((__u16)(0x07))
 166#define DIVISOR_LATCH_LSB          ((__u16)(0x00))
 167#define DIVISOR_LATCH_MSB          ((__u16)(0x01))
 168
 169#define CLK_MULTI_REGISTER         ((__u16)(0x02))
 170#define CLK_START_VALUE_REGISTER   ((__u16)(0x03))
 171#define GPIO_REGISTER              ((__u16)(0x07))
 172
 173#define SERIAL_LCR_DLAB            ((__u16)(0x0080))
 174
 175/*
 176 * URB POOL related defines
 177 */
 178#define NUM_URBS                        16      /* URB Count */
 179#define URB_TRANSFER_BUFFER_SIZE        32      /* URB Size  */
 180
 181/* LED on/off milliseconds*/
 182#define LED_ON_MS       500
 183#define LED_OFF_MS      500
 184
 185enum mos7840_flag {
 186        MOS7840_FLAG_CTRL_BUSY,
 187        MOS7840_FLAG_LED_BUSY,
 188};
 189
 190static const struct usb_device_id id_table[] = {
 191        {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)},
 192        {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)},
 193        {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7810)},
 194        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2)},
 195        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2P)},
 196        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4)},
 197        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4P)},
 198        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_2)},
 199        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_4)},
 200        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_2)},
 201        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4)},
 202        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)},
 203        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P)},
 204        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)},
 205        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P)},
 206        {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)},
 207        {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)},
 208        {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)},
 209        {}                      /* terminating entry */
 210};
 211MODULE_DEVICE_TABLE(usb, id_table);
 212
 213/* This structure holds all of the local port information */
 214
 215struct moschip_port {
 216        int port_num;           /*Actual port number in the device(1,2,etc) */
 217        struct urb *read_urb;   /* read URB for this port */
 218        __u8 shadowLCR;         /* last LCR value received */
 219        __u8 shadowMCR;         /* last MCR value received */
 220        char open;
 221        char open_ports;
 222        struct usb_serial_port *port;   /* loop back to the owner of this object */
 223
 224        /* Offsets */
 225        __u8 SpRegOffset;
 226        __u8 ControlRegOffset;
 227        __u8 DcrRegOffset;
 228        /* for processing control URBS in interrupt context */
 229        struct urb *control_urb;
 230        struct usb_ctrlrequest *dr;
 231        char *ctrl_buf;
 232        int MsrLsr;
 233
 234        spinlock_t pool_lock;
 235        struct urb *write_urb_pool[NUM_URBS];
 236        char busy[NUM_URBS];
 237        bool read_urb_busy;
 238
 239        /* For device(s) with LED indicator */
 240        bool has_led;
 241        struct timer_list led_timer1;   /* Timer for LED on */
 242        struct timer_list led_timer2;   /* Timer for LED off */
 243        struct urb *led_urb;
 244        struct usb_ctrlrequest *led_dr;
 245
 246        unsigned long flags;
 247};
 248
 249/*
 250 * mos7840_set_reg_sync
 251 *      To set the Control register by calling usb_fill_control_urb function
 252 *      by passing usb_sndctrlpipe function as parameter.
 253 */
 254
 255static int mos7840_set_reg_sync(struct usb_serial_port *port, __u16 reg,
 256                                __u16 val)
 257{
 258        struct usb_device *dev = port->serial->dev;
 259        val = val & 0x00ff;
 260        dev_dbg(&port->dev, "mos7840_set_reg_sync offset is %x, value %x\n", reg, val);
 261
 262        return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ,
 263                               MCS_WR_RTYPE, val, reg, NULL, 0,
 264                               MOS_WDR_TIMEOUT);
 265}
 266
 267/*
 268 * mos7840_get_reg_sync
 269 *      To set the Uart register by calling usb_fill_control_urb function by
 270 *      passing usb_rcvctrlpipe function as parameter.
 271 */
 272
 273static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg,
 274                                __u16 *val)
 275{
 276        struct usb_device *dev = port->serial->dev;
 277        int ret = 0;
 278        u8 *buf;
 279
 280        buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
 281        if (!buf)
 282                return -ENOMEM;
 283
 284        ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
 285                              MCS_RD_RTYPE, 0, reg, buf, VENDOR_READ_LENGTH,
 286                              MOS_WDR_TIMEOUT);
 287        if (ret < VENDOR_READ_LENGTH) {
 288                if (ret >= 0)
 289                        ret = -EIO;
 290                goto out;
 291        }
 292
 293        *val = buf[0];
 294        dev_dbg(&port->dev, "%s offset is %x, return val %x\n", __func__, reg, *val);
 295out:
 296        kfree(buf);
 297        return ret;
 298}
 299
 300/*
 301 * mos7840_set_uart_reg
 302 *      To set the Uart register by calling usb_fill_control_urb function by
 303 *      passing usb_sndctrlpipe function as parameter.
 304 */
 305
 306static int mos7840_set_uart_reg(struct usb_serial_port *port, __u16 reg,
 307                                __u16 val)
 308{
 309
 310        struct usb_device *dev = port->serial->dev;
 311        val = val & 0x00ff;
 312        /* For the UART control registers, the application number need
 313           to be Or'ed */
 314        if (port->serial->num_ports == 4) {
 315                val |= ((__u16)port->port_number + 1) << 8;
 316        } else {
 317                if (port->port_number == 0) {
 318                        val |= ((__u16)port->port_number + 1) << 8;
 319                } else {
 320                        val |= ((__u16)port->port_number + 2) << 8;
 321                }
 322        }
 323        dev_dbg(&port->dev, "%s application number is %x\n", __func__, val);
 324        return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ,
 325                               MCS_WR_RTYPE, val, reg, NULL, 0,
 326                               MOS_WDR_TIMEOUT);
 327
 328}
 329
 330/*
 331 * mos7840_get_uart_reg
 332 *      To set the Control register by calling usb_fill_control_urb function
 333 *      by passing usb_rcvctrlpipe function as parameter.
 334 */
 335static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
 336                                __u16 *val)
 337{
 338        struct usb_device *dev = port->serial->dev;
 339        int ret = 0;
 340        __u16 Wval;
 341        u8 *buf;
 342
 343        buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
 344        if (!buf)
 345                return -ENOMEM;
 346
 347        /* Wval  is same as application number */
 348        if (port->serial->num_ports == 4) {
 349                Wval = ((__u16)port->port_number + 1) << 8;
 350        } else {
 351                if (port->port_number == 0) {
 352                        Wval = ((__u16)port->port_number + 1) << 8;
 353                } else {
 354                        Wval = ((__u16)port->port_number + 2) << 8;
 355                }
 356        }
 357        dev_dbg(&port->dev, "%s application number is %x\n", __func__, Wval);
 358        ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
 359                              MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH,
 360                              MOS_WDR_TIMEOUT);
 361        if (ret < VENDOR_READ_LENGTH) {
 362                if (ret >= 0)
 363                        ret = -EIO;
 364                goto out;
 365        }
 366        *val = buf[0];
 367out:
 368        kfree(buf);
 369        return ret;
 370}
 371
 372static void mos7840_dump_serial_port(struct usb_serial_port *port,
 373                                     struct moschip_port *mos7840_port)
 374{
 375
 376        dev_dbg(&port->dev, "SpRegOffset is %2x\n", mos7840_port->SpRegOffset);
 377        dev_dbg(&port->dev, "ControlRegOffset is %2x\n", mos7840_port->ControlRegOffset);
 378        dev_dbg(&port->dev, "DCRRegOffset is %2x\n", mos7840_port->DcrRegOffset);
 379
 380}
 381
 382/************************************************************************/
 383/************************************************************************/
 384/*             I N T E R F A C E   F U N C T I O N S                    */
 385/*             I N T E R F A C E   F U N C T I O N S                    */
 386/************************************************************************/
 387/************************************************************************/
 388
 389static inline void mos7840_set_port_private(struct usb_serial_port *port,
 390                                            struct moschip_port *data)
 391{
 392        usb_set_serial_port_data(port, (void *)data);
 393}
 394
 395static inline struct moschip_port *mos7840_get_port_private(struct
 396                                                            usb_serial_port
 397                                                            *port)
 398{
 399        return (struct moschip_port *)usb_get_serial_port_data(port);
 400}
 401
 402static void mos7840_handle_new_msr(struct moschip_port *port, __u8 new_msr)
 403{
 404        struct moschip_port *mos7840_port;
 405        struct async_icount *icount;
 406        mos7840_port = port;
 407        if (new_msr &
 408            (MOS_MSR_DELTA_CTS | MOS_MSR_DELTA_DSR | MOS_MSR_DELTA_RI |
 409             MOS_MSR_DELTA_CD)) {
 410                icount = &mos7840_port->port->icount;
 411
 412                /* update input line counters */
 413                if (new_msr & MOS_MSR_DELTA_CTS)
 414                        icount->cts++;
 415                if (new_msr & MOS_MSR_DELTA_DSR)
 416                        icount->dsr++;
 417                if (new_msr & MOS_MSR_DELTA_CD)
 418                        icount->dcd++;
 419                if (new_msr & MOS_MSR_DELTA_RI)
 420                        icount->rng++;
 421
 422                wake_up_interruptible(&port->port->port.delta_msr_wait);
 423        }
 424}
 425
 426static void mos7840_handle_new_lsr(struct moschip_port *port, __u8 new_lsr)
 427{
 428        struct async_icount *icount;
 429
 430        if (new_lsr & SERIAL_LSR_BI) {
 431                /*
 432                 * Parity and Framing errors only count if they
 433                 * occur exclusive of a break being
 434                 * received.
 435                 */
 436                new_lsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI);
 437        }
 438
 439        /* update input line counters */
 440        icount = &port->port->icount;
 441        if (new_lsr & SERIAL_LSR_BI)
 442                icount->brk++;
 443        if (new_lsr & SERIAL_LSR_OE)
 444                icount->overrun++;
 445        if (new_lsr & SERIAL_LSR_PE)
 446                icount->parity++;
 447        if (new_lsr & SERIAL_LSR_FE)
 448                icount->frame++;
 449}
 450
 451/************************************************************************/
 452/************************************************************************/
 453/*            U S B  C A L L B A C K   F U N C T I O N S                */
 454/*            U S B  C A L L B A C K   F U N C T I O N S                */
 455/************************************************************************/
 456/************************************************************************/
 457
 458static void mos7840_control_callback(struct urb *urb)
 459{
 460        unsigned char *data;
 461        struct moschip_port *mos7840_port;
 462        struct device *dev = &urb->dev->dev;
 463        __u8 regval = 0x0;
 464        int status = urb->status;
 465
 466        mos7840_port = urb->context;
 467
 468        switch (status) {
 469        case 0:
 470                /* success */
 471                break;
 472        case -ECONNRESET:
 473        case -ENOENT:
 474        case -ESHUTDOWN:
 475                /* this urb is terminated, clean up */
 476                dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
 477                goto out;
 478        default:
 479                dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
 480                goto out;
 481        }
 482
 483        dev_dbg(dev, "%s urb buffer size is %d\n", __func__, urb->actual_length);
 484        dev_dbg(dev, "%s mos7840_port->MsrLsr is %d port %d\n", __func__,
 485                mos7840_port->MsrLsr, mos7840_port->port_num);
 486        data = urb->transfer_buffer;
 487        regval = (__u8) data[0];
 488        dev_dbg(dev, "%s data is %x\n", __func__, regval);
 489        if (mos7840_port->MsrLsr == 0)
 490                mos7840_handle_new_msr(mos7840_port, regval);
 491        else if (mos7840_port->MsrLsr == 1)
 492                mos7840_handle_new_lsr(mos7840_port, regval);
 493out:
 494        clear_bit_unlock(MOS7840_FLAG_CTRL_BUSY, &mos7840_port->flags);
 495}
 496
 497static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg,
 498                           __u16 *val)
 499{
 500        struct usb_device *dev = mcs->port->serial->dev;
 501        struct usb_ctrlrequest *dr = mcs->dr;
 502        unsigned char *buffer = mcs->ctrl_buf;
 503        int ret;
 504
 505        if (test_and_set_bit_lock(MOS7840_FLAG_CTRL_BUSY, &mcs->flags))
 506                return -EBUSY;
 507
 508        dr->bRequestType = MCS_RD_RTYPE;
 509        dr->bRequest = MCS_RDREQ;
 510        dr->wValue = cpu_to_le16(Wval); /* 0 */
 511        dr->wIndex = cpu_to_le16(reg);
 512        dr->wLength = cpu_to_le16(2);
 513
 514        usb_fill_control_urb(mcs->control_urb, dev, usb_rcvctrlpipe(dev, 0),
 515                             (unsigned char *)dr, buffer, 2,
 516                             mos7840_control_callback, mcs);
 517        mcs->control_urb->transfer_buffer_length = 2;
 518        ret = usb_submit_urb(mcs->control_urb, GFP_ATOMIC);
 519        if (ret)
 520                clear_bit_unlock(MOS7840_FLAG_CTRL_BUSY, &mcs->flags);
 521
 522        return ret;
 523}
 524
 525static void mos7840_set_led_callback(struct urb *urb)
 526{
 527        switch (urb->status) {
 528        case 0:
 529                /* Success */
 530                break;
 531        case -ECONNRESET:
 532        case -ENOENT:
 533        case -ESHUTDOWN:
 534                /* This urb is terminated, clean up */
 535                dev_dbg(&urb->dev->dev, "%s - urb shutting down: %d\n",
 536                        __func__, urb->status);
 537                break;
 538        default:
 539                dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n",
 540                        __func__, urb->status);
 541        }
 542}
 543
 544static void mos7840_set_led_async(struct moschip_port *mcs, __u16 wval,
 545                                __u16 reg)
 546{
 547        struct usb_device *dev = mcs->port->serial->dev;
 548        struct usb_ctrlrequest *dr = mcs->led_dr;
 549
 550        dr->bRequestType = MCS_WR_RTYPE;
 551        dr->bRequest = MCS_WRREQ;
 552        dr->wValue = cpu_to_le16(wval);
 553        dr->wIndex = cpu_to_le16(reg);
 554        dr->wLength = cpu_to_le16(0);
 555
 556        usb_fill_control_urb(mcs->led_urb, dev, usb_sndctrlpipe(dev, 0),
 557                (unsigned char *)dr, NULL, 0, mos7840_set_led_callback, NULL);
 558
 559        usb_submit_urb(mcs->led_urb, GFP_ATOMIC);
 560}
 561
 562static void mos7840_set_led_sync(struct usb_serial_port *port, __u16 reg,
 563                                __u16 val)
 564{
 565        struct usb_device *dev = port->serial->dev;
 566
 567        usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ, MCS_WR_RTYPE,
 568                        val, reg, NULL, 0, MOS_WDR_TIMEOUT);
 569}
 570
 571static void mos7840_led_off(unsigned long arg)
 572{
 573        struct moschip_port *mcs = (struct moschip_port *) arg;
 574
 575        /* Turn off LED */
 576        mos7840_set_led_async(mcs, 0x0300, MODEM_CONTROL_REGISTER);
 577        mod_timer(&mcs->led_timer2,
 578                                jiffies + msecs_to_jiffies(LED_OFF_MS));
 579}
 580
 581static void mos7840_led_flag_off(unsigned long arg)
 582{
 583        struct moschip_port *mcs = (struct moschip_port *) arg;
 584
 585        clear_bit_unlock(MOS7840_FLAG_LED_BUSY, &mcs->flags);
 586}
 587
 588static void mos7840_led_activity(struct usb_serial_port *port)
 589{
 590        struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
 591
 592        if (test_and_set_bit_lock(MOS7840_FLAG_LED_BUSY, &mos7840_port->flags))
 593                return;
 594
 595        mos7840_set_led_async(mos7840_port, 0x0301, MODEM_CONTROL_REGISTER);
 596        mod_timer(&mos7840_port->led_timer1,
 597                                jiffies + msecs_to_jiffies(LED_ON_MS));
 598}
 599
 600/*****************************************************************************
 601 * mos7840_interrupt_callback
 602 *      this is the callback function for when we have received data on the
 603 *      interrupt endpoint.
 604 *****************************************************************************/
 605
 606static void mos7840_interrupt_callback(struct urb *urb)
 607{
 608        int result;
 609        int length;
 610        struct moschip_port *mos7840_port;
 611        struct usb_serial *serial;
 612        __u16 Data;
 613        unsigned char *data;
 614        __u8 sp[5], st;
 615        int i, rv = 0;
 616        __u16 wval, wreg = 0;
 617        int status = urb->status;
 618
 619        switch (status) {
 620        case 0:
 621                /* success */
 622                break;
 623        case -ECONNRESET:
 624        case -ENOENT:
 625        case -ESHUTDOWN:
 626                /* this urb is terminated, clean up */
 627                dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n",
 628                        __func__, status);
 629                return;
 630        default:
 631                dev_dbg(&urb->dev->dev, "%s - nonzero urb status received: %d\n",
 632                        __func__, status);
 633                goto exit;
 634        }
 635
 636        length = urb->actual_length;
 637        data = urb->transfer_buffer;
 638
 639        serial = urb->context;
 640
 641        /* Moschip get 5 bytes
 642         * Byte 1 IIR Port 1 (port.number is 0)
 643         * Byte 2 IIR Port 2 (port.number is 1)
 644         * Byte 3 IIR Port 3 (port.number is 2)
 645         * Byte 4 IIR Port 4 (port.number is 3)
 646         * Byte 5 FIFO status for both */
 647
 648        if (length > 5) {
 649                dev_dbg(&urb->dev->dev, "%s", "Wrong data !!!\n");
 650                return;
 651        }
 652
 653        sp[0] = (__u8) data[0];
 654        sp[1] = (__u8) data[1];
 655        sp[2] = (__u8) data[2];
 656        sp[3] = (__u8) data[3];
 657        st = (__u8) data[4];
 658
 659        for (i = 0; i < serial->num_ports; i++) {
 660                mos7840_port = mos7840_get_port_private(serial->port[i]);
 661                wval = ((__u16)serial->port[i]->port_number + 1) << 8;
 662                if (mos7840_port->open) {
 663                        if (sp[i] & 0x01) {
 664                                dev_dbg(&urb->dev->dev, "SP%d No Interrupt !!!\n", i);
 665                        } else {
 666                                switch (sp[i] & 0x0f) {
 667                                case SERIAL_IIR_RLS:
 668                                        dev_dbg(&urb->dev->dev, "Serial Port %d: Receiver status error or \n", i);
 669                                        dev_dbg(&urb->dev->dev, "address bit detected in 9-bit mode\n");
 670                                        mos7840_port->MsrLsr = 1;
 671                                        wreg = LINE_STATUS_REGISTER;
 672                                        break;
 673                                case SERIAL_IIR_MS:
 674                                        dev_dbg(&urb->dev->dev, "Serial Port %d: Modem status change\n", i);
 675                                        mos7840_port->MsrLsr = 0;
 676                                        wreg = MODEM_STATUS_REGISTER;
 677                                        break;
 678                                }
 679                                rv = mos7840_get_reg(mos7840_port, wval, wreg, &Data);
 680                        }
 681                }
 682        }
 683        if (!(rv < 0))
 684                /* the completion handler for the control urb will resubmit */
 685                return;
 686exit:
 687        result = usb_submit_urb(urb, GFP_ATOMIC);
 688        if (result) {
 689                dev_err(&urb->dev->dev,
 690                        "%s - Error %d submitting interrupt urb\n",
 691                        __func__, result);
 692        }
 693}
 694
 695static int mos7840_port_paranoia_check(struct usb_serial_port *port,
 696                                       const char *function)
 697{
 698        if (!port) {
 699                pr_debug("%s - port == NULL\n", function);
 700                return -1;
 701        }
 702        if (!port->serial) {
 703                pr_debug("%s - port->serial == NULL\n", function);
 704                return -1;
 705        }
 706
 707        return 0;
 708}
 709
 710/* Inline functions to check the sanity of a pointer that is passed to us */
 711static int mos7840_serial_paranoia_check(struct usb_serial *serial,
 712                                         const char *function)
 713{
 714        if (!serial) {
 715                pr_debug("%s - serial == NULL\n", function);
 716                return -1;
 717        }
 718        if (!serial->type) {
 719                pr_debug("%s - serial->type == NULL!\n", function);
 720                return -1;
 721        }
 722
 723        return 0;
 724}
 725
 726static struct usb_serial *mos7840_get_usb_serial(struct usb_serial_port *port,
 727                                                 const char *function)
 728{
 729        /* if no port was specified, or it fails a paranoia check */
 730        if (!port ||
 731            mos7840_port_paranoia_check(port, function) ||
 732            mos7840_serial_paranoia_check(port->serial, function)) {
 733                /* then say that we don't have a valid usb_serial thing,
 734                 * which will end up genrating -ENODEV return values */
 735                return NULL;
 736        }
 737
 738        return port->serial;
 739}
 740
 741/*****************************************************************************
 742 * mos7840_bulk_in_callback
 743 *      this is the callback function for when we have received data on the
 744 *      bulk in endpoint.
 745 *****************************************************************************/
 746
 747static void mos7840_bulk_in_callback(struct urb *urb)
 748{
 749        int retval;
 750        unsigned char *data;
 751        struct usb_serial *serial;
 752        struct usb_serial_port *port;
 753        struct moschip_port *mos7840_port;
 754        int status = urb->status;
 755
 756        mos7840_port = urb->context;
 757        if (!mos7840_port)
 758                return;
 759
 760        if (status) {
 761                dev_dbg(&urb->dev->dev, "nonzero read bulk status received: %d\n", status);
 762                mos7840_port->read_urb_busy = false;
 763                return;
 764        }
 765
 766        port = mos7840_port->port;
 767        if (mos7840_port_paranoia_check(port, __func__)) {
 768                mos7840_port->read_urb_busy = false;
 769                return;
 770        }
 771
 772        serial = mos7840_get_usb_serial(port, __func__);
 773        if (!serial) {
 774                mos7840_port->read_urb_busy = false;
 775                return;
 776        }
 777
 778        data = urb->transfer_buffer;
 779        usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
 780
 781        if (urb->actual_length) {
 782                struct tty_port *tport = &mos7840_port->port->port;
 783                tty_insert_flip_string(tport, data, urb->actual_length);
 784                tty_flip_buffer_push(tport);
 785                port->icount.rx += urb->actual_length;
 786                dev_dbg(&port->dev, "icount.rx is %d:\n", port->icount.rx);
 787        }
 788
 789        if (!mos7840_port->read_urb) {
 790                dev_dbg(&port->dev, "%s", "URB KILLED !!!\n");
 791                mos7840_port->read_urb_busy = false;
 792                return;
 793        }
 794
 795        if (mos7840_port->has_led)
 796                mos7840_led_activity(port);
 797
 798        mos7840_port->read_urb_busy = true;
 799        retval = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC);
 800
 801        if (retval) {
 802                dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, retval = %d\n", retval);
 803                mos7840_port->read_urb_busy = false;
 804        }
 805}
 806
 807/*****************************************************************************
 808 * mos7840_bulk_out_data_callback
 809 *      this is the callback function for when we have finished sending
 810 *      serial data on the bulk out endpoint.
 811 *****************************************************************************/
 812
 813static void mos7840_bulk_out_data_callback(struct urb *urb)
 814{
 815        struct moschip_port *mos7840_port;
 816        struct usb_serial_port *port;
 817        int status = urb->status;
 818        int i;
 819
 820        mos7840_port = urb->context;
 821        port = mos7840_port->port;
 822        spin_lock(&mos7840_port->pool_lock);
 823        for (i = 0; i < NUM_URBS; i++) {
 824                if (urb == mos7840_port->write_urb_pool[i]) {
 825                        mos7840_port->busy[i] = 0;
 826                        break;
 827                }
 828        }
 829        spin_unlock(&mos7840_port->pool_lock);
 830
 831        if (status) {
 832                dev_dbg(&port->dev, "nonzero write bulk status received:%d\n", status);
 833                return;
 834        }
 835
 836        if (mos7840_port_paranoia_check(port, __func__))
 837                return;
 838
 839        if (mos7840_port->open)
 840                tty_port_tty_wakeup(&port->port);
 841
 842}
 843
 844/************************************************************************/
 845/*       D R I V E R  T T Y  I N T E R F A C E  F U N C T I O N S       */
 846/************************************************************************/
 847
 848/*****************************************************************************
 849 * mos7840_open
 850 *      this function is called by the tty driver when a port is opened
 851 *      If successful, we return 0
 852 *      Otherwise we return a negative error number.
 853 *****************************************************************************/
 854
 855static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port)
 856{
 857        int response;
 858        int j;
 859        struct usb_serial *serial;
 860        struct urb *urb;
 861        __u16 Data;
 862        int status;
 863        struct moschip_port *mos7840_port;
 864        struct moschip_port *port0;
 865
 866        if (mos7840_port_paranoia_check(port, __func__))
 867                return -ENODEV;
 868
 869        serial = port->serial;
 870
 871        if (mos7840_serial_paranoia_check(serial, __func__))
 872                return -ENODEV;
 873
 874        mos7840_port = mos7840_get_port_private(port);
 875        port0 = mos7840_get_port_private(serial->port[0]);
 876
 877        if (mos7840_port == NULL || port0 == NULL)
 878                return -ENODEV;
 879
 880        usb_clear_halt(serial->dev, port->write_urb->pipe);
 881        usb_clear_halt(serial->dev, port->read_urb->pipe);
 882        port0->open_ports++;
 883
 884        /* Initialising the write urb pool */
 885        for (j = 0; j < NUM_URBS; ++j) {
 886                urb = usb_alloc_urb(0, GFP_KERNEL);
 887                mos7840_port->write_urb_pool[j] = urb;
 888                if (!urb)
 889                        continue;
 890
 891                urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
 892                                                                GFP_KERNEL);
 893                if (!urb->transfer_buffer) {
 894                        usb_free_urb(urb);
 895                        mos7840_port->write_urb_pool[j] = NULL;
 896                        continue;
 897                }
 898        }
 899
 900/*****************************************************************************
 901 * Initialize MCS7840 -- Write Init values to corresponding Registers
 902 *
 903 * Register Index
 904 * 1 : IER
 905 * 2 : FCR
 906 * 3 : LCR
 907 * 4 : MCR
 908 *
 909 * 0x08 : SP1/2 Control Reg
 910 *****************************************************************************/
 911
 912        /* NEED to check the following Block */
 913
 914        Data = 0x0;
 915        status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data);
 916        if (status < 0) {
 917                dev_dbg(&port->dev, "Reading Spreg failed\n");
 918                goto err;
 919        }
 920        Data |= 0x80;
 921        status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
 922        if (status < 0) {
 923                dev_dbg(&port->dev, "writing Spreg failed\n");
 924                goto err;
 925        }
 926
 927        Data &= ~0x80;
 928        status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
 929        if (status < 0) {
 930                dev_dbg(&port->dev, "writing Spreg failed\n");
 931                goto err;
 932        }
 933        /* End of block to be checked */
 934
 935        Data = 0x0;
 936        status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
 937                                                                        &Data);
 938        if (status < 0) {
 939                dev_dbg(&port->dev, "Reading Controlreg failed\n");
 940                goto err;
 941        }
 942        Data |= 0x08;           /* Driver done bit */
 943        Data |= 0x20;           /* rx_disable */
 944        status = mos7840_set_reg_sync(port,
 945                                mos7840_port->ControlRegOffset, Data);
 946        if (status < 0) {
 947                dev_dbg(&port->dev, "writing Controlreg failed\n");
 948                goto err;
 949        }
 950        /* do register settings here */
 951        /* Set all regs to the device default values. */
 952        /***********************************
 953         * First Disable all interrupts.
 954         ***********************************/
 955        Data = 0x00;
 956        status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
 957        if (status < 0) {
 958                dev_dbg(&port->dev, "disabling interrupts failed\n");
 959                goto err;
 960        }
 961        /* Set FIFO_CONTROL_REGISTER to the default value */
 962        Data = 0x00;
 963        status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
 964        if (status < 0) {
 965                dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER  failed\n");
 966                goto err;
 967        }
 968
 969        Data = 0xcf;
 970        status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
 971        if (status < 0) {
 972                dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER  failed\n");
 973                goto err;
 974        }
 975
 976        Data = 0x03;
 977        status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
 978        mos7840_port->shadowLCR = Data;
 979
 980        Data = 0x0b;
 981        status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
 982        mos7840_port->shadowMCR = Data;
 983
 984        Data = 0x00;
 985        status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
 986        mos7840_port->shadowLCR = Data;
 987
 988        Data |= SERIAL_LCR_DLAB;        /* data latch enable in LCR 0x80 */
 989        status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
 990
 991        Data = 0x0c;
 992        status = mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data);
 993
 994        Data = 0x0;
 995        status = mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data);
 996
 997        Data = 0x00;
 998        status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
 999
1000        Data = Data & ~SERIAL_LCR_DLAB;
1001        status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1002        mos7840_port->shadowLCR = Data;
1003
1004        /* clearing Bulkin and Bulkout Fifo */
1005        Data = 0x0;
1006        status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data);
1007
1008        Data = Data | 0x0c;
1009        status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
1010
1011        Data = Data & ~0x0c;
1012        status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
1013        /* Finally enable all interrupts */
1014        Data = 0x0c;
1015        status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
1016
1017        /* clearing rx_disable */
1018        Data = 0x0;
1019        status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
1020                                                                        &Data);
1021        Data = Data & ~0x20;
1022        status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
1023                                                                        Data);
1024
1025        /* rx_negate */
1026        Data = 0x0;
1027        status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
1028                                                                        &Data);
1029        Data = Data | 0x10;
1030        status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
1031                                                                        Data);
1032
1033        /* Check to see if we've set up our endpoint info yet    *
1034         * (can't set it up in mos7840_startup as the structures *
1035         * were not set up at that time.)                        */
1036        if (port0->open_ports == 1) {
1037                /* FIXME: Buffer never NULL, so URB is not submitted. */
1038                if (serial->port[0]->interrupt_in_buffer == NULL) {
1039                        /* set up interrupt urb */
1040                        usb_fill_int_urb(serial->port[0]->interrupt_in_urb,
1041                                serial->dev,
1042                                usb_rcvintpipe(serial->dev,
1043                                serial->port[0]->interrupt_in_endpointAddress),
1044                                serial->port[0]->interrupt_in_buffer,
1045                                serial->port[0]->interrupt_in_urb->
1046                                transfer_buffer_length,
1047                                mos7840_interrupt_callback,
1048                                serial,
1049                                serial->port[0]->interrupt_in_urb->interval);
1050
1051                        /* start interrupt read for mos7840 */
1052                        response =
1053                            usb_submit_urb(serial->port[0]->interrupt_in_urb,
1054                                           GFP_KERNEL);
1055                        if (response) {
1056                                dev_err(&port->dev, "%s - Error %d submitting "
1057                                        "interrupt urb\n", __func__, response);
1058                        }
1059
1060                }
1061
1062        }
1063
1064        /* see if we've set up our endpoint info yet   *
1065         * (can't set it up in mos7840_startup as the  *
1066         * structures were not set up at that time.)   */
1067
1068        dev_dbg(&port->dev, "port number is %d\n", port->port_number);
1069        dev_dbg(&port->dev, "minor number is %d\n", port->minor);
1070        dev_dbg(&port->dev, "Bulkin endpoint is %d\n", port->bulk_in_endpointAddress);
1071        dev_dbg(&port->dev, "BulkOut endpoint is %d\n", port->bulk_out_endpointAddress);
1072        dev_dbg(&port->dev, "Interrupt endpoint is %d\n", port->interrupt_in_endpointAddress);
1073        dev_dbg(&port->dev, "port's number in the device is %d\n", mos7840_port->port_num);
1074        mos7840_port->read_urb = port->read_urb;
1075
1076        /* set up our bulk in urb */
1077        if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) {
1078                usb_fill_bulk_urb(mos7840_port->read_urb,
1079                        serial->dev,
1080                        usb_rcvbulkpipe(serial->dev,
1081                                (port->bulk_in_endpointAddress) + 2),
1082                        port->bulk_in_buffer,
1083                        mos7840_port->read_urb->transfer_buffer_length,
1084                        mos7840_bulk_in_callback, mos7840_port);
1085        } else {
1086                usb_fill_bulk_urb(mos7840_port->read_urb,
1087                        serial->dev,
1088                        usb_rcvbulkpipe(serial->dev,
1089                                port->bulk_in_endpointAddress),
1090                        port->bulk_in_buffer,
1091                        mos7840_port->read_urb->transfer_buffer_length,
1092                        mos7840_bulk_in_callback, mos7840_port);
1093        }
1094
1095        dev_dbg(&port->dev, "%s: bulkin endpoint is %d\n", __func__, port->bulk_in_endpointAddress);
1096        mos7840_port->read_urb_busy = true;
1097        response = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
1098        if (response) {
1099                dev_err(&port->dev, "%s - Error %d submitting control urb\n",
1100                        __func__, response);
1101                mos7840_port->read_urb_busy = false;
1102        }
1103
1104        /* initialize our port settings */
1105        /* Must set to enable ints! */
1106        mos7840_port->shadowMCR = MCR_MASTER_IE;
1107        /* send a open port command */
1108        mos7840_port->open = 1;
1109        /* mos7840_change_port_settings(mos7840_port,old_termios); */
1110
1111        return 0;
1112err:
1113        for (j = 0; j < NUM_URBS; ++j) {
1114                urb = mos7840_port->write_urb_pool[j];
1115                if (!urb)
1116                        continue;
1117                kfree(urb->transfer_buffer);
1118                usb_free_urb(urb);
1119        }
1120        return status;
1121}
1122
1123/*****************************************************************************
1124 * mos7840_chars_in_buffer
1125 *      this function is called by the tty driver when it wants to know how many
1126 *      bytes of data we currently have outstanding in the port (data that has
1127 *      been written, but hasn't made it out the port yet)
1128 *      If successful, we return the number of bytes left to be written in the
1129 *      system,
1130 *      Otherwise we return zero.
1131 *****************************************************************************/
1132
1133static int mos7840_chars_in_buffer(struct tty_struct *tty)
1134{
1135        struct usb_serial_port *port = tty->driver_data;
1136        int i;
1137        int chars = 0;
1138        unsigned long flags;
1139        struct moschip_port *mos7840_port;
1140
1141        if (mos7840_port_paranoia_check(port, __func__))
1142                return 0;
1143
1144        mos7840_port = mos7840_get_port_private(port);
1145        if (mos7840_port == NULL)
1146                return 0;
1147
1148        spin_lock_irqsave(&mos7840_port->pool_lock, flags);
1149        for (i = 0; i < NUM_URBS; ++i) {
1150                if (mos7840_port->busy[i]) {
1151                        struct urb *urb = mos7840_port->write_urb_pool[i];
1152                        chars += urb->transfer_buffer_length;
1153                }
1154        }
1155        spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
1156        dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
1157        return chars;
1158
1159}
1160
1161/*****************************************************************************
1162 * mos7840_close
1163 *      this function is called by the tty driver when a port is closed
1164 *****************************************************************************/
1165
1166static void mos7840_close(struct usb_serial_port *port)
1167{
1168        struct usb_serial *serial;
1169        struct moschip_port *mos7840_port;
1170        struct moschip_port *port0;
1171        int j;
1172        __u16 Data;
1173
1174        if (mos7840_port_paranoia_check(port, __func__))
1175                return;
1176
1177        serial = mos7840_get_usb_serial(port, __func__);
1178        if (!serial)
1179                return;
1180
1181        mos7840_port = mos7840_get_port_private(port);
1182        port0 = mos7840_get_port_private(serial->port[0]);
1183
1184        if (mos7840_port == NULL || port0 == NULL)
1185                return;
1186
1187        for (j = 0; j < NUM_URBS; ++j)
1188                usb_kill_urb(mos7840_port->write_urb_pool[j]);
1189
1190        /* Freeing Write URBs */
1191        for (j = 0; j < NUM_URBS; ++j) {
1192                if (mos7840_port->write_urb_pool[j]) {
1193                        kfree(mos7840_port->write_urb_pool[j]->transfer_buffer);
1194                        usb_free_urb(mos7840_port->write_urb_pool[j]);
1195                }
1196        }
1197
1198        usb_kill_urb(mos7840_port->read_urb);
1199        mos7840_port->read_urb_busy = false;
1200
1201        port0->open_ports--;
1202        dev_dbg(&port->dev, "%s in close%d\n", __func__, port0->open_ports);
1203        if (port0->open_ports == 0) {
1204                if (serial->port[0]->interrupt_in_urb) {
1205                        dev_dbg(&port->dev, "Shutdown interrupt_in_urb\n");
1206                        usb_kill_urb(serial->port[0]->interrupt_in_urb);
1207                }
1208        }
1209
1210        Data = 0x0;
1211        mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
1212
1213        Data = 0x00;
1214        mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
1215
1216        mos7840_port->open = 0;
1217}
1218
1219/*****************************************************************************
1220 * mos7840_break
1221 *      this function sends a break to the port
1222 *****************************************************************************/
1223static void mos7840_break(struct tty_struct *tty, int break_state)
1224{
1225        struct usb_serial_port *port = tty->driver_data;
1226        unsigned char data;
1227        struct usb_serial *serial;
1228        struct moschip_port *mos7840_port;
1229
1230        if (mos7840_port_paranoia_check(port, __func__))
1231                return;
1232
1233        serial = mos7840_get_usb_serial(port, __func__);
1234        if (!serial)
1235                return;
1236
1237        mos7840_port = mos7840_get_port_private(port);
1238
1239        if (mos7840_port == NULL)
1240                return;
1241
1242        if (break_state == -1)
1243                data = mos7840_port->shadowLCR | LCR_SET_BREAK;
1244        else
1245                data = mos7840_port->shadowLCR & ~LCR_SET_BREAK;
1246
1247        /* FIXME: no locking on shadowLCR anywhere in driver */
1248        mos7840_port->shadowLCR = data;
1249        dev_dbg(&port->dev, "%s mos7840_port->shadowLCR is %x\n", __func__, mos7840_port->shadowLCR);
1250        mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER,
1251                             mos7840_port->shadowLCR);
1252}
1253
1254/*****************************************************************************
1255 * mos7840_write_room
1256 *      this function is called by the tty driver when it wants to know how many
1257 *      bytes of data we can accept for a specific port.
1258 *      If successful, we return the amount of room that we have for this port
1259 *      Otherwise we return a negative error number.
1260 *****************************************************************************/
1261
1262static int mos7840_write_room(struct tty_struct *tty)
1263{
1264        struct usb_serial_port *port = tty->driver_data;
1265        int i;
1266        int room = 0;
1267        unsigned long flags;
1268        struct moschip_port *mos7840_port;
1269
1270        if (mos7840_port_paranoia_check(port, __func__))
1271                return -1;
1272
1273        mos7840_port = mos7840_get_port_private(port);
1274        if (mos7840_port == NULL)
1275                return -1;
1276
1277        spin_lock_irqsave(&mos7840_port->pool_lock, flags);
1278        for (i = 0; i < NUM_URBS; ++i) {
1279                if (!mos7840_port->busy[i])
1280                        room += URB_TRANSFER_BUFFER_SIZE;
1281        }
1282        spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
1283
1284        room = (room == 0) ? 0 : room - URB_TRANSFER_BUFFER_SIZE + 1;
1285        dev_dbg(&mos7840_port->port->dev, "%s - returns %d\n", __func__, room);
1286        return room;
1287
1288}
1289
1290/*****************************************************************************
1291 * mos7840_write
1292 *      this function is called by the tty driver when data should be written to
1293 *      the port.
1294 *      If successful, we return the number of bytes written, otherwise we
1295 *      return a negative error number.
1296 *****************************************************************************/
1297
1298static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
1299                         const unsigned char *data, int count)
1300{
1301        int status;
1302        int i;
1303        int bytes_sent = 0;
1304        int transfer_size;
1305        unsigned long flags;
1306
1307        struct moschip_port *mos7840_port;
1308        struct usb_serial *serial;
1309        struct urb *urb;
1310        /* __u16 Data; */
1311        const unsigned char *current_position = data;
1312        unsigned char *data1;
1313
1314        if (mos7840_port_paranoia_check(port, __func__))
1315                return -1;
1316
1317        serial = port->serial;
1318        if (mos7840_serial_paranoia_check(serial, __func__))
1319                return -1;
1320
1321        mos7840_port = mos7840_get_port_private(port);
1322        if (mos7840_port == NULL)
1323                return -1;
1324
1325        /* try to find a free urb in the list */
1326        urb = NULL;
1327
1328        spin_lock_irqsave(&mos7840_port->pool_lock, flags);
1329        for (i = 0; i < NUM_URBS; ++i) {
1330                if (!mos7840_port->busy[i]) {
1331                        mos7840_port->busy[i] = 1;
1332                        urb = mos7840_port->write_urb_pool[i];
1333                        dev_dbg(&port->dev, "URB:%d\n", i);
1334                        break;
1335                }
1336        }
1337        spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
1338
1339        if (urb == NULL) {
1340                dev_dbg(&port->dev, "%s - no more free urbs\n", __func__);
1341                goto exit;
1342        }
1343
1344        if (urb->transfer_buffer == NULL) {
1345                urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
1346                                               GFP_ATOMIC);
1347                if (!urb->transfer_buffer)
1348                        goto exit;
1349        }
1350        transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
1351
1352        memcpy(urb->transfer_buffer, current_position, transfer_size);
1353
1354        /* fill urb with data and submit  */
1355        if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) {
1356                usb_fill_bulk_urb(urb,
1357                        serial->dev,
1358                        usb_sndbulkpipe(serial->dev,
1359                                (port->bulk_out_endpointAddress) + 2),
1360                        urb->transfer_buffer,
1361                        transfer_size,
1362                        mos7840_bulk_out_data_callback, mos7840_port);
1363        } else {
1364                usb_fill_bulk_urb(urb,
1365                        serial->dev,
1366                        usb_sndbulkpipe(serial->dev,
1367                                port->bulk_out_endpointAddress),
1368                        urb->transfer_buffer,
1369                        transfer_size,
1370                        mos7840_bulk_out_data_callback, mos7840_port);
1371        }
1372
1373        data1 = urb->transfer_buffer;
1374        dev_dbg(&port->dev, "bulkout endpoint is %d\n", port->bulk_out_endpointAddress);
1375
1376        if (mos7840_port->has_led)
1377                mos7840_led_activity(port);
1378
1379        /* send it down the pipe */
1380        status = usb_submit_urb(urb, GFP_ATOMIC);
1381
1382        if (status) {
1383                mos7840_port->busy[i] = 0;
1384                dev_err_console(port, "%s - usb_submit_urb(write bulk) failed "
1385                        "with status = %d\n", __func__, status);
1386                bytes_sent = status;
1387                goto exit;
1388        }
1389        bytes_sent = transfer_size;
1390        port->icount.tx += transfer_size;
1391        dev_dbg(&port->dev, "icount.tx is %d:\n", port->icount.tx);
1392exit:
1393        return bytes_sent;
1394
1395}
1396
1397/*****************************************************************************
1398 * mos7840_throttle
1399 *      this function is called by the tty driver when it wants to stop the data
1400 *      being read from the port.
1401 *****************************************************************************/
1402
1403static void mos7840_throttle(struct tty_struct *tty)
1404{
1405        struct usb_serial_port *port = tty->driver_data;
1406        struct moschip_port *mos7840_port;
1407        int status;
1408
1409        if (mos7840_port_paranoia_check(port, __func__))
1410                return;
1411
1412        mos7840_port = mos7840_get_port_private(port);
1413
1414        if (mos7840_port == NULL)
1415                return;
1416
1417        if (!mos7840_port->open) {
1418                dev_dbg(&port->dev, "%s", "port not opened\n");
1419                return;
1420        }
1421
1422        /* if we are implementing XON/XOFF, send the stop character */
1423        if (I_IXOFF(tty)) {
1424                unsigned char stop_char = STOP_CHAR(tty);
1425                status = mos7840_write(tty, port, &stop_char, 1);
1426                if (status <= 0)
1427                        return;
1428        }
1429        /* if we are implementing RTS/CTS, toggle that line */
1430        if (C_CRTSCTS(tty)) {
1431                mos7840_port->shadowMCR &= ~MCR_RTS;
1432                status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1433                                         mos7840_port->shadowMCR);
1434                if (status < 0)
1435                        return;
1436        }
1437}
1438
1439/*****************************************************************************
1440 * mos7840_unthrottle
1441 *      this function is called by the tty driver when it wants to resume
1442 *      the data being read from the port (called after mos7840_throttle is
1443 *      called)
1444 *****************************************************************************/
1445static void mos7840_unthrottle(struct tty_struct *tty)
1446{
1447        struct usb_serial_port *port = tty->driver_data;
1448        int status;
1449        struct moschip_port *mos7840_port = mos7840_get_port_private(port);
1450
1451        if (mos7840_port_paranoia_check(port, __func__))
1452                return;
1453
1454        if (mos7840_port == NULL)
1455                return;
1456
1457        if (!mos7840_port->open) {
1458                dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1459                return;
1460        }
1461
1462        /* if we are implementing XON/XOFF, send the start character */
1463        if (I_IXOFF(tty)) {
1464                unsigned char start_char = START_CHAR(tty);
1465                status = mos7840_write(tty, port, &start_char, 1);
1466                if (status <= 0)
1467                        return;
1468        }
1469
1470        /* if we are implementing RTS/CTS, toggle that line */
1471        if (C_CRTSCTS(tty)) {
1472                mos7840_port->shadowMCR |= MCR_RTS;
1473                status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1474                                         mos7840_port->shadowMCR);
1475                if (status < 0)
1476                        return;
1477        }
1478}
1479
1480static int mos7840_tiocmget(struct tty_struct *tty)
1481{
1482        struct usb_serial_port *port = tty->driver_data;
1483        struct moschip_port *mos7840_port;
1484        unsigned int result;
1485        __u16 msr;
1486        __u16 mcr;
1487        int status;
1488        mos7840_port = mos7840_get_port_private(port);
1489
1490        if (mos7840_port == NULL)
1491                return -ENODEV;
1492
1493        status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr);
1494        if (status < 0)
1495                return -EIO;
1496        status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr);
1497        if (status < 0)
1498                return -EIO;
1499        result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0)
1500            | ((mcr & MCR_RTS) ? TIOCM_RTS : 0)
1501            | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0)
1502            | ((msr & MOS7840_MSR_CTS) ? TIOCM_CTS : 0)
1503            | ((msr & MOS7840_MSR_CD) ? TIOCM_CAR : 0)
1504            | ((msr & MOS7840_MSR_RI) ? TIOCM_RI : 0)
1505            | ((msr & MOS7840_MSR_DSR) ? TIOCM_DSR : 0);
1506
1507        dev_dbg(&port->dev, "%s - 0x%04X\n", __func__, result);
1508
1509        return result;
1510}
1511
1512static int mos7840_tiocmset(struct tty_struct *tty,
1513                            unsigned int set, unsigned int clear)
1514{
1515        struct usb_serial_port *port = tty->driver_data;
1516        struct moschip_port *mos7840_port;
1517        unsigned int mcr;
1518        int status;
1519
1520        mos7840_port = mos7840_get_port_private(port);
1521
1522        if (mos7840_port == NULL)
1523                return -ENODEV;
1524
1525        /* FIXME: What locks the port registers ? */
1526        mcr = mos7840_port->shadowMCR;
1527        if (clear & TIOCM_RTS)
1528                mcr &= ~MCR_RTS;
1529        if (clear & TIOCM_DTR)
1530                mcr &= ~MCR_DTR;
1531        if (clear & TIOCM_LOOP)
1532                mcr &= ~MCR_LOOPBACK;
1533
1534        if (set & TIOCM_RTS)
1535                mcr |= MCR_RTS;
1536        if (set & TIOCM_DTR)
1537                mcr |= MCR_DTR;
1538        if (set & TIOCM_LOOP)
1539                mcr |= MCR_LOOPBACK;
1540
1541        mos7840_port->shadowMCR = mcr;
1542
1543        status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, mcr);
1544        if (status < 0) {
1545                dev_dbg(&port->dev, "setting MODEM_CONTROL_REGISTER Failed\n");
1546                return status;
1547        }
1548
1549        return 0;
1550}
1551
1552/*****************************************************************************
1553 * mos7840_calc_baud_rate_divisor
1554 *      this function calculates the proper baud rate divisor for the specified
1555 *      baud rate.
1556 *****************************************************************************/
1557static int mos7840_calc_baud_rate_divisor(struct usb_serial_port *port,
1558                                          int baudRate, int *divisor,
1559                                          __u16 *clk_sel_val)
1560{
1561        dev_dbg(&port->dev, "%s - %d\n", __func__, baudRate);
1562
1563        if (baudRate <= 115200) {
1564                *divisor = 115200 / baudRate;
1565                *clk_sel_val = 0x0;
1566        }
1567        if ((baudRate > 115200) && (baudRate <= 230400)) {
1568                *divisor = 230400 / baudRate;
1569                *clk_sel_val = 0x10;
1570        } else if ((baudRate > 230400) && (baudRate <= 403200)) {
1571                *divisor = 403200 / baudRate;
1572                *clk_sel_val = 0x20;
1573        } else if ((baudRate > 403200) && (baudRate <= 460800)) {
1574                *divisor = 460800 / baudRate;
1575                *clk_sel_val = 0x30;
1576        } else if ((baudRate > 460800) && (baudRate <= 806400)) {
1577                *divisor = 806400 / baudRate;
1578                *clk_sel_val = 0x40;
1579        } else if ((baudRate > 806400) && (baudRate <= 921600)) {
1580                *divisor = 921600 / baudRate;
1581                *clk_sel_val = 0x50;
1582        } else if ((baudRate > 921600) && (baudRate <= 1572864)) {
1583                *divisor = 1572864 / baudRate;
1584                *clk_sel_val = 0x60;
1585        } else if ((baudRate > 1572864) && (baudRate <= 3145728)) {
1586                *divisor = 3145728 / baudRate;
1587                *clk_sel_val = 0x70;
1588        }
1589        return 0;
1590}
1591
1592/*****************************************************************************
1593 * mos7840_send_cmd_write_baud_rate
1594 *      this function sends the proper command to change the baud rate of the
1595 *      specified port.
1596 *****************************************************************************/
1597
1598static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
1599                                            int baudRate)
1600{
1601        int divisor = 0;
1602        int status;
1603        __u16 Data;
1604        unsigned char number;
1605        __u16 clk_sel_val;
1606        struct usb_serial_port *port;
1607
1608        if (mos7840_port == NULL)
1609                return -1;
1610
1611        port = mos7840_port->port;
1612        if (mos7840_port_paranoia_check(port, __func__))
1613                return -1;
1614
1615        if (mos7840_serial_paranoia_check(port->serial, __func__))
1616                return -1;
1617
1618        number = mos7840_port->port->port_number;
1619
1620        dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudRate);
1621        /* reset clk_uart_sel in spregOffset */
1622        if (baudRate > 115200) {
1623#ifdef HW_flow_control
1624                /* NOTE: need to see the pther register to modify */
1625                /* setting h/w flow control bit to 1 */
1626                Data = 0x2b;
1627                mos7840_port->shadowMCR = Data;
1628                status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1629                                                                        Data);
1630                if (status < 0) {
1631                        dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
1632                        return -1;
1633                }
1634#endif
1635
1636        } else {
1637#ifdef HW_flow_control
1638                /* setting h/w flow control bit to 0 */
1639                Data = 0xb;
1640                mos7840_port->shadowMCR = Data;
1641                status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1642                                                                        Data);
1643                if (status < 0) {
1644                        dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
1645                        return -1;
1646                }
1647#endif
1648
1649        }
1650
1651        if (1) {                /* baudRate <= 115200) */
1652                clk_sel_val = 0x0;
1653                Data = 0x0;
1654                status = mos7840_calc_baud_rate_divisor(port, baudRate, &divisor,
1655                                                   &clk_sel_val);
1656                status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset,
1657                                                                 &Data);
1658                if (status < 0) {
1659                        dev_dbg(&port->dev, "reading spreg failed in set_serial_baud\n");
1660                        return -1;
1661                }
1662                Data = (Data & 0x8f) | clk_sel_val;
1663                status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset,
1664                                                                Data);
1665                if (status < 0) {
1666                        dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
1667                        return -1;
1668                }
1669                /* Calculate the Divisor */
1670
1671                if (status) {
1672                        dev_err(&port->dev, "%s - bad baud rate\n", __func__);
1673                        return status;
1674                }
1675                /* Enable access to divisor latch */
1676                Data = mos7840_port->shadowLCR | SERIAL_LCR_DLAB;
1677                mos7840_port->shadowLCR = Data;
1678                mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1679
1680                /* Write the divisor */
1681                Data = (unsigned char)(divisor & 0xff);
1682                dev_dbg(&port->dev, "set_serial_baud Value to write DLL is %x\n", Data);
1683                mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data);
1684
1685                Data = (unsigned char)((divisor & 0xff00) >> 8);
1686                dev_dbg(&port->dev, "set_serial_baud Value to write DLM is %x\n", Data);
1687                mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data);
1688
1689                /* Disable access to divisor latch */
1690                Data = mos7840_port->shadowLCR & ~SERIAL_LCR_DLAB;
1691                mos7840_port->shadowLCR = Data;
1692                mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1693
1694        }
1695        return status;
1696}
1697
1698/*****************************************************************************
1699 * mos7840_change_port_settings
1700 *      This routine is called to set the UART on the device to match
1701 *      the specified new settings.
1702 *****************************************************************************/
1703
1704static void mos7840_change_port_settings(struct tty_struct *tty,
1705        struct moschip_port *mos7840_port, struct ktermios *old_termios)
1706{
1707        int baud;
1708        unsigned cflag;
1709        unsigned iflag;
1710        __u8 lData;
1711        __u8 lParity;
1712        __u8 lStop;
1713        int status;
1714        __u16 Data;
1715        struct usb_serial_port *port;
1716        struct usb_serial *serial;
1717
1718        if (mos7840_port == NULL)
1719                return;
1720
1721        port = mos7840_port->port;
1722
1723        if (mos7840_port_paranoia_check(port, __func__))
1724                return;
1725
1726        if (mos7840_serial_paranoia_check(port->serial, __func__))
1727                return;
1728
1729        serial = port->serial;
1730
1731        if (!mos7840_port->open) {
1732                dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1733                return;
1734        }
1735
1736        lData = LCR_BITS_8;
1737        lStop = LCR_STOP_1;
1738        lParity = LCR_PAR_NONE;
1739
1740        cflag = tty->termios.c_cflag;
1741        iflag = tty->termios.c_iflag;
1742
1743        /* Change the number of bits */
1744        switch (cflag & CSIZE) {
1745        case CS5:
1746                lData = LCR_BITS_5;
1747                break;
1748
1749        case CS6:
1750                lData = LCR_BITS_6;
1751                break;
1752
1753        case CS7:
1754                lData = LCR_BITS_7;
1755                break;
1756
1757        default:
1758        case CS8:
1759                lData = LCR_BITS_8;
1760                break;
1761        }
1762
1763        /* Change the Parity bit */
1764        if (cflag & PARENB) {
1765                if (cflag & PARODD) {
1766                        lParity = LCR_PAR_ODD;
1767                        dev_dbg(&port->dev, "%s - parity = odd\n", __func__);
1768                } else {
1769                        lParity = LCR_PAR_EVEN;
1770                        dev_dbg(&port->dev, "%s - parity = even\n", __func__);
1771                }
1772
1773        } else {
1774                dev_dbg(&port->dev, "%s - parity = none\n", __func__);
1775        }
1776
1777        if (cflag & CMSPAR)
1778                lParity = lParity | 0x20;
1779
1780        /* Change the Stop bit */
1781        if (cflag & CSTOPB) {
1782                lStop = LCR_STOP_2;
1783                dev_dbg(&port->dev, "%s - stop bits = 2\n", __func__);
1784        } else {
1785                lStop = LCR_STOP_1;
1786                dev_dbg(&port->dev, "%s - stop bits = 1\n", __func__);
1787        }
1788
1789        /* Update the LCR with the correct value */
1790        mos7840_port->shadowLCR &=
1791            ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK);
1792        mos7840_port->shadowLCR |= (lData | lParity | lStop);
1793
1794        dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is %x\n", __func__,
1795                mos7840_port->shadowLCR);
1796        /* Disable Interrupts */
1797        Data = 0x00;
1798        mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
1799
1800        Data = 0x00;
1801        mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
1802
1803        Data = 0xcf;
1804        mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
1805
1806        /* Send the updated LCR value to the mos7840 */
1807        Data = mos7840_port->shadowLCR;
1808
1809        mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1810
1811        Data = 0x00b;
1812        mos7840_port->shadowMCR = Data;
1813        mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
1814        Data = 0x00b;
1815        mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
1816
1817        /* set up the MCR register and send it to the mos7840 */
1818
1819        mos7840_port->shadowMCR = MCR_MASTER_IE;
1820        if (cflag & CBAUD)
1821                mos7840_port->shadowMCR |= (MCR_DTR | MCR_RTS);
1822
1823        if (cflag & CRTSCTS)
1824                mos7840_port->shadowMCR |= (MCR_XON_ANY);
1825        else
1826                mos7840_port->shadowMCR &= ~(MCR_XON_ANY);
1827
1828        Data = mos7840_port->shadowMCR;
1829        mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
1830
1831        /* Determine divisor based on baud rate */
1832        baud = tty_get_baud_rate(tty);
1833
1834        if (!baud) {
1835                /* pick a default, any default... */
1836                dev_dbg(&port->dev, "%s", "Picked default baud...\n");
1837                baud = 9600;
1838        }
1839
1840        dev_dbg(&port->dev, "%s - baud rate = %d\n", __func__, baud);
1841        status = mos7840_send_cmd_write_baud_rate(mos7840_port, baud);
1842
1843        /* Enable Interrupts */
1844        Data = 0x0c;
1845        mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
1846
1847        if (!mos7840_port->read_urb_busy) {
1848                mos7840_port->read_urb_busy = true;
1849                status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
1850                if (status) {
1851                        dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n",
1852                            status);
1853                        mos7840_port->read_urb_busy = false;
1854                }
1855        }
1856        dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is End %x\n", __func__,
1857                mos7840_port->shadowLCR);
1858}
1859
1860/*****************************************************************************
1861 * mos7840_set_termios
1862 *      this function is called by the tty driver when it wants to change
1863 *      the termios structure
1864 *****************************************************************************/
1865
1866static void mos7840_set_termios(struct tty_struct *tty,
1867                                struct usb_serial_port *port,
1868                                struct ktermios *old_termios)
1869{
1870        int status;
1871        struct usb_serial *serial;
1872        struct moschip_port *mos7840_port;
1873
1874        if (mos7840_port_paranoia_check(port, __func__))
1875                return;
1876
1877        serial = port->serial;
1878
1879        if (mos7840_serial_paranoia_check(serial, __func__))
1880                return;
1881
1882        mos7840_port = mos7840_get_port_private(port);
1883
1884        if (mos7840_port == NULL)
1885                return;
1886
1887        if (!mos7840_port->open) {
1888                dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1889                return;
1890        }
1891
1892        /* change the port settings to the new ones specified */
1893
1894        mos7840_change_port_settings(tty, mos7840_port, old_termios);
1895
1896        if (!mos7840_port->read_urb) {
1897                dev_dbg(&port->dev, "%s", "URB KILLED !!!!!\n");
1898                return;
1899        }
1900
1901        if (!mos7840_port->read_urb_busy) {
1902                mos7840_port->read_urb_busy = true;
1903                status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
1904                if (status) {
1905                        dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n",
1906                            status);
1907                        mos7840_port->read_urb_busy = false;
1908                }
1909        }
1910}
1911
1912/*****************************************************************************
1913 * mos7840_get_lsr_info - get line status register info
1914 *
1915 * Purpose: Let user call ioctl() to get info when the UART physically
1916 *          is emptied.  On bus types like RS485, the transmitter must
1917 *          release the bus after transmitting. This must be done when
1918 *          the transmit shift register is empty, not be done when the
1919 *          transmit holding register is empty.  This functionality
1920 *          allows an RS485 driver to be written in user space.
1921 *****************************************************************************/
1922
1923static int mos7840_get_lsr_info(struct tty_struct *tty,
1924                                unsigned int __user *value)
1925{
1926        int count;
1927        unsigned int result = 0;
1928
1929        count = mos7840_chars_in_buffer(tty);
1930        if (count == 0)
1931                result = TIOCSER_TEMT;
1932
1933        if (copy_to_user(value, &result, sizeof(int)))
1934                return -EFAULT;
1935        return 0;
1936}
1937
1938/*****************************************************************************
1939 * mos7840_get_serial_info
1940 *      function to get information about serial port
1941 *****************************************************************************/
1942
1943static int mos7840_get_serial_info(struct moschip_port *mos7840_port,
1944                                   struct serial_struct __user *retinfo)
1945{
1946        struct serial_struct tmp;
1947
1948        if (mos7840_port == NULL)
1949                return -1;
1950
1951        memset(&tmp, 0, sizeof(tmp));
1952
1953        tmp.type = PORT_16550A;
1954        tmp.line = mos7840_port->port->minor;
1955        tmp.port = mos7840_port->port->port_number;
1956        tmp.irq = 0;
1957        tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
1958        tmp.baud_base = 9600;
1959        tmp.close_delay = 5 * HZ;
1960        tmp.closing_wait = 30 * HZ;
1961
1962        if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1963                return -EFAULT;
1964        return 0;
1965}
1966
1967/*****************************************************************************
1968 * SerialIoctl
1969 *      this function handles any ioctl calls to the driver
1970 *****************************************************************************/
1971
1972static int mos7840_ioctl(struct tty_struct *tty,
1973                         unsigned int cmd, unsigned long arg)
1974{
1975        struct usb_serial_port *port = tty->driver_data;
1976        void __user *argp = (void __user *)arg;
1977        struct moschip_port *mos7840_port;
1978
1979        if (mos7840_port_paranoia_check(port, __func__))
1980                return -1;
1981
1982        mos7840_port = mos7840_get_port_private(port);
1983
1984        if (mos7840_port == NULL)
1985                return -1;
1986
1987        switch (cmd) {
1988                /* return number of bytes available */
1989
1990        case TIOCSERGETLSR:
1991                dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
1992                return mos7840_get_lsr_info(tty, argp);
1993
1994        case TIOCGSERIAL:
1995                dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__);
1996                return mos7840_get_serial_info(mos7840_port, argp);
1997
1998        case TIOCSSERIAL:
1999                dev_dbg(&port->dev, "%s TIOCSSERIAL\n", __func__);
2000                break;
2001        default:
2002                break;
2003        }
2004        return -ENOIOCTLCMD;
2005}
2006
2007static int mos7810_check(struct usb_serial *serial)
2008{
2009        int i, pass_count = 0;
2010        u8 *buf;
2011        __u16 data = 0, mcr_data = 0;
2012        __u16 test_pattern = 0x55AA;
2013        int res;
2014
2015        buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
2016        if (!buf)
2017                return 0;       /* failed to identify 7810 */
2018
2019        /* Store MCR setting */
2020        res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
2021                MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER,
2022                buf, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
2023        if (res == VENDOR_READ_LENGTH)
2024                mcr_data = *buf;
2025
2026        for (i = 0; i < 16; i++) {
2027                /* Send the 1-bit test pattern out to MCS7810 test pin */
2028                usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
2029                        MCS_WRREQ, MCS_WR_RTYPE,
2030                        (0x0300 | (((test_pattern >> i) & 0x0001) << 1)),
2031                        MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT);
2032
2033                /* Read the test pattern back */
2034                res = usb_control_msg(serial->dev,
2035                                usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ,
2036                                MCS_RD_RTYPE, 0, GPIO_REGISTER, buf,
2037                                VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
2038                if (res == VENDOR_READ_LENGTH)
2039                        data = *buf;
2040
2041                /* If this is a MCS7810 device, both test patterns must match */
2042                if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001)
2043                        break;
2044
2045                pass_count++;
2046        }
2047
2048        /* Restore MCR setting */
2049        usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), MCS_WRREQ,
2050                MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL,
2051                0, MOS_WDR_TIMEOUT);
2052
2053        kfree(buf);
2054
2055        if (pass_count == 16)
2056                return 1;
2057
2058        return 0;
2059}
2060
2061static int mos7840_probe(struct usb_serial *serial,
2062                                const struct usb_device_id *id)
2063{
2064        u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
2065        u8 *buf;
2066        int device_type;
2067
2068        if (product == MOSCHIP_DEVICE_ID_7810 ||
2069                product == MOSCHIP_DEVICE_ID_7820) {
2070                device_type = product;
2071                goto out;
2072        }
2073
2074        buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
2075        if (!buf)
2076                return -ENOMEM;
2077
2078        usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
2079                        MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf,
2080                        VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
2081
2082        /* For a MCS7840 device GPIO0 must be set to 1 */
2083        if (buf[0] & 0x01)
2084                device_type = MOSCHIP_DEVICE_ID_7840;
2085        else if (mos7810_check(serial))
2086                device_type = MOSCHIP_DEVICE_ID_7810;
2087        else
2088                device_type = MOSCHIP_DEVICE_ID_7820;
2089
2090        kfree(buf);
2091out:
2092        usb_set_serial_data(serial, (void *)(unsigned long)device_type);
2093
2094        return 0;
2095}
2096
2097static int mos7840_calc_num_ports(struct usb_serial *serial,
2098                                        struct usb_serial_endpoints *epds)
2099{
2100        int device_type = (unsigned long)usb_get_serial_data(serial);
2101        int num_ports;
2102
2103        num_ports = (device_type >> 4) & 0x000F;
2104
2105        /*
2106         * num_ports is currently never zero as device_type is one of
2107         * MOSCHIP_DEVICE_ID_78{1,2,4}0.
2108         */
2109        if (num_ports == 0)
2110                return -ENODEV;
2111
2112        if (epds->num_bulk_in < num_ports || epds->num_bulk_out < num_ports) {
2113                dev_err(&serial->interface->dev, "missing endpoints\n");
2114                return -ENODEV;
2115        }
2116
2117        return num_ports;
2118}
2119
2120static int mos7840_port_probe(struct usb_serial_port *port)
2121{
2122        struct usb_serial *serial = port->serial;
2123        int device_type = (unsigned long)usb_get_serial_data(serial);
2124        struct moschip_port *mos7840_port;
2125        int status;
2126        int pnum;
2127        __u16 Data;
2128
2129        /* we set up the pointers to the endpoints in the mos7840_open *
2130         * function, as the structures aren't created yet.             */
2131
2132        pnum = port->port_number;
2133
2134        dev_dbg(&port->dev, "mos7840_startup: configuring port %d\n", pnum);
2135        mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL);
2136        if (!mos7840_port)
2137                return -ENOMEM;
2138
2139        /* Initialize all port interrupt end point to port 0 int
2140         * endpoint. Our device has only one interrupt end point
2141         * common to all port */
2142
2143        mos7840_port->port = port;
2144        mos7840_set_port_private(port, mos7840_port);
2145        spin_lock_init(&mos7840_port->pool_lock);
2146
2147        /* minor is not initialised until later by
2148         * usb-serial.c:get_free_serial() and cannot therefore be used
2149         * to index device instances */
2150        mos7840_port->port_num = pnum + 1;
2151        dev_dbg(&port->dev, "port->minor = %d\n", port->minor);
2152        dev_dbg(&port->dev, "mos7840_port->port_num = %d\n", mos7840_port->port_num);
2153
2154        if (mos7840_port->port_num == 1) {
2155                mos7840_port->SpRegOffset = 0x0;
2156                mos7840_port->ControlRegOffset = 0x1;
2157                mos7840_port->DcrRegOffset = 0x4;
2158        } else if ((mos7840_port->port_num == 2) && (serial->num_ports == 4)) {
2159                mos7840_port->SpRegOffset = 0x8;
2160                mos7840_port->ControlRegOffset = 0x9;
2161                mos7840_port->DcrRegOffset = 0x16;
2162        } else if ((mos7840_port->port_num == 2) && (serial->num_ports == 2)) {
2163                mos7840_port->SpRegOffset = 0xa;
2164                mos7840_port->ControlRegOffset = 0xb;
2165                mos7840_port->DcrRegOffset = 0x19;
2166        } else if ((mos7840_port->port_num == 3) && (serial->num_ports == 4)) {
2167                mos7840_port->SpRegOffset = 0xa;
2168                mos7840_port->ControlRegOffset = 0xb;
2169                mos7840_port->DcrRegOffset = 0x19;
2170        } else if ((mos7840_port->port_num == 4) && (serial->num_ports == 4)) {
2171                mos7840_port->SpRegOffset = 0xc;
2172                mos7840_port->ControlRegOffset = 0xd;
2173                mos7840_port->DcrRegOffset = 0x1c;
2174        }
2175        mos7840_dump_serial_port(port, mos7840_port);
2176        mos7840_set_port_private(port, mos7840_port);
2177
2178        /* enable rx_disable bit in control register */
2179        status = mos7840_get_reg_sync(port,
2180                        mos7840_port->ControlRegOffset, &Data);
2181        if (status < 0) {
2182                dev_dbg(&port->dev, "Reading ControlReg failed status-0x%x\n", status);
2183                goto out;
2184        } else
2185                dev_dbg(&port->dev, "ControlReg Reading success val is %x, status%d\n", Data, status);
2186        Data |= 0x08;   /* setting driver done bit */
2187        Data |= 0x04;   /* sp1_bit to have cts change reflect in
2188                           modem status reg */
2189
2190        /* Data |= 0x20; //rx_disable bit */
2191        status = mos7840_set_reg_sync(port,
2192                        mos7840_port->ControlRegOffset, Data);
2193        if (status < 0) {
2194                dev_dbg(&port->dev, "Writing ControlReg failed(rx_disable) status-0x%x\n", status);
2195                goto out;
2196        } else
2197                dev_dbg(&port->dev, "ControlReg Writing success(rx_disable) status%d\n", status);
2198
2199        /* Write default values in DCR (i.e 0x01 in DCR0, 0x05 in DCR2
2200           and 0x24 in DCR3 */
2201        Data = 0x01;
2202        status = mos7840_set_reg_sync(port,
2203                        (__u16) (mos7840_port->DcrRegOffset + 0), Data);
2204        if (status < 0) {
2205                dev_dbg(&port->dev, "Writing DCR0 failed status-0x%x\n", status);
2206                goto out;
2207        } else
2208                dev_dbg(&port->dev, "DCR0 Writing success status%d\n", status);
2209
2210        Data = 0x05;
2211        status = mos7840_set_reg_sync(port,
2212                        (__u16) (mos7840_port->DcrRegOffset + 1), Data);
2213        if (status < 0) {
2214                dev_dbg(&port->dev, "Writing DCR1 failed status-0x%x\n", status);
2215                goto out;
2216        } else
2217                dev_dbg(&port->dev, "DCR1 Writing success status%d\n", status);
2218
2219        Data = 0x24;
2220        status = mos7840_set_reg_sync(port,
2221                        (__u16) (mos7840_port->DcrRegOffset + 2), Data);
2222        if (status < 0) {
2223                dev_dbg(&port->dev, "Writing DCR2 failed status-0x%x\n", status);
2224                goto out;
2225        } else
2226                dev_dbg(&port->dev, "DCR2 Writing success status%d\n", status);
2227
2228        /* write values in clkstart0x0 and clkmulti 0x20 */
2229        Data = 0x0;
2230        status = mos7840_set_reg_sync(port, CLK_START_VALUE_REGISTER, Data);
2231        if (status < 0) {
2232                dev_dbg(&port->dev, "Writing CLK_START_VALUE_REGISTER failed status-0x%x\n", status);
2233                goto out;
2234        } else
2235                dev_dbg(&port->dev, "CLK_START_VALUE_REGISTER Writing success status%d\n", status);
2236
2237        Data = 0x20;
2238        status = mos7840_set_reg_sync(port, CLK_MULTI_REGISTER, Data);
2239        if (status < 0) {
2240                dev_dbg(&port->dev, "Writing CLK_MULTI_REGISTER failed status-0x%x\n", status);
2241                goto error;
2242        } else
2243                dev_dbg(&port->dev, "CLK_MULTI_REGISTER Writing success status%d\n", status);
2244
2245        /* write value 0x0 to scratchpad register */
2246        Data = 0x00;
2247        status = mos7840_set_uart_reg(port, SCRATCH_PAD_REGISTER, Data);
2248        if (status < 0) {
2249                dev_dbg(&port->dev, "Writing SCRATCH_PAD_REGISTER failed status-0x%x\n", status);
2250                goto out;
2251        } else
2252                dev_dbg(&port->dev, "SCRATCH_PAD_REGISTER Writing success status%d\n", status);
2253
2254        /* Zero Length flag register */
2255        if ((mos7840_port->port_num != 1) && (serial->num_ports == 2)) {
2256                Data = 0xff;
2257                status = mos7840_set_reg_sync(port,
2258                                (__u16) (ZLP_REG1 +
2259                                        ((__u16)mos7840_port->port_num)), Data);
2260                dev_dbg(&port->dev, "ZLIP offset %x\n",
2261                                (__u16)(ZLP_REG1 + ((__u16) mos7840_port->port_num)));
2262                if (status < 0) {
2263                        dev_dbg(&port->dev, "Writing ZLP_REG%d failed status-0x%x\n", pnum + 2, status);
2264                        goto out;
2265                } else
2266                        dev_dbg(&port->dev, "ZLP_REG%d Writing success status%d\n", pnum + 2, status);
2267        } else {
2268                Data = 0xff;
2269                status = mos7840_set_reg_sync(port,
2270                                (__u16) (ZLP_REG1 +
2271                                        ((__u16)mos7840_port->port_num) - 0x1), Data);
2272                dev_dbg(&port->dev, "ZLIP offset %x\n",
2273                                (__u16)(ZLP_REG1 + ((__u16) mos7840_port->port_num) - 0x1));
2274                if (status < 0) {
2275                        dev_dbg(&port->dev, "Writing ZLP_REG%d failed status-0x%x\n", pnum + 1, status);
2276                        goto out;
2277                } else
2278                        dev_dbg(&port->dev, "ZLP_REG%d Writing success status%d\n", pnum + 1, status);
2279
2280        }
2281        mos7840_port->control_urb = usb_alloc_urb(0, GFP_KERNEL);
2282        mos7840_port->ctrl_buf = kmalloc(16, GFP_KERNEL);
2283        mos7840_port->dr = kmalloc(sizeof(struct usb_ctrlrequest),
2284                        GFP_KERNEL);
2285        if (!mos7840_port->control_urb || !mos7840_port->ctrl_buf ||
2286                        !mos7840_port->dr) {
2287                status = -ENOMEM;
2288                goto error;
2289        }
2290
2291        mos7840_port->has_led = false;
2292
2293        /* Initialize LED timers */
2294        if (device_type == MOSCHIP_DEVICE_ID_7810) {
2295                mos7840_port->has_led = true;
2296
2297                mos7840_port->led_urb = usb_alloc_urb(0, GFP_KERNEL);
2298                mos7840_port->led_dr = kmalloc(sizeof(*mos7840_port->led_dr),
2299                                                                GFP_KERNEL);
2300                if (!mos7840_port->led_urb || !mos7840_port->led_dr) {
2301                        status = -ENOMEM;
2302                        goto error;
2303                }
2304
2305                setup_timer(&mos7840_port->led_timer1, mos7840_led_off,
2306                            (unsigned long)mos7840_port);
2307                mos7840_port->led_timer1.expires =
2308                        jiffies + msecs_to_jiffies(LED_ON_MS);
2309                setup_timer(&mos7840_port->led_timer2, mos7840_led_flag_off,
2310                            (unsigned long)mos7840_port);
2311                mos7840_port->led_timer2.expires =
2312                        jiffies + msecs_to_jiffies(LED_OFF_MS);
2313
2314                /* Turn off LED */
2315                mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300);
2316        }
2317out:
2318        if (pnum == serial->num_ports - 1) {
2319                /* Zero Length flag enable */
2320                Data = 0x0f;
2321                status = mos7840_set_reg_sync(serial->port[0], ZLP_REG5, Data);
2322                if (status < 0) {
2323                        dev_dbg(&port->dev, "Writing ZLP_REG5 failed status-0x%x\n", status);
2324                        goto error;
2325                } else
2326                        dev_dbg(&port->dev, "ZLP_REG5 Writing success status%d\n", status);
2327
2328                /* setting configuration feature to one */
2329                usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
2330                                0x03, 0x00, 0x01, 0x00, NULL, 0x00,
2331                                MOS_WDR_TIMEOUT);
2332        }
2333        return 0;
2334error:
2335        kfree(mos7840_port->led_dr);
2336        usb_free_urb(mos7840_port->led_urb);
2337        kfree(mos7840_port->dr);
2338        kfree(mos7840_port->ctrl_buf);
2339        usb_free_urb(mos7840_port->control_urb);
2340        kfree(mos7840_port);
2341
2342        return status;
2343}
2344
2345static int mos7840_port_remove(struct usb_serial_port *port)
2346{
2347        struct moschip_port *mos7840_port;
2348
2349        mos7840_port = mos7840_get_port_private(port);
2350
2351        if (mos7840_port->has_led) {
2352                /* Turn off LED */
2353                mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300);
2354
2355                del_timer_sync(&mos7840_port->led_timer1);
2356                del_timer_sync(&mos7840_port->led_timer2);
2357
2358                usb_kill_urb(mos7840_port->led_urb);
2359                usb_free_urb(mos7840_port->led_urb);
2360                kfree(mos7840_port->led_dr);
2361        }
2362        usb_kill_urb(mos7840_port->control_urb);
2363        usb_free_urb(mos7840_port->control_urb);
2364        kfree(mos7840_port->ctrl_buf);
2365        kfree(mos7840_port->dr);
2366        kfree(mos7840_port);
2367
2368        return 0;
2369}
2370
2371static struct usb_serial_driver moschip7840_4port_device = {
2372        .driver = {
2373                   .owner = THIS_MODULE,
2374                   .name = "mos7840",
2375                   },
2376        .description = DRIVER_DESC,
2377        .id_table = id_table,
2378        .num_interrupt_in = 1,
2379        .open = mos7840_open,
2380        .close = mos7840_close,
2381        .write = mos7840_write,
2382        .write_room = mos7840_write_room,
2383        .chars_in_buffer = mos7840_chars_in_buffer,
2384        .throttle = mos7840_throttle,
2385        .unthrottle = mos7840_unthrottle,
2386        .calc_num_ports = mos7840_calc_num_ports,
2387        .probe = mos7840_probe,
2388        .ioctl = mos7840_ioctl,
2389        .set_termios = mos7840_set_termios,
2390        .break_ctl = mos7840_break,
2391        .tiocmget = mos7840_tiocmget,
2392        .tiocmset = mos7840_tiocmset,
2393        .tiocmiwait = usb_serial_generic_tiocmiwait,
2394        .get_icount = usb_serial_generic_get_icount,
2395        .port_probe = mos7840_port_probe,
2396        .port_remove = mos7840_port_remove,
2397        .read_bulk_callback = mos7840_bulk_in_callback,
2398        .read_int_callback = mos7840_interrupt_callback,
2399};
2400
2401static struct usb_serial_driver * const serial_drivers[] = {
2402        &moschip7840_4port_device, NULL
2403};
2404
2405module_usb_serial_driver(serial_drivers, id_table);
2406
2407MODULE_DESCRIPTION(DRIVER_DESC);
2408MODULE_LICENSE("GPL");
2409