1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright 2007, Frank A Kingswood <frank@kingswood-consulting.co.uk>
4 * Copyright 2007, Werner Cornelius <werner@cornelius-consult.de>
5 * Copyright 2009, Boris Hajduk <boris@hajduk.org>
7 * ch341.c implements a serial port driver for the Winchiphead CH341.
9 * The CH341 device can be used to implement an RS232 asynchronous
10 * serial port, an IEEE-1284 parallel printer port or a memory-like
11 * interface. In all cases the CH341 supports an I2C interface as well.
12 * This driver only supports the asynchronous serial interface.
15 #include <linux/kernel.h>
16 #include <linux/tty.h>
17 #include <linux/module.h>
18 #include <linux/slab.h>
19 #include <linux/usb.h>
20 #include <linux/usb/serial.h>
21 #include <linux/serial.h>
22 #include <linux/unaligned.h>
24 #define DEFAULT_BAUD_RATE 9600
25 #define DEFAULT_TIMEOUT 1000
27 /* flags for IO-Bits */
28 #define CH341_BIT_RTS (1 << 6)
29 #define CH341_BIT_DTR (1 << 5)
31 /******************************/
32 /* interrupt pipe definitions */
33 /******************************/
34 /* always 4 interrupt bytes */
35 /* first irq byte normally 0x08 */
36 /* second irq byte base 0x7d + below */
37 /* third irq byte base 0x94 + below */
38 /* fourth irq byte normally 0xee */
40 /* second interrupt byte */
41 #define CH341_MULT_STAT 0x04 /* multiple status since last interrupt event */
43 /* status returned in third interrupt answer byte, inverted in data
45 #define CH341_BIT_CTS 0x01
46 #define CH341_BIT_DSR 0x02
47 #define CH341_BIT_RI 0x04
48 #define CH341_BIT_DCD 0x08
49 #define CH341_BITS_MODEM_STAT 0x0f /* all bits */
51 /* Break support - the information used to implement this was gleaned from
52 * the Net/FreeBSD uchcom.c driver by Takanori Watanabe. Domo arigato.
55 #define CH341_REQ_READ_VERSION 0x5F
56 #define CH341_REQ_WRITE_REG 0x9A
57 #define CH341_REQ_READ_REG 0x95
58 #define CH341_REQ_SERIAL_INIT 0xA1
59 #define CH341_REQ_MODEM_CTRL 0xA4
61 #define CH341_REG_BREAK 0x05
62 #define CH341_REG_PRESCALER 0x12
63 #define CH341_REG_DIVISOR 0x13
64 #define CH341_REG_LCR 0x18
65 #define CH341_REG_LCR2 0x25
67 #define CH341_NBREAK_BITS 0x01
69 #define CH341_LCR_ENABLE_RX 0x80
70 #define CH341_LCR_ENABLE_TX 0x40
71 #define CH341_LCR_MARK_SPACE 0x20
72 #define CH341_LCR_PAR_EVEN 0x10
73 #define CH341_LCR_ENABLE_PAR 0x08
74 #define CH341_LCR_STOP_BITS_2 0x04
75 #define CH341_LCR_CS8 0x03
76 #define CH341_LCR_CS7 0x02
77 #define CH341_LCR_CS6 0x01
78 #define CH341_LCR_CS5 0x00
80 #define CH341_QUIRK_LIMITED_PRESCALER BIT(0)
81 #define CH341_QUIRK_SIMULATE_BREAK BIT(1)
83 static const struct usb_device_id id_table
[] = {
84 { USB_DEVICE(0x1a86, 0x5523) },
85 { USB_DEVICE(0x1a86, 0x7522) },
86 { USB_DEVICE(0x1a86, 0x7523) },
87 { USB_DEVICE(0x2184, 0x0057) },
88 { USB_DEVICE(0x4348, 0x5523) },
89 { USB_DEVICE(0x9986, 0x7523) },
92 MODULE_DEVICE_TABLE(usb
, id_table
);
94 struct ch341_private
{
95 spinlock_t lock
; /* access lock */
96 unsigned baud_rate
; /* set baud rate */
101 unsigned long quirks
;
104 unsigned long break_end
;
107 static void ch341_set_termios(struct tty_struct
*tty
,
108 struct usb_serial_port
*port
,
109 const struct ktermios
*old_termios
);
111 static int ch341_control_out(struct usb_device
*dev
, u8 request
,
112 u16 value
, u16 index
)
116 dev_dbg(&dev
->dev
, "%s - (%02x,%04x,%04x)\n", __func__
,
117 request
, value
, index
);
119 r
= usb_control_msg(dev
, usb_sndctrlpipe(dev
, 0), request
,
120 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
| USB_DIR_OUT
,
121 value
, index
, NULL
, 0, DEFAULT_TIMEOUT
);
123 dev_err(&dev
->dev
, "failed to send control message: %d\n", r
);
128 static int ch341_control_in(struct usb_device
*dev
,
129 u8 request
, u16 value
, u16 index
,
130 char *buf
, unsigned bufsize
)
134 dev_dbg(&dev
->dev
, "%s - (%02x,%04x,%04x,%u)\n", __func__
,
135 request
, value
, index
, bufsize
);
137 r
= usb_control_msg_recv(dev
, 0, request
,
138 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
| USB_DIR_IN
,
139 value
, index
, buf
, bufsize
, DEFAULT_TIMEOUT
,
142 dev_err(&dev
->dev
, "failed to receive control message: %d\n",
150 #define CH341_CLKRATE 48000000
151 #define CH341_CLK_DIV(ps, fact) (1 << (12 - 3 * (ps) - (fact)))
152 #define CH341_MIN_RATE(ps) (CH341_CLKRATE / (CH341_CLK_DIV((ps), 1) * 512))
154 static const speed_t ch341_min_rates
[] = {
161 /* Supported range is 46 to 3000000 bps. */
162 #define CH341_MIN_BPS DIV_ROUND_UP(CH341_CLKRATE, CH341_CLK_DIV(0, 0) * 256)
163 #define CH341_MAX_BPS (CH341_CLKRATE / (CH341_CLK_DIV(3, 0) * 2))
166 * The device line speed is given by the following equation:
168 * baudrate = 48000000 / (2^(12 - 3 * ps - fact) * div), where
172 * 2 <= div <= 256 if fact = 0, or
173 * 9 <= div <= 256 if fact = 1
175 static int ch341_get_divisor(struct ch341_private
*priv
, speed_t speed
)
177 unsigned int fact
, div
, clk_div
;
178 bool force_fact0
= false;
182 * Clamp to supported range, this makes the (ps < 0) and (div < 2)
183 * sanity checks below redundant.
185 speed
= clamp_val(speed
, CH341_MIN_BPS
, CH341_MAX_BPS
);
188 * Start with highest possible base clock (fact = 1) that will give a
189 * divisor strictly less than 512.
192 for (ps
= 3; ps
>= 0; ps
--) {
193 if (speed
> ch341_min_rates
[ps
])
200 /* Determine corresponding divisor, rounding down. */
201 clk_div
= CH341_CLK_DIV(ps
, fact
);
202 div
= CH341_CLKRATE
/ (clk_div
* speed
);
204 /* Some devices require a lower base clock if ps < 3. */
205 if (ps
< 3 && (priv
->quirks
& CH341_QUIRK_LIMITED_PRESCALER
))
208 /* Halve base clock (fact = 0) if required. */
209 if (div
< 9 || div
> 255 || force_fact0
) {
219 * Pick next divisor if resulting rate is closer to the requested one,
220 * scale up to avoid rounding errors on low rates.
222 if (16 * CH341_CLKRATE
/ (clk_div
* div
) - 16 * speed
>=
223 16 * speed
- 16 * CH341_CLKRATE
/ (clk_div
* (div
+ 1)))
227 * Prefer lower base clock (fact = 0) if even divisor.
229 * Note that this makes the receiver more tolerant to errors.
231 if (fact
== 1 && div
% 2 == 0) {
236 return (0x100 - div
) << 8 | fact
<< 2 | ps
;
239 static int ch341_set_baudrate_lcr(struct usb_device
*dev
,
240 struct ch341_private
*priv
,
241 speed_t baud_rate
, u8 lcr
)
249 val
= ch341_get_divisor(priv
, baud_rate
);
254 * CH341A buffers data until a full endpoint-size packet (32 bytes)
255 * has been received unless bit 7 is set.
257 * At least one device with version 0x27 appears to have this bit
260 if (priv
->version
> 0x27)
263 r
= ch341_control_out(dev
, CH341_REQ_WRITE_REG
,
264 CH341_REG_DIVISOR
<< 8 | CH341_REG_PRESCALER
,
270 * Chip versions before version 0x30 as read using
271 * CH341_REQ_READ_VERSION used separate registers for line control
272 * (stop bits, parity and word length). Version 0x30 and above use
273 * CH341_REG_LCR only and CH341_REG_LCR2 is always set to zero.
275 if (priv
->version
< 0x30)
278 r
= ch341_control_out(dev
, CH341_REQ_WRITE_REG
,
279 CH341_REG_LCR2
<< 8 | CH341_REG_LCR
, lcr
);
286 static int ch341_set_handshake(struct usb_device
*dev
, u8 control
)
288 return ch341_control_out(dev
, CH341_REQ_MODEM_CTRL
, ~control
, 0);
291 static int ch341_get_status(struct usb_device
*dev
, struct ch341_private
*priv
)
293 const unsigned int size
= 2;
298 r
= ch341_control_in(dev
, CH341_REQ_READ_REG
, 0x0706, 0, buffer
, size
);
302 spin_lock_irqsave(&priv
->lock
, flags
);
303 priv
->msr
= (~(*buffer
)) & CH341_BITS_MODEM_STAT
;
304 spin_unlock_irqrestore(&priv
->lock
, flags
);
309 /* -------------------------------------------------------------------------- */
311 static int ch341_configure(struct usb_device
*dev
, struct ch341_private
*priv
)
313 const unsigned int size
= 2;
317 /* expect two bytes 0x27 0x00 */
318 r
= ch341_control_in(dev
, CH341_REQ_READ_VERSION
, 0, 0, buffer
, size
);
322 priv
->version
= buffer
[0];
323 dev_dbg(&dev
->dev
, "Chip version: 0x%02x\n", priv
->version
);
325 r
= ch341_control_out(dev
, CH341_REQ_SERIAL_INIT
, 0, 0);
329 r
= ch341_set_baudrate_lcr(dev
, priv
, priv
->baud_rate
, priv
->lcr
);
333 r
= ch341_set_handshake(dev
, priv
->mcr
);
340 static int ch341_detect_quirks(struct usb_serial_port
*port
)
342 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
343 struct usb_device
*udev
= port
->serial
->dev
;
344 const unsigned int size
= 2;
345 unsigned long quirks
= 0;
350 * A subset of CH34x devices does not support all features. The
351 * prescaler is limited and there is no support for sending a RS232
352 * break condition. A read failure when trying to set up the latter is
353 * used to detect these devices.
355 r
= usb_control_msg_recv(udev
, 0, CH341_REQ_READ_REG
,
356 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
| USB_DIR_IN
,
357 CH341_REG_BREAK
, 0, &buffer
, size
,
358 DEFAULT_TIMEOUT
, GFP_KERNEL
);
360 dev_info(&port
->dev
, "break control not supported, using simulated break\n");
361 quirks
= CH341_QUIRK_LIMITED_PRESCALER
| CH341_QUIRK_SIMULATE_BREAK
;
364 dev_err(&port
->dev
, "failed to read break control: %d\n", r
);
368 dev_dbg(&port
->dev
, "enabling quirk flags: 0x%02lx\n", quirks
);
369 priv
->quirks
|= quirks
;
375 static int ch341_port_probe(struct usb_serial_port
*port
)
377 struct ch341_private
*priv
;
380 priv
= kzalloc(sizeof(struct ch341_private
), GFP_KERNEL
);
384 spin_lock_init(&priv
->lock
);
385 priv
->baud_rate
= DEFAULT_BAUD_RATE
;
387 * Some CH340 devices appear unable to change the initial LCR
388 * settings, so set a sane 8N1 default.
390 priv
->lcr
= CH341_LCR_ENABLE_RX
| CH341_LCR_ENABLE_TX
| CH341_LCR_CS8
;
392 r
= ch341_configure(port
->serial
->dev
, priv
);
396 usb_set_serial_port_data(port
, priv
);
398 r
= ch341_detect_quirks(port
);
408 static void ch341_port_remove(struct usb_serial_port
*port
)
410 struct ch341_private
*priv
;
412 priv
= usb_get_serial_port_data(port
);
416 static int ch341_carrier_raised(struct usb_serial_port
*port
)
418 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
419 if (priv
->msr
& CH341_BIT_DCD
)
424 static void ch341_dtr_rts(struct usb_serial_port
*port
, int on
)
426 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
429 /* drop DTR and RTS */
430 spin_lock_irqsave(&priv
->lock
, flags
);
432 priv
->mcr
|= CH341_BIT_RTS
| CH341_BIT_DTR
;
434 priv
->mcr
&= ~(CH341_BIT_RTS
| CH341_BIT_DTR
);
435 spin_unlock_irqrestore(&priv
->lock
, flags
);
436 ch341_set_handshake(port
->serial
->dev
, priv
->mcr
);
439 static void ch341_close(struct usb_serial_port
*port
)
441 usb_serial_generic_close(port
);
442 usb_kill_urb(port
->interrupt_in_urb
);
446 /* open this device, set default parameters */
447 static int ch341_open(struct tty_struct
*tty
, struct usb_serial_port
*port
)
449 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
453 ch341_set_termios(tty
, port
, NULL
);
455 dev_dbg(&port
->dev
, "%s - submitting interrupt urb\n", __func__
);
456 r
= usb_submit_urb(port
->interrupt_in_urb
, GFP_KERNEL
);
458 dev_err(&port
->dev
, "%s - failed to submit interrupt urb: %d\n",
463 r
= ch341_get_status(port
->serial
->dev
, priv
);
465 dev_err(&port
->dev
, "failed to read modem status: %d\n", r
);
466 goto err_kill_interrupt_urb
;
469 r
= usb_serial_generic_open(tty
, port
);
471 goto err_kill_interrupt_urb
;
475 err_kill_interrupt_urb
:
476 usb_kill_urb(port
->interrupt_in_urb
);
481 /* Old_termios contains the original termios settings and
482 * tty->termios contains the new setting to be used.
484 static void ch341_set_termios(struct tty_struct
*tty
,
485 struct usb_serial_port
*port
,
486 const struct ktermios
*old_termios
)
488 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
494 /* redundant changes may cause the chip to lose bytes */
495 if (old_termios
&& !tty_termios_hw_change(&tty
->termios
, old_termios
))
498 baud_rate
= tty_get_baud_rate(tty
);
500 lcr
= CH341_LCR_ENABLE_RX
| CH341_LCR_ENABLE_TX
;
502 switch (C_CSIZE(tty
)) {
504 lcr
|= CH341_LCR_CS5
;
507 lcr
|= CH341_LCR_CS6
;
510 lcr
|= CH341_LCR_CS7
;
513 lcr
|= CH341_LCR_CS8
;
518 lcr
|= CH341_LCR_ENABLE_PAR
;
519 if (C_PARODD(tty
) == 0)
520 lcr
|= CH341_LCR_PAR_EVEN
;
522 lcr
|= CH341_LCR_MARK_SPACE
;
526 lcr
|= CH341_LCR_STOP_BITS_2
;
529 priv
->baud_rate
= baud_rate
;
531 r
= ch341_set_baudrate_lcr(port
->serial
->dev
, priv
,
532 priv
->baud_rate
, lcr
);
533 if (r
< 0 && old_termios
) {
534 priv
->baud_rate
= tty_termios_baud_rate(old_termios
);
535 tty_termios_copy_hw(&tty
->termios
, old_termios
);
541 spin_lock_irqsave(&priv
->lock
, flags
);
542 if (C_BAUD(tty
) == B0
)
543 priv
->mcr
&= ~(CH341_BIT_DTR
| CH341_BIT_RTS
);
544 else if (old_termios
&& (old_termios
->c_cflag
& CBAUD
) == B0
)
545 priv
->mcr
|= (CH341_BIT_DTR
| CH341_BIT_RTS
);
546 spin_unlock_irqrestore(&priv
->lock
, flags
);
548 ch341_set_handshake(port
->serial
->dev
, priv
->mcr
);
552 * A subset of all CH34x devices don't support a real break condition and
553 * reading CH341_REG_BREAK fails (see also ch341_detect_quirks). This function
554 * simulates a break condition by lowering the baud rate to the minimum
555 * supported by the hardware upon enabling the break condition and sending
558 * Incoming data is corrupted while the break condition is being simulated.
560 * Normally the duration of the break condition can be controlled individually
561 * by userspace using TIOCSBRK and TIOCCBRK or by passing an argument to
562 * TCSBRKP. Due to how the simulation is implemented the duration can't be
563 * controlled. The duration is always about (1s / 46bd * 9bit) = 196ms.
565 static int ch341_simulate_break(struct tty_struct
*tty
, int break_state
)
567 struct usb_serial_port
*port
= tty
->driver_data
;
568 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
569 unsigned long now
, delay
;
572 if (break_state
!= 0) {
573 dev_dbg(&port
->dev
, "enter break state requested\n");
575 r
= ch341_set_baudrate_lcr(port
->serial
->dev
, priv
,
577 CH341_LCR_ENABLE_RX
| CH341_LCR_ENABLE_TX
| CH341_LCR_CS8
);
580 "failed to change baud rate to %u: %d\n",
585 r
= tty_put_char(tty
, '\0');
588 "failed to write NUL byte for simulated break condition: %d\n",
594 * Compute expected transmission duration including safety
595 * margin. The original baud rate is only restored after the
596 * computed point in time.
598 * 11 bits = 1 start, 8 data, 1 stop, 1 margin
600 priv
->break_end
= jiffies
+ (11 * HZ
/ CH341_MIN_BPS
);
605 dev_dbg(&port
->dev
, "leave break state requested\n");
609 if (time_before(now
, priv
->break_end
)) {
610 /* Wait until NUL byte is written */
611 delay
= priv
->break_end
- now
;
613 "wait %d ms while transmitting NUL byte at %u baud\n",
614 jiffies_to_msecs(delay
), CH341_MIN_BPS
);
615 schedule_timeout_interruptible(delay
);
620 /* Restore original baud rate */
621 r2
= ch341_set_baudrate_lcr(port
->serial
->dev
, priv
, priv
->baud_rate
,
625 "restoring original baud rate of %u failed: %d\n",
626 priv
->baud_rate
, r2
);
633 static int ch341_break_ctl(struct tty_struct
*tty
, int break_state
)
635 const uint16_t ch341_break_reg
=
636 ((uint16_t) CH341_REG_LCR
<< 8) | CH341_REG_BREAK
;
637 struct usb_serial_port
*port
= tty
->driver_data
;
638 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
640 uint16_t reg_contents
;
641 uint8_t break_reg
[2];
643 if (priv
->quirks
& CH341_QUIRK_SIMULATE_BREAK
)
644 return ch341_simulate_break(tty
, break_state
);
646 r
= ch341_control_in(port
->serial
->dev
, CH341_REQ_READ_REG
,
647 ch341_break_reg
, 0, break_reg
, 2);
649 dev_err(&port
->dev
, "%s - USB control read error (%d)\n",
655 dev_dbg(&port
->dev
, "%s - initial ch341 break register contents - reg1: %x, reg2: %x\n",
656 __func__
, break_reg
[0], break_reg
[1]);
657 if (break_state
!= 0) {
658 dev_dbg(&port
->dev
, "%s - Enter break state requested\n", __func__
);
659 break_reg
[0] &= ~CH341_NBREAK_BITS
;
660 break_reg
[1] &= ~CH341_LCR_ENABLE_TX
;
662 dev_dbg(&port
->dev
, "%s - Leave break state requested\n", __func__
);
663 break_reg
[0] |= CH341_NBREAK_BITS
;
664 break_reg
[1] |= CH341_LCR_ENABLE_TX
;
666 dev_dbg(&port
->dev
, "%s - New ch341 break register contents - reg1: %x, reg2: %x\n",
667 __func__
, break_reg
[0], break_reg
[1]);
668 reg_contents
= get_unaligned_le16(break_reg
);
669 r
= ch341_control_out(port
->serial
->dev
, CH341_REQ_WRITE_REG
,
670 ch341_break_reg
, reg_contents
);
672 dev_err(&port
->dev
, "%s - USB control write error (%d)\n",
680 static int ch341_tiocmset(struct tty_struct
*tty
,
681 unsigned int set
, unsigned int clear
)
683 struct usb_serial_port
*port
= tty
->driver_data
;
684 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
688 spin_lock_irqsave(&priv
->lock
, flags
);
690 priv
->mcr
|= CH341_BIT_RTS
;
692 priv
->mcr
|= CH341_BIT_DTR
;
693 if (clear
& TIOCM_RTS
)
694 priv
->mcr
&= ~CH341_BIT_RTS
;
695 if (clear
& TIOCM_DTR
)
696 priv
->mcr
&= ~CH341_BIT_DTR
;
698 spin_unlock_irqrestore(&priv
->lock
, flags
);
700 return ch341_set_handshake(port
->serial
->dev
, control
);
703 static void ch341_update_status(struct usb_serial_port
*port
,
704 unsigned char *data
, size_t len
)
706 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
707 struct tty_struct
*tty
;
715 status
= ~data
[2] & CH341_BITS_MODEM_STAT
;
717 spin_lock_irqsave(&priv
->lock
, flags
);
718 delta
= status
^ priv
->msr
;
720 spin_unlock_irqrestore(&priv
->lock
, flags
);
722 if (data
[1] & CH341_MULT_STAT
)
723 dev_dbg(&port
->dev
, "%s - multiple status change\n", __func__
);
728 if (delta
& CH341_BIT_CTS
)
730 if (delta
& CH341_BIT_DSR
)
732 if (delta
& CH341_BIT_RI
)
734 if (delta
& CH341_BIT_DCD
) {
736 tty
= tty_port_tty_get(&port
->port
);
738 usb_serial_handle_dcd_change(port
, tty
,
739 status
& CH341_BIT_DCD
);
744 wake_up_interruptible(&port
->port
.delta_msr_wait
);
747 static void ch341_read_int_callback(struct urb
*urb
)
749 struct usb_serial_port
*port
= urb
->context
;
750 unsigned char *data
= urb
->transfer_buffer
;
751 unsigned int len
= urb
->actual_length
;
754 switch (urb
->status
) {
761 /* this urb is terminated, clean up */
762 dev_dbg(&urb
->dev
->dev
, "%s - urb shutting down: %d\n",
763 __func__
, urb
->status
);
766 dev_dbg(&urb
->dev
->dev
, "%s - nonzero urb status: %d\n",
767 __func__
, urb
->status
);
771 usb_serial_debug_data(&port
->dev
, __func__
, len
, data
);
772 ch341_update_status(port
, data
, len
);
774 status
= usb_submit_urb(urb
, GFP_ATOMIC
);
776 dev_err(&urb
->dev
->dev
, "%s - usb_submit_urb failed: %d\n",
781 static int ch341_tiocmget(struct tty_struct
*tty
)
783 struct usb_serial_port
*port
= tty
->driver_data
;
784 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
790 spin_lock_irqsave(&priv
->lock
, flags
);
793 spin_unlock_irqrestore(&priv
->lock
, flags
);
795 result
= ((mcr
& CH341_BIT_DTR
) ? TIOCM_DTR
: 0)
796 | ((mcr
& CH341_BIT_RTS
) ? TIOCM_RTS
: 0)
797 | ((status
& CH341_BIT_CTS
) ? TIOCM_CTS
: 0)
798 | ((status
& CH341_BIT_DSR
) ? TIOCM_DSR
: 0)
799 | ((status
& CH341_BIT_RI
) ? TIOCM_RI
: 0)
800 | ((status
& CH341_BIT_DCD
) ? TIOCM_CD
: 0);
802 dev_dbg(&port
->dev
, "%s - result = %x\n", __func__
, result
);
807 static int ch341_reset_resume(struct usb_serial
*serial
)
809 struct usb_serial_port
*port
= serial
->port
[0];
810 struct ch341_private
*priv
;
813 priv
= usb_get_serial_port_data(port
);
817 /* reconfigure ch341 serial port after bus-reset */
818 ch341_configure(serial
->dev
, priv
);
820 if (tty_port_initialized(&port
->port
)) {
821 ret
= usb_submit_urb(port
->interrupt_in_urb
, GFP_NOIO
);
823 dev_err(&port
->dev
, "failed to submit interrupt urb: %d\n",
828 ret
= ch341_get_status(port
->serial
->dev
, priv
);
830 dev_err(&port
->dev
, "failed to read modem status: %d\n",
835 return usb_serial_generic_resume(serial
);
838 static struct usb_serial_driver ch341_device
= {
840 .name
= "ch341-uart",
842 .id_table
= id_table
,
845 .dtr_rts
= ch341_dtr_rts
,
846 .carrier_raised
= ch341_carrier_raised
,
847 .close
= ch341_close
,
848 .set_termios
= ch341_set_termios
,
849 .break_ctl
= ch341_break_ctl
,
850 .tiocmget
= ch341_tiocmget
,
851 .tiocmset
= ch341_tiocmset
,
852 .tiocmiwait
= usb_serial_generic_tiocmiwait
,
853 .read_int_callback
= ch341_read_int_callback
,
854 .port_probe
= ch341_port_probe
,
855 .port_remove
= ch341_port_remove
,
856 .reset_resume
= ch341_reset_resume
,
859 static struct usb_serial_driver
* const serial_drivers
[] = {
863 module_usb_serial_driver(serial_drivers
, id_table
);
865 MODULE_DESCRIPTION("Winchiphead CH341 USB Serial driver");
866 MODULE_LICENSE("GPL v2");