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