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