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        { USB_DEVICE(0x1a86, 0x5523) },
  79        { },
  80};
  81MODULE_DEVICE_TABLE(usb, id_table);
  82
  83struct ch341_private {
  84        spinlock_t lock; /* access lock */
  85        wait_queue_head_t delta_msr_wait; /* wait queue for modem status */
  86        unsigned baud_rate; /* set baud rate */
  87        u8 line_control; /* set line control value RTS/DTR */
  88        u8 line_status; /* active status of modem control inputs */
  89        u8 multi_status_change; /* status changed multiple since last call */
  90};
  91
  92static int ch341_control_out(struct usb_device *dev, u8 request,
  93                             u16 value, u16 index)
  94{
  95        int r;
  96        dbg("ch341_control_out(%02x,%02x,%04x,%04x)", USB_DIR_OUT|0x40,
  97                (int)request, (int)value, (int)index);
  98
  99        r = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request,
 100                            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 101                            value, index, NULL, 0, DEFAULT_TIMEOUT);
 102
 103        return r;
 104}
 105
 106static int ch341_control_in(struct usb_device *dev,
 107                            u8 request, u16 value, u16 index,
 108                            char *buf, unsigned bufsize)
 109{
 110        int r;
 111        dbg("ch341_control_in(%02x,%02x,%04x,%04x,%p,%u)", USB_DIR_IN|0x40,
 112                (int)request, (int)value, (int)index, buf, (int)bufsize);
 113
 114        r = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
 115                            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 116                            value, index, buf, bufsize, DEFAULT_TIMEOUT);
 117        return r;
 118}
 119
 120static int ch341_set_baudrate(struct usb_device *dev,
 121                              struct ch341_private *priv)
 122{
 123        short a, b;
 124        int r;
 125        unsigned long factor;
 126        short divisor;
 127
 128        dbg("ch341_set_baudrate(%d)", priv->baud_rate);
 129
 130        if (!priv->baud_rate)
 131                return -EINVAL;
 132        factor = (CH341_BAUDBASE_FACTOR / priv->baud_rate);
 133        divisor = CH341_BAUDBASE_DIVMAX;
 134
 135        while ((factor > 0xfff0) && divisor) {
 136                factor >>= 3;
 137                divisor--;
 138        }
 139
 140        if (factor > 0xfff0)
 141                return -EINVAL;
 142
 143        factor = 0x10000 - factor;
 144        a = (factor & 0xff00) | divisor;
 145        b = factor & 0xff;
 146
 147        r = ch341_control_out(dev, 0x9a, 0x1312, a);
 148        if (!r)
 149                r = ch341_control_out(dev, 0x9a, 0x0f2c, b);
 150
 151        return r;
 152}
 153
 154static int ch341_set_handshake(struct usb_device *dev, u8 control)
 155{
 156        dbg("ch341_set_handshake(0x%02x)", control);
 157        return ch341_control_out(dev, 0xa4, ~control, 0);
 158}
 159
 160static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv)
 161{
 162        char *buffer;
 163        int r;
 164        const unsigned size = 8;
 165        unsigned long flags;
 166
 167        dbg("ch341_get_status()");
 168
 169        buffer = kmalloc(size, GFP_KERNEL);
 170        if (!buffer)
 171                return -ENOMEM;
 172
 173        r = ch341_control_in(dev, 0x95, 0x0706, 0, buffer, size);
 174        if (r < 0)
 175                goto out;
 176
 177        /* setup the private status if available */
 178        if (r == 2) {
 179                r = 0;
 180                spin_lock_irqsave(&priv->lock, flags);
 181                priv->line_status = (~(*buffer)) & CH341_BITS_MODEM_STAT;
 182                priv->multi_status_change = 0;
 183                spin_unlock_irqrestore(&priv->lock, flags);
 184        } else
 185                r = -EPROTO;
 186
 187out:    kfree(buffer);
 188        return r;
 189}
 190
 191/* -------------------------------------------------------------------------- */
 192
 193static int ch341_configure(struct usb_device *dev, struct ch341_private *priv)
 194{
 195        char *buffer;
 196        int r;
 197        const unsigned size = 8;
 198
 199        dbg("ch341_configure()");
 200
 201        buffer = kmalloc(size, GFP_KERNEL);
 202        if (!buffer)
 203                return -ENOMEM;
 204
 205        /* expect two bytes 0x27 0x00 */
 206        r = ch341_control_in(dev, 0x5f, 0, 0, buffer, size);
 207        if (r < 0)
 208                goto out;
 209
 210        r = ch341_control_out(dev, 0xa1, 0, 0);
 211        if (r < 0)
 212                goto out;
 213
 214        r = ch341_set_baudrate(dev, priv);
 215        if (r < 0)
 216                goto out;
 217
 218        /* expect two bytes 0x56 0x00 */
 219        r = ch341_control_in(dev, 0x95, 0x2518, 0, buffer, size);
 220        if (r < 0)
 221                goto out;
 222
 223        r = ch341_control_out(dev, 0x9a, 0x2518, 0x0050);
 224        if (r < 0)
 225                goto out;
 226
 227        /* expect 0xff 0xee */
 228        r = ch341_get_status(dev, priv);
 229        if (r < 0)
 230                goto out;
 231
 232        r = ch341_control_out(dev, 0xa1, 0x501f, 0xd90a);
 233        if (r < 0)
 234                goto out;
 235
 236        r = ch341_set_baudrate(dev, priv);
 237        if (r < 0)
 238                goto out;
 239
 240        r = ch341_set_handshake(dev, priv->line_control);
 241        if (r < 0)
 242                goto out;
 243
 244        /* expect 0x9f 0xee */
 245        r = ch341_get_status(dev, priv);
 246
 247out:    kfree(buffer);
 248        return r;
 249}
 250
 251/* allocate private data */
 252static int ch341_attach(struct usb_serial *serial)
 253{
 254        struct ch341_private *priv;
 255        int r;
 256
 257        dbg("ch341_attach()");
 258
 259        /* private data */
 260        priv = kzalloc(sizeof(struct ch341_private), GFP_KERNEL);
 261        if (!priv)
 262                return -ENOMEM;
 263
 264        spin_lock_init(&priv->lock);
 265        init_waitqueue_head(&priv->delta_msr_wait);
 266        priv->baud_rate = DEFAULT_BAUD_RATE;
 267        priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR;
 268
 269        r = ch341_configure(serial->dev, priv);
 270        if (r < 0)
 271                goto error;
 272
 273        usb_set_serial_port_data(serial->port[0], priv);
 274        return 0;
 275
 276error:  kfree(priv);
 277        return r;
 278}
 279
 280static int ch341_carrier_raised(struct usb_serial_port *port)
 281{
 282        struct ch341_private *priv = usb_get_serial_port_data(port);
 283        if (priv->line_status & CH341_BIT_DCD)
 284                return 1;
 285        return 0;
 286}
 287
 288static void ch341_dtr_rts(struct usb_serial_port *port, int on)
 289{
 290        struct ch341_private *priv = usb_get_serial_port_data(port);
 291        unsigned long flags;
 292
 293        dbg("%s - port %d", __func__, port->number);
 294        /* drop DTR and RTS */
 295        spin_lock_irqsave(&priv->lock, flags);
 296        if (on)
 297                priv->line_control |= CH341_BIT_RTS | CH341_BIT_DTR;
 298        else
 299                priv->line_control &= ~(CH341_BIT_RTS | CH341_BIT_DTR);
 300        spin_unlock_irqrestore(&priv->lock, flags);
 301        ch341_set_handshake(port->serial->dev, priv->line_control);
 302        wake_up_interruptible(&priv->delta_msr_wait);
 303}
 304
 305static void ch341_close(struct usb_serial_port *port)
 306{
 307        dbg("%s - port %d", __func__, port->number);
 308
 309        usb_serial_generic_close(port);
 310        usb_kill_urb(port->interrupt_in_urb);
 311}
 312
 313
 314/* open this device, set default parameters */
 315static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port)
 316{
 317        struct usb_serial *serial = port->serial;
 318        struct ch341_private *priv = usb_get_serial_port_data(serial->port[0]);
 319        int r;
 320
 321        dbg("ch341_open()");
 322
 323        priv->baud_rate = DEFAULT_BAUD_RATE;
 324
 325        r = ch341_configure(serial->dev, priv);
 326        if (r)
 327                goto out;
 328
 329        r = ch341_set_handshake(serial->dev, priv->line_control);
 330        if (r)
 331                goto out;
 332
 333        r = ch341_set_baudrate(serial->dev, priv);
 334        if (r)
 335                goto out;
 336
 337        dbg("%s - submitting interrupt urb", __func__);
 338        port->interrupt_in_urb->dev = serial->dev;
 339        r = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 340        if (r) {
 341                dev_err(&port->dev, "%s - failed submitting interrupt urb,"
 342                        " error %d\n", __func__, r);
 343                ch341_close(port);
 344                return -EPROTO;
 345        }
 346
 347        r = usb_serial_generic_open(tty, port);
 348
 349out:    return r;
 350}
 351
 352/* Old_termios contains the original termios settings and
 353 * tty->termios contains the new setting to be used.
 354 */
 355static void ch341_set_termios(struct tty_struct *tty,
 356                struct usb_serial_port *port, struct ktermios *old_termios)
 357{
 358        struct ch341_private *priv = usb_get_serial_port_data(port);
 359        unsigned baud_rate;
 360        unsigned long flags;
 361
 362        dbg("ch341_set_termios()");
 363
 364        baud_rate = tty_get_baud_rate(tty);
 365
 366        priv->baud_rate = baud_rate;
 367
 368        if (baud_rate) {
 369                spin_lock_irqsave(&priv->lock, flags);
 370                priv->line_control |= (CH341_BIT_DTR | CH341_BIT_RTS);
 371                spin_unlock_irqrestore(&priv->lock, flags);
 372                ch341_set_baudrate(port->serial->dev, priv);
 373        } else {
 374                spin_lock_irqsave(&priv->lock, flags);
 375                priv->line_control &= ~(CH341_BIT_DTR | CH341_BIT_RTS);
 376                spin_unlock_irqrestore(&priv->lock, flags);
 377        }
 378
 379        ch341_set_handshake(port->serial->dev, priv->line_control);
 380
 381        /* Unimplemented:
 382         * (cflag & CSIZE) : data bits [5, 8]
 383         * (cflag & PARENB) : parity {NONE, EVEN, ODD}
 384         * (cflag & CSTOPB) : stop bits [1, 2]
 385         */
 386}
 387
 388static void ch341_break_ctl(struct tty_struct *tty, int break_state)
 389{
 390        const uint16_t ch341_break_reg =
 391                CH341_REG_BREAK1 | ((uint16_t) CH341_REG_BREAK2 << 8);
 392        struct usb_serial_port *port = tty->driver_data;
 393        int r;
 394        uint16_t reg_contents;
 395        uint8_t *break_reg;
 396
 397        dbg("%s()", __func__);
 398
 399        break_reg = kmalloc(2, GFP_KERNEL);
 400        if (!break_reg) {
 401                dev_err(&port->dev, "%s - kmalloc failed\n", __func__);
 402                return;
 403        }
 404
 405        r = ch341_control_in(port->serial->dev, CH341_REQ_READ_REG,
 406                        ch341_break_reg, 0, break_reg, 2);
 407        if (r < 0) {
 408                dev_err(&port->dev, "%s - USB control read error (%d)\n",
 409                                __func__, r);
 410                goto out;
 411        }
 412        dbg("%s - initial ch341 break register contents - reg1: %x, reg2: %x",
 413                        __func__, break_reg[0], break_reg[1]);
 414        if (break_state != 0) {
 415                dbg("%s - Enter break state requested", __func__);
 416                break_reg[0] &= ~CH341_NBREAK_BITS_REG1;
 417                break_reg[1] &= ~CH341_NBREAK_BITS_REG2;
 418        } else {
 419                dbg("%s - Leave break state requested", __func__);
 420                break_reg[0] |= CH341_NBREAK_BITS_REG1;
 421                break_reg[1] |= CH341_NBREAK_BITS_REG2;
 422        }
 423        dbg("%s - New ch341 break register contents - reg1: %x, reg2: %x",
 424                        __func__, break_reg[0], break_reg[1]);
 425        reg_contents = get_unaligned_le16(break_reg);
 426        r = ch341_control_out(port->serial->dev, CH341_REQ_WRITE_REG,
 427                        ch341_break_reg, reg_contents);
 428        if (r < 0)
 429                dev_err(&port->dev, "%s - USB control write error (%d)\n",
 430                                __func__, r);
 431out:
 432        kfree(break_reg);
 433}
 434
 435static int ch341_tiocmset(struct tty_struct *tty,
 436                          unsigned int set, unsigned int clear)
 437{
 438        struct usb_serial_port *port = tty->driver_data;
 439        struct ch341_private *priv = usb_get_serial_port_data(port);
 440        unsigned long flags;
 441        u8 control;
 442
 443        spin_lock_irqsave(&priv->lock, flags);
 444        if (set & TIOCM_RTS)
 445                priv->line_control |= CH341_BIT_RTS;
 446        if (set & TIOCM_DTR)
 447                priv->line_control |= CH341_BIT_DTR;
 448        if (clear & TIOCM_RTS)
 449                priv->line_control &= ~CH341_BIT_RTS;
 450        if (clear & TIOCM_DTR)
 451                priv->line_control &= ~CH341_BIT_DTR;
 452        control = priv->line_control;
 453        spin_unlock_irqrestore(&priv->lock, flags);
 454
 455        return ch341_set_handshake(port->serial->dev, control);
 456}
 457
 458static void ch341_read_int_callback(struct urb *urb)
 459{
 460        struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
 461        unsigned char *data = urb->transfer_buffer;
 462        unsigned int actual_length = urb->actual_length;
 463        int status;
 464
 465        dbg("%s (%d)", __func__, port->number);
 466
 467        switch (urb->status) {
 468        case 0:
 469                /* success */
 470                break;
 471        case -ECONNRESET:
 472        case -ENOENT:
 473        case -ESHUTDOWN:
 474                /* this urb is terminated, clean up */
 475                dbg("%s - urb shutting down with status: %d", __func__,
 476                    urb->status);
 477                return;
 478        default:
 479                dbg("%s - nonzero urb status received: %d", __func__,
 480                    urb->status);
 481                goto exit;
 482        }
 483
 484        usb_serial_debug_data(debug, &port->dev, __func__,
 485                              urb->actual_length, urb->transfer_buffer);
 486
 487        if (actual_length >= 4) {
 488                struct ch341_private *priv = usb_get_serial_port_data(port);
 489                unsigned long flags;
 490                u8 prev_line_status = priv->line_status;
 491
 492                spin_lock_irqsave(&priv->lock, flags);
 493                priv->line_status = (~(data[2])) & CH341_BITS_MODEM_STAT;
 494                if ((data[1] & CH341_MULT_STAT))
 495                        priv->multi_status_change = 1;
 496                spin_unlock_irqrestore(&priv->lock, flags);
 497
 498                if ((priv->line_status ^ prev_line_status) & CH341_BIT_DCD) {
 499                        struct tty_struct *tty = tty_port_tty_get(&port->port);
 500                        if (tty)
 501                                usb_serial_handle_dcd_change(port, tty,
 502                                            priv->line_status & CH341_BIT_DCD);
 503                        tty_kref_put(tty);
 504                }
 505
 506                wake_up_interruptible(&priv->delta_msr_wait);
 507        }
 508
 509exit:
 510        status = usb_submit_urb(urb, GFP_ATOMIC);
 511        if (status)
 512                dev_err(&urb->dev->dev,
 513                        "%s - usb_submit_urb failed with result %d\n",
 514                        __func__, status);
 515}
 516
 517static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
 518{
 519        struct ch341_private *priv = usb_get_serial_port_data(port);
 520        unsigned long flags;
 521        u8 prevstatus;
 522        u8 status;
 523        u8 changed;
 524        u8 multi_change = 0;
 525
 526        spin_lock_irqsave(&priv->lock, flags);
 527        prevstatus = priv->line_status;
 528        priv->multi_status_change = 0;
 529        spin_unlock_irqrestore(&priv->lock, flags);
 530
 531        while (!multi_change) {
 532                interruptible_sleep_on(&priv->delta_msr_wait);
 533                /* see if a signal did it */
 534                if (signal_pending(current))
 535                        return -ERESTARTSYS;
 536
 537                spin_lock_irqsave(&priv->lock, flags);
 538                status = priv->line_status;
 539                multi_change = priv->multi_status_change;
 540                spin_unlock_irqrestore(&priv->lock, flags);
 541
 542                changed = prevstatus ^ status;
 543
 544                if (((arg & TIOCM_RNG) && (changed & CH341_BIT_RI)) ||
 545                    ((arg & TIOCM_DSR) && (changed & CH341_BIT_DSR)) ||
 546                    ((arg & TIOCM_CD)  && (changed & CH341_BIT_DCD)) ||
 547                    ((arg & TIOCM_CTS) && (changed & CH341_BIT_CTS))) {
 548                        return 0;
 549                }
 550                prevstatus = status;
 551        }
 552
 553        return 0;
 554}
 555
 556static int ch341_ioctl(struct tty_struct *tty,
 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)
 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