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 <asm/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, 0x5512) },
85 { USB_DEVICE(0x1a86, 0x5523) },
86 { USB_DEVICE(0x1a86, 0x7522) },
87 { USB_DEVICE(0x1a86, 0x7523) },
88 { USB_DEVICE(0x4348, 0x5523) },
91 MODULE_DEVICE_TABLE(usb
, id_table
);
93 struct ch341_private
{
94 spinlock_t lock
; /* access lock */
95 unsigned baud_rate
; /* set baud rate */
100 unsigned long break_end
;
103 static void ch341_set_termios(struct tty_struct
*tty
,
104 struct usb_serial_port
*port
,
105 struct ktermios
*old_termios
);
107 static int ch341_control_out(struct usb_device
*dev
, u8 request
,
108 u16 value
, u16 index
)
112 dev_dbg(&dev
->dev
, "%s - (%02x,%04x,%04x)\n", __func__
,
113 request
, value
, index
);
115 r
= usb_control_msg(dev
, usb_sndctrlpipe(dev
, 0), request
,
116 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
| USB_DIR_OUT
,
117 value
, index
, NULL
, 0, DEFAULT_TIMEOUT
);
119 dev_err(&dev
->dev
, "failed to send control message: %d\n", r
);
124 static int ch341_control_in(struct usb_device
*dev
,
125 u8 request
, u16 value
, u16 index
,
126 char *buf
, unsigned bufsize
)
130 dev_dbg(&dev
->dev
, "%s - (%02x,%04x,%04x,%u)\n", __func__
,
131 request
, value
, index
, bufsize
);
133 r
= usb_control_msg(dev
, usb_rcvctrlpipe(dev
, 0), request
,
134 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
| USB_DIR_IN
,
135 value
, index
, buf
, bufsize
, DEFAULT_TIMEOUT
);
136 if (r
< (int)bufsize
) {
139 "short control message received (%d < %u)\n",
144 dev_err(&dev
->dev
, "failed to receive control message: %d\n",
152 #define CH341_CLKRATE 48000000
153 #define CH341_CLK_DIV(ps, fact) (1 << (12 - 3 * (ps) - (fact)))
154 #define CH341_MIN_RATE(ps) (CH341_CLKRATE / (CH341_CLK_DIV((ps), 1) * 512))
156 static const speed_t ch341_min_rates
[] = {
163 /* Supported range is 46 to 3000000 bps. */
164 #define CH341_MIN_BPS DIV_ROUND_UP(CH341_CLKRATE, CH341_CLK_DIV(0, 0) * 256)
165 #define CH341_MAX_BPS (CH341_CLKRATE / (CH341_CLK_DIV(3, 0) * 2))
168 * The device line speed is given by the following equation:
170 * baudrate = 48000000 / (2^(12 - 3 * ps - fact) * div), where
174 * 2 <= div <= 256 if fact = 0, or
175 * 9 <= div <= 256 if fact = 1
177 static int ch341_get_divisor(struct ch341_private
*priv
, speed_t speed
)
179 unsigned int fact
, div
, clk_div
;
180 bool force_fact0
= false;
184 * Clamp to supported range, this makes the (ps < 0) and (div < 2)
185 * sanity checks below redundant.
187 speed
= clamp_val(speed
, CH341_MIN_BPS
, CH341_MAX_BPS
);
190 * Start with highest possible base clock (fact = 1) that will give a
191 * divisor strictly less than 512.
194 for (ps
= 3; ps
>= 0; ps
--) {
195 if (speed
> ch341_min_rates
[ps
])
202 /* Determine corresponding divisor, rounding down. */
203 clk_div
= CH341_CLK_DIV(ps
, fact
);
204 div
= CH341_CLKRATE
/ (clk_div
* speed
);
206 /* Some devices require a lower base clock if ps < 3. */
207 if (ps
< 3 && (priv
->quirks
& CH341_QUIRK_LIMITED_PRESCALER
))
210 /* Halve base clock (fact = 0) if required. */
211 if (div
< 9 || div
> 255 || force_fact0
) {
221 * Pick next divisor if resulting rate is closer to the requested one,
222 * scale up to avoid rounding errors on low rates.
224 if (16 * CH341_CLKRATE
/ (clk_div
* div
) - 16 * speed
>=
225 16 * speed
- 16 * CH341_CLKRATE
/ (clk_div
* (div
+ 1)))
229 * Prefer lower base clock (fact = 0) if even divisor.
231 * Note that this makes the receiver more tolerant to errors.
233 if (fact
== 1 && div
% 2 == 0) {
238 return (0x100 - div
) << 8 | fact
<< 2 | ps
;
241 static int ch341_set_baudrate_lcr(struct usb_device
*dev
,
242 struct ch341_private
*priv
,
243 speed_t baud_rate
, u8 lcr
)
251 val
= ch341_get_divisor(priv
, baud_rate
);
256 * CH341A buffers data until a full endpoint-size packet (32 bytes)
257 * has been received unless bit 7 is set.
261 r
= ch341_control_out(dev
, CH341_REQ_WRITE_REG
,
262 CH341_REG_DIVISOR
<< 8 | CH341_REG_PRESCALER
,
268 * Chip versions before version 0x30 as read using
269 * CH341_REQ_READ_VERSION used separate registers for line control
270 * (stop bits, parity and word length). Version 0x30 and above use
271 * CH341_REG_LCR only and CH341_REG_LCR2 is always set to zero.
273 r
= ch341_control_out(dev
, CH341_REQ_WRITE_REG
,
274 CH341_REG_LCR2
<< 8 | CH341_REG_LCR
, lcr
);
281 static int ch341_set_handshake(struct usb_device
*dev
, u8 control
)
283 return ch341_control_out(dev
, CH341_REQ_MODEM_CTRL
, ~control
, 0);
286 static int ch341_get_status(struct usb_device
*dev
, struct ch341_private
*priv
)
288 const unsigned int size
= 2;
293 buffer
= kmalloc(size
, GFP_KERNEL
);
297 r
= ch341_control_in(dev
, CH341_REQ_READ_REG
, 0x0706, 0, buffer
, size
);
301 spin_lock_irqsave(&priv
->lock
, flags
);
302 priv
->msr
= (~(*buffer
)) & CH341_BITS_MODEM_STAT
;
303 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 buffer
= kmalloc(size
, GFP_KERNEL
);
321 /* expect two bytes 0x27 0x00 */
322 r
= ch341_control_in(dev
, CH341_REQ_READ_VERSION
, 0, 0, buffer
, size
);
325 dev_dbg(&dev
->dev
, "Chip version: 0x%02x\n", buffer
[0]);
327 r
= ch341_control_out(dev
, CH341_REQ_SERIAL_INIT
, 0, 0);
331 r
= ch341_set_baudrate_lcr(dev
, priv
, priv
->baud_rate
, priv
->lcr
);
335 r
= ch341_set_handshake(dev
, priv
->mcr
);
341 static int ch341_detect_quirks(struct usb_serial_port
*port
)
343 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
344 struct usb_device
*udev
= port
->serial
->dev
;
345 const unsigned int size
= 2;
346 unsigned long quirks
= 0;
350 buffer
= kmalloc(size
, GFP_KERNEL
);
355 * A subset of CH34x devices does not support all features. The
356 * prescaler is limited and there is no support for sending a RS232
357 * break condition. A read failure when trying to set up the latter is
358 * used to detect these devices.
360 r
= usb_control_msg(udev
, usb_rcvctrlpipe(udev
, 0), CH341_REQ_READ_REG
,
361 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
| USB_DIR_IN
,
362 CH341_REG_BREAK
, 0, buffer
, size
, DEFAULT_TIMEOUT
);
364 dev_info(&port
->dev
, "break control not supported, using simulated break\n");
365 quirks
= CH341_QUIRK_LIMITED_PRESCALER
| CH341_QUIRK_SIMULATE_BREAK
;
373 dev_err(&port
->dev
, "failed to read break control: %d\n", r
);
382 dev_dbg(&port
->dev
, "enabling quirk flags: 0x%02lx\n", quirks
);
383 priv
->quirks
|= quirks
;
389 static int ch341_port_probe(struct usb_serial_port
*port
)
391 struct ch341_private
*priv
;
394 priv
= kzalloc(sizeof(struct ch341_private
), GFP_KERNEL
);
398 spin_lock_init(&priv
->lock
);
399 priv
->baud_rate
= DEFAULT_BAUD_RATE
;
401 * Some CH340 devices appear unable to change the initial LCR
402 * settings, so set a sane 8N1 default.
404 priv
->lcr
= CH341_LCR_ENABLE_RX
| CH341_LCR_ENABLE_TX
| CH341_LCR_CS8
;
406 r
= ch341_configure(port
->serial
->dev
, priv
);
410 usb_set_serial_port_data(port
, priv
);
412 r
= ch341_detect_quirks(port
);
422 static int ch341_port_remove(struct usb_serial_port
*port
)
424 struct ch341_private
*priv
;
426 priv
= usb_get_serial_port_data(port
);
432 static int ch341_carrier_raised(struct usb_serial_port
*port
)
434 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
435 if (priv
->msr
& CH341_BIT_DCD
)
440 static void ch341_dtr_rts(struct usb_serial_port
*port
, int on
)
442 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
445 /* drop DTR and RTS */
446 spin_lock_irqsave(&priv
->lock
, flags
);
448 priv
->mcr
|= CH341_BIT_RTS
| CH341_BIT_DTR
;
450 priv
->mcr
&= ~(CH341_BIT_RTS
| CH341_BIT_DTR
);
451 spin_unlock_irqrestore(&priv
->lock
, flags
);
452 ch341_set_handshake(port
->serial
->dev
, priv
->mcr
);
455 static void ch341_close(struct usb_serial_port
*port
)
457 usb_serial_generic_close(port
);
458 usb_kill_urb(port
->interrupt_in_urb
);
462 /* open this device, set default parameters */
463 static int ch341_open(struct tty_struct
*tty
, struct usb_serial_port
*port
)
465 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
469 ch341_set_termios(tty
, port
, NULL
);
471 dev_dbg(&port
->dev
, "%s - submitting interrupt urb\n", __func__
);
472 r
= usb_submit_urb(port
->interrupt_in_urb
, GFP_KERNEL
);
474 dev_err(&port
->dev
, "%s - failed to submit interrupt urb: %d\n",
479 r
= ch341_get_status(port
->serial
->dev
, priv
);
481 dev_err(&port
->dev
, "failed to read modem status: %d\n", r
);
482 goto err_kill_interrupt_urb
;
485 r
= usb_serial_generic_open(tty
, port
);
487 goto err_kill_interrupt_urb
;
491 err_kill_interrupt_urb
:
492 usb_kill_urb(port
->interrupt_in_urb
);
497 /* Old_termios contains the original termios settings and
498 * tty->termios contains the new setting to be used.
500 static void ch341_set_termios(struct tty_struct
*tty
,
501 struct usb_serial_port
*port
, struct ktermios
*old_termios
)
503 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
509 /* redundant changes may cause the chip to lose bytes */
510 if (old_termios
&& !tty_termios_hw_change(&tty
->termios
, old_termios
))
513 baud_rate
= tty_get_baud_rate(tty
);
515 lcr
= CH341_LCR_ENABLE_RX
| CH341_LCR_ENABLE_TX
;
517 switch (C_CSIZE(tty
)) {
519 lcr
|= CH341_LCR_CS5
;
522 lcr
|= CH341_LCR_CS6
;
525 lcr
|= CH341_LCR_CS7
;
528 lcr
|= CH341_LCR_CS8
;
533 lcr
|= CH341_LCR_ENABLE_PAR
;
534 if (C_PARODD(tty
) == 0)
535 lcr
|= CH341_LCR_PAR_EVEN
;
537 lcr
|= CH341_LCR_MARK_SPACE
;
541 lcr
|= CH341_LCR_STOP_BITS_2
;
544 priv
->baud_rate
= baud_rate
;
546 r
= ch341_set_baudrate_lcr(port
->serial
->dev
, priv
,
547 priv
->baud_rate
, lcr
);
548 if (r
< 0 && old_termios
) {
549 priv
->baud_rate
= tty_termios_baud_rate(old_termios
);
550 tty_termios_copy_hw(&tty
->termios
, old_termios
);
556 spin_lock_irqsave(&priv
->lock
, flags
);
557 if (C_BAUD(tty
) == B0
)
558 priv
->mcr
&= ~(CH341_BIT_DTR
| CH341_BIT_RTS
);
559 else if (old_termios
&& (old_termios
->c_cflag
& CBAUD
) == B0
)
560 priv
->mcr
|= (CH341_BIT_DTR
| CH341_BIT_RTS
);
561 spin_unlock_irqrestore(&priv
->lock
, flags
);
563 ch341_set_handshake(port
->serial
->dev
, priv
->mcr
);
567 * A subset of all CH34x devices don't support a real break condition and
568 * reading CH341_REG_BREAK fails (see also ch341_detect_quirks). This function
569 * simulates a break condition by lowering the baud rate to the minimum
570 * supported by the hardware upon enabling the break condition and sending
573 * Incoming data is corrupted while the break condition is being simulated.
575 * Normally the duration of the break condition can be controlled individually
576 * by userspace using TIOCSBRK and TIOCCBRK or by passing an argument to
577 * TCSBRKP. Due to how the simulation is implemented the duration can't be
578 * controlled. The duration is always about (1s / 46bd * 9bit) = 196ms.
580 static void ch341_simulate_break(struct tty_struct
*tty
, int break_state
)
582 struct usb_serial_port
*port
= tty
->driver_data
;
583 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
584 unsigned long now
, delay
;
587 if (break_state
!= 0) {
588 dev_dbg(&port
->dev
, "enter break state requested\n");
590 r
= ch341_set_baudrate_lcr(port
->serial
->dev
, priv
,
592 CH341_LCR_ENABLE_RX
| CH341_LCR_ENABLE_TX
| CH341_LCR_CS8
);
595 "failed to change baud rate to %u: %d\n",
600 r
= tty_put_char(tty
, '\0');
603 "failed to write NUL byte for simulated break condition: %d\n",
609 * Compute expected transmission duration including safety
610 * margin. The original baud rate is only restored after the
611 * computed point in time.
613 * 11 bits = 1 start, 8 data, 1 stop, 1 margin
615 priv
->break_end
= jiffies
+ (11 * HZ
/ CH341_MIN_BPS
);
620 dev_dbg(&port
->dev
, "leave break state requested\n");
624 if (time_before(now
, priv
->break_end
)) {
625 /* Wait until NUL byte is written */
626 delay
= priv
->break_end
- now
;
628 "wait %d ms while transmitting NUL byte at %u baud\n",
629 jiffies_to_msecs(delay
), CH341_MIN_BPS
);
630 schedule_timeout_interruptible(delay
);
634 /* Restore original baud rate */
635 r
= ch341_set_baudrate_lcr(port
->serial
->dev
, priv
, priv
->baud_rate
,
639 "restoring original baud rate of %u failed: %d\n",
643 static void ch341_break_ctl(struct tty_struct
*tty
, int break_state
)
645 const uint16_t ch341_break_reg
=
646 ((uint16_t) CH341_REG_LCR
<< 8) | CH341_REG_BREAK
;
647 struct usb_serial_port
*port
= tty
->driver_data
;
648 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
650 uint16_t reg_contents
;
653 if (priv
->quirks
& CH341_QUIRK_SIMULATE_BREAK
) {
654 ch341_simulate_break(tty
, break_state
);
658 break_reg
= kmalloc(2, GFP_KERNEL
);
662 r
= ch341_control_in(port
->serial
->dev
, CH341_REQ_READ_REG
,
663 ch341_break_reg
, 0, break_reg
, 2);
665 dev_err(&port
->dev
, "%s - USB control read error (%d)\n",
669 dev_dbg(&port
->dev
, "%s - initial ch341 break register contents - reg1: %x, reg2: %x\n",
670 __func__
, break_reg
[0], break_reg
[1]);
671 if (break_state
!= 0) {
672 dev_dbg(&port
->dev
, "%s - Enter break state requested\n", __func__
);
673 break_reg
[0] &= ~CH341_NBREAK_BITS
;
674 break_reg
[1] &= ~CH341_LCR_ENABLE_TX
;
676 dev_dbg(&port
->dev
, "%s - Leave break state requested\n", __func__
);
677 break_reg
[0] |= CH341_NBREAK_BITS
;
678 break_reg
[1] |= CH341_LCR_ENABLE_TX
;
680 dev_dbg(&port
->dev
, "%s - New ch341 break register contents - reg1: %x, reg2: %x\n",
681 __func__
, break_reg
[0], break_reg
[1]);
682 reg_contents
= get_unaligned_le16(break_reg
);
683 r
= ch341_control_out(port
->serial
->dev
, CH341_REQ_WRITE_REG
,
684 ch341_break_reg
, reg_contents
);
686 dev_err(&port
->dev
, "%s - USB control write error (%d)\n",
692 static int ch341_tiocmset(struct tty_struct
*tty
,
693 unsigned int set
, unsigned int clear
)
695 struct usb_serial_port
*port
= tty
->driver_data
;
696 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
700 spin_lock_irqsave(&priv
->lock
, flags
);
702 priv
->mcr
|= CH341_BIT_RTS
;
704 priv
->mcr
|= CH341_BIT_DTR
;
705 if (clear
& TIOCM_RTS
)
706 priv
->mcr
&= ~CH341_BIT_RTS
;
707 if (clear
& TIOCM_DTR
)
708 priv
->mcr
&= ~CH341_BIT_DTR
;
710 spin_unlock_irqrestore(&priv
->lock
, flags
);
712 return ch341_set_handshake(port
->serial
->dev
, control
);
715 static void ch341_update_status(struct usb_serial_port
*port
,
716 unsigned char *data
, size_t len
)
718 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
719 struct tty_struct
*tty
;
727 status
= ~data
[2] & CH341_BITS_MODEM_STAT
;
729 spin_lock_irqsave(&priv
->lock
, flags
);
730 delta
= status
^ priv
->msr
;
732 spin_unlock_irqrestore(&priv
->lock
, flags
);
734 if (data
[1] & CH341_MULT_STAT
)
735 dev_dbg(&port
->dev
, "%s - multiple status change\n", __func__
);
740 if (delta
& CH341_BIT_CTS
)
742 if (delta
& CH341_BIT_DSR
)
744 if (delta
& CH341_BIT_RI
)
746 if (delta
& CH341_BIT_DCD
) {
748 tty
= tty_port_tty_get(&port
->port
);
750 usb_serial_handle_dcd_change(port
, tty
,
751 status
& CH341_BIT_DCD
);
756 wake_up_interruptible(&port
->port
.delta_msr_wait
);
759 static void ch341_read_int_callback(struct urb
*urb
)
761 struct usb_serial_port
*port
= urb
->context
;
762 unsigned char *data
= urb
->transfer_buffer
;
763 unsigned int len
= urb
->actual_length
;
766 switch (urb
->status
) {
773 /* this urb is terminated, clean up */
774 dev_dbg(&urb
->dev
->dev
, "%s - urb shutting down: %d\n",
775 __func__
, urb
->status
);
778 dev_dbg(&urb
->dev
->dev
, "%s - nonzero urb status: %d\n",
779 __func__
, urb
->status
);
783 usb_serial_debug_data(&port
->dev
, __func__
, len
, data
);
784 ch341_update_status(port
, data
, len
);
786 status
= usb_submit_urb(urb
, GFP_ATOMIC
);
788 dev_err(&urb
->dev
->dev
, "%s - usb_submit_urb failed: %d\n",
793 static int ch341_tiocmget(struct tty_struct
*tty
)
795 struct usb_serial_port
*port
= tty
->driver_data
;
796 struct ch341_private
*priv
= usb_get_serial_port_data(port
);
802 spin_lock_irqsave(&priv
->lock
, flags
);
805 spin_unlock_irqrestore(&priv
->lock
, flags
);
807 result
= ((mcr
& CH341_BIT_DTR
) ? TIOCM_DTR
: 0)
808 | ((mcr
& CH341_BIT_RTS
) ? TIOCM_RTS
: 0)
809 | ((status
& CH341_BIT_CTS
) ? TIOCM_CTS
: 0)
810 | ((status
& CH341_BIT_DSR
) ? TIOCM_DSR
: 0)
811 | ((status
& CH341_BIT_RI
) ? TIOCM_RI
: 0)
812 | ((status
& CH341_BIT_DCD
) ? TIOCM_CD
: 0);
814 dev_dbg(&port
->dev
, "%s - result = %x\n", __func__
, result
);
819 static int ch341_reset_resume(struct usb_serial
*serial
)
821 struct usb_serial_port
*port
= serial
->port
[0];
822 struct ch341_private
*priv
;
825 priv
= usb_get_serial_port_data(port
);
829 /* reconfigure ch341 serial port after bus-reset */
830 ch341_configure(serial
->dev
, priv
);
832 if (tty_port_initialized(&port
->port
)) {
833 ret
= usb_submit_urb(port
->interrupt_in_urb
, GFP_NOIO
);
835 dev_err(&port
->dev
, "failed to submit interrupt urb: %d\n",
840 ret
= ch341_get_status(port
->serial
->dev
, priv
);
842 dev_err(&port
->dev
, "failed to read modem status: %d\n",
847 return usb_serial_generic_resume(serial
);
850 static struct usb_serial_driver ch341_device
= {
852 .owner
= THIS_MODULE
,
853 .name
= "ch341-uart",
855 .id_table
= id_table
,
858 .dtr_rts
= ch341_dtr_rts
,
859 .carrier_raised
= ch341_carrier_raised
,
860 .close
= ch341_close
,
861 .set_termios
= ch341_set_termios
,
862 .break_ctl
= ch341_break_ctl
,
863 .tiocmget
= ch341_tiocmget
,
864 .tiocmset
= ch341_tiocmset
,
865 .tiocmiwait
= usb_serial_generic_tiocmiwait
,
866 .read_int_callback
= ch341_read_int_callback
,
867 .port_probe
= ch341_port_probe
,
868 .port_remove
= ch341_port_remove
,
869 .reset_resume
= ch341_reset_resume
,
872 static struct usb_serial_driver
* const serial_drivers
[] = {
876 module_usb_serial_driver(serial_drivers
, id_table
);
878 MODULE_LICENSE("GPL v2");