linux/drivers/usb/serial/ch341.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   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>
   6 *
   7 * ch341.c implements a serial port driver for the Winchiphead CH341.
   8 *
   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.
  13 */
  14
  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>
  23
  24#define DEFAULT_BAUD_RATE 9600
  25#define DEFAULT_TIMEOUT   1000
  26
  27/* flags for IO-Bits */
  28#define CH341_BIT_RTS (1 << 6)
  29#define CH341_BIT_DTR (1 << 5)
  30
  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 */
  39
  40/* second interrupt byte */
  41#define CH341_MULT_STAT 0x04 /* multiple status since last interrupt event */
  42
  43/* status returned in third interrupt answer byte, inverted in data
  44   from irq */
  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 */
  50
  51/* Break support - the information used to implement this was gleaned from
  52 * the Net/FreeBSD uchcom.c driver by Takanori Watanabe.  Domo arigato.
  53 */
  54
  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
  60
  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
  66
  67#define CH341_NBREAK_BITS      0x01
  68
  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
  79
  80#define CH341_QUIRK_LIMITED_PRESCALER   BIT(0)
  81#define CH341_QUIRK_SIMULATE_BREAK      BIT(1)
  82
  83static 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) },
  89        { USB_DEVICE(0x9986, 0x7523) },
  90        { },
  91};
  92MODULE_DEVICE_TABLE(usb, id_table);
  93
  94struct ch341_private {
  95        spinlock_t lock; /* access lock */
  96        unsigned baud_rate; /* set baud rate */
  97        u8 mcr;
  98        u8 msr;
  99        u8 lcr;
 100        unsigned long quirks;
 101        unsigned long break_end;
 102};
 103
 104static void ch341_set_termios(struct tty_struct *tty,
 105                              struct usb_serial_port *port,
 106                              struct ktermios *old_termios);
 107
 108static int ch341_control_out(struct usb_device *dev, u8 request,
 109                             u16 value, u16 index)
 110{
 111        int r;
 112
 113        dev_dbg(&dev->dev, "%s - (%02x,%04x,%04x)\n", __func__,
 114                request, value, index);
 115
 116        r = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request,
 117                            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 118                            value, index, NULL, 0, DEFAULT_TIMEOUT);
 119        if (r < 0)
 120                dev_err(&dev->dev, "failed to send control message: %d\n", r);
 121
 122        return r;
 123}
 124
 125static int ch341_control_in(struct usb_device *dev,
 126                            u8 request, u16 value, u16 index,
 127                            char *buf, unsigned bufsize)
 128{
 129        int r;
 130
 131        dev_dbg(&dev->dev, "%s - (%02x,%04x,%04x,%u)\n", __func__,
 132                request, value, index, bufsize);
 133
 134        r = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
 135                            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 136                            value, index, buf, bufsize, DEFAULT_TIMEOUT);
 137        if (r < (int)bufsize) {
 138                if (r >= 0) {
 139                        dev_err(&dev->dev,
 140                                "short control message received (%d < %u)\n",
 141                                r, bufsize);
 142                        r = -EIO;
 143                }
 144
 145                dev_err(&dev->dev, "failed to receive control message: %d\n",
 146                        r);
 147                return r;
 148        }
 149
 150        return 0;
 151}
 152
 153#define CH341_CLKRATE           48000000
 154#define CH341_CLK_DIV(ps, fact) (1 << (12 - 3 * (ps) - (fact)))
 155#define CH341_MIN_RATE(ps)      (CH341_CLKRATE / (CH341_CLK_DIV((ps), 1) * 512))
 156
 157static const speed_t ch341_min_rates[] = {
 158        CH341_MIN_RATE(0),
 159        CH341_MIN_RATE(1),
 160        CH341_MIN_RATE(2),
 161        CH341_MIN_RATE(3),
 162};
 163
 164/* Supported range is 46 to 3000000 bps. */
 165#define CH341_MIN_BPS   DIV_ROUND_UP(CH341_CLKRATE, CH341_CLK_DIV(0, 0) * 256)
 166#define CH341_MAX_BPS   (CH341_CLKRATE / (CH341_CLK_DIV(3, 0) * 2))
 167
 168/*
 169 * The device line speed is given by the following equation:
 170 *
 171 *      baudrate = 48000000 / (2^(12 - 3 * ps - fact) * div), where
 172 *
 173 *              0 <= ps <= 3,
 174 *              0 <= fact <= 1,
 175 *              2 <= div <= 256 if fact = 0, or
 176 *              9 <= div <= 256 if fact = 1
 177 */
 178static int ch341_get_divisor(struct ch341_private *priv, speed_t speed)
 179{
 180        unsigned int fact, div, clk_div;
 181        bool force_fact0 = false;
 182        int ps;
 183
 184        /*
 185         * Clamp to supported range, this makes the (ps < 0) and (div < 2)
 186         * sanity checks below redundant.
 187         */
 188        speed = clamp_val(speed, CH341_MIN_BPS, CH341_MAX_BPS);
 189
 190        /*
 191         * Start with highest possible base clock (fact = 1) that will give a
 192         * divisor strictly less than 512.
 193         */
 194        fact = 1;
 195        for (ps = 3; ps >= 0; ps--) {
 196                if (speed > ch341_min_rates[ps])
 197                        break;
 198        }
 199
 200        if (ps < 0)
 201                return -EINVAL;
 202
 203        /* Determine corresponding divisor, rounding down. */
 204        clk_div = CH341_CLK_DIV(ps, fact);
 205        div = CH341_CLKRATE / (clk_div * speed);
 206
 207        /* Some devices require a lower base clock if ps < 3. */
 208        if (ps < 3 && (priv->quirks & CH341_QUIRK_LIMITED_PRESCALER))
 209                force_fact0 = true;
 210
 211        /* Halve base clock (fact = 0) if required. */
 212        if (div < 9 || div > 255 || force_fact0) {
 213                div /= 2;
 214                clk_div *= 2;
 215                fact = 0;
 216        }
 217
 218        if (div < 2)
 219                return -EINVAL;
 220
 221        /*
 222         * Pick next divisor if resulting rate is closer to the requested one,
 223         * scale up to avoid rounding errors on low rates.
 224         */
 225        if (16 * CH341_CLKRATE / (clk_div * div) - 16 * speed >=
 226                        16 * speed - 16 * CH341_CLKRATE / (clk_div * (div + 1)))
 227                div++;
 228
 229        /*
 230         * Prefer lower base clock (fact = 0) if even divisor.
 231         *
 232         * Note that this makes the receiver more tolerant to errors.
 233         */
 234        if (fact == 1 && div % 2 == 0) {
 235                div /= 2;
 236                fact = 0;
 237        }
 238
 239        return (0x100 - div) << 8 | fact << 2 | ps;
 240}
 241
 242static int ch341_set_baudrate_lcr(struct usb_device *dev,
 243                                  struct ch341_private *priv,
 244                                  speed_t baud_rate, u8 lcr)
 245{
 246        int val;
 247        int r;
 248
 249        if (!baud_rate)
 250                return -EINVAL;
 251
 252        val = ch341_get_divisor(priv, baud_rate);
 253        if (val < 0)
 254                return -EINVAL;
 255
 256        /*
 257         * CH341A buffers data until a full endpoint-size packet (32 bytes)
 258         * has been received unless bit 7 is set.
 259         */
 260        val |= BIT(7);
 261
 262        r = ch341_control_out(dev, CH341_REQ_WRITE_REG,
 263                              CH341_REG_DIVISOR << 8 | CH341_REG_PRESCALER,
 264                              val);
 265        if (r)
 266                return r;
 267
 268        /*
 269         * Chip versions before version 0x30 as read using
 270         * CH341_REQ_READ_VERSION used separate registers for line control
 271         * (stop bits, parity and word length). Version 0x30 and above use
 272         * CH341_REG_LCR only and CH341_REG_LCR2 is always set to zero.
 273         */
 274        r = ch341_control_out(dev, CH341_REQ_WRITE_REG,
 275                              CH341_REG_LCR2 << 8 | CH341_REG_LCR, lcr);
 276        if (r)
 277                return r;
 278
 279        return r;
 280}
 281
 282static int ch341_set_handshake(struct usb_device *dev, u8 control)
 283{
 284        return ch341_control_out(dev, CH341_REQ_MODEM_CTRL, ~control, 0);
 285}
 286
 287static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv)
 288{
 289        const unsigned int size = 2;
 290        char *buffer;
 291        int r;
 292        unsigned long flags;
 293
 294        buffer = kmalloc(size, GFP_KERNEL);
 295        if (!buffer)
 296                return -ENOMEM;
 297
 298        r = ch341_control_in(dev, CH341_REQ_READ_REG, 0x0706, 0, buffer, size);
 299        if (r < 0)
 300                goto out;
 301
 302        spin_lock_irqsave(&priv->lock, flags);
 303        priv->msr = (~(*buffer)) & CH341_BITS_MODEM_STAT;
 304        spin_unlock_irqrestore(&priv->lock, flags);
 305
 306out:    kfree(buffer);
 307        return r;
 308}
 309
 310/* -------------------------------------------------------------------------- */
 311
 312static int ch341_configure(struct usb_device *dev, struct ch341_private *priv)
 313{
 314        const unsigned int size = 2;
 315        char *buffer;
 316        int r;
 317
 318        buffer = kmalloc(size, GFP_KERNEL);
 319        if (!buffer)
 320                return -ENOMEM;
 321
 322        /* expect two bytes 0x27 0x00 */
 323        r = ch341_control_in(dev, CH341_REQ_READ_VERSION, 0, 0, buffer, size);
 324        if (r < 0)
 325                goto out;
 326        dev_dbg(&dev->dev, "Chip version: 0x%02x\n", buffer[0]);
 327
 328        r = ch341_control_out(dev, CH341_REQ_SERIAL_INIT, 0, 0);
 329        if (r < 0)
 330                goto out;
 331
 332        r = ch341_set_baudrate_lcr(dev, priv, priv->baud_rate, priv->lcr);
 333        if (r < 0)
 334                goto out;
 335
 336        r = ch341_set_handshake(dev, priv->mcr);
 337
 338out:    kfree(buffer);
 339        return r;
 340}
 341
 342static int ch341_detect_quirks(struct usb_serial_port *port)
 343{
 344        struct ch341_private *priv = usb_get_serial_port_data(port);
 345        struct usb_device *udev = port->serial->dev;
 346        const unsigned int size = 2;
 347        unsigned long quirks = 0;
 348        char *buffer;
 349        int r;
 350
 351        buffer = kmalloc(size, GFP_KERNEL);
 352        if (!buffer)
 353                return -ENOMEM;
 354
 355        /*
 356         * A subset of CH34x devices does not support all features. The
 357         * prescaler is limited and there is no support for sending a RS232
 358         * break condition. A read failure when trying to set up the latter is
 359         * used to detect these devices.
 360         */
 361        r = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), CH341_REQ_READ_REG,
 362                            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 363                            CH341_REG_BREAK, 0, buffer, size, DEFAULT_TIMEOUT);
 364        if (r == -EPIPE) {
 365                dev_info(&port->dev, "break control not supported, using simulated break\n");
 366                quirks = CH341_QUIRK_LIMITED_PRESCALER | CH341_QUIRK_SIMULATE_BREAK;
 367                r = 0;
 368                goto out;
 369        }
 370
 371        if (r != size) {
 372                if (r >= 0)
 373                        r = -EIO;
 374                dev_err(&port->dev, "failed to read break control: %d\n", r);
 375                goto out;
 376        }
 377
 378        r = 0;
 379out:
 380        kfree(buffer);
 381
 382        if (quirks) {
 383                dev_dbg(&port->dev, "enabling quirk flags: 0x%02lx\n", quirks);
 384                priv->quirks |= quirks;
 385        }
 386
 387        return r;
 388}
 389
 390static int ch341_port_probe(struct usb_serial_port *port)
 391{
 392        struct ch341_private *priv;
 393        int r;
 394
 395        priv = kzalloc(sizeof(struct ch341_private), GFP_KERNEL);
 396        if (!priv)
 397                return -ENOMEM;
 398
 399        spin_lock_init(&priv->lock);
 400        priv->baud_rate = DEFAULT_BAUD_RATE;
 401        /*
 402         * Some CH340 devices appear unable to change the initial LCR
 403         * settings, so set a sane 8N1 default.
 404         */
 405        priv->lcr = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX | CH341_LCR_CS8;
 406
 407        r = ch341_configure(port->serial->dev, priv);
 408        if (r < 0)
 409                goto error;
 410
 411        usb_set_serial_port_data(port, priv);
 412
 413        r = ch341_detect_quirks(port);
 414        if (r < 0)
 415                goto error;
 416
 417        return 0;
 418
 419error:  kfree(priv);
 420        return r;
 421}
 422
 423static void ch341_port_remove(struct usb_serial_port *port)
 424{
 425        struct ch341_private *priv;
 426
 427        priv = usb_get_serial_port_data(port);
 428        kfree(priv);
 429}
 430
 431static int ch341_carrier_raised(struct usb_serial_port *port)
 432{
 433        struct ch341_private *priv = usb_get_serial_port_data(port);
 434        if (priv->msr & CH341_BIT_DCD)
 435                return 1;
 436        return 0;
 437}
 438
 439static void ch341_dtr_rts(struct usb_serial_port *port, int on)
 440{
 441        struct ch341_private *priv = usb_get_serial_port_data(port);
 442        unsigned long flags;
 443
 444        /* drop DTR and RTS */
 445        spin_lock_irqsave(&priv->lock, flags);
 446        if (on)
 447                priv->mcr |= CH341_BIT_RTS | CH341_BIT_DTR;
 448        else
 449                priv->mcr &= ~(CH341_BIT_RTS | CH341_BIT_DTR);
 450        spin_unlock_irqrestore(&priv->lock, flags);
 451        ch341_set_handshake(port->serial->dev, priv->mcr);
 452}
 453
 454static void ch341_close(struct usb_serial_port *port)
 455{
 456        usb_serial_generic_close(port);
 457        usb_kill_urb(port->interrupt_in_urb);
 458}
 459
 460
 461/* open this device, set default parameters */
 462static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port)
 463{
 464        struct ch341_private *priv = usb_get_serial_port_data(port);
 465        int r;
 466
 467        if (tty)
 468                ch341_set_termios(tty, port, NULL);
 469
 470        dev_dbg(&port->dev, "%s - submitting interrupt urb\n", __func__);
 471        r = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 472        if (r) {
 473                dev_err(&port->dev, "%s - failed to submit interrupt urb: %d\n",
 474                        __func__, r);
 475                return r;
 476        }
 477
 478        r = ch341_get_status(port->serial->dev, priv);
 479        if (r < 0) {
 480                dev_err(&port->dev, "failed to read modem status: %d\n", r);
 481                goto err_kill_interrupt_urb;
 482        }
 483
 484        r = usb_serial_generic_open(tty, port);
 485        if (r)
 486                goto err_kill_interrupt_urb;
 487
 488        return 0;
 489
 490err_kill_interrupt_urb:
 491        usb_kill_urb(port->interrupt_in_urb);
 492
 493        return r;
 494}
 495
 496/* Old_termios contains the original termios settings and
 497 * tty->termios contains the new setting to be used.
 498 */
 499static void ch341_set_termios(struct tty_struct *tty,
 500                struct usb_serial_port *port, struct ktermios *old_termios)
 501{
 502        struct ch341_private *priv = usb_get_serial_port_data(port);
 503        unsigned baud_rate;
 504        unsigned long flags;
 505        u8 lcr;
 506        int r;
 507
 508        /* redundant changes may cause the chip to lose bytes */
 509        if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
 510                return;
 511
 512        baud_rate = tty_get_baud_rate(tty);
 513
 514        lcr = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX;
 515
 516        switch (C_CSIZE(tty)) {
 517        case CS5:
 518                lcr |= CH341_LCR_CS5;
 519                break;
 520        case CS6:
 521                lcr |= CH341_LCR_CS6;
 522                break;
 523        case CS7:
 524                lcr |= CH341_LCR_CS7;
 525                break;
 526        case CS8:
 527                lcr |= CH341_LCR_CS8;
 528                break;
 529        }
 530
 531        if (C_PARENB(tty)) {
 532                lcr |= CH341_LCR_ENABLE_PAR;
 533                if (C_PARODD(tty) == 0)
 534                        lcr |= CH341_LCR_PAR_EVEN;
 535                if (C_CMSPAR(tty))
 536                        lcr |= CH341_LCR_MARK_SPACE;
 537        }
 538
 539        if (C_CSTOPB(tty))
 540                lcr |= CH341_LCR_STOP_BITS_2;
 541
 542        if (baud_rate) {
 543                priv->baud_rate = baud_rate;
 544
 545                r = ch341_set_baudrate_lcr(port->serial->dev, priv,
 546                                           priv->baud_rate, lcr);
 547                if (r < 0 && old_termios) {
 548                        priv->baud_rate = tty_termios_baud_rate(old_termios);
 549                        tty_termios_copy_hw(&tty->termios, old_termios);
 550                } else if (r == 0) {
 551                        priv->lcr = lcr;
 552                }
 553        }
 554
 555        spin_lock_irqsave(&priv->lock, flags);
 556        if (C_BAUD(tty) == B0)
 557                priv->mcr &= ~(CH341_BIT_DTR | CH341_BIT_RTS);
 558        else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
 559                priv->mcr |= (CH341_BIT_DTR | CH341_BIT_RTS);
 560        spin_unlock_irqrestore(&priv->lock, flags);
 561
 562        ch341_set_handshake(port->serial->dev, priv->mcr);
 563}
 564
 565/*
 566 * A subset of all CH34x devices don't support a real break condition and
 567 * reading CH341_REG_BREAK fails (see also ch341_detect_quirks). This function
 568 * simulates a break condition by lowering the baud rate to the minimum
 569 * supported by the hardware upon enabling the break condition and sending
 570 * a NUL byte.
 571 *
 572 * Incoming data is corrupted while the break condition is being simulated.
 573 *
 574 * Normally the duration of the break condition can be controlled individually
 575 * by userspace using TIOCSBRK and TIOCCBRK or by passing an argument to
 576 * TCSBRKP. Due to how the simulation is implemented the duration can't be
 577 * controlled. The duration is always about (1s / 46bd * 9bit) = 196ms.
 578 */
 579static void ch341_simulate_break(struct tty_struct *tty, int break_state)
 580{
 581        struct usb_serial_port *port = tty->driver_data;
 582        struct ch341_private *priv = usb_get_serial_port_data(port);
 583        unsigned long now, delay;
 584        int r;
 585
 586        if (break_state != 0) {
 587                dev_dbg(&port->dev, "enter break state requested\n");
 588
 589                r = ch341_set_baudrate_lcr(port->serial->dev, priv,
 590                                CH341_MIN_BPS,
 591                                CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX | CH341_LCR_CS8);
 592                if (r < 0) {
 593                        dev_err(&port->dev,
 594                                "failed to change baud rate to %u: %d\n",
 595                                CH341_MIN_BPS, r);
 596                        goto restore;
 597                }
 598
 599                r = tty_put_char(tty, '\0');
 600                if (r < 0) {
 601                        dev_err(&port->dev,
 602                                "failed to write NUL byte for simulated break condition: %d\n",
 603                                r);
 604                        goto restore;
 605                }
 606
 607                /*
 608                 * Compute expected transmission duration including safety
 609                 * margin. The original baud rate is only restored after the
 610                 * computed point in time.
 611                 *
 612                 * 11 bits = 1 start, 8 data, 1 stop, 1 margin
 613                 */
 614                priv->break_end = jiffies + (11 * HZ / CH341_MIN_BPS);
 615
 616                return;
 617        }
 618
 619        dev_dbg(&port->dev, "leave break state requested\n");
 620
 621        now = jiffies;
 622
 623        if (time_before(now, priv->break_end)) {
 624                /* Wait until NUL byte is written */
 625                delay = priv->break_end - now;
 626                dev_dbg(&port->dev,
 627                        "wait %d ms while transmitting NUL byte at %u baud\n",
 628                        jiffies_to_msecs(delay), CH341_MIN_BPS);
 629                schedule_timeout_interruptible(delay);
 630        }
 631
 632restore:
 633        /* Restore original baud rate */
 634        r = ch341_set_baudrate_lcr(port->serial->dev, priv, priv->baud_rate,
 635                                   priv->lcr);
 636        if (r < 0)
 637                dev_err(&port->dev,
 638                        "restoring original baud rate of %u failed: %d\n",
 639                        priv->baud_rate, r);
 640}
 641
 642static void ch341_break_ctl(struct tty_struct *tty, int break_state)
 643{
 644        const uint16_t ch341_break_reg =
 645                        ((uint16_t) CH341_REG_LCR << 8) | CH341_REG_BREAK;
 646        struct usb_serial_port *port = tty->driver_data;
 647        struct ch341_private *priv = usb_get_serial_port_data(port);
 648        int r;
 649        uint16_t reg_contents;
 650        uint8_t *break_reg;
 651
 652        if (priv->quirks & CH341_QUIRK_SIMULATE_BREAK) {
 653                ch341_simulate_break(tty, break_state);
 654                return;
 655        }
 656
 657        break_reg = kmalloc(2, GFP_KERNEL);
 658        if (!break_reg)
 659                return;
 660
 661        r = ch341_control_in(port->serial->dev, CH341_REQ_READ_REG,
 662                        ch341_break_reg, 0, break_reg, 2);
 663        if (r < 0) {
 664                dev_err(&port->dev, "%s - USB control read error (%d)\n",
 665                                __func__, r);
 666                goto out;
 667        }
 668        dev_dbg(&port->dev, "%s - initial ch341 break register contents - reg1: %x, reg2: %x\n",
 669                __func__, break_reg[0], break_reg[1]);
 670        if (break_state != 0) {
 671                dev_dbg(&port->dev, "%s - Enter break state requested\n", __func__);
 672                break_reg[0] &= ~CH341_NBREAK_BITS;
 673                break_reg[1] &= ~CH341_LCR_ENABLE_TX;
 674        } else {
 675                dev_dbg(&port->dev, "%s - Leave break state requested\n", __func__);
 676                break_reg[0] |= CH341_NBREAK_BITS;
 677                break_reg[1] |= CH341_LCR_ENABLE_TX;
 678        }
 679        dev_dbg(&port->dev, "%s - New ch341 break register contents - reg1: %x, reg2: %x\n",
 680                __func__, break_reg[0], break_reg[1]);
 681        reg_contents = get_unaligned_le16(break_reg);
 682        r = ch341_control_out(port->serial->dev, CH341_REQ_WRITE_REG,
 683                        ch341_break_reg, reg_contents);
 684        if (r < 0)
 685                dev_err(&port->dev, "%s - USB control write error (%d)\n",
 686                                __func__, r);
 687out:
 688        kfree(break_reg);
 689}
 690
 691static int ch341_tiocmset(struct tty_struct *tty,
 692                          unsigned int set, unsigned int clear)
 693{
 694        struct usb_serial_port *port = tty->driver_data;
 695        struct ch341_private *priv = usb_get_serial_port_data(port);
 696        unsigned long flags;
 697        u8 control;
 698
 699        spin_lock_irqsave(&priv->lock, flags);
 700        if (set & TIOCM_RTS)
 701                priv->mcr |= CH341_BIT_RTS;
 702        if (set & TIOCM_DTR)
 703                priv->mcr |= CH341_BIT_DTR;
 704        if (clear & TIOCM_RTS)
 705                priv->mcr &= ~CH341_BIT_RTS;
 706        if (clear & TIOCM_DTR)
 707                priv->mcr &= ~CH341_BIT_DTR;
 708        control = priv->mcr;
 709        spin_unlock_irqrestore(&priv->lock, flags);
 710
 711        return ch341_set_handshake(port->serial->dev, control);
 712}
 713
 714static void ch341_update_status(struct usb_serial_port *port,
 715                                        unsigned char *data, size_t len)
 716{
 717        struct ch341_private *priv = usb_get_serial_port_data(port);
 718        struct tty_struct *tty;
 719        unsigned long flags;
 720        u8 status;
 721        u8 delta;
 722
 723        if (len < 4)
 724                return;
 725
 726        status = ~data[2] & CH341_BITS_MODEM_STAT;
 727
 728        spin_lock_irqsave(&priv->lock, flags);
 729        delta = status ^ priv->msr;
 730        priv->msr = status;
 731        spin_unlock_irqrestore(&priv->lock, flags);
 732
 733        if (data[1] & CH341_MULT_STAT)
 734                dev_dbg(&port->dev, "%s - multiple status change\n", __func__);
 735
 736        if (!delta)
 737                return;
 738
 739        if (delta & CH341_BIT_CTS)
 740                port->icount.cts++;
 741        if (delta & CH341_BIT_DSR)
 742                port->icount.dsr++;
 743        if (delta & CH341_BIT_RI)
 744                port->icount.rng++;
 745        if (delta & CH341_BIT_DCD) {
 746                port->icount.dcd++;
 747                tty = tty_port_tty_get(&port->port);
 748                if (tty) {
 749                        usb_serial_handle_dcd_change(port, tty,
 750                                                status & CH341_BIT_DCD);
 751                        tty_kref_put(tty);
 752                }
 753        }
 754
 755        wake_up_interruptible(&port->port.delta_msr_wait);
 756}
 757
 758static void ch341_read_int_callback(struct urb *urb)
 759{
 760        struct usb_serial_port *port = urb->context;
 761        unsigned char *data = urb->transfer_buffer;
 762        unsigned int len = urb->actual_length;
 763        int status;
 764
 765        switch (urb->status) {
 766        case 0:
 767                /* success */
 768                break;
 769        case -ECONNRESET:
 770        case -ENOENT:
 771        case -ESHUTDOWN:
 772                /* this urb is terminated, clean up */
 773                dev_dbg(&urb->dev->dev, "%s - urb shutting down: %d\n",
 774                        __func__, urb->status);
 775                return;
 776        default:
 777                dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n",
 778                        __func__, urb->status);
 779                goto exit;
 780        }
 781
 782        usb_serial_debug_data(&port->dev, __func__, len, data);
 783        ch341_update_status(port, data, len);
 784exit:
 785        status = usb_submit_urb(urb, GFP_ATOMIC);
 786        if (status) {
 787                dev_err(&urb->dev->dev, "%s - usb_submit_urb failed: %d\n",
 788                        __func__, status);
 789        }
 790}
 791
 792static int ch341_tiocmget(struct tty_struct *tty)
 793{
 794        struct usb_serial_port *port = tty->driver_data;
 795        struct ch341_private *priv = usb_get_serial_port_data(port);
 796        unsigned long flags;
 797        u8 mcr;
 798        u8 status;
 799        unsigned int result;
 800
 801        spin_lock_irqsave(&priv->lock, flags);
 802        mcr = priv->mcr;
 803        status = priv->msr;
 804        spin_unlock_irqrestore(&priv->lock, flags);
 805
 806        result = ((mcr & CH341_BIT_DTR)         ? TIOCM_DTR : 0)
 807                  | ((mcr & CH341_BIT_RTS)      ? TIOCM_RTS : 0)
 808                  | ((status & CH341_BIT_CTS)   ? TIOCM_CTS : 0)
 809                  | ((status & CH341_BIT_DSR)   ? TIOCM_DSR : 0)
 810                  | ((status & CH341_BIT_RI)    ? TIOCM_RI  : 0)
 811                  | ((status & CH341_BIT_DCD)   ? TIOCM_CD  : 0);
 812
 813        dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
 814
 815        return result;
 816}
 817
 818static int ch341_reset_resume(struct usb_serial *serial)
 819{
 820        struct usb_serial_port *port = serial->port[0];
 821        struct ch341_private *priv;
 822        int ret;
 823
 824        priv = usb_get_serial_port_data(port);
 825        if (!priv)
 826                return 0;
 827
 828        /* reconfigure ch341 serial port after bus-reset */
 829        ch341_configure(serial->dev, priv);
 830
 831        if (tty_port_initialized(&port->port)) {
 832                ret = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
 833                if (ret) {
 834                        dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
 835                                ret);
 836                        return ret;
 837                }
 838
 839                ret = ch341_get_status(port->serial->dev, priv);
 840                if (ret < 0) {
 841                        dev_err(&port->dev, "failed to read modem status: %d\n",
 842                                ret);
 843                }
 844        }
 845
 846        return usb_serial_generic_resume(serial);
 847}
 848
 849static struct usb_serial_driver ch341_device = {
 850        .driver = {
 851                .owner  = THIS_MODULE,
 852                .name   = "ch341-uart",
 853        },
 854        .id_table          = id_table,
 855        .num_ports         = 1,
 856        .open              = ch341_open,
 857        .dtr_rts           = ch341_dtr_rts,
 858        .carrier_raised    = ch341_carrier_raised,
 859        .close             = ch341_close,
 860        .set_termios       = ch341_set_termios,
 861        .break_ctl         = ch341_break_ctl,
 862        .tiocmget          = ch341_tiocmget,
 863        .tiocmset          = ch341_tiocmset,
 864        .tiocmiwait        = usb_serial_generic_tiocmiwait,
 865        .read_int_callback = ch341_read_int_callback,
 866        .port_probe        = ch341_port_probe,
 867        .port_remove       = ch341_port_remove,
 868        .reset_resume      = ch341_reset_resume,
 869};
 870
 871static struct usb_serial_driver * const serial_drivers[] = {
 872        &ch341_device, NULL
 873};
 874
 875module_usb_serial_driver(serial_drivers, id_table);
 876
 877MODULE_LICENSE("GPL v2");
 878