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