1 // SPDX-License-Identifier: GPL-2.0+
3 * Clean ups from Moschip version and a few ioctl implementations by:
4 * Paul B Schroeder <pschroeder "at" uplogix "dot" com>
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>
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>
24 #define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver"
27 * 16C50 UART register defines
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 */
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 */
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 */
48 #define LCR_SET_BREAK 0x40 /* Set Break condition */
49 #define LCR_DL_ENABLE 0x80 /* Enable access to divisor latch */
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 */
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 */
64 * Defines used for sending commands to port
67 #define MOS_WDR_TIMEOUT 5000 /* default urb timeout */
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
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)
84 #define MAX_NAME_LEN 64
86 #define ZLP_REG1 0x3A /* Zero_Flag_Reg1 58 */
87 #define ZLP_REG5 0x3E /* Zero_Flag_Reg5 62 */
89 /* For higher baud Rates use TIOCEXBAUD */
90 #define TIOCEXBAUD 0x5462
93 * Vendor id and device id defines
95 * NOTE: Do not add new defines, add entries directly to the id_table instead.
97 #define USB_VENDOR_ID_BANDB 0x0856
98 #define BANDB_DEVICE_ID_USO9ML2_2 0xAC22
99 #define BANDB_DEVICE_ID_USO9ML2_2P 0xBC00
100 #define BANDB_DEVICE_ID_USO9ML2_4 0xAC24
101 #define BANDB_DEVICE_ID_USO9ML2_4P 0xBC01
102 #define BANDB_DEVICE_ID_US9ML2_2 0xAC29
103 #define BANDB_DEVICE_ID_US9ML2_4 0xAC30
104 #define BANDB_DEVICE_ID_USPTL4_2 0xAC31
105 #define BANDB_DEVICE_ID_USPTL4_4 0xAC32
106 #define BANDB_DEVICE_ID_USOPTL4_2 0xAC42
107 #define BANDB_DEVICE_ID_USOPTL4_2P 0xBC02
108 #define BANDB_DEVICE_ID_USOPTL4_4 0xAC44
109 #define BANDB_DEVICE_ID_USOPTL4_4P 0xBC03
111 /* Interrupt Routine Defines */
113 #define SERIAL_IIR_RLS 0x06
114 #define SERIAL_IIR_MS 0x00
117 * Emulation of the bit mask on the LINE STATUS REGISTER.
119 #define SERIAL_LSR_DR 0x0001
120 #define SERIAL_LSR_OE 0x0002
121 #define SERIAL_LSR_PE 0x0004
122 #define SERIAL_LSR_FE 0x0008
123 #define SERIAL_LSR_BI 0x0010
125 #define MOS_MSR_DELTA_CTS 0x10
126 #define MOS_MSR_DELTA_DSR 0x20
127 #define MOS_MSR_DELTA_RI 0x40
128 #define MOS_MSR_DELTA_CD 0x80
130 /* Serial Port register Address */
131 #define INTERRUPT_ENABLE_REGISTER ((__u16)(0x01))
132 #define FIFO_CONTROL_REGISTER ((__u16)(0x02))
133 #define LINE_CONTROL_REGISTER ((__u16)(0x03))
134 #define MODEM_CONTROL_REGISTER ((__u16)(0x04))
135 #define LINE_STATUS_REGISTER ((__u16)(0x05))
136 #define MODEM_STATUS_REGISTER ((__u16)(0x06))
137 #define SCRATCH_PAD_REGISTER ((__u16)(0x07))
138 #define DIVISOR_LATCH_LSB ((__u16)(0x00))
139 #define DIVISOR_LATCH_MSB ((__u16)(0x01))
141 #define CLK_MULTI_REGISTER ((__u16)(0x02))
142 #define CLK_START_VALUE_REGISTER ((__u16)(0x03))
143 #define GPIO_REGISTER ((__u16)(0x07))
145 #define SERIAL_LCR_DLAB ((__u16)(0x0080))
148 * URB POOL related defines
150 #define NUM_URBS 16 /* URB Count */
151 #define URB_TRANSFER_BUFFER_SIZE 32 /* URB Size */
153 /* LED on/off milliseconds*/
154 #define LED_ON_MS 500
155 #define LED_OFF_MS 500
158 MOS7840_FLAG_LED_BUSY
,
161 #define MCS_PORT_MASK GENMASK(2, 0)
162 #define MCS_PORTS(nr) ((nr) & MCS_PORT_MASK)
163 #define MCS_LED BIT(3)
165 #define MCS_DEVICE(vid, pid, flags) \
166 USB_DEVICE((vid), (pid)), .driver_info = (flags)
168 static const struct usb_device_id id_table
[] = {
169 { MCS_DEVICE(0x0557, 0x2011, MCS_PORTS(4)) }, /* ATEN UC2324 */
170 { MCS_DEVICE(0x0557, 0x7820, MCS_PORTS(2)) }, /* ATEN UC2322 */
171 { MCS_DEVICE(0x110a, 0x2210, MCS_PORTS(2)) }, /* Moxa UPort 2210 */
172 { MCS_DEVICE(0x9710, 0x7810, MCS_PORTS(1) | MCS_LED
) }, /* ASIX MCS7810 */
173 { MCS_DEVICE(0x9710, 0x7820, MCS_PORTS(2)) }, /* MosChip MCS7820 */
174 { MCS_DEVICE(0x9710, 0x7840, MCS_PORTS(4)) }, /* MosChip MCS7840 */
175 { MCS_DEVICE(0x9710, 0x7843, MCS_PORTS(3)) }, /* ASIX MCS7840 3 port */
176 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USO9ML2_2
) },
177 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USO9ML2_2P
) },
178 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USO9ML2_4
) },
179 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USO9ML2_4P
) },
180 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_US9ML2_2
) },
181 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_US9ML2_4
) },
182 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USPTL4_2
) },
183 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USPTL4_4
) },
184 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USOPTL4_2
) },
185 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USOPTL4_2P
) },
186 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USOPTL4_4
) },
187 { USB_DEVICE(USB_VENDOR_ID_BANDB
, BANDB_DEVICE_ID_USOPTL4_4P
) },
188 {} /* terminating entry */
190 MODULE_DEVICE_TABLE(usb
, id_table
);
192 /* This structure holds all of the local port information */
194 struct moschip_port
{
195 int port_num
; /*Actual port number in the device(1,2,etc) */
196 struct urb
*read_urb
; /* read URB for this port */
197 __u8 shadowLCR
; /* last LCR value received */
198 __u8 shadowMCR
; /* last MCR value received */
199 struct usb_serial_port
*port
; /* loop back to the owner of this object */
203 __u8 ControlRegOffset
;
206 spinlock_t pool_lock
;
207 struct urb
*write_urb_pool
[NUM_URBS
];
211 /* For device(s) with LED indicator */
213 struct timer_list led_timer1
; /* Timer for LED on */
214 struct timer_list led_timer2
; /* Timer for LED off */
216 struct usb_ctrlrequest
*led_dr
;
222 * mos7840_set_reg_sync
223 * To set the Control register by calling usb_fill_control_urb function
224 * by passing usb_sndctrlpipe function as parameter.
227 static int mos7840_set_reg_sync(struct usb_serial_port
*port
, __u16 reg
,
230 struct usb_device
*dev
= port
->serial
->dev
;
232 dev_dbg(&port
->dev
, "mos7840_set_reg_sync offset is %x, value %x\n", reg
, val
);
234 return usb_control_msg(dev
, usb_sndctrlpipe(dev
, 0), MCS_WRREQ
,
235 MCS_WR_RTYPE
, val
, reg
, NULL
, 0,
240 * mos7840_get_reg_sync
241 * To set the Uart register by calling usb_fill_control_urb function by
242 * passing usb_rcvctrlpipe function as parameter.
245 static int mos7840_get_reg_sync(struct usb_serial_port
*port
, __u16 reg
,
248 struct usb_device
*dev
= port
->serial
->dev
;
252 buf
= kmalloc(VENDOR_READ_LENGTH
, GFP_KERNEL
);
256 ret
= usb_control_msg(dev
, usb_rcvctrlpipe(dev
, 0), MCS_RDREQ
,
257 MCS_RD_RTYPE
, 0, reg
, buf
, VENDOR_READ_LENGTH
,
259 if (ret
< VENDOR_READ_LENGTH
) {
266 dev_dbg(&port
->dev
, "%s offset is %x, return val %x\n", __func__
, reg
, *val
);
273 * mos7840_set_uart_reg
274 * To set the Uart register by calling usb_fill_control_urb function by
275 * passing usb_sndctrlpipe function as parameter.
278 static int mos7840_set_uart_reg(struct usb_serial_port
*port
, __u16 reg
,
282 struct usb_device
*dev
= port
->serial
->dev
;
284 /* For the UART control registers, the application number need
286 if (port
->serial
->num_ports
== 2 && port
->port_number
!= 0)
287 val
|= ((__u16
)port
->port_number
+ 2) << 8;
289 val
|= ((__u16
)port
->port_number
+ 1) << 8;
290 dev_dbg(&port
->dev
, "%s application number is %x\n", __func__
, val
);
291 return usb_control_msg(dev
, usb_sndctrlpipe(dev
, 0), MCS_WRREQ
,
292 MCS_WR_RTYPE
, val
, reg
, NULL
, 0,
298 * mos7840_get_uart_reg
299 * To set the Control register by calling usb_fill_control_urb function
300 * by passing usb_rcvctrlpipe function as parameter.
302 static int mos7840_get_uart_reg(struct usb_serial_port
*port
, __u16 reg
,
305 struct usb_device
*dev
= port
->serial
->dev
;
310 buf
= kmalloc(VENDOR_READ_LENGTH
, GFP_KERNEL
);
314 /* Wval is same as application number */
315 if (port
->serial
->num_ports
== 2 && port
->port_number
!= 0)
316 Wval
= ((__u16
)port
->port_number
+ 2) << 8;
318 Wval
= ((__u16
)port
->port_number
+ 1) << 8;
319 dev_dbg(&port
->dev
, "%s application number is %x\n", __func__
, Wval
);
320 ret
= usb_control_msg(dev
, usb_rcvctrlpipe(dev
, 0), MCS_RDREQ
,
321 MCS_RD_RTYPE
, Wval
, reg
, buf
, VENDOR_READ_LENGTH
,
323 if (ret
< VENDOR_READ_LENGTH
) {
334 static void mos7840_dump_serial_port(struct usb_serial_port
*port
,
335 struct moschip_port
*mos7840_port
)
338 dev_dbg(&port
->dev
, "SpRegOffset is %2x\n", mos7840_port
->SpRegOffset
);
339 dev_dbg(&port
->dev
, "ControlRegOffset is %2x\n", mos7840_port
->ControlRegOffset
);
340 dev_dbg(&port
->dev
, "DCRRegOffset is %2x\n", mos7840_port
->DcrRegOffset
);
344 /************************************************************************/
345 /************************************************************************/
346 /* U S B C A L L B A C K F U N C T I O N S */
347 /* U S B C A L L B A C K F U N C T I O N S */
348 /************************************************************************/
349 /************************************************************************/
351 static void mos7840_set_led_callback(struct urb
*urb
)
353 switch (urb
->status
) {
360 /* This urb is terminated, clean up */
361 dev_dbg(&urb
->dev
->dev
, "%s - urb shutting down: %d\n",
362 __func__
, urb
->status
);
365 dev_dbg(&urb
->dev
->dev
, "%s - nonzero urb status: %d\n",
366 __func__
, urb
->status
);
370 static void mos7840_set_led_async(struct moschip_port
*mcs
, __u16 wval
,
373 struct usb_device
*dev
= mcs
->port
->serial
->dev
;
374 struct usb_ctrlrequest
*dr
= mcs
->led_dr
;
376 dr
->bRequestType
= MCS_WR_RTYPE
;
377 dr
->bRequest
= MCS_WRREQ
;
378 dr
->wValue
= cpu_to_le16(wval
);
379 dr
->wIndex
= cpu_to_le16(reg
);
380 dr
->wLength
= cpu_to_le16(0);
382 usb_fill_control_urb(mcs
->led_urb
, dev
, usb_sndctrlpipe(dev
, 0),
383 (unsigned char *)dr
, NULL
, 0, mos7840_set_led_callback
, NULL
);
385 usb_submit_urb(mcs
->led_urb
, GFP_ATOMIC
);
388 static void mos7840_set_led_sync(struct usb_serial_port
*port
, __u16 reg
,
391 struct usb_device
*dev
= port
->serial
->dev
;
393 usb_control_msg(dev
, usb_sndctrlpipe(dev
, 0), MCS_WRREQ
, MCS_WR_RTYPE
,
394 val
, reg
, NULL
, 0, MOS_WDR_TIMEOUT
);
397 static void mos7840_led_off(struct timer_list
*t
)
399 struct moschip_port
*mcs
= from_timer(mcs
, t
, led_timer1
);
402 mos7840_set_led_async(mcs
, 0x0300, MODEM_CONTROL_REGISTER
);
403 mod_timer(&mcs
->led_timer2
,
404 jiffies
+ msecs_to_jiffies(LED_OFF_MS
));
407 static void mos7840_led_flag_off(struct timer_list
*t
)
409 struct moschip_port
*mcs
= from_timer(mcs
, t
, led_timer2
);
411 clear_bit_unlock(MOS7840_FLAG_LED_BUSY
, &mcs
->flags
);
414 static void mos7840_led_activity(struct usb_serial_port
*port
)
416 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
418 if (test_and_set_bit_lock(MOS7840_FLAG_LED_BUSY
, &mos7840_port
->flags
))
421 mos7840_set_led_async(mos7840_port
, 0x0301, MODEM_CONTROL_REGISTER
);
422 mod_timer(&mos7840_port
->led_timer1
,
423 jiffies
+ msecs_to_jiffies(LED_ON_MS
));
426 /*****************************************************************************
427 * mos7840_bulk_in_callback
428 * this is the callback function for when we have received data on the
430 *****************************************************************************/
432 static void mos7840_bulk_in_callback(struct urb
*urb
)
434 struct moschip_port
*mos7840_port
= urb
->context
;
435 struct usb_serial_port
*port
= mos7840_port
->port
;
438 int status
= urb
->status
;
441 dev_dbg(&urb
->dev
->dev
, "nonzero read bulk status received: %d\n", status
);
442 mos7840_port
->read_urb_busy
= false;
446 data
= urb
->transfer_buffer
;
447 usb_serial_debug_data(&port
->dev
, __func__
, urb
->actual_length
, data
);
449 if (urb
->actual_length
) {
450 struct tty_port
*tport
= &mos7840_port
->port
->port
;
451 tty_insert_flip_string(tport
, data
, urb
->actual_length
);
452 tty_flip_buffer_push(tport
);
453 port
->icount
.rx
+= urb
->actual_length
;
454 dev_dbg(&port
->dev
, "icount.rx is %d:\n", port
->icount
.rx
);
457 if (mos7840_port
->has_led
)
458 mos7840_led_activity(port
);
460 mos7840_port
->read_urb_busy
= true;
461 retval
= usb_submit_urb(mos7840_port
->read_urb
, GFP_ATOMIC
);
464 dev_dbg(&port
->dev
, "usb_submit_urb(read bulk) failed, retval = %d\n", retval
);
465 mos7840_port
->read_urb_busy
= false;
469 /*****************************************************************************
470 * mos7840_bulk_out_data_callback
471 * this is the callback function for when we have finished sending
472 * serial data on the bulk out endpoint.
473 *****************************************************************************/
475 static void mos7840_bulk_out_data_callback(struct urb
*urb
)
477 struct moschip_port
*mos7840_port
= urb
->context
;
478 struct usb_serial_port
*port
= mos7840_port
->port
;
479 int status
= urb
->status
;
483 spin_lock_irqsave(&mos7840_port
->pool_lock
, flags
);
484 for (i
= 0; i
< NUM_URBS
; i
++) {
485 if (urb
== mos7840_port
->write_urb_pool
[i
]) {
486 mos7840_port
->busy
[i
] = 0;
490 spin_unlock_irqrestore(&mos7840_port
->pool_lock
, flags
);
493 dev_dbg(&port
->dev
, "nonzero write bulk status received:%d\n", status
);
497 tty_port_tty_wakeup(&port
->port
);
501 /************************************************************************/
502 /* D R I V E R T T Y I N T E R F A C E F U N C T I O N S */
503 /************************************************************************/
505 /*****************************************************************************
507 * this function is called by the tty driver when a port is opened
508 * If successful, we return 0
509 * Otherwise we return a negative error number.
510 *****************************************************************************/
512 static int mos7840_open(struct tty_struct
*tty
, struct usb_serial_port
*port
)
514 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
515 struct usb_serial
*serial
= port
->serial
;
522 usb_clear_halt(serial
->dev
, port
->write_urb
->pipe
);
523 usb_clear_halt(serial
->dev
, port
->read_urb
->pipe
);
525 /* Initialising the write urb pool */
526 for (j
= 0; j
< NUM_URBS
; ++j
) {
527 urb
= usb_alloc_urb(0, GFP_KERNEL
);
528 mos7840_port
->write_urb_pool
[j
] = urb
;
532 urb
->transfer_buffer
= kmalloc(URB_TRANSFER_BUFFER_SIZE
,
534 if (!urb
->transfer_buffer
) {
536 mos7840_port
->write_urb_pool
[j
] = NULL
;
541 /*****************************************************************************
542 * Initialize MCS7840 -- Write Init values to corresponding Registers
550 * 0x08 : SP1/2 Control Reg
551 *****************************************************************************/
553 /* NEED to check the following Block */
556 status
= mos7840_get_reg_sync(port
, mos7840_port
->SpRegOffset
, &Data
);
558 dev_dbg(&port
->dev
, "Reading Spreg failed\n");
562 status
= mos7840_set_reg_sync(port
, mos7840_port
->SpRegOffset
, Data
);
564 dev_dbg(&port
->dev
, "writing Spreg failed\n");
569 status
= mos7840_set_reg_sync(port
, mos7840_port
->SpRegOffset
, Data
);
571 dev_dbg(&port
->dev
, "writing Spreg failed\n");
574 /* End of block to be checked */
577 status
= mos7840_get_reg_sync(port
, mos7840_port
->ControlRegOffset
,
580 dev_dbg(&port
->dev
, "Reading Controlreg failed\n");
583 Data
|= 0x08; /* Driver done bit */
584 Data
|= 0x20; /* rx_disable */
585 status
= mos7840_set_reg_sync(port
,
586 mos7840_port
->ControlRegOffset
, Data
);
588 dev_dbg(&port
->dev
, "writing Controlreg failed\n");
591 /* do register settings here */
592 /* Set all regs to the device default values. */
593 /***********************************
594 * First Disable all interrupts.
595 ***********************************/
597 status
= mos7840_set_uart_reg(port
, INTERRUPT_ENABLE_REGISTER
, Data
);
599 dev_dbg(&port
->dev
, "disabling interrupts failed\n");
602 /* Set FIFO_CONTROL_REGISTER to the default value */
604 status
= mos7840_set_uart_reg(port
, FIFO_CONTROL_REGISTER
, Data
);
606 dev_dbg(&port
->dev
, "Writing FIFO_CONTROL_REGISTER failed\n");
611 status
= mos7840_set_uart_reg(port
, FIFO_CONTROL_REGISTER
, Data
);
613 dev_dbg(&port
->dev
, "Writing FIFO_CONTROL_REGISTER failed\n");
618 status
= mos7840_set_uart_reg(port
, LINE_CONTROL_REGISTER
, Data
);
619 mos7840_port
->shadowLCR
= Data
;
622 status
= mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
, Data
);
623 mos7840_port
->shadowMCR
= Data
;
626 status
= mos7840_get_uart_reg(port
, LINE_CONTROL_REGISTER
, &Data
);
627 mos7840_port
->shadowLCR
= Data
;
629 Data
|= SERIAL_LCR_DLAB
; /* data latch enable in LCR 0x80 */
630 status
= mos7840_set_uart_reg(port
, LINE_CONTROL_REGISTER
, Data
);
633 status
= mos7840_set_uart_reg(port
, DIVISOR_LATCH_LSB
, Data
);
636 status
= mos7840_set_uart_reg(port
, DIVISOR_LATCH_MSB
, Data
);
639 status
= mos7840_get_uart_reg(port
, LINE_CONTROL_REGISTER
, &Data
);
641 Data
= Data
& ~SERIAL_LCR_DLAB
;
642 status
= mos7840_set_uart_reg(port
, LINE_CONTROL_REGISTER
, Data
);
643 mos7840_port
->shadowLCR
= Data
;
645 /* clearing Bulkin and Bulkout Fifo */
647 status
= mos7840_get_reg_sync(port
, mos7840_port
->SpRegOffset
, &Data
);
650 status
= mos7840_set_reg_sync(port
, mos7840_port
->SpRegOffset
, Data
);
653 status
= mos7840_set_reg_sync(port
, mos7840_port
->SpRegOffset
, Data
);
654 /* Finally enable all interrupts */
656 status
= mos7840_set_uart_reg(port
, INTERRUPT_ENABLE_REGISTER
, Data
);
658 /* clearing rx_disable */
660 status
= mos7840_get_reg_sync(port
, mos7840_port
->ControlRegOffset
,
663 status
= mos7840_set_reg_sync(port
, mos7840_port
->ControlRegOffset
,
668 status
= mos7840_get_reg_sync(port
, mos7840_port
->ControlRegOffset
,
671 status
= mos7840_set_reg_sync(port
, mos7840_port
->ControlRegOffset
,
674 dev_dbg(&port
->dev
, "port number is %d\n", port
->port_number
);
675 dev_dbg(&port
->dev
, "minor number is %d\n", port
->minor
);
676 dev_dbg(&port
->dev
, "Bulkin endpoint is %d\n", port
->bulk_in_endpointAddress
);
677 dev_dbg(&port
->dev
, "BulkOut endpoint is %d\n", port
->bulk_out_endpointAddress
);
678 dev_dbg(&port
->dev
, "Interrupt endpoint is %d\n", port
->interrupt_in_endpointAddress
);
679 dev_dbg(&port
->dev
, "port's number in the device is %d\n", mos7840_port
->port_num
);
680 mos7840_port
->read_urb
= port
->read_urb
;
682 /* set up our bulk in urb */
683 if ((serial
->num_ports
== 2) && (((__u16
)port
->port_number
% 2) != 0)) {
684 usb_fill_bulk_urb(mos7840_port
->read_urb
,
686 usb_rcvbulkpipe(serial
->dev
,
687 (port
->bulk_in_endpointAddress
) + 2),
688 port
->bulk_in_buffer
,
689 mos7840_port
->read_urb
->transfer_buffer_length
,
690 mos7840_bulk_in_callback
, mos7840_port
);
692 usb_fill_bulk_urb(mos7840_port
->read_urb
,
694 usb_rcvbulkpipe(serial
->dev
,
695 port
->bulk_in_endpointAddress
),
696 port
->bulk_in_buffer
,
697 mos7840_port
->read_urb
->transfer_buffer_length
,
698 mos7840_bulk_in_callback
, mos7840_port
);
701 dev_dbg(&port
->dev
, "%s: bulkin endpoint is %d\n", __func__
, port
->bulk_in_endpointAddress
);
702 mos7840_port
->read_urb_busy
= true;
703 response
= usb_submit_urb(mos7840_port
->read_urb
, GFP_KERNEL
);
705 dev_err(&port
->dev
, "%s - Error %d submitting control urb\n",
707 mos7840_port
->read_urb_busy
= false;
710 /* initialize our port settings */
711 /* Must set to enable ints! */
712 mos7840_port
->shadowMCR
= MCR_MASTER_IE
;
716 for (j
= 0; j
< NUM_URBS
; ++j
) {
717 urb
= mos7840_port
->write_urb_pool
[j
];
720 kfree(urb
->transfer_buffer
);
726 /*****************************************************************************
727 * mos7840_chars_in_buffer
728 * this function is called by the tty driver when it wants to know how many
729 * bytes of data we currently have outstanding in the port (data that has
730 * been written, but hasn't made it out the port yet)
731 *****************************************************************************/
733 static unsigned int mos7840_chars_in_buffer(struct tty_struct
*tty
)
735 struct usb_serial_port
*port
= tty
->driver_data
;
736 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
738 unsigned int chars
= 0;
741 spin_lock_irqsave(&mos7840_port
->pool_lock
, flags
);
742 for (i
= 0; i
< NUM_URBS
; ++i
) {
743 if (mos7840_port
->busy
[i
]) {
744 struct urb
*urb
= mos7840_port
->write_urb_pool
[i
];
745 chars
+= urb
->transfer_buffer_length
;
748 spin_unlock_irqrestore(&mos7840_port
->pool_lock
, flags
);
749 dev_dbg(&port
->dev
, "%s - returns %u\n", __func__
, chars
);
754 /*****************************************************************************
756 * this function is called by the tty driver when a port is closed
757 *****************************************************************************/
759 static void mos7840_close(struct usb_serial_port
*port
)
761 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
765 for (j
= 0; j
< NUM_URBS
; ++j
)
766 usb_kill_urb(mos7840_port
->write_urb_pool
[j
]);
768 /* Freeing Write URBs */
769 for (j
= 0; j
< NUM_URBS
; ++j
) {
770 if (mos7840_port
->write_urb_pool
[j
]) {
771 kfree(mos7840_port
->write_urb_pool
[j
]->transfer_buffer
);
772 usb_free_urb(mos7840_port
->write_urb_pool
[j
]);
776 usb_kill_urb(mos7840_port
->read_urb
);
777 mos7840_port
->read_urb_busy
= false;
780 mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
, Data
);
783 mos7840_set_uart_reg(port
, INTERRUPT_ENABLE_REGISTER
, Data
);
786 /*****************************************************************************
788 * this function sends a break to the port
789 *****************************************************************************/
790 static int mos7840_break(struct tty_struct
*tty
, int break_state
)
792 struct usb_serial_port
*port
= tty
->driver_data
;
793 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
796 if (break_state
== -1)
797 data
= mos7840_port
->shadowLCR
| LCR_SET_BREAK
;
799 data
= mos7840_port
->shadowLCR
& ~LCR_SET_BREAK
;
801 /* FIXME: no locking on shadowLCR anywhere in driver */
802 mos7840_port
->shadowLCR
= data
;
803 dev_dbg(&port
->dev
, "%s mos7840_port->shadowLCR is %x\n", __func__
, mos7840_port
->shadowLCR
);
805 return mos7840_set_uart_reg(port
, LINE_CONTROL_REGISTER
,
806 mos7840_port
->shadowLCR
);
809 /*****************************************************************************
811 * this function is called by the tty driver when it wants to know how many
812 * bytes of data we can accept for a specific port.
813 *****************************************************************************/
815 static unsigned int mos7840_write_room(struct tty_struct
*tty
)
817 struct usb_serial_port
*port
= tty
->driver_data
;
818 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
820 unsigned int room
= 0;
823 spin_lock_irqsave(&mos7840_port
->pool_lock
, flags
);
824 for (i
= 0; i
< NUM_URBS
; ++i
) {
825 if (!mos7840_port
->busy
[i
])
826 room
+= URB_TRANSFER_BUFFER_SIZE
;
828 spin_unlock_irqrestore(&mos7840_port
->pool_lock
, flags
);
830 room
= (room
== 0) ? 0 : room
- URB_TRANSFER_BUFFER_SIZE
+ 1;
831 dev_dbg(&mos7840_port
->port
->dev
, "%s - returns %u\n", __func__
, room
);
836 /*****************************************************************************
838 * this function is called by the tty driver when data should be written to
840 * If successful, we return the number of bytes written, otherwise we
841 * return a negative error number.
842 *****************************************************************************/
844 static int mos7840_write(struct tty_struct
*tty
, struct usb_serial_port
*port
,
845 const unsigned char *data
, int count
)
847 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
848 struct usb_serial
*serial
= port
->serial
;
856 const unsigned char *current_position
= data
;
858 /* try to find a free urb in the list */
861 spin_lock_irqsave(&mos7840_port
->pool_lock
, flags
);
862 for (i
= 0; i
< NUM_URBS
; ++i
) {
863 if (!mos7840_port
->busy
[i
]) {
864 mos7840_port
->busy
[i
] = 1;
865 urb
= mos7840_port
->write_urb_pool
[i
];
866 dev_dbg(&port
->dev
, "URB:%d\n", i
);
870 spin_unlock_irqrestore(&mos7840_port
->pool_lock
, flags
);
873 dev_dbg(&port
->dev
, "%s - no more free urbs\n", __func__
);
877 if (urb
->transfer_buffer
== NULL
) {
878 urb
->transfer_buffer
= kmalloc(URB_TRANSFER_BUFFER_SIZE
,
880 if (!urb
->transfer_buffer
) {
881 bytes_sent
= -ENOMEM
;
885 transfer_size
= min(count
, URB_TRANSFER_BUFFER_SIZE
);
887 memcpy(urb
->transfer_buffer
, current_position
, transfer_size
);
889 /* fill urb with data and submit */
890 if ((serial
->num_ports
== 2) && (((__u16
)port
->port_number
% 2) != 0)) {
891 usb_fill_bulk_urb(urb
,
893 usb_sndbulkpipe(serial
->dev
,
894 (port
->bulk_out_endpointAddress
) + 2),
895 urb
->transfer_buffer
,
897 mos7840_bulk_out_data_callback
, mos7840_port
);
899 usb_fill_bulk_urb(urb
,
901 usb_sndbulkpipe(serial
->dev
,
902 port
->bulk_out_endpointAddress
),
903 urb
->transfer_buffer
,
905 mos7840_bulk_out_data_callback
, mos7840_port
);
908 dev_dbg(&port
->dev
, "bulkout endpoint is %d\n", port
->bulk_out_endpointAddress
);
910 if (mos7840_port
->has_led
)
911 mos7840_led_activity(port
);
913 /* send it down the pipe */
914 status
= usb_submit_urb(urb
, GFP_ATOMIC
);
917 mos7840_port
->busy
[i
] = 0;
918 dev_err_console(port
, "%s - usb_submit_urb(write bulk) failed "
919 "with status = %d\n", __func__
, status
);
923 bytes_sent
= transfer_size
;
924 port
->icount
.tx
+= transfer_size
;
925 dev_dbg(&port
->dev
, "icount.tx is %d:\n", port
->icount
.tx
);
931 /*****************************************************************************
933 * this function is called by the tty driver when it wants to stop the data
934 * being read from the port.
935 *****************************************************************************/
937 static void mos7840_throttle(struct tty_struct
*tty
)
939 struct usb_serial_port
*port
= tty
->driver_data
;
940 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
943 /* if we are implementing XON/XOFF, send the stop character */
945 unsigned char stop_char
= STOP_CHAR(tty
);
946 status
= mos7840_write(tty
, port
, &stop_char
, 1);
950 /* if we are implementing RTS/CTS, toggle that line */
951 if (C_CRTSCTS(tty
)) {
952 mos7840_port
->shadowMCR
&= ~MCR_RTS
;
953 status
= mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
,
954 mos7840_port
->shadowMCR
);
960 /*****************************************************************************
962 * this function is called by the tty driver when it wants to resume
963 * the data being read from the port (called after mos7840_throttle is
965 *****************************************************************************/
966 static void mos7840_unthrottle(struct tty_struct
*tty
)
968 struct usb_serial_port
*port
= tty
->driver_data
;
969 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
972 /* if we are implementing XON/XOFF, send the start character */
974 unsigned char start_char
= START_CHAR(tty
);
975 status
= mos7840_write(tty
, port
, &start_char
, 1);
980 /* if we are implementing RTS/CTS, toggle that line */
981 if (C_CRTSCTS(tty
)) {
982 mos7840_port
->shadowMCR
|= MCR_RTS
;
983 status
= mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
,
984 mos7840_port
->shadowMCR
);
990 static int mos7840_tiocmget(struct tty_struct
*tty
)
992 struct usb_serial_port
*port
= tty
->driver_data
;
998 status
= mos7840_get_uart_reg(port
, MODEM_STATUS_REGISTER
, &msr
);
1001 status
= mos7840_get_uart_reg(port
, MODEM_CONTROL_REGISTER
, &mcr
);
1004 result
= ((mcr
& MCR_DTR
) ? TIOCM_DTR
: 0)
1005 | ((mcr
& MCR_RTS
) ? TIOCM_RTS
: 0)
1006 | ((mcr
& MCR_LOOPBACK
) ? TIOCM_LOOP
: 0)
1007 | ((msr
& MOS7840_MSR_CTS
) ? TIOCM_CTS
: 0)
1008 | ((msr
& MOS7840_MSR_CD
) ? TIOCM_CAR
: 0)
1009 | ((msr
& MOS7840_MSR_RI
) ? TIOCM_RI
: 0)
1010 | ((msr
& MOS7840_MSR_DSR
) ? TIOCM_DSR
: 0);
1012 dev_dbg(&port
->dev
, "%s - 0x%04X\n", __func__
, result
);
1017 static int mos7840_tiocmset(struct tty_struct
*tty
,
1018 unsigned int set
, unsigned int clear
)
1020 struct usb_serial_port
*port
= tty
->driver_data
;
1021 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
1025 /* FIXME: What locks the port registers ? */
1026 mcr
= mos7840_port
->shadowMCR
;
1027 if (clear
& TIOCM_RTS
)
1029 if (clear
& TIOCM_DTR
)
1031 if (clear
& TIOCM_LOOP
)
1032 mcr
&= ~MCR_LOOPBACK
;
1034 if (set
& TIOCM_RTS
)
1036 if (set
& TIOCM_DTR
)
1038 if (set
& TIOCM_LOOP
)
1039 mcr
|= MCR_LOOPBACK
;
1041 mos7840_port
->shadowMCR
= mcr
;
1043 status
= mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
, mcr
);
1045 dev_dbg(&port
->dev
, "setting MODEM_CONTROL_REGISTER Failed\n");
1052 /*****************************************************************************
1053 * mos7840_calc_baud_rate_divisor
1054 * this function calculates the proper baud rate divisor for the specified
1056 *****************************************************************************/
1057 static int mos7840_calc_baud_rate_divisor(struct usb_serial_port
*port
,
1058 int baudRate
, int *divisor
,
1061 dev_dbg(&port
->dev
, "%s - %d\n", __func__
, baudRate
);
1063 if (baudRate
<= 115200) {
1064 *divisor
= 115200 / baudRate
;
1067 if ((baudRate
> 115200) && (baudRate
<= 230400)) {
1068 *divisor
= 230400 / baudRate
;
1069 *clk_sel_val
= 0x10;
1070 } else if ((baudRate
> 230400) && (baudRate
<= 403200)) {
1071 *divisor
= 403200 / baudRate
;
1072 *clk_sel_val
= 0x20;
1073 } else if ((baudRate
> 403200) && (baudRate
<= 460800)) {
1074 *divisor
= 460800 / baudRate
;
1075 *clk_sel_val
= 0x30;
1076 } else if ((baudRate
> 460800) && (baudRate
<= 806400)) {
1077 *divisor
= 806400 / baudRate
;
1078 *clk_sel_val
= 0x40;
1079 } else if ((baudRate
> 806400) && (baudRate
<= 921600)) {
1080 *divisor
= 921600 / baudRate
;
1081 *clk_sel_val
= 0x50;
1082 } else if ((baudRate
> 921600) && (baudRate
<= 1572864)) {
1083 *divisor
= 1572864 / baudRate
;
1084 *clk_sel_val
= 0x60;
1085 } else if ((baudRate
> 1572864) && (baudRate
<= 3145728)) {
1086 *divisor
= 3145728 / baudRate
;
1087 *clk_sel_val
= 0x70;
1092 /*****************************************************************************
1093 * mos7840_send_cmd_write_baud_rate
1094 * this function sends the proper command to change the baud rate of the
1096 *****************************************************************************/
1098 static int mos7840_send_cmd_write_baud_rate(struct moschip_port
*mos7840_port
,
1101 struct usb_serial_port
*port
= mos7840_port
->port
;
1107 dev_dbg(&port
->dev
, "%s - baud = %d\n", __func__
, baudRate
);
1108 /* reset clk_uart_sel in spregOffset */
1109 if (baudRate
> 115200) {
1110 #ifdef HW_flow_control
1111 /* NOTE: need to see the pther register to modify */
1112 /* setting h/w flow control bit to 1 */
1114 mos7840_port
->shadowMCR
= Data
;
1115 status
= mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
,
1118 dev_dbg(&port
->dev
, "Writing spreg failed in set_serial_baud\n");
1124 #ifdef HW_flow_control
1125 /* setting h/w flow control bit to 0 */
1127 mos7840_port
->shadowMCR
= Data
;
1128 status
= mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
,
1131 dev_dbg(&port
->dev
, "Writing spreg failed in set_serial_baud\n");
1138 if (1) { /* baudRate <= 115200) */
1141 status
= mos7840_calc_baud_rate_divisor(port
, baudRate
, &divisor
,
1143 status
= mos7840_get_reg_sync(port
, mos7840_port
->SpRegOffset
,
1146 dev_dbg(&port
->dev
, "reading spreg failed in set_serial_baud\n");
1149 Data
= (Data
& 0x8f) | clk_sel_val
;
1150 status
= mos7840_set_reg_sync(port
, mos7840_port
->SpRegOffset
,
1153 dev_dbg(&port
->dev
, "Writing spreg failed in set_serial_baud\n");
1156 /* Calculate the Divisor */
1159 dev_err(&port
->dev
, "%s - bad baud rate\n", __func__
);
1162 /* Enable access to divisor latch */
1163 Data
= mos7840_port
->shadowLCR
| SERIAL_LCR_DLAB
;
1164 mos7840_port
->shadowLCR
= Data
;
1165 mos7840_set_uart_reg(port
, LINE_CONTROL_REGISTER
, Data
);
1167 /* Write the divisor */
1168 Data
= (unsigned char)(divisor
& 0xff);
1169 dev_dbg(&port
->dev
, "set_serial_baud Value to write DLL is %x\n", Data
);
1170 mos7840_set_uart_reg(port
, DIVISOR_LATCH_LSB
, Data
);
1172 Data
= (unsigned char)((divisor
& 0xff00) >> 8);
1173 dev_dbg(&port
->dev
, "set_serial_baud Value to write DLM is %x\n", Data
);
1174 mos7840_set_uart_reg(port
, DIVISOR_LATCH_MSB
, Data
);
1176 /* Disable access to divisor latch */
1177 Data
= mos7840_port
->shadowLCR
& ~SERIAL_LCR_DLAB
;
1178 mos7840_port
->shadowLCR
= Data
;
1179 mos7840_set_uart_reg(port
, LINE_CONTROL_REGISTER
, Data
);
1185 /*****************************************************************************
1186 * mos7840_change_port_settings
1187 * This routine is called to set the UART on the device to match
1188 * the specified new settings.
1189 *****************************************************************************/
1191 static void mos7840_change_port_settings(struct tty_struct
*tty
,
1192 struct moschip_port
*mos7840_port
,
1193 const struct ktermios
*old_termios
)
1195 struct usb_serial_port
*port
= mos7840_port
->port
;
1206 lParity
= LCR_PAR_NONE
;
1208 cflag
= tty
->termios
.c_cflag
;
1210 /* Change the number of bits */
1211 switch (cflag
& CSIZE
) {
1230 /* Change the Parity bit */
1231 if (cflag
& PARENB
) {
1232 if (cflag
& PARODD
) {
1233 lParity
= LCR_PAR_ODD
;
1234 dev_dbg(&port
->dev
, "%s - parity = odd\n", __func__
);
1236 lParity
= LCR_PAR_EVEN
;
1237 dev_dbg(&port
->dev
, "%s - parity = even\n", __func__
);
1241 dev_dbg(&port
->dev
, "%s - parity = none\n", __func__
);
1245 lParity
= lParity
| 0x20;
1247 /* Change the Stop bit */
1248 if (cflag
& CSTOPB
) {
1250 dev_dbg(&port
->dev
, "%s - stop bits = 2\n", __func__
);
1253 dev_dbg(&port
->dev
, "%s - stop bits = 1\n", __func__
);
1256 /* Update the LCR with the correct value */
1257 mos7840_port
->shadowLCR
&=
1258 ~(LCR_BITS_MASK
| LCR_STOP_MASK
| LCR_PAR_MASK
);
1259 mos7840_port
->shadowLCR
|= (lData
| lParity
| lStop
);
1261 dev_dbg(&port
->dev
, "%s - mos7840_port->shadowLCR is %x\n", __func__
,
1262 mos7840_port
->shadowLCR
);
1263 /* Disable Interrupts */
1265 mos7840_set_uart_reg(port
, INTERRUPT_ENABLE_REGISTER
, Data
);
1268 mos7840_set_uart_reg(port
, FIFO_CONTROL_REGISTER
, Data
);
1271 mos7840_set_uart_reg(port
, FIFO_CONTROL_REGISTER
, Data
);
1273 /* Send the updated LCR value to the mos7840 */
1274 Data
= mos7840_port
->shadowLCR
;
1276 mos7840_set_uart_reg(port
, LINE_CONTROL_REGISTER
, Data
);
1279 mos7840_port
->shadowMCR
= Data
;
1280 mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
, Data
);
1282 mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
, Data
);
1284 /* set up the MCR register and send it to the mos7840 */
1286 mos7840_port
->shadowMCR
= MCR_MASTER_IE
;
1288 mos7840_port
->shadowMCR
|= (MCR_DTR
| MCR_RTS
);
1290 if (cflag
& CRTSCTS
)
1291 mos7840_port
->shadowMCR
|= (MCR_XON_ANY
);
1293 mos7840_port
->shadowMCR
&= ~(MCR_XON_ANY
);
1295 Data
= mos7840_port
->shadowMCR
;
1296 mos7840_set_uart_reg(port
, MODEM_CONTROL_REGISTER
, Data
);
1298 /* Determine divisor based on baud rate */
1299 baud
= tty_get_baud_rate(tty
);
1302 /* pick a default, any default... */
1303 dev_dbg(&port
->dev
, "%s", "Picked default baud...\n");
1307 dev_dbg(&port
->dev
, "%s - baud rate = %d\n", __func__
, baud
);
1308 status
= mos7840_send_cmd_write_baud_rate(mos7840_port
, baud
);
1310 /* Enable Interrupts */
1312 mos7840_set_uart_reg(port
, INTERRUPT_ENABLE_REGISTER
, Data
);
1314 if (!mos7840_port
->read_urb_busy
) {
1315 mos7840_port
->read_urb_busy
= true;
1316 status
= usb_submit_urb(mos7840_port
->read_urb
, GFP_KERNEL
);
1318 dev_dbg(&port
->dev
, "usb_submit_urb(read bulk) failed, status = %d\n",
1320 mos7840_port
->read_urb_busy
= false;
1323 dev_dbg(&port
->dev
, "%s - mos7840_port->shadowLCR is End %x\n", __func__
,
1324 mos7840_port
->shadowLCR
);
1327 /*****************************************************************************
1328 * mos7840_set_termios
1329 * this function is called by the tty driver when it wants to change
1330 * the termios structure
1331 *****************************************************************************/
1333 static void mos7840_set_termios(struct tty_struct
*tty
,
1334 struct usb_serial_port
*port
,
1335 const struct ktermios
*old_termios
)
1337 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
1340 /* change the port settings to the new ones specified */
1342 mos7840_change_port_settings(tty
, mos7840_port
, old_termios
);
1344 if (!mos7840_port
->read_urb_busy
) {
1345 mos7840_port
->read_urb_busy
= true;
1346 status
= usb_submit_urb(mos7840_port
->read_urb
, GFP_KERNEL
);
1348 dev_dbg(&port
->dev
, "usb_submit_urb(read bulk) failed, status = %d\n",
1350 mos7840_port
->read_urb_busy
= false;
1355 /*****************************************************************************
1356 * mos7840_get_lsr_info - get line status register info
1358 * Purpose: Let user call ioctl() to get info when the UART physically
1359 * is emptied. On bus types like RS485, the transmitter must
1360 * release the bus after transmitting. This must be done when
1361 * the transmit shift register is empty, not be done when the
1362 * transmit holding register is empty. This functionality
1363 * allows an RS485 driver to be written in user space.
1364 *****************************************************************************/
1366 static int mos7840_get_lsr_info(struct tty_struct
*tty
,
1367 unsigned int __user
*value
)
1370 unsigned int result
= 0;
1372 count
= mos7840_chars_in_buffer(tty
);
1374 result
= TIOCSER_TEMT
;
1376 if (copy_to_user(value
, &result
, sizeof(int)))
1381 /*****************************************************************************
1383 * this function handles any ioctl calls to the driver
1384 *****************************************************************************/
1386 static int mos7840_ioctl(struct tty_struct
*tty
,
1387 unsigned int cmd
, unsigned long arg
)
1389 struct usb_serial_port
*port
= tty
->driver_data
;
1390 void __user
*argp
= (void __user
*)arg
;
1393 /* return number of bytes available */
1396 dev_dbg(&port
->dev
, "%s TIOCSERGETLSR\n", __func__
);
1397 return mos7840_get_lsr_info(tty
, argp
);
1402 return -ENOIOCTLCMD
;
1406 * Check if GPO (pin 42) is connected to GPI (pin 33) as recommended by ASIX
1407 * for MCS7810 by bit-banging a 16-bit word.
1409 * Note that GPO is really RTS of the third port so this will toggle RTS of
1410 * port two or three on two- and four-port devices.
1412 static int mos7810_check(struct usb_serial
*serial
)
1414 int i
, pass_count
= 0;
1416 __u16 data
= 0, mcr_data
= 0;
1417 __u16 test_pattern
= 0x55AA;
1420 buf
= kmalloc(VENDOR_READ_LENGTH
, GFP_KERNEL
);
1422 return 0; /* failed to identify 7810 */
1424 /* Store MCR setting */
1425 res
= usb_control_msg(serial
->dev
, usb_rcvctrlpipe(serial
->dev
, 0),
1426 MCS_RDREQ
, MCS_RD_RTYPE
, 0x0300, MODEM_CONTROL_REGISTER
,
1427 buf
, VENDOR_READ_LENGTH
, MOS_WDR_TIMEOUT
);
1428 if (res
== VENDOR_READ_LENGTH
)
1431 for (i
= 0; i
< 16; i
++) {
1432 /* Send the 1-bit test pattern out to MCS7810 test pin */
1433 usb_control_msg(serial
->dev
, usb_sndctrlpipe(serial
->dev
, 0),
1434 MCS_WRREQ
, MCS_WR_RTYPE
,
1435 (0x0300 | (((test_pattern
>> i
) & 0x0001) << 1)),
1436 MODEM_CONTROL_REGISTER
, NULL
, 0, MOS_WDR_TIMEOUT
);
1438 /* Read the test pattern back */
1439 res
= usb_control_msg(serial
->dev
,
1440 usb_rcvctrlpipe(serial
->dev
, 0), MCS_RDREQ
,
1441 MCS_RD_RTYPE
, 0, GPIO_REGISTER
, buf
,
1442 VENDOR_READ_LENGTH
, MOS_WDR_TIMEOUT
);
1443 if (res
== VENDOR_READ_LENGTH
)
1446 /* If this is a MCS7810 device, both test patterns must match */
1447 if (((test_pattern
>> i
) ^ (~data
>> 1)) & 0x0001)
1453 /* Restore MCR setting */
1454 usb_control_msg(serial
->dev
, usb_sndctrlpipe(serial
->dev
, 0), MCS_WRREQ
,
1455 MCS_WR_RTYPE
, 0x0300 | mcr_data
, MODEM_CONTROL_REGISTER
, NULL
,
1456 0, MOS_WDR_TIMEOUT
);
1460 if (pass_count
== 16)
1466 static int mos7840_probe(struct usb_serial
*serial
,
1467 const struct usb_device_id
*id
)
1469 unsigned long device_flags
= id
->driver_info
;
1472 /* Skip device-type detection if we already have device flags. */
1476 buf
= kzalloc(VENDOR_READ_LENGTH
, GFP_KERNEL
);
1480 usb_control_msg(serial
->dev
, usb_rcvctrlpipe(serial
->dev
, 0),
1481 MCS_RDREQ
, MCS_RD_RTYPE
, 0, GPIO_REGISTER
, buf
,
1482 VENDOR_READ_LENGTH
, MOS_WDR_TIMEOUT
);
1484 /* For a MCS7840 device GPIO0 must be set to 1 */
1486 device_flags
= MCS_PORTS(4);
1487 else if (mos7810_check(serial
))
1488 device_flags
= MCS_PORTS(1) | MCS_LED
;
1490 device_flags
= MCS_PORTS(2);
1494 usb_set_serial_data(serial
, (void *)device_flags
);
1499 static int mos7840_calc_num_ports(struct usb_serial
*serial
,
1500 struct usb_serial_endpoints
*epds
)
1502 unsigned long device_flags
= (unsigned long)usb_get_serial_data(serial
);
1503 int num_ports
= MCS_PORTS(device_flags
);
1505 if (num_ports
== 0 || num_ports
> 4)
1508 if (epds
->num_bulk_in
< num_ports
|| epds
->num_bulk_out
< num_ports
) {
1509 dev_err(&serial
->interface
->dev
, "missing endpoints\n");
1516 static int mos7840_attach(struct usb_serial
*serial
)
1518 struct device
*dev
= &serial
->interface
->dev
;
1522 /* Zero Length flag enable */
1524 status
= mos7840_set_reg_sync(serial
->port
[0], ZLP_REG5
, val
);
1526 dev_dbg(dev
, "Writing ZLP_REG5 failed status-0x%x\n", status
);
1528 dev_dbg(dev
, "ZLP_REG5 Writing success status%d\n", status
);
1533 static int mos7840_port_probe(struct usb_serial_port
*port
)
1535 struct usb_serial
*serial
= port
->serial
;
1536 unsigned long device_flags
= (unsigned long)usb_get_serial_data(serial
);
1537 struct moschip_port
*mos7840_port
;
1542 /* we set up the pointers to the endpoints in the mos7840_open *
1543 * function, as the structures aren't created yet. */
1545 pnum
= port
->port_number
;
1547 dev_dbg(&port
->dev
, "mos7840_startup: configuring port %d\n", pnum
);
1548 mos7840_port
= kzalloc(sizeof(struct moschip_port
), GFP_KERNEL
);
1552 /* Initialize all port interrupt end point to port 0 int
1553 * endpoint. Our device has only one interrupt end point
1554 * common to all port */
1556 mos7840_port
->port
= port
;
1557 spin_lock_init(&mos7840_port
->pool_lock
);
1559 /* minor is not initialised until later by
1560 * usb-serial.c:get_free_serial() and cannot therefore be used
1561 * to index device instances */
1562 mos7840_port
->port_num
= pnum
+ 1;
1563 dev_dbg(&port
->dev
, "port->minor = %d\n", port
->minor
);
1564 dev_dbg(&port
->dev
, "mos7840_port->port_num = %d\n", mos7840_port
->port_num
);
1566 if (mos7840_port
->port_num
== 1) {
1567 mos7840_port
->SpRegOffset
= 0x0;
1568 mos7840_port
->ControlRegOffset
= 0x1;
1569 mos7840_port
->DcrRegOffset
= 0x4;
1571 u8 phy_num
= mos7840_port
->port_num
;
1573 /* Port 2 in the 2-port case uses registers of port 3 */
1574 if (serial
->num_ports
== 2)
1577 mos7840_port
->SpRegOffset
= 0x8 + 2 * (phy_num
- 2);
1578 mos7840_port
->ControlRegOffset
= 0x9 + 2 * (phy_num
- 2);
1579 mos7840_port
->DcrRegOffset
= 0x16 + 3 * (phy_num
- 2);
1581 mos7840_dump_serial_port(port
, mos7840_port
);
1582 usb_set_serial_port_data(port
, mos7840_port
);
1584 /* enable rx_disable bit in control register */
1585 status
= mos7840_get_reg_sync(port
,
1586 mos7840_port
->ControlRegOffset
, &Data
);
1588 dev_dbg(&port
->dev
, "Reading ControlReg failed status-0x%x\n", status
);
1591 dev_dbg(&port
->dev
, "ControlReg Reading success val is %x, status%d\n", Data
, status
);
1592 Data
|= 0x08; /* setting driver done bit */
1593 Data
|= 0x04; /* sp1_bit to have cts change reflect in
1596 /* Data |= 0x20; //rx_disable bit */
1597 status
= mos7840_set_reg_sync(port
,
1598 mos7840_port
->ControlRegOffset
, Data
);
1600 dev_dbg(&port
->dev
, "Writing ControlReg failed(rx_disable) status-0x%x\n", status
);
1603 dev_dbg(&port
->dev
, "ControlReg Writing success(rx_disable) status%d\n", status
);
1605 /* Write default values in DCR (i.e 0x01 in DCR0, 0x05 in DCR2
1608 status
= mos7840_set_reg_sync(port
,
1609 (__u16
) (mos7840_port
->DcrRegOffset
+ 0), Data
);
1611 dev_dbg(&port
->dev
, "Writing DCR0 failed status-0x%x\n", status
);
1614 dev_dbg(&port
->dev
, "DCR0 Writing success status%d\n", status
);
1617 status
= mos7840_set_reg_sync(port
,
1618 (__u16
) (mos7840_port
->DcrRegOffset
+ 1), Data
);
1620 dev_dbg(&port
->dev
, "Writing DCR1 failed status-0x%x\n", status
);
1623 dev_dbg(&port
->dev
, "DCR1 Writing success status%d\n", status
);
1626 status
= mos7840_set_reg_sync(port
,
1627 (__u16
) (mos7840_port
->DcrRegOffset
+ 2), Data
);
1629 dev_dbg(&port
->dev
, "Writing DCR2 failed status-0x%x\n", status
);
1632 dev_dbg(&port
->dev
, "DCR2 Writing success status%d\n", status
);
1634 /* write values in clkstart0x0 and clkmulti 0x20 */
1636 status
= mos7840_set_reg_sync(port
, CLK_START_VALUE_REGISTER
, Data
);
1638 dev_dbg(&port
->dev
, "Writing CLK_START_VALUE_REGISTER failed status-0x%x\n", status
);
1641 dev_dbg(&port
->dev
, "CLK_START_VALUE_REGISTER Writing success status%d\n", status
);
1644 status
= mos7840_set_reg_sync(port
, CLK_MULTI_REGISTER
, Data
);
1646 dev_dbg(&port
->dev
, "Writing CLK_MULTI_REGISTER failed status-0x%x\n", status
);
1649 dev_dbg(&port
->dev
, "CLK_MULTI_REGISTER Writing success status%d\n", status
);
1651 /* write value 0x0 to scratchpad register */
1653 status
= mos7840_set_uart_reg(port
, SCRATCH_PAD_REGISTER
, Data
);
1655 dev_dbg(&port
->dev
, "Writing SCRATCH_PAD_REGISTER failed status-0x%x\n", status
);
1658 dev_dbg(&port
->dev
, "SCRATCH_PAD_REGISTER Writing success status%d\n", status
);
1660 /* Zero Length flag register */
1661 if ((mos7840_port
->port_num
!= 1) && (serial
->num_ports
== 2)) {
1663 status
= mos7840_set_reg_sync(port
,
1665 ((__u16
)mos7840_port
->port_num
)), Data
);
1666 dev_dbg(&port
->dev
, "ZLIP offset %x\n",
1667 (__u16
)(ZLP_REG1
+ ((__u16
) mos7840_port
->port_num
)));
1669 dev_dbg(&port
->dev
, "Writing ZLP_REG%d failed status-0x%x\n", pnum
+ 2, status
);
1672 dev_dbg(&port
->dev
, "ZLP_REG%d Writing success status%d\n", pnum
+ 2, status
);
1675 status
= mos7840_set_reg_sync(port
,
1677 ((__u16
)mos7840_port
->port_num
) - 0x1), Data
);
1678 dev_dbg(&port
->dev
, "ZLIP offset %x\n",
1679 (__u16
)(ZLP_REG1
+ ((__u16
) mos7840_port
->port_num
) - 0x1));
1681 dev_dbg(&port
->dev
, "Writing ZLP_REG%d failed status-0x%x\n", pnum
+ 1, status
);
1684 dev_dbg(&port
->dev
, "ZLP_REG%d Writing success status%d\n", pnum
+ 1, status
);
1688 mos7840_port
->has_led
= device_flags
& MCS_LED
;
1690 /* Initialize LED timers */
1691 if (mos7840_port
->has_led
) {
1692 mos7840_port
->led_urb
= usb_alloc_urb(0, GFP_KERNEL
);
1693 mos7840_port
->led_dr
= kmalloc(sizeof(*mos7840_port
->led_dr
),
1695 if (!mos7840_port
->led_urb
|| !mos7840_port
->led_dr
) {
1700 timer_setup(&mos7840_port
->led_timer1
, mos7840_led_off
, 0);
1701 mos7840_port
->led_timer1
.expires
=
1702 jiffies
+ msecs_to_jiffies(LED_ON_MS
);
1703 timer_setup(&mos7840_port
->led_timer2
, mos7840_led_flag_off
,
1705 mos7840_port
->led_timer2
.expires
=
1706 jiffies
+ msecs_to_jiffies(LED_OFF_MS
);
1709 mos7840_set_led_sync(port
, MODEM_CONTROL_REGISTER
, 0x0300);
1714 kfree(mos7840_port
->led_dr
);
1715 usb_free_urb(mos7840_port
->led_urb
);
1716 kfree(mos7840_port
);
1721 static void mos7840_port_remove(struct usb_serial_port
*port
)
1723 struct moschip_port
*mos7840_port
= usb_get_serial_port_data(port
);
1725 if (mos7840_port
->has_led
) {
1727 mos7840_set_led_sync(port
, MODEM_CONTROL_REGISTER
, 0x0300);
1729 timer_shutdown_sync(&mos7840_port
->led_timer1
);
1730 timer_shutdown_sync(&mos7840_port
->led_timer2
);
1732 usb_kill_urb(mos7840_port
->led_urb
);
1733 usb_free_urb(mos7840_port
->led_urb
);
1734 kfree(mos7840_port
->led_dr
);
1737 kfree(mos7840_port
);
1740 static int mos7840_suspend(struct usb_serial
*serial
, pm_message_t message
)
1742 struct moschip_port
*mos7840_port
;
1743 struct usb_serial_port
*port
;
1746 for (i
= 0; i
< serial
->num_ports
; ++i
) {
1747 port
= serial
->port
[i
];
1748 if (!tty_port_initialized(&port
->port
))
1751 mos7840_port
= usb_get_serial_port_data(port
);
1753 usb_kill_urb(mos7840_port
->read_urb
);
1754 mos7840_port
->read_urb_busy
= false;
1760 static int mos7840_resume(struct usb_serial
*serial
)
1762 struct moschip_port
*mos7840_port
;
1763 struct usb_serial_port
*port
;
1767 for (i
= 0; i
< serial
->num_ports
; ++i
) {
1768 port
= serial
->port
[i
];
1769 if (!tty_port_initialized(&port
->port
))
1772 mos7840_port
= usb_get_serial_port_data(port
);
1774 mos7840_port
->read_urb_busy
= true;
1775 res
= usb_submit_urb(mos7840_port
->read_urb
, GFP_NOIO
);
1777 mos7840_port
->read_urb_busy
= false;
1783 static struct usb_serial_driver moschip7840_4port_device
= {
1787 .description
= DRIVER_DESC
,
1788 .id_table
= id_table
,
1789 .num_interrupt_in
= 1,
1790 .open
= mos7840_open
,
1791 .close
= mos7840_close
,
1792 .write
= mos7840_write
,
1793 .write_room
= mos7840_write_room
,
1794 .chars_in_buffer
= mos7840_chars_in_buffer
,
1795 .throttle
= mos7840_throttle
,
1796 .unthrottle
= mos7840_unthrottle
,
1797 .calc_num_ports
= mos7840_calc_num_ports
,
1798 .probe
= mos7840_probe
,
1799 .attach
= mos7840_attach
,
1800 .ioctl
= mos7840_ioctl
,
1801 .set_termios
= mos7840_set_termios
,
1802 .break_ctl
= mos7840_break
,
1803 .tiocmget
= mos7840_tiocmget
,
1804 .tiocmset
= mos7840_tiocmset
,
1805 .get_icount
= usb_serial_generic_get_icount
,
1806 .port_probe
= mos7840_port_probe
,
1807 .port_remove
= mos7840_port_remove
,
1808 .read_bulk_callback
= mos7840_bulk_in_callback
,
1809 .suspend
= mos7840_suspend
,
1810 .resume
= mos7840_resume
,
1813 static struct usb_serial_driver
* const serial_drivers
[] = {
1814 &moschip7840_4port_device
, NULL
1817 module_usb_serial_driver(serial_drivers
, id_table
);
1819 MODULE_DESCRIPTION(DRIVER_DESC
);
1820 MODULE_LICENSE("GPL");