linux/drivers/usb/serial/ch341.c
<<
>>
Prefs
   1/*
   2 * Copyright 2007, Frank A Kingswood <frank@kingswood-consulting.co.uk>
   3 * Copyright 2007, Werner Cornelius <werner@cornelius-consult.de>
   4 * Copyright 2009, Boris Hajduk <boris@hajduk.org>
   5 *
   6 * ch341.c implements a serial port driver for the Winchiphead CH341.
   7 *
   8 * The CH341 device can be used to implement an RS232 asynchronous
   9 * serial port, an IEEE-1284 parallel printer port or a memory-like
  10 * interface. In all cases the CH341 supports an I2C interface as well.
  11 * This driver only supports the asynchronous serial interface.
  12 *
  13 * This program is free software; you can redistribute it and/or
  14 * modify it under the terms of the GNU General Public License version
  15 * 2 as published by the Free Software Foundation.
  16 */
  17
  18#include <linux/kernel.h>
  19#include <linux/init.h>
  20#include <linux/tty.h>
  21#include <linux/module.h>
  22#include <linux/slab.h>
  23#include <linux/usb.h>
  24#include <linux/usb/serial.h>
  25#include <linux/serial.h>
  26#include <asm/unaligned.h>
  27
  28#define DEFAULT_BAUD_RATE 9600
  29#define DEFAULT_TIMEOUT   1000
  30
  31/* flags for IO-Bits */
  32#define CH341_BIT_RTS (1 << 6)
  33#define CH341_BIT_DTR (1 << 5)
  34
  35/******************************/
  36/* interrupt pipe definitions */
  37/******************************/
  38/* always 4 interrupt bytes */
  39/* first irq byte normally 0x08 */
  40/* second irq byte base 0x7d + below */
  41/* third irq byte base 0x94 + below */
  42/* fourth irq byte normally 0xee */
  43
  44/* second interrupt byte */
  45#define CH341_MULT_STAT 0x04 /* multiple status since last interrupt event */
  46
  47/* status returned in third interrupt answer byte, inverted in data
  48   from irq */
  49#define CH341_BIT_CTS 0x01
  50#define CH341_BIT_DSR 0x02
  51#define CH341_BIT_RI  0x04
  52#define CH341_BIT_DCD 0x08
  53#define CH341_BITS_MODEM_STAT 0x0f /* all bits */
  54
  55/*******************************/
  56/* baudrate calculation factor */
  57/*******************************/
  58#define CH341_BAUDBASE_FACTOR 1532620800
  59#define CH341_BAUDBASE_DIVMAX 3
  60
  61/* Break support - the information used to implement this was gleaned from
  62 * the Net/FreeBSD uchcom.c driver by Takanori Watanabe.  Domo arigato.
  63 */
  64
  65#define CH341_REQ_WRITE_REG    0x9A
  66#define CH341_REQ_READ_REG     0x95
  67#define CH341_REG_BREAK1       0x05
  68#define CH341_REG_BREAK2       0x18
  69#define CH341_NBREAK_BITS_REG1 0x01
  70#define CH341_NBREAK_BITS_REG2 0x40
  71
  72
  73static int debug;
  74
  75static const struct usb_device_id id_table[] = {
  76        { USB_DEVICE(0x4348, 0x5523) },
  77        { USB_DEVICE(0x1a86, 0x7523) },
  78        { },
  79};
  80MODULE_DEVICE_TABLE(usb, id_table);
  81
  82struct ch341_private {
  83        spinlock_t lock; /* access lock */
  84        wait_queue_head_t delta_msr_wait; /* wait queue for modem status */
  85        unsigned baud_rate; /* set baud rate */
  86        u8 line_control; /* set line control value RTS/DTR */
  87        u8 line_status; /* active status of modem control inputs */
  88        u8 multi_status_change; /* status changed multiple since last call */
  89};
  90
  91static int ch341_control_out(struct usb_device *dev, u8 request,
  92                             u16 value, u16 index)
  93{
  94        int r;
  95        dbg("ch341_control_out(%02x,%02x,%04x,%04x)", USB_DIR_OUT|0x40,
  96                (int)request, (int)value, (int)index);
  97
  98        r = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request,
  99                            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 100                            value, index, NULL, 0, DEFAULT_TIMEOUT);
 101
 102        return r;
 103}
 104
 105static int ch341_control_in(struct usb_device *dev,
 106                            u8 request, u16 value, u16 index,
 107                            char *buf, unsigned bufsize)
 108{
 109        int r;
 110        dbg("ch341_control_in(%02x,%02x,%04x,%04x,%p,%u)", USB_DIR_IN|0x40,
 111                (int)request, (int)value, (int)index, buf, (int)bufsize);
 112
 113        r = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
 114                            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 115                            value, index, buf, bufsize, DEFAULT_TIMEOUT);
 116        return r;
 117}
 118
 119static int ch341_set_baudrate(struct usb_device *dev,
 120                              struct ch341_private *priv)
 121{
 122        short a, b;
 123        int r;
 124        unsigned long factor;
 125        short divisor;
 126
 127        dbg("ch341_set_baudrate(%d)", priv->baud_rate);
 128
 129        if (!priv->baud_rate)
 130                return -EINVAL;
 131        factor = (CH341_BAUDBASE_FACTOR / priv->baud_rate);
 132        divisor = CH341_BAUDBASE_DIVMAX;
 133
 134        while ((factor > 0xfff0) && divisor) {
 135                factor >>= 3;
 136                divisor--;
 137        }
 138
 139        if (factor > 0xfff0)
 140                return -EINVAL;
 141
 142        factor = 0x10000 - factor;
 143        a = (factor & 0xff00) | divisor;
 144        b = factor & 0xff;
 145
 146        r = ch341_control_out(dev, 0x9a, 0x1312, a);
 147        if (!r)
 148                r = ch341_control_out(dev, 0x9a, 0x0f2c, b);
 149
 150        return r;
 151}
 152
 153static int ch341_set_handshake(struct usb_device *dev, u8 control)
 154{
 155        dbg("ch341_set_handshake(0x%02x)", control);
 156        return ch341_control_out(dev, 0xa4, ~control, 0);
 157}
 158
 159static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv)
 160{
 161        char *buffer;
 162        int r;
 163        const unsigned size = 8;
 164        unsigned long flags;
 165
 166        dbg("ch341_get_status()");
 167
 168        buffer = kmalloc(size, GFP_KERNEL);
 169        if (!buffer)
 170                return -ENOMEM;
 171
 172        r = ch341_control_in(dev, 0x95, 0x0706, 0, buffer, size);
 173        if (r < 0)
 174                goto out;
 175
 176        /* setup the private status if available */
 177        if (r == 2) {
 178                r = 0;
 179                spin_lock_irqsave(&priv->lock, flags);
 180                priv->line_status = (~(*buffer)) & CH341_BITS_MODEM_STAT;
 181                priv->multi_status_change = 0;
 182                spin_unlock_irqrestore(&priv->lock, flags);
 183        } else
 184                r = -EPROTO;
 185
 186out:    kfree(buffer);
 187        return r;
 188}
 189
 190/* -------------------------------------------------------------------------- */
 191
 192static int ch341_configure(struct usb_device *dev, struct ch341_private *priv)
 193{
 194        char *buffer;
 195        int r;
 196        const unsigned size = 8;
 197
 198        dbg("ch341_configure()");
 199
 200        buffer = kmalloc(size, GFP_KERNEL);
 201        if (!buffer)
 202                return -ENOMEM;
 203
 204        /* expect two bytes 0x27 0x00 */
 205        r = ch341_control_in(dev, 0x5f, 0, 0, buffer, size);
 206        if (r < 0)
 207                goto out;
 208
 209        r = ch341_control_out(dev, 0xa1, 0, 0);
 210        if (r < 0)
 211                goto out;
 212
 213        r = ch341_set_baudrate(dev, priv);
 214        if (r < 0)
 215                goto out;
 216
 217        /* expect two bytes 0x56 0x00 */
 218        r = ch341_control_in(dev, 0x95, 0x2518, 0, buffer, size);
 219        if (r < 0)
 220                goto out;
 221
 222        r = ch341_control_out(dev, 0x9a, 0x2518, 0x0050);
 223        if (r < 0)
 224                goto out;
 225
 226        /* expect 0xff 0xee */
 227        r = ch341_get_status(dev, priv);
 228        if (r < 0)
 229                goto out;
 230
 231        r = ch341_control_out(dev, 0xa1, 0x501f, 0xd90a);
 232        if (r < 0)
 233                goto out;
 234
 235        r = ch341_set_baudrate(dev, priv);
 236        if (r < 0)
 237                goto out;
 238
 239        r = ch341_set_handshake(dev, priv->line_control);
 240        if (r < 0)
 241                goto out;
 242
 243        /* expect 0x9f 0xee */
 244        r = ch341_get_status(dev, priv);
 245
 246out:    kfree(buffer);
 247        return r;
 248}
 249
 250/* allocate private data */
 251static int ch341_attach(struct usb_serial *serial)
 252{
 253        struct ch341_private *priv;
 254        int r;
 255
 256        dbg("ch341_attach()");
 257
 258        /* private data */
 259        priv = kzalloc(sizeof(struct ch341_private), GFP_KERNEL);
 260        if (!priv)
 261                return -ENOMEM;
 262
 263        spin_lock_init(&priv->lock);
 264        init_waitqueue_head(&priv->delta_msr_wait);
 265        priv->baud_rate = DEFAULT_BAUD_RATE;
 266        priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR;
 267
 268        r = ch341_configure(serial->dev, priv);
 269        if (r < 0)
 270                goto error;
 271
 272        usb_set_serial_port_data(serial->port[0], priv);
 273        return 0;
 274
 275error:  kfree(priv);
 276        return r;
 277}
 278
 279static int ch341_carrier_raised(struct usb_serial_port *port)
 280{
 281        struct ch341_private *priv = usb_get_serial_port_data(port);
 282        if (priv->line_status & CH341_BIT_DCD)
 283                return 1;
 284        return 0;
 285}
 286
 287static void ch341_dtr_rts(struct usb_serial_port *port, int on)
 288{
 289        struct ch341_private *priv = usb_get_serial_port_data(port);
 290        unsigned long flags;
 291
 292        dbg("%s - port %d", __func__, port->number);
 293        /* drop DTR and RTS */
 294        spin_lock_irqsave(&priv->lock, flags);
 295        if (on)
 296                priv->line_control |= CH341_BIT_RTS | CH341_BIT_DTR;
 297        else
 298                priv->line_control &= ~(CH341_BIT_RTS | CH341_BIT_DTR);
 299        spin_unlock_irqrestore(&priv->lock, flags);
 300        ch341_set_handshake(port->serial->dev, priv->line_control);
 301        wake_up_interruptible(&priv->delta_msr_wait);
 302}
 303
 304static void ch341_close(struct usb_serial_port *port)
 305{
 306        dbg("%s - port %d", __func__, port->number);
 307
 308        usb_serial_generic_close(port);
 309        usb_kill_urb(port->interrupt_in_urb);
 310}
 311
 312
 313/* open this device, set default parameters */
 314static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port)
 315{
 316        struct usb_serial *serial = port->serial;
 317        struct ch341_private *priv = usb_get_serial_port_data(serial->port[0]);
 318        int r;
 319
 320        dbg("ch341_open()");
 321
 322        priv->baud_rate = DEFAULT_BAUD_RATE;
 323
 324        r = ch341_configure(serial->dev, priv);
 325        if (r)
 326                goto out;
 327
 328        r = ch341_set_handshake(serial->dev, priv->line_control);
 329        if (r)
 330                goto out;
 331
 332        r = ch341_set_baudrate(serial->dev, priv);
 333        if (r)
 334                goto out;
 335
 336        dbg("%s - submitting interrupt urb", __func__);
 337        port->interrupt_in_urb->dev = serial->dev;
 338        r = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 339        if (r) {
 340                dev_err(&port->dev, "%s - failed submitting interrupt urb,"
 341                        " error %d\n", __func__, r);
 342                ch341_close(port);
 343                return -EPROTO;
 344        }
 345
 346        r = usb_serial_generic_open(tty, port);
 347
 348out:    return r;
 349}
 350
 351/* Old_termios contains the original termios settings and
 352 * tty->termios contains the new setting to be used.
 353 */
 354static void ch341_set_termios(struct tty_struct *tty,
 355                struct usb_serial_port *port, struct ktermios *old_termios)
 356{
 357        struct ch341_private *priv = usb_get_serial_port_data(port);
 358        unsigned baud_rate;
 359        unsigned long flags;
 360
 361        dbg("ch341_set_termios()");
 362
 363        baud_rate = tty_get_baud_rate(tty);
 364
 365        priv->baud_rate = baud_rate;
 366
 367        if (baud_rate) {
 368                spin_lock_irqsave(&priv->lock, flags);
 369                priv->line_control |= (CH341_BIT_DTR | CH341_BIT_RTS);
 370                spin_unlock_irqrestore(&priv->lock, flags);
 371                ch341_set_baudrate(port->serial->dev, priv);
 372        } else {
 373                spin_lock_irqsave(&priv->lock, flags);
 374                priv->line_control &= ~(CH341_BIT_DTR | CH341_BIT_RTS);
 375                spin_unlock_irqrestore(&priv->lock, flags);
 376        }
 377
 378        ch341_set_handshake(port->serial->dev, priv->line_control);
 379
 380        /* Unimplemented:
 381         * (cflag & CSIZE) : data bits [5, 8]
 382         * (cflag & PARENB) : parity {NONE, EVEN, ODD}
 383         * (cflag & CSTOPB) : stop bits [1, 2]
 384         */
 385}
 386
 387static void ch341_break_ctl(struct tty_struct *tty, int break_state)
 388{
 389        const uint16_t ch341_break_reg =
 390                CH341_REG_BREAK1 | ((uint16_t) CH341_REG_BREAK2 << 8);
 391        struct usb_serial_port *port = tty->driver_data;
 392        int r;
 393        uint16_t reg_contents;
 394        uint8_t *break_reg;
 395
 396        dbg("%s()", __func__);
 397
 398        break_reg = kmalloc(2, GFP_KERNEL);
 399        if (!break_reg) {
 400                dev_err(&port->dev, "%s - kmalloc failed\n", __func__);
 401                return;
 402        }
 403
 404        r = ch341_control_in(port->serial->dev, CH341_REQ_READ_REG,
 405                        ch341_break_reg, 0, break_reg, 2);
 406        if (r < 0) {
 407                dev_err(&port->dev, "%s - USB control read error (%d)\n",
 408                                __func__, r);
 409                goto out;
 410        }
 411        dbg("%s - initial ch341 break register contents - reg1: %x, reg2: %x",
 412                        __func__, break_reg[0], break_reg[1]);
 413        if (break_state != 0) {
 414                dbg("%s - Enter break state requested", __func__);
 415                break_reg[0] &= ~CH341_NBREAK_BITS_REG1;
 416                break_reg[1] &= ~CH341_NBREAK_BITS_REG2;
 417        } else {
 418                dbg("%s - Leave break state requested", __func__);
 419                break_reg[0] |= CH341_NBREAK_BITS_REG1;
 420                break_reg[1] |= CH341_NBREAK_BITS_REG2;
 421        }
 422        dbg("%s - New ch341 break register contents - reg1: %x, reg2: %x",
 423                        __func__, break_reg[0], break_reg[1]);
 424        reg_contents = get_unaligned_le16(break_reg);
 425        r = ch341_control_out(port->serial->dev, CH341_REQ_WRITE_REG,
 426                        ch341_break_reg, reg_contents);
 427        if (r < 0)
 428                dev_err(&port->dev, "%s - USB control write error (%d)\n",
 429                                __func__, r);
 430out:
 431        kfree(break_reg);
 432}
 433
 434static int ch341_tiocmset(struct tty_struct *tty, struct file *file,
 435                          unsigned int set, unsigned int clear)
 436{
 437        struct usb_serial_port *port = tty->driver_data;
 438        struct ch341_private *priv = usb_get_serial_port_data(port);
 439        unsigned long flags;
 440        u8 control;
 441
 442        spin_lock_irqsave(&priv->lock, flags);
 443        if (set & TIOCM_RTS)
 444                priv->line_control |= CH341_BIT_RTS;
 445        if (set & TIOCM_DTR)
 446                priv->line_control |= CH341_BIT_DTR;
 447        if (clear & TIOCM_RTS)
 448                priv->line_control &= ~CH341_BIT_RTS;
 449        if (clear & TIOCM_DTR)
 450                priv->line_control &= ~CH341_BIT_DTR;
 451        control = priv->line_control;
 452        spin_unlock_irqrestore(&priv->lock, flags);
 453
 454        return ch341_set_handshake(port->serial->dev, control);
 455}
 456
 457static void ch341_read_int_callback(struct urb *urb)
 458{
 459        struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
 460        unsigned char *data = urb->transfer_buffer;
 461        unsigned int actual_length = urb->actual_length;
 462        int status;
 463
 464        dbg("%s (%d)", __func__, port->number);
 465
 466        switch (urb->status) {
 467        case 0:
 468                /* success */
 469                break;
 470        case -ECONNRESET:
 471        case -ENOENT:
 472        case -ESHUTDOWN:
 473                /* this urb is terminated, clean up */
 474                dbg("%s - urb shutting down with status: %d", __func__,
 475                    urb->status);
 476                return;
 477        default:
 478                dbg("%s - nonzero urb status received: %d", __func__,
 479                    urb->status);
 480                goto exit;
 481        }
 482
 483        usb_serial_debug_data(debug, &port->dev, __func__,
 484                              urb->actual_length, urb->transfer_buffer);
 485
 486        if (actual_length >= 4) {
 487                struct ch341_private *priv = usb_get_serial_port_data(port);
 488                unsigned long flags;
 489                u8 prev_line_status = priv->line_status;
 490
 491                spin_lock_irqsave(&priv->lock, flags);
 492                priv->line_status = (~(data[2])) & CH341_BITS_MODEM_STAT;
 493                if ((data[1] & CH341_MULT_STAT))
 494                        priv->multi_status_change = 1;
 495                spin_unlock_irqrestore(&priv->lock, flags);
 496
 497                if ((priv->line_status ^ prev_line_status) & CH341_BIT_DCD) {
 498                        struct tty_struct *tty = tty_port_tty_get(&port->port);
 499                        if (tty)
 500                                usb_serial_handle_dcd_change(port, tty,
 501                                            priv->line_status & CH341_BIT_DCD);
 502                        tty_kref_put(tty);
 503                }
 504
 505                wake_up_interruptible(&priv->delta_msr_wait);
 506        }
 507
 508exit:
 509        status = usb_submit_urb(urb, GFP_ATOMIC);
 510        if (status)
 511                dev_err(&urb->dev->dev,
 512                        "%s - usb_submit_urb failed with result %d\n",
 513                        __func__, status);
 514}
 515
 516static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
 517{
 518        struct ch341_private *priv = usb_get_serial_port_data(port);
 519        unsigned long flags;
 520        u8 prevstatus;
 521        u8 status;
 522        u8 changed;
 523        u8 multi_change = 0;
 524
 525        spin_lock_irqsave(&priv->lock, flags);
 526        prevstatus = priv->line_status;
 527        priv->multi_status_change = 0;
 528        spin_unlock_irqrestore(&priv->lock, flags);
 529
 530        while (!multi_change) {
 531                interruptible_sleep_on(&priv->delta_msr_wait);
 532                /* see if a signal did it */
 533                if (signal_pending(current))
 534                        return -ERESTARTSYS;
 535
 536                spin_lock_irqsave(&priv->lock, flags);
 537                status = priv->line_status;
 538                multi_change = priv->multi_status_change;
 539                spin_unlock_irqrestore(&priv->lock, flags);
 540
 541                changed = prevstatus ^ status;
 542
 543                if (((arg & TIOCM_RNG) && (changed & CH341_BIT_RI)) ||
 544                    ((arg & TIOCM_DSR) && (changed & CH341_BIT_DSR)) ||
 545                    ((arg & TIOCM_CD)  && (changed & CH341_BIT_DCD)) ||
 546                    ((arg & TIOCM_CTS) && (changed & CH341_BIT_CTS))) {
 547                        return 0;
 548                }
 549                prevstatus = status;
 550        }
 551
 552        return 0;
 553}
 554
 555/*static int ch341_ioctl(struct usb_serial_port *port, struct file *file,*/
 556static int ch341_ioctl(struct tty_struct *tty, struct file *file,
 557                        unsigned int cmd, unsigned long arg)
 558{
 559        struct usb_serial_port *port = tty->driver_data;
 560        dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
 561
 562        switch (cmd) {
 563        case TIOCMIWAIT:
 564                dbg("%s (%d) TIOCMIWAIT", __func__,  port->number);
 565                return wait_modem_info(port, arg);
 566
 567        default:
 568                dbg("%s not supported = 0x%04x", __func__, cmd);
 569                break;
 570        }
 571
 572        return -ENOIOCTLCMD;
 573}
 574
 575static int ch341_tiocmget(struct tty_struct *tty, struct file *file)
 576{
 577        struct usb_serial_port *port = tty->driver_data;
 578        struct ch341_private *priv = usb_get_serial_port_data(port);
 579        unsigned long flags;
 580        u8 mcr;
 581        u8 status;
 582        unsigned int result;
 583
 584        dbg("%s (%d)", __func__, port->number);
 585
 586        spin_lock_irqsave(&priv->lock, flags);
 587        mcr = priv->line_control;
 588        status = priv->line_status;
 589        spin_unlock_irqrestore(&priv->lock, flags);
 590
 591        result = ((mcr & CH341_BIT_DTR)         ? TIOCM_DTR : 0)
 592                  | ((mcr & CH341_BIT_RTS)      ? TIOCM_RTS : 0)
 593                  | ((status & CH341_BIT_CTS)   ? TIOCM_CTS : 0)
 594                  | ((status & CH341_BIT_DSR)   ? TIOCM_DSR : 0)
 595                  | ((status & CH341_BIT_RI)    ? TIOCM_RI  : 0)
 596                  | ((status & CH341_BIT_DCD)   ? TIOCM_CD  : 0);
 597
 598        dbg("%s - result = %x", __func__, result);
 599
 600        return result;
 601}
 602
 603
 604static int ch341_reset_resume(struct usb_interface *intf)
 605{
 606        struct usb_device *dev = interface_to_usbdev(intf);
 607        struct usb_serial *serial = NULL;
 608        struct ch341_private *priv;
 609
 610        serial = usb_get_intfdata(intf);
 611        priv = usb_get_serial_port_data(serial->port[0]);
 612
 613        /*reconfigure ch341 serial port after bus-reset*/
 614        ch341_configure(dev, priv);
 615
 616        usb_serial_resume(intf);
 617
 618        return 0;
 619}
 620
 621static struct usb_driver ch341_driver = {
 622        .name           = "ch341",
 623        .probe          = usb_serial_probe,
 624        .disconnect     = usb_serial_disconnect,
 625        .suspend        = usb_serial_suspend,
 626        .resume         = usb_serial_resume,
 627        .reset_resume   = ch341_reset_resume,
 628        .id_table       = id_table,
 629        .no_dynamic_id  = 1,
 630        .supports_autosuspend = 1,
 631};
 632
 633static struct usb_serial_driver ch341_device = {
 634        .driver = {
 635                .owner  = THIS_MODULE,
 636                .name   = "ch341-uart",
 637        },
 638        .id_table          = id_table,
 639        .usb_driver        = &ch341_driver,
 640        .num_ports         = 1,
 641        .open              = ch341_open,
 642        .dtr_rts           = ch341_dtr_rts,
 643        .carrier_raised    = ch341_carrier_raised,
 644        .close             = ch341_close,
 645        .ioctl             = ch341_ioctl,
 646        .set_termios       = ch341_set_termios,
 647        .break_ctl         = ch341_break_ctl,
 648        .tiocmget          = ch341_tiocmget,
 649        .tiocmset          = ch341_tiocmset,
 650        .read_int_callback = ch341_read_int_callback,
 651        .attach            = ch341_attach,
 652};
 653
 654static int __init ch341_init(void)
 655{
 656        int retval;
 657
 658        retval = usb_serial_register(&ch341_device);
 659        if (retval)
 660                return retval;
 661        retval = usb_register(&ch341_driver);
 662        if (retval)
 663                usb_serial_deregister(&ch341_device);
 664        return retval;
 665}
 666
 667static void __exit ch341_exit(void)
 668{
 669        usb_deregister(&ch341_driver);
 670        usb_serial_deregister(&ch341_device);
 671}
 672
 673module_init(ch341_init);
 674module_exit(ch341_exit);
 675MODULE_LICENSE("GPL");
 676
 677module_param(debug, bool, S_IRUGO | S_IWUSR);
 678MODULE_PARM_DESC(debug, "Debug enabled or not");
 679
 680/* EOF ch341.c */
 681