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