cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mos7840.c (53867B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Clean ups from Moschip version and a few ioctl implementations by:
      4 *	Paul B Schroeder <pschroeder "at" uplogix "dot" com>
      5 *
      6 * Originally based on drivers/usb/serial/io_edgeport.c which is:
      7 *      Copyright (C) 2000 Inside Out Networks, All rights reserved.
      8 *      Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
      9 *
     10 */
     11
     12#include <linux/kernel.h>
     13#include <linux/errno.h>
     14#include <linux/slab.h>
     15#include <linux/tty.h>
     16#include <linux/tty_driver.h>
     17#include <linux/tty_flip.h>
     18#include <linux/module.h>
     19#include <linux/serial.h>
     20#include <linux/usb.h>
     21#include <linux/usb/serial.h>
     22#include <linux/uaccess.h>
     23
     24#define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver"
     25
     26/*
     27 * 16C50 UART register defines
     28 */
     29
     30#define LCR_BITS_5             0x00	/* 5 bits/char */
     31#define LCR_BITS_6             0x01	/* 6 bits/char */
     32#define LCR_BITS_7             0x02	/* 7 bits/char */
     33#define LCR_BITS_8             0x03	/* 8 bits/char */
     34#define LCR_BITS_MASK          0x03	/* Mask for bits/char field */
     35
     36#define LCR_STOP_1             0x00	/* 1 stop bit */
     37#define LCR_STOP_1_5           0x04	/* 1.5 stop bits (if 5   bits/char) */
     38#define LCR_STOP_2             0x04	/* 2 stop bits   (if 6-8 bits/char) */
     39#define LCR_STOP_MASK          0x04	/* Mask for stop bits field */
     40
     41#define LCR_PAR_NONE           0x00	/* No parity */
     42#define LCR_PAR_ODD            0x08	/* Odd parity */
     43#define LCR_PAR_EVEN           0x18	/* Even parity */
     44#define LCR_PAR_MARK           0x28	/* Force parity bit to 1 */
     45#define LCR_PAR_SPACE          0x38	/* Force parity bit to 0 */
     46#define LCR_PAR_MASK           0x38	/* Mask for parity field */
     47
     48#define LCR_SET_BREAK          0x40	/* Set Break condition */
     49#define LCR_DL_ENABLE          0x80	/* Enable access to divisor latch */
     50
     51#define MCR_DTR                0x01	/* Assert DTR */
     52#define MCR_RTS                0x02	/* Assert RTS */
     53#define MCR_OUT1               0x04	/* Loopback only: Sets state of RI */
     54#define MCR_MASTER_IE          0x08	/* Enable interrupt outputs */
     55#define MCR_LOOPBACK           0x10	/* Set internal (digital) loopback mode */
     56#define MCR_XON_ANY            0x20	/* Enable any char to exit XOFF mode */
     57
     58#define MOS7840_MSR_CTS        0x10	/* Current state of CTS */
     59#define MOS7840_MSR_DSR        0x20	/* Current state of DSR */
     60#define MOS7840_MSR_RI         0x40	/* Current state of RI */
     61#define MOS7840_MSR_CD         0x80	/* Current state of CD */
     62
     63/*
     64 * Defines used for sending commands to port
     65 */
     66
     67#define MOS_WDR_TIMEOUT		5000	/* default urb timeout */
     68
     69#define MOS_PORT1       0x0200
     70#define MOS_PORT2       0x0300
     71#define MOS_VENREG      0x0000
     72#define MOS_MAX_PORT	0x02
     73#define MOS_WRITE       0x0E
     74#define MOS_READ        0x0D
     75
     76/* Requests */
     77#define MCS_RD_RTYPE    0xC0
     78#define MCS_WR_RTYPE    0x40
     79#define MCS_RDREQ       0x0D
     80#define MCS_WRREQ       0x0E
     81#define MCS_CTRL_TIMEOUT        500
     82#define VENDOR_READ_LENGTH      (0x01)
     83
     84#define MAX_NAME_LEN    64
     85
     86#define ZLP_REG1  0x3A		/* Zero_Flag_Reg1    58 */
     87#define ZLP_REG5  0x3E		/* Zero_Flag_Reg5    62 */
     88
     89/* For higher baud Rates use TIOCEXBAUD */
     90#define TIOCEXBAUD     0x5462
     91
     92/*
     93 * Vendor id and device id defines
     94 *
     95 * NOTE: Do not add new defines, add entries directly to the id_table instead.
     96 */
     97#define USB_VENDOR_ID_BANDB              0x0856
     98#define BANDB_DEVICE_ID_USO9ML2_2        0xAC22
     99#define BANDB_DEVICE_ID_USO9ML2_2P       0xBC00
    100#define BANDB_DEVICE_ID_USO9ML2_4        0xAC24
    101#define BANDB_DEVICE_ID_USO9ML2_4P       0xBC01
    102#define BANDB_DEVICE_ID_US9ML2_2         0xAC29
    103#define BANDB_DEVICE_ID_US9ML2_4         0xAC30
    104#define BANDB_DEVICE_ID_USPTL4_2         0xAC31
    105#define BANDB_DEVICE_ID_USPTL4_4         0xAC32
    106#define BANDB_DEVICE_ID_USOPTL4_2        0xAC42
    107#define BANDB_DEVICE_ID_USOPTL4_2P       0xBC02
    108#define BANDB_DEVICE_ID_USOPTL4_4        0xAC44
    109#define BANDB_DEVICE_ID_USOPTL4_4P       0xBC03
    110
    111/* Interrupt Routine Defines    */
    112
    113#define SERIAL_IIR_RLS      0x06
    114#define SERIAL_IIR_MS       0x00
    115
    116/*
    117 *  Emulation of the bit mask on the LINE STATUS REGISTER.
    118 */
    119#define SERIAL_LSR_DR       0x0001
    120#define SERIAL_LSR_OE       0x0002
    121#define SERIAL_LSR_PE       0x0004
    122#define SERIAL_LSR_FE       0x0008
    123#define SERIAL_LSR_BI       0x0010
    124
    125#define MOS_MSR_DELTA_CTS   0x10
    126#define MOS_MSR_DELTA_DSR   0x20
    127#define MOS_MSR_DELTA_RI    0x40
    128#define MOS_MSR_DELTA_CD    0x80
    129
    130/* Serial Port register Address */
    131#define INTERRUPT_ENABLE_REGISTER  ((__u16)(0x01))
    132#define FIFO_CONTROL_REGISTER      ((__u16)(0x02))
    133#define LINE_CONTROL_REGISTER      ((__u16)(0x03))
    134#define MODEM_CONTROL_REGISTER     ((__u16)(0x04))
    135#define LINE_STATUS_REGISTER       ((__u16)(0x05))
    136#define MODEM_STATUS_REGISTER      ((__u16)(0x06))
    137#define SCRATCH_PAD_REGISTER       ((__u16)(0x07))
    138#define DIVISOR_LATCH_LSB          ((__u16)(0x00))
    139#define DIVISOR_LATCH_MSB          ((__u16)(0x01))
    140
    141#define CLK_MULTI_REGISTER         ((__u16)(0x02))
    142#define CLK_START_VALUE_REGISTER   ((__u16)(0x03))
    143#define GPIO_REGISTER              ((__u16)(0x07))
    144
    145#define SERIAL_LCR_DLAB            ((__u16)(0x0080))
    146
    147/*
    148 * URB POOL related defines
    149 */
    150#define NUM_URBS                        16	/* URB Count */
    151#define URB_TRANSFER_BUFFER_SIZE        32	/* URB Size  */
    152
    153/* LED on/off milliseconds*/
    154#define LED_ON_MS	500
    155#define LED_OFF_MS	500
    156
    157enum mos7840_flag {
    158	MOS7840_FLAG_LED_BUSY,
    159};
    160
    161#define MCS_PORT_MASK	GENMASK(2, 0)
    162#define MCS_PORTS(nr)	((nr) & MCS_PORT_MASK)
    163#define MCS_LED		BIT(3)
    164
    165#define MCS_DEVICE(vid, pid, flags) \
    166		USB_DEVICE((vid), (pid)), .driver_info = (flags)
    167
    168static const struct usb_device_id id_table[] = {
    169	{ MCS_DEVICE(0x0557, 0x2011, MCS_PORTS(4)) },	/* ATEN UC2324 */
    170	{ MCS_DEVICE(0x0557, 0x7820, MCS_PORTS(2)) },	/* ATEN UC2322 */
    171	{ MCS_DEVICE(0x110a, 0x2210, MCS_PORTS(2)) },	/* Moxa UPort 2210 */
    172	{ MCS_DEVICE(0x9710, 0x7810, MCS_PORTS(1) | MCS_LED) }, /* ASIX MCS7810 */
    173	{ MCS_DEVICE(0x9710, 0x7820, MCS_PORTS(2)) },	/* MosChip MCS7820 */
    174	{ MCS_DEVICE(0x9710, 0x7840, MCS_PORTS(4)) },	/* MosChip MCS7840 */
    175	{ MCS_DEVICE(0x9710, 0x7843, MCS_PORTS(3)) },	/* ASIX MCS7840 3 port */
    176	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2) },
    177	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2P) },
    178	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4) },
    179	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4P) },
    180	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_2) },
    181	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_4) },
    182	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_2) },
    183	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4) },
    184	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2) },
    185	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P) },
    186	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4) },
    187	{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P) },
    188	{}			/* terminating entry */
    189};
    190MODULE_DEVICE_TABLE(usb, id_table);
    191
    192/* This structure holds all of the local port information */
    193
    194struct moschip_port {
    195	int port_num;		/*Actual port number in the device(1,2,etc) */
    196	struct urb *read_urb;	/* read URB for this port */
    197	__u8 shadowLCR;		/* last LCR value received */
    198	__u8 shadowMCR;		/* last MCR value received */
    199	struct usb_serial_port *port;	/* loop back to the owner of this object */
    200
    201	/* Offsets */
    202	__u8 SpRegOffset;
    203	__u8 ControlRegOffset;
    204	__u8 DcrRegOffset;
    205
    206	spinlock_t pool_lock;
    207	struct urb *write_urb_pool[NUM_URBS];
    208	char busy[NUM_URBS];
    209	bool read_urb_busy;
    210
    211	/* For device(s) with LED indicator */
    212	bool has_led;
    213	struct timer_list led_timer1;	/* Timer for LED on */
    214	struct timer_list led_timer2;	/* Timer for LED off */
    215	struct urb *led_urb;
    216	struct usb_ctrlrequest *led_dr;
    217
    218	unsigned long flags;
    219};
    220
    221/*
    222 * mos7840_set_reg_sync
    223 * 	To set the Control register by calling usb_fill_control_urb function
    224 *	by passing usb_sndctrlpipe function as parameter.
    225 */
    226
    227static int mos7840_set_reg_sync(struct usb_serial_port *port, __u16 reg,
    228				__u16 val)
    229{
    230	struct usb_device *dev = port->serial->dev;
    231	val = val & 0x00ff;
    232	dev_dbg(&port->dev, "mos7840_set_reg_sync offset is %x, value %x\n", reg, val);
    233
    234	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ,
    235			       MCS_WR_RTYPE, val, reg, NULL, 0,
    236			       MOS_WDR_TIMEOUT);
    237}
    238
    239/*
    240 * mos7840_get_reg_sync
    241 * 	To set the Uart register by calling usb_fill_control_urb function by
    242 *	passing usb_rcvctrlpipe function as parameter.
    243 */
    244
    245static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg,
    246				__u16 *val)
    247{
    248	struct usb_device *dev = port->serial->dev;
    249	int ret = 0;
    250	u8 *buf;
    251
    252	buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
    253	if (!buf)
    254		return -ENOMEM;
    255
    256	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
    257			      MCS_RD_RTYPE, 0, reg, buf, VENDOR_READ_LENGTH,
    258			      MOS_WDR_TIMEOUT);
    259	if (ret < VENDOR_READ_LENGTH) {
    260		if (ret >= 0)
    261			ret = -EIO;
    262		goto out;
    263	}
    264
    265	*val = buf[0];
    266	dev_dbg(&port->dev, "%s offset is %x, return val %x\n", __func__, reg, *val);
    267out:
    268	kfree(buf);
    269	return ret;
    270}
    271
    272/*
    273 * mos7840_set_uart_reg
    274 *	To set the Uart register by calling usb_fill_control_urb function by
    275 *	passing usb_sndctrlpipe function as parameter.
    276 */
    277
    278static int mos7840_set_uart_reg(struct usb_serial_port *port, __u16 reg,
    279				__u16 val)
    280{
    281
    282	struct usb_device *dev = port->serial->dev;
    283	val = val & 0x00ff;
    284	/* For the UART control registers, the application number need
    285	   to be Or'ed */
    286	if (port->serial->num_ports == 2 && port->port_number != 0)
    287		val |= ((__u16)port->port_number + 2) << 8;
    288	else
    289		val |= ((__u16)port->port_number + 1) << 8;
    290	dev_dbg(&port->dev, "%s application number is %x\n", __func__, val);
    291	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ,
    292			       MCS_WR_RTYPE, val, reg, NULL, 0,
    293			       MOS_WDR_TIMEOUT);
    294
    295}
    296
    297/*
    298 * mos7840_get_uart_reg
    299 *	To set the Control register by calling usb_fill_control_urb function
    300 *	by passing usb_rcvctrlpipe function as parameter.
    301 */
    302static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
    303				__u16 *val)
    304{
    305	struct usb_device *dev = port->serial->dev;
    306	int ret = 0;
    307	__u16 Wval;
    308	u8 *buf;
    309
    310	buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
    311	if (!buf)
    312		return -ENOMEM;
    313
    314	/* Wval  is same as application number */
    315	if (port->serial->num_ports == 2 && port->port_number != 0)
    316		Wval = ((__u16)port->port_number + 2) << 8;
    317	else
    318		Wval = ((__u16)port->port_number + 1) << 8;
    319	dev_dbg(&port->dev, "%s application number is %x\n", __func__, Wval);
    320	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
    321			      MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH,
    322			      MOS_WDR_TIMEOUT);
    323	if (ret < VENDOR_READ_LENGTH) {
    324		if (ret >= 0)
    325			ret = -EIO;
    326		goto out;
    327	}
    328	*val = buf[0];
    329out:
    330	kfree(buf);
    331	return ret;
    332}
    333
    334static void mos7840_dump_serial_port(struct usb_serial_port *port,
    335				     struct moschip_port *mos7840_port)
    336{
    337
    338	dev_dbg(&port->dev, "SpRegOffset is %2x\n", mos7840_port->SpRegOffset);
    339	dev_dbg(&port->dev, "ControlRegOffset is %2x\n", mos7840_port->ControlRegOffset);
    340	dev_dbg(&port->dev, "DCRRegOffset is %2x\n", mos7840_port->DcrRegOffset);
    341
    342}
    343
    344/************************************************************************/
    345/************************************************************************/
    346/*            U S B  C A L L B A C K   F U N C T I O N S                */
    347/*            U S B  C A L L B A C K   F U N C T I O N S                */
    348/************************************************************************/
    349/************************************************************************/
    350
    351static void mos7840_set_led_callback(struct urb *urb)
    352{
    353	switch (urb->status) {
    354	case 0:
    355		/* Success */
    356		break;
    357	case -ECONNRESET:
    358	case -ENOENT:
    359	case -ESHUTDOWN:
    360		/* This urb is terminated, clean up */
    361		dev_dbg(&urb->dev->dev, "%s - urb shutting down: %d\n",
    362			__func__, urb->status);
    363		break;
    364	default:
    365		dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n",
    366			__func__, urb->status);
    367	}
    368}
    369
    370static void mos7840_set_led_async(struct moschip_port *mcs, __u16 wval,
    371				__u16 reg)
    372{
    373	struct usb_device *dev = mcs->port->serial->dev;
    374	struct usb_ctrlrequest *dr = mcs->led_dr;
    375
    376	dr->bRequestType = MCS_WR_RTYPE;
    377	dr->bRequest = MCS_WRREQ;
    378	dr->wValue = cpu_to_le16(wval);
    379	dr->wIndex = cpu_to_le16(reg);
    380	dr->wLength = cpu_to_le16(0);
    381
    382	usb_fill_control_urb(mcs->led_urb, dev, usb_sndctrlpipe(dev, 0),
    383		(unsigned char *)dr, NULL, 0, mos7840_set_led_callback, NULL);
    384
    385	usb_submit_urb(mcs->led_urb, GFP_ATOMIC);
    386}
    387
    388static void mos7840_set_led_sync(struct usb_serial_port *port, __u16 reg,
    389				__u16 val)
    390{
    391	struct usb_device *dev = port->serial->dev;
    392
    393	usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ, MCS_WR_RTYPE,
    394			val, reg, NULL, 0, MOS_WDR_TIMEOUT);
    395}
    396
    397static void mos7840_led_off(struct timer_list *t)
    398{
    399	struct moschip_port *mcs = from_timer(mcs, t, led_timer1);
    400
    401	/* Turn off LED */
    402	mos7840_set_led_async(mcs, 0x0300, MODEM_CONTROL_REGISTER);
    403	mod_timer(&mcs->led_timer2,
    404				jiffies + msecs_to_jiffies(LED_OFF_MS));
    405}
    406
    407static void mos7840_led_flag_off(struct timer_list *t)
    408{
    409	struct moschip_port *mcs = from_timer(mcs, t, led_timer2);
    410
    411	clear_bit_unlock(MOS7840_FLAG_LED_BUSY, &mcs->flags);
    412}
    413
    414static void mos7840_led_activity(struct usb_serial_port *port)
    415{
    416	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    417
    418	if (test_and_set_bit_lock(MOS7840_FLAG_LED_BUSY, &mos7840_port->flags))
    419		return;
    420
    421	mos7840_set_led_async(mos7840_port, 0x0301, MODEM_CONTROL_REGISTER);
    422	mod_timer(&mos7840_port->led_timer1,
    423				jiffies + msecs_to_jiffies(LED_ON_MS));
    424}
    425
    426/*****************************************************************************
    427 * mos7840_bulk_in_callback
    428 *	this is the callback function for when we have received data on the
    429 *	bulk in endpoint.
    430 *****************************************************************************/
    431
    432static void mos7840_bulk_in_callback(struct urb *urb)
    433{
    434	struct moschip_port *mos7840_port = urb->context;
    435	struct usb_serial_port *port = mos7840_port->port;
    436	int retval;
    437	unsigned char *data;
    438	int status = urb->status;
    439
    440	if (status) {
    441		dev_dbg(&urb->dev->dev, "nonzero read bulk status received: %d\n", status);
    442		mos7840_port->read_urb_busy = false;
    443		return;
    444	}
    445
    446	data = urb->transfer_buffer;
    447	usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
    448
    449	if (urb->actual_length) {
    450		struct tty_port *tport = &mos7840_port->port->port;
    451		tty_insert_flip_string(tport, data, urb->actual_length);
    452		tty_flip_buffer_push(tport);
    453		port->icount.rx += urb->actual_length;
    454		dev_dbg(&port->dev, "icount.rx is %d:\n", port->icount.rx);
    455	}
    456
    457	if (mos7840_port->has_led)
    458		mos7840_led_activity(port);
    459
    460	mos7840_port->read_urb_busy = true;
    461	retval = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC);
    462
    463	if (retval) {
    464		dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, retval = %d\n", retval);
    465		mos7840_port->read_urb_busy = false;
    466	}
    467}
    468
    469/*****************************************************************************
    470 * mos7840_bulk_out_data_callback
    471 *	this is the callback function for when we have finished sending
    472 *	serial data on the bulk out endpoint.
    473 *****************************************************************************/
    474
    475static void mos7840_bulk_out_data_callback(struct urb *urb)
    476{
    477	struct moschip_port *mos7840_port = urb->context;
    478	struct usb_serial_port *port = mos7840_port->port;
    479	int status = urb->status;
    480	unsigned long flags;
    481	int i;
    482
    483	spin_lock_irqsave(&mos7840_port->pool_lock, flags);
    484	for (i = 0; i < NUM_URBS; i++) {
    485		if (urb == mos7840_port->write_urb_pool[i]) {
    486			mos7840_port->busy[i] = 0;
    487			break;
    488		}
    489	}
    490	spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
    491
    492	if (status) {
    493		dev_dbg(&port->dev, "nonzero write bulk status received:%d\n", status);
    494		return;
    495	}
    496
    497	tty_port_tty_wakeup(&port->port);
    498
    499}
    500
    501/************************************************************************/
    502/*       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       */
    503/************************************************************************/
    504
    505/*****************************************************************************
    506 * mos7840_open
    507 *	this function is called by the tty driver when a port is opened
    508 *	If successful, we return 0
    509 *	Otherwise we return a negative error number.
    510 *****************************************************************************/
    511
    512static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port)
    513{
    514	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    515	struct usb_serial *serial = port->serial;
    516	int response;
    517	int j;
    518	struct urb *urb;
    519	__u16 Data;
    520	int status;
    521
    522	usb_clear_halt(serial->dev, port->write_urb->pipe);
    523	usb_clear_halt(serial->dev, port->read_urb->pipe);
    524
    525	/* Initialising the write urb pool */
    526	for (j = 0; j < NUM_URBS; ++j) {
    527		urb = usb_alloc_urb(0, GFP_KERNEL);
    528		mos7840_port->write_urb_pool[j] = urb;
    529		if (!urb)
    530			continue;
    531
    532		urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
    533								GFP_KERNEL);
    534		if (!urb->transfer_buffer) {
    535			usb_free_urb(urb);
    536			mos7840_port->write_urb_pool[j] = NULL;
    537			continue;
    538		}
    539	}
    540
    541/*****************************************************************************
    542 * Initialize MCS7840 -- Write Init values to corresponding Registers
    543 *
    544 * Register Index
    545 * 1 : IER
    546 * 2 : FCR
    547 * 3 : LCR
    548 * 4 : MCR
    549 *
    550 * 0x08 : SP1/2 Control Reg
    551 *****************************************************************************/
    552
    553	/* NEED to check the following Block */
    554
    555	Data = 0x0;
    556	status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data);
    557	if (status < 0) {
    558		dev_dbg(&port->dev, "Reading Spreg failed\n");
    559		goto err;
    560	}
    561	Data |= 0x80;
    562	status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
    563	if (status < 0) {
    564		dev_dbg(&port->dev, "writing Spreg failed\n");
    565		goto err;
    566	}
    567
    568	Data &= ~0x80;
    569	status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
    570	if (status < 0) {
    571		dev_dbg(&port->dev, "writing Spreg failed\n");
    572		goto err;
    573	}
    574	/* End of block to be checked */
    575
    576	Data = 0x0;
    577	status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
    578									&Data);
    579	if (status < 0) {
    580		dev_dbg(&port->dev, "Reading Controlreg failed\n");
    581		goto err;
    582	}
    583	Data |= 0x08;		/* Driver done bit */
    584	Data |= 0x20;		/* rx_disable */
    585	status = mos7840_set_reg_sync(port,
    586				mos7840_port->ControlRegOffset, Data);
    587	if (status < 0) {
    588		dev_dbg(&port->dev, "writing Controlreg failed\n");
    589		goto err;
    590	}
    591	/* do register settings here */
    592	/* Set all regs to the device default values. */
    593	/***********************************
    594	 * First Disable all interrupts.
    595	 ***********************************/
    596	Data = 0x00;
    597	status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
    598	if (status < 0) {
    599		dev_dbg(&port->dev, "disabling interrupts failed\n");
    600		goto err;
    601	}
    602	/* Set FIFO_CONTROL_REGISTER to the default value */
    603	Data = 0x00;
    604	status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
    605	if (status < 0) {
    606		dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER  failed\n");
    607		goto err;
    608	}
    609
    610	Data = 0xcf;
    611	status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
    612	if (status < 0) {
    613		dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER  failed\n");
    614		goto err;
    615	}
    616
    617	Data = 0x03;
    618	status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
    619	mos7840_port->shadowLCR = Data;
    620
    621	Data = 0x0b;
    622	status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
    623	mos7840_port->shadowMCR = Data;
    624
    625	Data = 0x00;
    626	status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
    627	mos7840_port->shadowLCR = Data;
    628
    629	Data |= SERIAL_LCR_DLAB;	/* data latch enable in LCR 0x80 */
    630	status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
    631
    632	Data = 0x0c;
    633	status = mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data);
    634
    635	Data = 0x0;
    636	status = mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data);
    637
    638	Data = 0x00;
    639	status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
    640
    641	Data = Data & ~SERIAL_LCR_DLAB;
    642	status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
    643	mos7840_port->shadowLCR = Data;
    644
    645	/* clearing Bulkin and Bulkout Fifo */
    646	Data = 0x0;
    647	status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data);
    648
    649	Data = Data | 0x0c;
    650	status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
    651
    652	Data = Data & ~0x0c;
    653	status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
    654	/* Finally enable all interrupts */
    655	Data = 0x0c;
    656	status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
    657
    658	/* clearing rx_disable */
    659	Data = 0x0;
    660	status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
    661									&Data);
    662	Data = Data & ~0x20;
    663	status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
    664									Data);
    665
    666	/* rx_negate */
    667	Data = 0x0;
    668	status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
    669									&Data);
    670	Data = Data | 0x10;
    671	status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
    672									Data);
    673
    674	dev_dbg(&port->dev, "port number is %d\n", port->port_number);
    675	dev_dbg(&port->dev, "minor number is %d\n", port->minor);
    676	dev_dbg(&port->dev, "Bulkin endpoint is %d\n", port->bulk_in_endpointAddress);
    677	dev_dbg(&port->dev, "BulkOut endpoint is %d\n", port->bulk_out_endpointAddress);
    678	dev_dbg(&port->dev, "Interrupt endpoint is %d\n", port->interrupt_in_endpointAddress);
    679	dev_dbg(&port->dev, "port's number in the device is %d\n", mos7840_port->port_num);
    680	mos7840_port->read_urb = port->read_urb;
    681
    682	/* set up our bulk in urb */
    683	if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) {
    684		usb_fill_bulk_urb(mos7840_port->read_urb,
    685			serial->dev,
    686			usb_rcvbulkpipe(serial->dev,
    687				(port->bulk_in_endpointAddress) + 2),
    688			port->bulk_in_buffer,
    689			mos7840_port->read_urb->transfer_buffer_length,
    690			mos7840_bulk_in_callback, mos7840_port);
    691	} else {
    692		usb_fill_bulk_urb(mos7840_port->read_urb,
    693			serial->dev,
    694			usb_rcvbulkpipe(serial->dev,
    695				port->bulk_in_endpointAddress),
    696			port->bulk_in_buffer,
    697			mos7840_port->read_urb->transfer_buffer_length,
    698			mos7840_bulk_in_callback, mos7840_port);
    699	}
    700
    701	dev_dbg(&port->dev, "%s: bulkin endpoint is %d\n", __func__, port->bulk_in_endpointAddress);
    702	mos7840_port->read_urb_busy = true;
    703	response = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
    704	if (response) {
    705		dev_err(&port->dev, "%s - Error %d submitting control urb\n",
    706			__func__, response);
    707		mos7840_port->read_urb_busy = false;
    708	}
    709
    710	/* initialize our port settings */
    711	/* Must set to enable ints! */
    712	mos7840_port->shadowMCR = MCR_MASTER_IE;
    713
    714	return 0;
    715err:
    716	for (j = 0; j < NUM_URBS; ++j) {
    717		urb = mos7840_port->write_urb_pool[j];
    718		if (!urb)
    719			continue;
    720		kfree(urb->transfer_buffer);
    721		usb_free_urb(urb);
    722	}
    723	return status;
    724}
    725
    726/*****************************************************************************
    727 * mos7840_chars_in_buffer
    728 *	this function is called by the tty driver when it wants to know how many
    729 *	bytes of data we currently have outstanding in the port (data that has
    730 *	been written, but hasn't made it out the port yet)
    731 *****************************************************************************/
    732
    733static unsigned int mos7840_chars_in_buffer(struct tty_struct *tty)
    734{
    735	struct usb_serial_port *port = tty->driver_data;
    736	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    737	int i;
    738	unsigned int chars = 0;
    739	unsigned long flags;
    740
    741	spin_lock_irqsave(&mos7840_port->pool_lock, flags);
    742	for (i = 0; i < NUM_URBS; ++i) {
    743		if (mos7840_port->busy[i]) {
    744			struct urb *urb = mos7840_port->write_urb_pool[i];
    745			chars += urb->transfer_buffer_length;
    746		}
    747	}
    748	spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
    749	dev_dbg(&port->dev, "%s - returns %u\n", __func__, chars);
    750	return chars;
    751
    752}
    753
    754/*****************************************************************************
    755 * mos7840_close
    756 *	this function is called by the tty driver when a port is closed
    757 *****************************************************************************/
    758
    759static void mos7840_close(struct usb_serial_port *port)
    760{
    761	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    762	int j;
    763	__u16 Data;
    764
    765	for (j = 0; j < NUM_URBS; ++j)
    766		usb_kill_urb(mos7840_port->write_urb_pool[j]);
    767
    768	/* Freeing Write URBs */
    769	for (j = 0; j < NUM_URBS; ++j) {
    770		if (mos7840_port->write_urb_pool[j]) {
    771			kfree(mos7840_port->write_urb_pool[j]->transfer_buffer);
    772			usb_free_urb(mos7840_port->write_urb_pool[j]);
    773		}
    774	}
    775
    776	usb_kill_urb(mos7840_port->read_urb);
    777	mos7840_port->read_urb_busy = false;
    778
    779	Data = 0x0;
    780	mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
    781
    782	Data = 0x00;
    783	mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
    784}
    785
    786/*****************************************************************************
    787 * mos7840_break
    788 *	this function sends a break to the port
    789 *****************************************************************************/
    790static void mos7840_break(struct tty_struct *tty, int break_state)
    791{
    792	struct usb_serial_port *port = tty->driver_data;
    793	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    794	unsigned char data;
    795
    796	if (break_state == -1)
    797		data = mos7840_port->shadowLCR | LCR_SET_BREAK;
    798	else
    799		data = mos7840_port->shadowLCR & ~LCR_SET_BREAK;
    800
    801	/* FIXME: no locking on shadowLCR anywhere in driver */
    802	mos7840_port->shadowLCR = data;
    803	dev_dbg(&port->dev, "%s mos7840_port->shadowLCR is %x\n", __func__, mos7840_port->shadowLCR);
    804	mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER,
    805			     mos7840_port->shadowLCR);
    806}
    807
    808/*****************************************************************************
    809 * mos7840_write_room
    810 *	this function is called by the tty driver when it wants to know how many
    811 *	bytes of data we can accept for a specific port.
    812 *****************************************************************************/
    813
    814static unsigned int mos7840_write_room(struct tty_struct *tty)
    815{
    816	struct usb_serial_port *port = tty->driver_data;
    817	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    818	int i;
    819	unsigned int room = 0;
    820	unsigned long flags;
    821
    822	spin_lock_irqsave(&mos7840_port->pool_lock, flags);
    823	for (i = 0; i < NUM_URBS; ++i) {
    824		if (!mos7840_port->busy[i])
    825			room += URB_TRANSFER_BUFFER_SIZE;
    826	}
    827	spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
    828
    829	room = (room == 0) ? 0 : room - URB_TRANSFER_BUFFER_SIZE + 1;
    830	dev_dbg(&mos7840_port->port->dev, "%s - returns %u\n", __func__, room);
    831	return room;
    832
    833}
    834
    835/*****************************************************************************
    836 * mos7840_write
    837 *	this function is called by the tty driver when data should be written to
    838 *	the port.
    839 *	If successful, we return the number of bytes written, otherwise we
    840 *      return a negative error number.
    841 *****************************************************************************/
    842
    843static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
    844			 const unsigned char *data, int count)
    845{
    846	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    847	struct usb_serial *serial = port->serial;
    848	int status;
    849	int i;
    850	int bytes_sent = 0;
    851	int transfer_size;
    852	unsigned long flags;
    853	struct urb *urb;
    854	/* __u16 Data; */
    855	const unsigned char *current_position = data;
    856
    857	/* try to find a free urb in the list */
    858	urb = NULL;
    859
    860	spin_lock_irqsave(&mos7840_port->pool_lock, flags);
    861	for (i = 0; i < NUM_URBS; ++i) {
    862		if (!mos7840_port->busy[i]) {
    863			mos7840_port->busy[i] = 1;
    864			urb = mos7840_port->write_urb_pool[i];
    865			dev_dbg(&port->dev, "URB:%d\n", i);
    866			break;
    867		}
    868	}
    869	spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
    870
    871	if (urb == NULL) {
    872		dev_dbg(&port->dev, "%s - no more free urbs\n", __func__);
    873		goto exit;
    874	}
    875
    876	if (urb->transfer_buffer == NULL) {
    877		urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
    878					       GFP_ATOMIC);
    879		if (!urb->transfer_buffer) {
    880			bytes_sent = -ENOMEM;
    881			goto exit;
    882		}
    883	}
    884	transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
    885
    886	memcpy(urb->transfer_buffer, current_position, transfer_size);
    887
    888	/* fill urb with data and submit  */
    889	if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) {
    890		usb_fill_bulk_urb(urb,
    891			serial->dev,
    892			usb_sndbulkpipe(serial->dev,
    893				(port->bulk_out_endpointAddress) + 2),
    894			urb->transfer_buffer,
    895			transfer_size,
    896			mos7840_bulk_out_data_callback, mos7840_port);
    897	} else {
    898		usb_fill_bulk_urb(urb,
    899			serial->dev,
    900			usb_sndbulkpipe(serial->dev,
    901				port->bulk_out_endpointAddress),
    902			urb->transfer_buffer,
    903			transfer_size,
    904			mos7840_bulk_out_data_callback, mos7840_port);
    905	}
    906
    907	dev_dbg(&port->dev, "bulkout endpoint is %d\n", port->bulk_out_endpointAddress);
    908
    909	if (mos7840_port->has_led)
    910		mos7840_led_activity(port);
    911
    912	/* send it down the pipe */
    913	status = usb_submit_urb(urb, GFP_ATOMIC);
    914
    915	if (status) {
    916		mos7840_port->busy[i] = 0;
    917		dev_err_console(port, "%s - usb_submit_urb(write bulk) failed "
    918			"with status = %d\n", __func__, status);
    919		bytes_sent = status;
    920		goto exit;
    921	}
    922	bytes_sent = transfer_size;
    923	port->icount.tx += transfer_size;
    924	dev_dbg(&port->dev, "icount.tx is %d:\n", port->icount.tx);
    925exit:
    926	return bytes_sent;
    927
    928}
    929
    930/*****************************************************************************
    931 * mos7840_throttle
    932 *	this function is called by the tty driver when it wants to stop the data
    933 *	being read from the port.
    934 *****************************************************************************/
    935
    936static void mos7840_throttle(struct tty_struct *tty)
    937{
    938	struct usb_serial_port *port = tty->driver_data;
    939	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    940	int status;
    941
    942	/* if we are implementing XON/XOFF, send the stop character */
    943	if (I_IXOFF(tty)) {
    944		unsigned char stop_char = STOP_CHAR(tty);
    945		status = mos7840_write(tty, port, &stop_char, 1);
    946		if (status <= 0)
    947			return;
    948	}
    949	/* if we are implementing RTS/CTS, toggle that line */
    950	if (C_CRTSCTS(tty)) {
    951		mos7840_port->shadowMCR &= ~MCR_RTS;
    952		status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
    953					 mos7840_port->shadowMCR);
    954		if (status < 0)
    955			return;
    956	}
    957}
    958
    959/*****************************************************************************
    960 * mos7840_unthrottle
    961 *	this function is called by the tty driver when it wants to resume
    962 *	the data being read from the port (called after mos7840_throttle is
    963 *	called)
    964 *****************************************************************************/
    965static void mos7840_unthrottle(struct tty_struct *tty)
    966{
    967	struct usb_serial_port *port = tty->driver_data;
    968	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
    969	int status;
    970
    971	/* if we are implementing XON/XOFF, send the start character */
    972	if (I_IXOFF(tty)) {
    973		unsigned char start_char = START_CHAR(tty);
    974		status = mos7840_write(tty, port, &start_char, 1);
    975		if (status <= 0)
    976			return;
    977	}
    978
    979	/* if we are implementing RTS/CTS, toggle that line */
    980	if (C_CRTSCTS(tty)) {
    981		mos7840_port->shadowMCR |= MCR_RTS;
    982		status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
    983					 mos7840_port->shadowMCR);
    984		if (status < 0)
    985			return;
    986	}
    987}
    988
    989static int mos7840_tiocmget(struct tty_struct *tty)
    990{
    991	struct usb_serial_port *port = tty->driver_data;
    992	unsigned int result;
    993	__u16 msr;
    994	__u16 mcr;
    995	int status;
    996
    997	status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr);
    998	if (status < 0)
    999		return -EIO;
   1000	status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr);
   1001	if (status < 0)
   1002		return -EIO;
   1003	result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0)
   1004	    | ((mcr & MCR_RTS) ? TIOCM_RTS : 0)
   1005	    | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0)
   1006	    | ((msr & MOS7840_MSR_CTS) ? TIOCM_CTS : 0)
   1007	    | ((msr & MOS7840_MSR_CD) ? TIOCM_CAR : 0)
   1008	    | ((msr & MOS7840_MSR_RI) ? TIOCM_RI : 0)
   1009	    | ((msr & MOS7840_MSR_DSR) ? TIOCM_DSR : 0);
   1010
   1011	dev_dbg(&port->dev, "%s - 0x%04X\n", __func__, result);
   1012
   1013	return result;
   1014}
   1015
   1016static int mos7840_tiocmset(struct tty_struct *tty,
   1017			    unsigned int set, unsigned int clear)
   1018{
   1019	struct usb_serial_port *port = tty->driver_data;
   1020	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
   1021	unsigned int mcr;
   1022	int status;
   1023
   1024	/* FIXME: What locks the port registers ? */
   1025	mcr = mos7840_port->shadowMCR;
   1026	if (clear & TIOCM_RTS)
   1027		mcr &= ~MCR_RTS;
   1028	if (clear & TIOCM_DTR)
   1029		mcr &= ~MCR_DTR;
   1030	if (clear & TIOCM_LOOP)
   1031		mcr &= ~MCR_LOOPBACK;
   1032
   1033	if (set & TIOCM_RTS)
   1034		mcr |= MCR_RTS;
   1035	if (set & TIOCM_DTR)
   1036		mcr |= MCR_DTR;
   1037	if (set & TIOCM_LOOP)
   1038		mcr |= MCR_LOOPBACK;
   1039
   1040	mos7840_port->shadowMCR = mcr;
   1041
   1042	status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, mcr);
   1043	if (status < 0) {
   1044		dev_dbg(&port->dev, "setting MODEM_CONTROL_REGISTER Failed\n");
   1045		return status;
   1046	}
   1047
   1048	return 0;
   1049}
   1050
   1051/*****************************************************************************
   1052 * mos7840_calc_baud_rate_divisor
   1053 *	this function calculates the proper baud rate divisor for the specified
   1054 *	baud rate.
   1055 *****************************************************************************/
   1056static int mos7840_calc_baud_rate_divisor(struct usb_serial_port *port,
   1057					  int baudRate, int *divisor,
   1058					  __u16 *clk_sel_val)
   1059{
   1060	dev_dbg(&port->dev, "%s - %d\n", __func__, baudRate);
   1061
   1062	if (baudRate <= 115200) {
   1063		*divisor = 115200 / baudRate;
   1064		*clk_sel_val = 0x0;
   1065	}
   1066	if ((baudRate > 115200) && (baudRate <= 230400)) {
   1067		*divisor = 230400 / baudRate;
   1068		*clk_sel_val = 0x10;
   1069	} else if ((baudRate > 230400) && (baudRate <= 403200)) {
   1070		*divisor = 403200 / baudRate;
   1071		*clk_sel_val = 0x20;
   1072	} else if ((baudRate > 403200) && (baudRate <= 460800)) {
   1073		*divisor = 460800 / baudRate;
   1074		*clk_sel_val = 0x30;
   1075	} else if ((baudRate > 460800) && (baudRate <= 806400)) {
   1076		*divisor = 806400 / baudRate;
   1077		*clk_sel_val = 0x40;
   1078	} else if ((baudRate > 806400) && (baudRate <= 921600)) {
   1079		*divisor = 921600 / baudRate;
   1080		*clk_sel_val = 0x50;
   1081	} else if ((baudRate > 921600) && (baudRate <= 1572864)) {
   1082		*divisor = 1572864 / baudRate;
   1083		*clk_sel_val = 0x60;
   1084	} else if ((baudRate > 1572864) && (baudRate <= 3145728)) {
   1085		*divisor = 3145728 / baudRate;
   1086		*clk_sel_val = 0x70;
   1087	}
   1088	return 0;
   1089}
   1090
   1091/*****************************************************************************
   1092 * mos7840_send_cmd_write_baud_rate
   1093 *	this function sends the proper command to change the baud rate of the
   1094 *	specified port.
   1095 *****************************************************************************/
   1096
   1097static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
   1098					    int baudRate)
   1099{
   1100	struct usb_serial_port *port = mos7840_port->port;
   1101	int divisor = 0;
   1102	int status;
   1103	__u16 Data;
   1104	__u16 clk_sel_val;
   1105
   1106	dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudRate);
   1107	/* reset clk_uart_sel in spregOffset */
   1108	if (baudRate > 115200) {
   1109#ifdef HW_flow_control
   1110		/* NOTE: need to see the pther register to modify */
   1111		/* setting h/w flow control bit to 1 */
   1112		Data = 0x2b;
   1113		mos7840_port->shadowMCR = Data;
   1114		status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
   1115									Data);
   1116		if (status < 0) {
   1117			dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
   1118			return -1;
   1119		}
   1120#endif
   1121
   1122	} else {
   1123#ifdef HW_flow_control
   1124		/* setting h/w flow control bit to 0 */
   1125		Data = 0xb;
   1126		mos7840_port->shadowMCR = Data;
   1127		status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
   1128									Data);
   1129		if (status < 0) {
   1130			dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
   1131			return -1;
   1132		}
   1133#endif
   1134
   1135	}
   1136
   1137	if (1) {		/* baudRate <= 115200) */
   1138		clk_sel_val = 0x0;
   1139		Data = 0x0;
   1140		status = mos7840_calc_baud_rate_divisor(port, baudRate, &divisor,
   1141						   &clk_sel_val);
   1142		status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset,
   1143								 &Data);
   1144		if (status < 0) {
   1145			dev_dbg(&port->dev, "reading spreg failed in set_serial_baud\n");
   1146			return -1;
   1147		}
   1148		Data = (Data & 0x8f) | clk_sel_val;
   1149		status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset,
   1150								Data);
   1151		if (status < 0) {
   1152			dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
   1153			return -1;
   1154		}
   1155		/* Calculate the Divisor */
   1156
   1157		if (status) {
   1158			dev_err(&port->dev, "%s - bad baud rate\n", __func__);
   1159			return status;
   1160		}
   1161		/* Enable access to divisor latch */
   1162		Data = mos7840_port->shadowLCR | SERIAL_LCR_DLAB;
   1163		mos7840_port->shadowLCR = Data;
   1164		mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
   1165
   1166		/* Write the divisor */
   1167		Data = (unsigned char)(divisor & 0xff);
   1168		dev_dbg(&port->dev, "set_serial_baud Value to write DLL is %x\n", Data);
   1169		mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data);
   1170
   1171		Data = (unsigned char)((divisor & 0xff00) >> 8);
   1172		dev_dbg(&port->dev, "set_serial_baud Value to write DLM is %x\n", Data);
   1173		mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data);
   1174
   1175		/* Disable access to divisor latch */
   1176		Data = mos7840_port->shadowLCR & ~SERIAL_LCR_DLAB;
   1177		mos7840_port->shadowLCR = Data;
   1178		mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
   1179
   1180	}
   1181	return status;
   1182}
   1183
   1184/*****************************************************************************
   1185 * mos7840_change_port_settings
   1186 *	This routine is called to set the UART on the device to match
   1187 *      the specified new settings.
   1188 *****************************************************************************/
   1189
   1190static void mos7840_change_port_settings(struct tty_struct *tty,
   1191	struct moschip_port *mos7840_port, struct ktermios *old_termios)
   1192{
   1193	struct usb_serial_port *port = mos7840_port->port;
   1194	int baud;
   1195	unsigned cflag;
   1196	__u8 lData;
   1197	__u8 lParity;
   1198	__u8 lStop;
   1199	int status;
   1200	__u16 Data;
   1201
   1202	lData = LCR_BITS_8;
   1203	lStop = LCR_STOP_1;
   1204	lParity = LCR_PAR_NONE;
   1205
   1206	cflag = tty->termios.c_cflag;
   1207
   1208	/* Change the number of bits */
   1209	switch (cflag & CSIZE) {
   1210	case CS5:
   1211		lData = LCR_BITS_5;
   1212		break;
   1213
   1214	case CS6:
   1215		lData = LCR_BITS_6;
   1216		break;
   1217
   1218	case CS7:
   1219		lData = LCR_BITS_7;
   1220		break;
   1221
   1222	default:
   1223	case CS8:
   1224		lData = LCR_BITS_8;
   1225		break;
   1226	}
   1227
   1228	/* Change the Parity bit */
   1229	if (cflag & PARENB) {
   1230		if (cflag & PARODD) {
   1231			lParity = LCR_PAR_ODD;
   1232			dev_dbg(&port->dev, "%s - parity = odd\n", __func__);
   1233		} else {
   1234			lParity = LCR_PAR_EVEN;
   1235			dev_dbg(&port->dev, "%s - parity = even\n", __func__);
   1236		}
   1237
   1238	} else {
   1239		dev_dbg(&port->dev, "%s - parity = none\n", __func__);
   1240	}
   1241
   1242	if (cflag & CMSPAR)
   1243		lParity = lParity | 0x20;
   1244
   1245	/* Change the Stop bit */
   1246	if (cflag & CSTOPB) {
   1247		lStop = LCR_STOP_2;
   1248		dev_dbg(&port->dev, "%s - stop bits = 2\n", __func__);
   1249	} else {
   1250		lStop = LCR_STOP_1;
   1251		dev_dbg(&port->dev, "%s - stop bits = 1\n", __func__);
   1252	}
   1253
   1254	/* Update the LCR with the correct value */
   1255	mos7840_port->shadowLCR &=
   1256	    ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK);
   1257	mos7840_port->shadowLCR |= (lData | lParity | lStop);
   1258
   1259	dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is %x\n", __func__,
   1260		mos7840_port->shadowLCR);
   1261	/* Disable Interrupts */
   1262	Data = 0x00;
   1263	mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
   1264
   1265	Data = 0x00;
   1266	mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
   1267
   1268	Data = 0xcf;
   1269	mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
   1270
   1271	/* Send the updated LCR value to the mos7840 */
   1272	Data = mos7840_port->shadowLCR;
   1273
   1274	mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
   1275
   1276	Data = 0x00b;
   1277	mos7840_port->shadowMCR = Data;
   1278	mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
   1279	Data = 0x00b;
   1280	mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
   1281
   1282	/* set up the MCR register and send it to the mos7840 */
   1283
   1284	mos7840_port->shadowMCR = MCR_MASTER_IE;
   1285	if (cflag & CBAUD)
   1286		mos7840_port->shadowMCR |= (MCR_DTR | MCR_RTS);
   1287
   1288	if (cflag & CRTSCTS)
   1289		mos7840_port->shadowMCR |= (MCR_XON_ANY);
   1290	else
   1291		mos7840_port->shadowMCR &= ~(MCR_XON_ANY);
   1292
   1293	Data = mos7840_port->shadowMCR;
   1294	mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
   1295
   1296	/* Determine divisor based on baud rate */
   1297	baud = tty_get_baud_rate(tty);
   1298
   1299	if (!baud) {
   1300		/* pick a default, any default... */
   1301		dev_dbg(&port->dev, "%s", "Picked default baud...\n");
   1302		baud = 9600;
   1303	}
   1304
   1305	dev_dbg(&port->dev, "%s - baud rate = %d\n", __func__, baud);
   1306	status = mos7840_send_cmd_write_baud_rate(mos7840_port, baud);
   1307
   1308	/* Enable Interrupts */
   1309	Data = 0x0c;
   1310	mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
   1311
   1312	if (!mos7840_port->read_urb_busy) {
   1313		mos7840_port->read_urb_busy = true;
   1314		status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
   1315		if (status) {
   1316			dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n",
   1317			    status);
   1318			mos7840_port->read_urb_busy = false;
   1319		}
   1320	}
   1321	dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is End %x\n", __func__,
   1322		mos7840_port->shadowLCR);
   1323}
   1324
   1325/*****************************************************************************
   1326 * mos7840_set_termios
   1327 *	this function is called by the tty driver when it wants to change
   1328 *	the termios structure
   1329 *****************************************************************************/
   1330
   1331static void mos7840_set_termios(struct tty_struct *tty,
   1332				struct usb_serial_port *port,
   1333				struct ktermios *old_termios)
   1334{
   1335	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
   1336	int status;
   1337
   1338	/* change the port settings to the new ones specified */
   1339
   1340	mos7840_change_port_settings(tty, mos7840_port, old_termios);
   1341
   1342	if (!mos7840_port->read_urb_busy) {
   1343		mos7840_port->read_urb_busy = true;
   1344		status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
   1345		if (status) {
   1346			dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n",
   1347			    status);
   1348			mos7840_port->read_urb_busy = false;
   1349		}
   1350	}
   1351}
   1352
   1353/*****************************************************************************
   1354 * mos7840_get_lsr_info - get line status register info
   1355 *
   1356 * Purpose: Let user call ioctl() to get info when the UART physically
   1357 * 	    is emptied.  On bus types like RS485, the transmitter must
   1358 * 	    release the bus after transmitting. This must be done when
   1359 * 	    the transmit shift register is empty, not be done when the
   1360 * 	    transmit holding register is empty.  This functionality
   1361 * 	    allows an RS485 driver to be written in user space.
   1362 *****************************************************************************/
   1363
   1364static int mos7840_get_lsr_info(struct tty_struct *tty,
   1365				unsigned int __user *value)
   1366{
   1367	int count;
   1368	unsigned int result = 0;
   1369
   1370	count = mos7840_chars_in_buffer(tty);
   1371	if (count == 0)
   1372		result = TIOCSER_TEMT;
   1373
   1374	if (copy_to_user(value, &result, sizeof(int)))
   1375		return -EFAULT;
   1376	return 0;
   1377}
   1378
   1379/*****************************************************************************
   1380 * SerialIoctl
   1381 *	this function handles any ioctl calls to the driver
   1382 *****************************************************************************/
   1383
   1384static int mos7840_ioctl(struct tty_struct *tty,
   1385			 unsigned int cmd, unsigned long arg)
   1386{
   1387	struct usb_serial_port *port = tty->driver_data;
   1388	void __user *argp = (void __user *)arg;
   1389
   1390	switch (cmd) {
   1391		/* return number of bytes available */
   1392
   1393	case TIOCSERGETLSR:
   1394		dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
   1395		return mos7840_get_lsr_info(tty, argp);
   1396
   1397	default:
   1398		break;
   1399	}
   1400	return -ENOIOCTLCMD;
   1401}
   1402
   1403/*
   1404 * Check if GPO (pin 42) is connected to GPI (pin 33) as recommended by ASIX
   1405 * for MCS7810 by bit-banging a 16-bit word.
   1406 *
   1407 * Note that GPO is really RTS of the third port so this will toggle RTS of
   1408 * port two or three on two- and four-port devices.
   1409 */
   1410static int mos7810_check(struct usb_serial *serial)
   1411{
   1412	int i, pass_count = 0;
   1413	u8 *buf;
   1414	__u16 data = 0, mcr_data = 0;
   1415	__u16 test_pattern = 0x55AA;
   1416	int res;
   1417
   1418	buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
   1419	if (!buf)
   1420		return 0;	/* failed to identify 7810 */
   1421
   1422	/* Store MCR setting */
   1423	res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
   1424		MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER,
   1425		buf, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
   1426	if (res == VENDOR_READ_LENGTH)
   1427		mcr_data = *buf;
   1428
   1429	for (i = 0; i < 16; i++) {
   1430		/* Send the 1-bit test pattern out to MCS7810 test pin */
   1431		usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
   1432			MCS_WRREQ, MCS_WR_RTYPE,
   1433			(0x0300 | (((test_pattern >> i) & 0x0001) << 1)),
   1434			MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT);
   1435
   1436		/* Read the test pattern back */
   1437		res = usb_control_msg(serial->dev,
   1438				usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ,
   1439				MCS_RD_RTYPE, 0, GPIO_REGISTER, buf,
   1440				VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
   1441		if (res == VENDOR_READ_LENGTH)
   1442			data = *buf;
   1443
   1444		/* If this is a MCS7810 device, both test patterns must match */
   1445		if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001)
   1446			break;
   1447
   1448		pass_count++;
   1449	}
   1450
   1451	/* Restore MCR setting */
   1452	usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), MCS_WRREQ,
   1453		MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL,
   1454		0, MOS_WDR_TIMEOUT);
   1455
   1456	kfree(buf);
   1457
   1458	if (pass_count == 16)
   1459		return 1;
   1460
   1461	return 0;
   1462}
   1463
   1464static int mos7840_probe(struct usb_serial *serial,
   1465				const struct usb_device_id *id)
   1466{
   1467	unsigned long device_flags = id->driver_info;
   1468	u8 *buf;
   1469
   1470	/* Skip device-type detection if we already have device flags. */
   1471	if (device_flags)
   1472		goto out;
   1473
   1474	buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
   1475	if (!buf)
   1476		return -ENOMEM;
   1477
   1478	usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
   1479			MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf,
   1480			VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
   1481
   1482	/* For a MCS7840 device GPIO0 must be set to 1 */
   1483	if (buf[0] & 0x01)
   1484		device_flags = MCS_PORTS(4);
   1485	else if (mos7810_check(serial))
   1486		device_flags = MCS_PORTS(1) | MCS_LED;
   1487	else
   1488		device_flags = MCS_PORTS(2);
   1489
   1490	kfree(buf);
   1491out:
   1492	usb_set_serial_data(serial, (void *)device_flags);
   1493
   1494	return 0;
   1495}
   1496
   1497static int mos7840_calc_num_ports(struct usb_serial *serial,
   1498					struct usb_serial_endpoints *epds)
   1499{
   1500	unsigned long device_flags = (unsigned long)usb_get_serial_data(serial);
   1501	int num_ports = MCS_PORTS(device_flags);
   1502
   1503	if (num_ports == 0 || num_ports > 4)
   1504		return -ENODEV;
   1505
   1506	if (epds->num_bulk_in < num_ports || epds->num_bulk_out < num_ports) {
   1507		dev_err(&serial->interface->dev, "missing endpoints\n");
   1508		return -ENODEV;
   1509	}
   1510
   1511	return num_ports;
   1512}
   1513
   1514static int mos7840_attach(struct usb_serial *serial)
   1515{
   1516	struct device *dev = &serial->interface->dev;
   1517	int status;
   1518	u16 val;
   1519
   1520	/* Zero Length flag enable */
   1521	val = 0x0f;
   1522	status = mos7840_set_reg_sync(serial->port[0], ZLP_REG5, val);
   1523	if (status < 0)
   1524		dev_dbg(dev, "Writing ZLP_REG5 failed status-0x%x\n", status);
   1525	else
   1526		dev_dbg(dev, "ZLP_REG5 Writing success status%d\n", status);
   1527
   1528	return status;
   1529}
   1530
   1531static int mos7840_port_probe(struct usb_serial_port *port)
   1532{
   1533	struct usb_serial *serial = port->serial;
   1534	unsigned long device_flags = (unsigned long)usb_get_serial_data(serial);
   1535	struct moschip_port *mos7840_port;
   1536	int status;
   1537	int pnum;
   1538	__u16 Data;
   1539
   1540	/* we set up the pointers to the endpoints in the mos7840_open *
   1541	 * function, as the structures aren't created yet.             */
   1542
   1543	pnum = port->port_number;
   1544
   1545	dev_dbg(&port->dev, "mos7840_startup: configuring port %d\n", pnum);
   1546	mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL);
   1547	if (!mos7840_port)
   1548		return -ENOMEM;
   1549
   1550	/* Initialize all port interrupt end point to port 0 int
   1551	 * endpoint. Our device has only one interrupt end point
   1552	 * common to all port */
   1553
   1554	mos7840_port->port = port;
   1555	spin_lock_init(&mos7840_port->pool_lock);
   1556
   1557	/* minor is not initialised until later by
   1558	 * usb-serial.c:get_free_serial() and cannot therefore be used
   1559	 * to index device instances */
   1560	mos7840_port->port_num = pnum + 1;
   1561	dev_dbg(&port->dev, "port->minor = %d\n", port->minor);
   1562	dev_dbg(&port->dev, "mos7840_port->port_num = %d\n", mos7840_port->port_num);
   1563
   1564	if (mos7840_port->port_num == 1) {
   1565		mos7840_port->SpRegOffset = 0x0;
   1566		mos7840_port->ControlRegOffset = 0x1;
   1567		mos7840_port->DcrRegOffset = 0x4;
   1568	} else {
   1569		u8 phy_num = mos7840_port->port_num;
   1570
   1571		/* Port 2 in the 2-port case uses registers of port 3 */
   1572		if (serial->num_ports == 2)
   1573			phy_num = 3;
   1574
   1575		mos7840_port->SpRegOffset = 0x8 + 2 * (phy_num - 2);
   1576		mos7840_port->ControlRegOffset = 0x9 + 2 * (phy_num - 2);
   1577		mos7840_port->DcrRegOffset = 0x16 + 3 * (phy_num - 2);
   1578	}
   1579	mos7840_dump_serial_port(port, mos7840_port);
   1580	usb_set_serial_port_data(port, mos7840_port);
   1581
   1582	/* enable rx_disable bit in control register */
   1583	status = mos7840_get_reg_sync(port,
   1584			mos7840_port->ControlRegOffset, &Data);
   1585	if (status < 0) {
   1586		dev_dbg(&port->dev, "Reading ControlReg failed status-0x%x\n", status);
   1587		goto error;
   1588	} else
   1589		dev_dbg(&port->dev, "ControlReg Reading success val is %x, status%d\n", Data, status);
   1590	Data |= 0x08;	/* setting driver done bit */
   1591	Data |= 0x04;	/* sp1_bit to have cts change reflect in
   1592			   modem status reg */
   1593
   1594	/* Data |= 0x20; //rx_disable bit */
   1595	status = mos7840_set_reg_sync(port,
   1596			mos7840_port->ControlRegOffset, Data);
   1597	if (status < 0) {
   1598		dev_dbg(&port->dev, "Writing ControlReg failed(rx_disable) status-0x%x\n", status);
   1599		goto error;
   1600	} else
   1601		dev_dbg(&port->dev, "ControlReg Writing success(rx_disable) status%d\n", status);
   1602
   1603	/* Write default values in DCR (i.e 0x01 in DCR0, 0x05 in DCR2
   1604	   and 0x24 in DCR3 */
   1605	Data = 0x01;
   1606	status = mos7840_set_reg_sync(port,
   1607			(__u16) (mos7840_port->DcrRegOffset + 0), Data);
   1608	if (status < 0) {
   1609		dev_dbg(&port->dev, "Writing DCR0 failed status-0x%x\n", status);
   1610		goto error;
   1611	} else
   1612		dev_dbg(&port->dev, "DCR0 Writing success status%d\n", status);
   1613
   1614	Data = 0x05;
   1615	status = mos7840_set_reg_sync(port,
   1616			(__u16) (mos7840_port->DcrRegOffset + 1), Data);
   1617	if (status < 0) {
   1618		dev_dbg(&port->dev, "Writing DCR1 failed status-0x%x\n", status);
   1619		goto error;
   1620	} else
   1621		dev_dbg(&port->dev, "DCR1 Writing success status%d\n", status);
   1622
   1623	Data = 0x24;
   1624	status = mos7840_set_reg_sync(port,
   1625			(__u16) (mos7840_port->DcrRegOffset + 2), Data);
   1626	if (status < 0) {
   1627		dev_dbg(&port->dev, "Writing DCR2 failed status-0x%x\n", status);
   1628		goto error;
   1629	} else
   1630		dev_dbg(&port->dev, "DCR2 Writing success status%d\n", status);
   1631
   1632	/* write values in clkstart0x0 and clkmulti 0x20 */
   1633	Data = 0x0;
   1634	status = mos7840_set_reg_sync(port, CLK_START_VALUE_REGISTER, Data);
   1635	if (status < 0) {
   1636		dev_dbg(&port->dev, "Writing CLK_START_VALUE_REGISTER failed status-0x%x\n", status);
   1637		goto error;
   1638	} else
   1639		dev_dbg(&port->dev, "CLK_START_VALUE_REGISTER Writing success status%d\n", status);
   1640
   1641	Data = 0x20;
   1642	status = mos7840_set_reg_sync(port, CLK_MULTI_REGISTER, Data);
   1643	if (status < 0) {
   1644		dev_dbg(&port->dev, "Writing CLK_MULTI_REGISTER failed status-0x%x\n", status);
   1645		goto error;
   1646	} else
   1647		dev_dbg(&port->dev, "CLK_MULTI_REGISTER Writing success status%d\n", status);
   1648
   1649	/* write value 0x0 to scratchpad register */
   1650	Data = 0x00;
   1651	status = mos7840_set_uart_reg(port, SCRATCH_PAD_REGISTER, Data);
   1652	if (status < 0) {
   1653		dev_dbg(&port->dev, "Writing SCRATCH_PAD_REGISTER failed status-0x%x\n", status);
   1654		goto error;
   1655	} else
   1656		dev_dbg(&port->dev, "SCRATCH_PAD_REGISTER Writing success status%d\n", status);
   1657
   1658	/* Zero Length flag register */
   1659	if ((mos7840_port->port_num != 1) && (serial->num_ports == 2)) {
   1660		Data = 0xff;
   1661		status = mos7840_set_reg_sync(port,
   1662				(__u16) (ZLP_REG1 +
   1663					((__u16)mos7840_port->port_num)), Data);
   1664		dev_dbg(&port->dev, "ZLIP offset %x\n",
   1665				(__u16)(ZLP_REG1 + ((__u16) mos7840_port->port_num)));
   1666		if (status < 0) {
   1667			dev_dbg(&port->dev, "Writing ZLP_REG%d failed status-0x%x\n", pnum + 2, status);
   1668			goto error;
   1669		} else
   1670			dev_dbg(&port->dev, "ZLP_REG%d Writing success status%d\n", pnum + 2, status);
   1671	} else {
   1672		Data = 0xff;
   1673		status = mos7840_set_reg_sync(port,
   1674				(__u16) (ZLP_REG1 +
   1675					((__u16)mos7840_port->port_num) - 0x1), Data);
   1676		dev_dbg(&port->dev, "ZLIP offset %x\n",
   1677				(__u16)(ZLP_REG1 + ((__u16) mos7840_port->port_num) - 0x1));
   1678		if (status < 0) {
   1679			dev_dbg(&port->dev, "Writing ZLP_REG%d failed status-0x%x\n", pnum + 1, status);
   1680			goto error;
   1681		} else
   1682			dev_dbg(&port->dev, "ZLP_REG%d Writing success status%d\n", pnum + 1, status);
   1683
   1684	}
   1685
   1686	mos7840_port->has_led = device_flags & MCS_LED;
   1687
   1688	/* Initialize LED timers */
   1689	if (mos7840_port->has_led) {
   1690		mos7840_port->led_urb = usb_alloc_urb(0, GFP_KERNEL);
   1691		mos7840_port->led_dr = kmalloc(sizeof(*mos7840_port->led_dr),
   1692								GFP_KERNEL);
   1693		if (!mos7840_port->led_urb || !mos7840_port->led_dr) {
   1694			status = -ENOMEM;
   1695			goto error;
   1696		}
   1697
   1698		timer_setup(&mos7840_port->led_timer1, mos7840_led_off, 0);
   1699		mos7840_port->led_timer1.expires =
   1700			jiffies + msecs_to_jiffies(LED_ON_MS);
   1701		timer_setup(&mos7840_port->led_timer2, mos7840_led_flag_off,
   1702			    0);
   1703		mos7840_port->led_timer2.expires =
   1704			jiffies + msecs_to_jiffies(LED_OFF_MS);
   1705
   1706		/* Turn off LED */
   1707		mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300);
   1708	}
   1709
   1710	return 0;
   1711error:
   1712	kfree(mos7840_port->led_dr);
   1713	usb_free_urb(mos7840_port->led_urb);
   1714	kfree(mos7840_port);
   1715
   1716	return status;
   1717}
   1718
   1719static void mos7840_port_remove(struct usb_serial_port *port)
   1720{
   1721	struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
   1722
   1723	if (mos7840_port->has_led) {
   1724		/* Turn off LED */
   1725		mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300);
   1726
   1727		del_timer_sync(&mos7840_port->led_timer1);
   1728		del_timer_sync(&mos7840_port->led_timer2);
   1729
   1730		usb_kill_urb(mos7840_port->led_urb);
   1731		usb_free_urb(mos7840_port->led_urb);
   1732		kfree(mos7840_port->led_dr);
   1733	}
   1734
   1735	kfree(mos7840_port);
   1736}
   1737
   1738static struct usb_serial_driver moschip7840_4port_device = {
   1739	.driver = {
   1740		   .owner = THIS_MODULE,
   1741		   .name = "mos7840",
   1742		   },
   1743	.description = DRIVER_DESC,
   1744	.id_table = id_table,
   1745	.num_interrupt_in = 1,
   1746	.open = mos7840_open,
   1747	.close = mos7840_close,
   1748	.write = mos7840_write,
   1749	.write_room = mos7840_write_room,
   1750	.chars_in_buffer = mos7840_chars_in_buffer,
   1751	.throttle = mos7840_throttle,
   1752	.unthrottle = mos7840_unthrottle,
   1753	.calc_num_ports = mos7840_calc_num_ports,
   1754	.probe = mos7840_probe,
   1755	.attach = mos7840_attach,
   1756	.ioctl = mos7840_ioctl,
   1757	.set_termios = mos7840_set_termios,
   1758	.break_ctl = mos7840_break,
   1759	.tiocmget = mos7840_tiocmget,
   1760	.tiocmset = mos7840_tiocmset,
   1761	.get_icount = usb_serial_generic_get_icount,
   1762	.port_probe = mos7840_port_probe,
   1763	.port_remove = mos7840_port_remove,
   1764	.read_bulk_callback = mos7840_bulk_in_callback,
   1765};
   1766
   1767static struct usb_serial_driver * const serial_drivers[] = {
   1768	&moschip7840_4port_device, NULL
   1769};
   1770
   1771module_usb_serial_driver(serial_drivers, id_table);
   1772
   1773MODULE_DESCRIPTION(DRIVER_DESC);
   1774MODULE_LICENSE("GPL");