USB: replace remaining __FUNCTION__ occurrences
[linux-block.git] / drivers / usb / serial / pl2303.c
CommitLineData
1da177e4
LT
1/*
2 * Prolific PL2303 USB to serial adaptor driver
3 *
4d0dce3e 4 * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
1da177e4
LT
5 * Copyright (C) 2003 IBM Corp.
6 *
7 * Original driver for 2.2.x by anonymous
8 *
4d0dce3e
GKH
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License version
11 * 2 as published by the Free Software Foundation.
1da177e4
LT
12 *
13 * See Documentation/usb/usb-serial.txt for more information on using this driver
14 *
1da177e4
LT
15 */
16
1da177e4
LT
17#include <linux/kernel.h>
18#include <linux/errno.h>
19#include <linux/init.h>
20#include <linux/slab.h>
21#include <linux/tty.h>
22#include <linux/tty_driver.h>
23#include <linux/tty_flip.h>
24#include <linux/serial.h>
25#include <linux/module.h>
26#include <linux/moduleparam.h>
27#include <linux/spinlock.h>
28#include <asm/uaccess.h>
29#include <linux/usb.h>
a969888c 30#include <linux/usb/serial.h>
1da177e4
LT
31#include "pl2303.h"
32
33/*
34 * Version Information
35 */
1da177e4
LT
36#define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
37
38static int debug;
39
40#define PL2303_CLOSING_WAIT (30*HZ)
41
42#define PL2303_BUF_SIZE 1024
43#define PL2303_TMP_BUF_SIZE 1024
44
1da177e4
LT
45struct pl2303_buf {
46 unsigned int buf_size;
47 char *buf_buf;
48 char *buf_get;
49 char *buf_put;
50};
51
52static struct usb_device_id id_table [] = {
53 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
54 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
3d861494 55 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
1da177e4
LT
56 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
57 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
b483b6aa 58 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
1da177e4 59 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
8a28dea3 60 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
1da177e4
LT
61 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
62 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
63 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
64 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
65 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
58381719 66 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
1da177e4
LT
67 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
68 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
57833ea6 69 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
1da177e4
LT
70 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
71 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
72 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
73 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
74 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
75 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
a8310f3b 76 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
1da177e4 77 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
a8310f3b 78 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
e7beb667 79 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
acbb36f1 80 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
c6c27721
CL
81 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
82 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
6cceb05f 83 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
c6c27721 84 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
491b04ce 85 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
3b928474 86 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
b7aa94b6 87 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
8fd80133 88 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
2d94b981 89 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
9e3285db 90 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
002e8f2c 91 { USB_DEVICE(HL340_VENDOR_ID, HL340_PRODUCT_ID) },
cc311ee7 92 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
1da177e4
LT
93 { } /* Terminating entry */
94};
95
372db8a7 96MODULE_DEVICE_TABLE(usb, id_table);
1da177e4
LT
97
98static struct usb_driver pl2303_driver = {
1da177e4
LT
99 .name = "pl2303",
100 .probe = usb_serial_probe,
101 .disconnect = usb_serial_disconnect,
102 .id_table = id_table,
fcf9e55e
SS
103 .suspend = usb_serial_suspend,
104 .resume = usb_serial_resume,
ba9dc657 105 .no_dynamic_id = 1,
fcf9e55e 106 .supports_autosuspend = 1,
1da177e4
LT
107};
108
109#define SET_LINE_REQUEST_TYPE 0x21
110#define SET_LINE_REQUEST 0x20
111
112#define SET_CONTROL_REQUEST_TYPE 0x21
113#define SET_CONTROL_REQUEST 0x22
114#define CONTROL_DTR 0x01
115#define CONTROL_RTS 0x02
116
117#define BREAK_REQUEST_TYPE 0x21
118#define BREAK_REQUEST 0x23
119#define BREAK_ON 0xffff
120#define BREAK_OFF 0x0000
121
122#define GET_LINE_REQUEST_TYPE 0xa1
123#define GET_LINE_REQUEST 0x21
124
125#define VENDOR_WRITE_REQUEST_TYPE 0x40
126#define VENDOR_WRITE_REQUEST 0x01
127
128#define VENDOR_READ_REQUEST_TYPE 0xc0
129#define VENDOR_READ_REQUEST 0x01
130
131#define UART_STATE 0x08
132#define UART_STATE_TRANSIENT_MASK 0x74
133#define UART_DCD 0x01
134#define UART_DSR 0x02
135#define UART_BREAK_ERROR 0x04
136#define UART_RING 0x08
137#define UART_FRAME_ERROR 0x10
138#define UART_PARITY_ERROR 0x20
139#define UART_OVERRUN_ERROR 0x40
140#define UART_CTS 0x80
141
1da177e4
LT
142
143enum pl2303_type {
144 type_0, /* don't know the difference between type 0 and */
145 type_1, /* type 1, until someone from prolific tells us... */
146 HX, /* HX version of the pl2303 chip */
147};
148
149struct pl2303_private {
150 spinlock_t lock;
151 struct pl2303_buf *buf;
152 int write_urb_in_use;
153 wait_queue_head_t delta_msr_wait;
154 u8 line_control;
155 u8 line_status;
156 u8 termios_initialized;
157 enum pl2303_type type;
158};
159
572d3138
TG
160/*
161 * pl2303_buf_alloc
162 *
163 * Allocate a circular buffer and all associated memory.
164 */
165static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
166{
167 struct pl2303_buf *pb;
168
169 if (size == 0)
170 return NULL;
171
5cbded58 172 pb = kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
572d3138
TG
173 if (pb == NULL)
174 return NULL;
175
176 pb->buf_buf = kmalloc(size, GFP_KERNEL);
177 if (pb->buf_buf == NULL) {
178 kfree(pb);
179 return NULL;
180 }
181
182 pb->buf_size = size;
183 pb->buf_get = pb->buf_put = pb->buf_buf;
184
185 return pb;
186}
187
188/*
189 * pl2303_buf_free
190 *
191 * Free the buffer and all associated memory.
192 */
193static void pl2303_buf_free(struct pl2303_buf *pb)
194{
195 if (pb) {
196 kfree(pb->buf_buf);
197 kfree(pb);
198 }
199}
200
201/*
202 * pl2303_buf_clear
203 *
204 * Clear out all data in the circular buffer.
205 */
206static void pl2303_buf_clear(struct pl2303_buf *pb)
207{
208 if (pb != NULL)
209 pb->buf_get = pb->buf_put;
210 /* equivalent to a get of all data available */
211}
212
213/*
214 * pl2303_buf_data_avail
215 *
216 * Return the number of bytes of data available in the circular
217 * buffer.
218 */
219static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
220{
221 if (pb == NULL)
222 return 0;
223
224 return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size);
225}
226
227/*
228 * pl2303_buf_space_avail
229 *
230 * Return the number of bytes of space available in the circular
231 * buffer.
232 */
233static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
234{
235 if (pb == NULL)
236 return 0;
237
238 return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size);
239}
240
241/*
242 * pl2303_buf_put
243 *
244 * Copy data data from a user buffer and put it into the circular buffer.
245 * Restrict to the amount of space available.
246 *
247 * Return the number of bytes copied.
248 */
249static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
250 unsigned int count)
251{
252 unsigned int len;
253
254 if (pb == NULL)
255 return 0;
256
257 len = pl2303_buf_space_avail(pb);
258 if (count > len)
259 count = len;
260
261 if (count == 0)
262 return 0;
263
264 len = pb->buf_buf + pb->buf_size - pb->buf_put;
265 if (count > len) {
266 memcpy(pb->buf_put, buf, len);
267 memcpy(pb->buf_buf, buf+len, count - len);
268 pb->buf_put = pb->buf_buf + count - len;
269 } else {
270 memcpy(pb->buf_put, buf, count);
271 if (count < len)
272 pb->buf_put += count;
273 else /* count == len */
274 pb->buf_put = pb->buf_buf;
275 }
276
277 return count;
278}
279
280/*
281 * pl2303_buf_get
282 *
283 * Get data from the circular buffer and copy to the given buffer.
284 * Restrict to the amount of data available.
285 *
286 * Return the number of bytes copied.
287 */
288static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
289 unsigned int count)
290{
291 unsigned int len;
292
293 if (pb == NULL)
294 return 0;
295
296 len = pl2303_buf_data_avail(pb);
297 if (count > len)
298 count = len;
299
300 if (count == 0)
301 return 0;
302
303 len = pb->buf_buf + pb->buf_size - pb->buf_get;
304 if (count > len) {
305 memcpy(buf, pb->buf_get, len);
306 memcpy(buf+len, pb->buf_buf, count - len);
307 pb->buf_get = pb->buf_buf + count - len;
308 } else {
309 memcpy(buf, pb->buf_get, count);
310 if (count < len)
311 pb->buf_get += count;
312 else /* count == len */
313 pb->buf_get = pb->buf_buf;
314 }
315
316 return count;
317}
1da177e4 318
eb44da0b
SS
319static int pl2303_vendor_read(__u16 value, __u16 index,
320 struct usb_serial *serial, unsigned char *buf)
321{
322 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
323 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
324 value, index, buf, 1, 100);
325 dbg("0x%x:0x%x:0x%x:0x%x %d - %x", VENDOR_READ_REQUEST_TYPE,
326 VENDOR_READ_REQUEST, value, index, res, buf[0]);
327 return res;
328}
329
330static int pl2303_vendor_write(__u16 value, __u16 index,
331 struct usb_serial *serial)
332{
333 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
334 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
335 value, index, NULL, 0, 100);
336 dbg("0x%x:0x%x:0x%x:0x%x %d", VENDOR_WRITE_REQUEST_TYPE,
337 VENDOR_WRITE_REQUEST, value, index, res);
338 return res;
339}
340
372db8a7 341static int pl2303_startup(struct usb_serial *serial)
1da177e4
LT
342{
343 struct pl2303_private *priv;
344 enum pl2303_type type = type_0;
3e152505 345 unsigned char *buf;
1da177e4
LT
346 int i;
347
3e152505
SS
348 buf = kmalloc(10, GFP_KERNEL);
349 if (buf == NULL)
350 return -ENOMEM;
351
1da177e4
LT
352 if (serial->dev->descriptor.bDeviceClass == 0x02)
353 type = type_0;
354 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
355 type = HX;
356 else if (serial->dev->descriptor.bDeviceClass == 0x00)
357 type = type_1;
358 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
359 type = type_1;
360 dbg("device type: %d", type);
361
362 for (i = 0; i < serial->num_ports; ++i) {
80b6ca48 363 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
1da177e4
LT
364 if (!priv)
365 goto cleanup;
1da177e4
LT
366 spin_lock_init(&priv->lock);
367 priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
368 if (priv->buf == NULL) {
369 kfree(priv);
370 goto cleanup;
371 }
372 init_waitqueue_head(&priv->delta_msr_wait);
373 priv->type = type;
374 usb_set_serial_port_data(serial->port[i], priv);
375 }
3e152505
SS
376
377 pl2303_vendor_read(0x8484, 0, serial, buf);
378 pl2303_vendor_write(0x0404, 0, serial);
379 pl2303_vendor_read(0x8484, 0, serial, buf);
380 pl2303_vendor_read(0x8383, 0, serial, buf);
381 pl2303_vendor_read(0x8484, 0, serial, buf);
382 pl2303_vendor_write(0x0404, 1, serial);
383 pl2303_vendor_read(0x8484, 0, serial, buf);
384 pl2303_vendor_read(0x8383, 0, serial, buf);
385 pl2303_vendor_write(0, 1, serial);
386 pl2303_vendor_write(1, 0, serial);
387 if (type == HX)
388 pl2303_vendor_write(2, 0x44, serial);
389 else
390 pl2303_vendor_write(2, 0x24, serial);
391
392 kfree(buf);
1da177e4
LT
393 return 0;
394
395cleanup:
3e152505 396 kfree(buf);
1da177e4
LT
397 for (--i; i>=0; --i) {
398 priv = usb_get_serial_port_data(serial->port[i]);
399 pl2303_buf_free(priv->buf);
400 kfree(priv);
401 usb_set_serial_port_data(serial->port[i], NULL);
402 }
403 return -ENOMEM;
404}
405
372db8a7 406static int set_control_lines(struct usb_device *dev, u8 value)
1da177e4
LT
407{
408 int retval;
409
372db8a7
TG
410 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
411 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
412 value, 0, NULL, 0, 100);
441b62c1 413 dbg("%s - value = %d, retval = %d", __func__, value, retval);
1da177e4
LT
414 return retval;
415}
416
1da177e4
LT
417static void pl2303_send(struct usb_serial_port *port)
418{
419 int count, result;
420 struct pl2303_private *priv = usb_get_serial_port_data(port);
421 unsigned long flags;
422
441b62c1 423 dbg("%s - port %d", __func__, port->number);
1da177e4
LT
424
425 spin_lock_irqsave(&priv->lock, flags);
426
427 if (priv->write_urb_in_use) {
428 spin_unlock_irqrestore(&priv->lock, flags);
429 return;
430 }
431
432 count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
372db8a7 433 port->bulk_out_size);
1da177e4
LT
434
435 if (count == 0) {
436 spin_unlock_irqrestore(&priv->lock, flags);
437 return;
438 }
439
440 priv->write_urb_in_use = 1;
441
442 spin_unlock_irqrestore(&priv->lock, flags);
443
441b62c1 444 usb_serial_debug_data(debug, &port->dev, __func__, count,
372db8a7 445 port->write_urb->transfer_buffer);
1da177e4
LT
446
447 port->write_urb->transfer_buffer_length = count;
448 port->write_urb->dev = port->serial->dev;
372db8a7 449 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1da177e4 450 if (result) {
372db8a7 451 dev_err(&port->dev, "%s - failed submitting write urb,"
441b62c1 452 " error %d\n", __func__, result);
1da177e4
LT
453 priv->write_urb_in_use = 0;
454 // TODO: reschedule pl2303_send
455 }
456
cf2c7481 457 usb_serial_port_softint(port);
1da177e4
LT
458}
459
572d3138
TG
460static int pl2303_write(struct usb_serial_port *port, const unsigned char *buf,
461 int count)
462{
463 struct pl2303_private *priv = usb_get_serial_port_data(port);
464 unsigned long flags;
465
441b62c1 466 dbg("%s - port %d, %d bytes", __func__, port->number, count);
572d3138
TG
467
468 if (!count)
469 return count;
470
471 spin_lock_irqsave(&priv->lock, flags);
472 count = pl2303_buf_put(priv->buf, buf, count);
473 spin_unlock_irqrestore(&priv->lock, flags);
474
475 pl2303_send(port);
476
477 return count;
478}
479
1da177e4
LT
480static int pl2303_write_room(struct usb_serial_port *port)
481{
482 struct pl2303_private *priv = usb_get_serial_port_data(port);
483 int room = 0;
484 unsigned long flags;
485
441b62c1 486 dbg("%s - port %d", __func__, port->number);
1da177e4
LT
487
488 spin_lock_irqsave(&priv->lock, flags);
489 room = pl2303_buf_space_avail(priv->buf);
490 spin_unlock_irqrestore(&priv->lock, flags);
491
441b62c1 492 dbg("%s - returns %d", __func__, room);
1da177e4
LT
493 return room;
494}
495
496static int pl2303_chars_in_buffer(struct usb_serial_port *port)
497{
498 struct pl2303_private *priv = usb_get_serial_port_data(port);
499 int chars = 0;
500 unsigned long flags;
501
441b62c1 502 dbg("%s - port %d", __func__, port->number);
1da177e4
LT
503
504 spin_lock_irqsave(&priv->lock, flags);
505 chars = pl2303_buf_data_avail(priv->buf);
506 spin_unlock_irqrestore(&priv->lock, flags);
507
441b62c1 508 dbg("%s - returns %d", __func__, chars);
1da177e4
LT
509 return chars;
510}
511
372db8a7 512static void pl2303_set_termios(struct usb_serial_port *port,
606d099c 513 struct ktermios *old_termios)
1da177e4
LT
514{
515 struct usb_serial *serial = port->serial;
516 struct pl2303_private *priv = usb_get_serial_port_data(port);
517 unsigned long flags;
518 unsigned int cflag;
519 unsigned char *buf;
520 int baud;
521 int i;
522 u8 control;
523
441b62c1 524 dbg("%s - port %d", __func__, port->number);
1da177e4 525
1da177e4
LT
526 spin_lock_irqsave(&priv->lock, flags);
527 if (!priv->termios_initialized) {
528 *(port->tty->termios) = tty_std_termios;
372db8a7
TG
529 port->tty->termios->c_cflag = B9600 | CS8 | CREAD |
530 HUPCL | CLOCAL;
df64c471
AC
531 port->tty->termios->c_ispeed = 9600;
532 port->tty->termios->c_ospeed = 9600;
1da177e4
LT
533 priv->termios_initialized = 1;
534 }
535 spin_unlock_irqrestore(&priv->lock, flags);
536
bf5e5834
AC
537 /* The PL2303 is reported to lose bytes if you change
538 serial settings even to the same values as before. Thus
539 we actually need to filter in this specific case */
540
541 if (!tty_termios_hw_change(port->tty->termios, old_termios))
542 return;
543
1da177e4 544 cflag = port->tty->termios->c_cflag;
1da177e4 545
372db8a7 546 buf = kzalloc(7, GFP_KERNEL);
1da177e4 547 if (!buf) {
441b62c1 548 dev_err(&port->dev, "%s - out of memory.\n", __func__);
1da177e4
LT
549 return;
550 }
1da177e4 551
372db8a7
TG
552 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
553 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
554 0, 0, buf, 7, 100);
555 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
556 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
1da177e4
LT
557
558 if (cflag & CSIZE) {
559 switch (cflag & CSIZE) {
560 case CS5: buf[6] = 5; break;
561 case CS6: buf[6] = 6; break;
562 case CS7: buf[6] = 7; break;
563 default:
564 case CS8: buf[6] = 8; break;
565 }
441b62c1 566 dbg("%s - data bits = %d", __func__, buf[6]);
1da177e4
LT
567 }
568
e0c79f51 569 baud = tty_get_baud_rate(port->tty);;
441b62c1 570 dbg("%s - baud = %d", __func__, baud);
1da177e4
LT
571 if (baud) {
572 buf[0] = baud & 0xff;
573 buf[1] = (baud >> 8) & 0xff;
574 buf[2] = (baud >> 16) & 0xff;
575 buf[3] = (baud >> 24) & 0xff;
576 }
577
578 /* For reference buf[4]=0 is 1 stop bits */
579 /* For reference buf[4]=1 is 1.5 stop bits */
580 /* For reference buf[4]=2 is 2 stop bits */
581 if (cflag & CSTOPB) {
582 buf[4] = 2;
441b62c1 583 dbg("%s - stop bits = 2", __func__);
1da177e4
LT
584 } else {
585 buf[4] = 0;
441b62c1 586 dbg("%s - stop bits = 1", __func__);
1da177e4
LT
587 }
588
589 if (cflag & PARENB) {
590 /* For reference buf[5]=0 is none parity */
591 /* For reference buf[5]=1 is odd parity */
592 /* For reference buf[5]=2 is even parity */
593 /* For reference buf[5]=3 is mark parity */
594 /* For reference buf[5]=4 is space parity */
595 if (cflag & PARODD) {
596 buf[5] = 1;
441b62c1 597 dbg("%s - parity = odd", __func__);
1da177e4
LT
598 } else {
599 buf[5] = 2;
441b62c1 600 dbg("%s - parity = even", __func__);
1da177e4
LT
601 }
602 } else {
603 buf[5] = 0;
441b62c1 604 dbg("%s - parity = none", __func__);
1da177e4
LT
605 }
606
372db8a7
TG
607 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
608 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
609 0, 0, buf, 7, 100);
610 dbg("0x21:0x20:0:0 %d", i);
1da177e4
LT
611
612 /* change control lines if we are switching to or from B0 */
613 spin_lock_irqsave(&priv->lock, flags);
614 control = priv->line_control;
615 if ((cflag & CBAUD) == B0)
616 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
617 else
618 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
619 if (control != priv->line_control) {
620 control = priv->line_control;
621 spin_unlock_irqrestore(&priv->lock, flags);
622 set_control_lines(serial->dev, control);
623 } else {
624 spin_unlock_irqrestore(&priv->lock, flags);
625 }
372db8a7 626
1da177e4
LT
627 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
628
372db8a7
TG
629 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
630 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
631 0, 0, buf, 7, 100);
632 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
1da177e4
LT
633 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
634
635 if (cflag & CRTSCTS) {
1da177e4 636 if (priv->type == HX)
eb44da0b 637 pl2303_vendor_write(0x0, 0x61, serial);
1da177e4 638 else
eb44da0b 639 pl2303_vendor_write(0x0, 0x41, serial);
715f9527 640 } else {
eb44da0b 641 pl2303_vendor_write(0x0, 0x0, serial);
1da177e4 642 }
572d3138 643
df64c471
AC
644 /* FIXME: Need to read back resulting baud rate */
645 if (baud)
646 tty_encode_baud_rate(port->tty, baud, baud);
647
572d3138
TG
648 kfree(buf);
649}
650
651static void pl2303_close(struct usb_serial_port *port, struct file *filp)
652{
653 struct pl2303_private *priv = usb_get_serial_port_data(port);
654 unsigned long flags;
655 unsigned int c_cflag;
656 int bps;
657 long timeout;
658 wait_queue_t wait;
659
441b62c1 660 dbg("%s - port %d", __func__, port->number);
572d3138
TG
661
662 /* wait for data to drain from the buffer */
663 spin_lock_irqsave(&priv->lock, flags);
664 timeout = PL2303_CLOSING_WAIT;
665 init_waitqueue_entry(&wait, current);
666 add_wait_queue(&port->tty->write_wait, &wait);
667 for (;;) {
668 set_current_state(TASK_INTERRUPTIBLE);
669 if (pl2303_buf_data_avail(priv->buf) == 0 ||
670 timeout == 0 || signal_pending(current) ||
0915f490 671 port->serial->disconnected)
572d3138
TG
672 break;
673 spin_unlock_irqrestore(&priv->lock, flags);
674 timeout = schedule_timeout(timeout);
675 spin_lock_irqsave(&priv->lock, flags);
676 }
677 set_current_state(TASK_RUNNING);
678 remove_wait_queue(&port->tty->write_wait, &wait);
679 /* clear out any remaining data in the buffer */
680 pl2303_buf_clear(priv->buf);
681 spin_unlock_irqrestore(&priv->lock, flags);
682
683 /* wait for characters to drain from the device */
684 /* (this is long enough for the entire 256 byte */
685 /* pl2303 hardware buffer to drain with no flow */
686 /* control for data rates of 1200 bps or more, */
687 /* for lower rates we should really know how much */
688 /* data is in the buffer to compute a delay */
689 /* that is not unnecessarily long) */
690 bps = tty_get_baud_rate(port->tty);
691 if (bps > 1200)
692 timeout = max((HZ*2560)/bps,HZ/10);
693 else
694 timeout = 2*HZ;
695 schedule_timeout_interruptible(timeout);
696
697 /* shutdown our urbs */
441b62c1 698 dbg("%s - shutting down urbs", __func__);
572d3138
TG
699 usb_kill_urb(port->write_urb);
700 usb_kill_urb(port->read_urb);
701 usb_kill_urb(port->interrupt_in_urb);
702
703 if (port->tty) {
704 c_cflag = port->tty->termios->c_cflag;
705 if (c_cflag & HUPCL) {
706 /* drop DTR and RTS */
707 spin_lock_irqsave(&priv->lock, flags);
708 priv->line_control = 0;
709 spin_unlock_irqrestore(&priv->lock, flags);
710 set_control_lines(port->serial->dev, 0);
711 }
712 }
1da177e4
LT
713}
714
372db8a7 715static int pl2303_open(struct usb_serial_port *port, struct file *filp)
1da177e4 716{
606d099c 717 struct ktermios tmp_termios;
1da177e4
LT
718 struct usb_serial *serial = port->serial;
719 struct pl2303_private *priv = usb_get_serial_port_data(port);
1da177e4
LT
720 int result;
721
441b62c1 722 dbg("%s - port %d", __func__, port->number);
1da177e4 723
1694899f
D
724 if (priv->type != HX) {
725 usb_clear_halt(serial->dev, port->write_urb->pipe);
726 usb_clear_halt(serial->dev, port->read_urb->pipe);
3e152505 727 } else {
1da177e4 728 /* reset upstream data pipes */
eb44da0b
SS
729 pl2303_vendor_write(8, 0, serial);
730 pl2303_vendor_write(9, 0, serial);
1da177e4
LT
731 }
732
1da177e4
LT
733 /* Setup termios */
734 if (port->tty) {
372db8a7 735 pl2303_set_termios(port, &tmp_termios);
1da177e4
LT
736 }
737
738 //FIXME: need to assert RTS and DTR if CRTSCTS off
739
441b62c1 740 dbg("%s - submitting read urb", __func__);
1da177e4 741 port->read_urb->dev = serial->dev;
372db8a7 742 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
1da177e4 743 if (result) {
372db8a7 744 dev_err(&port->dev, "%s - failed submitting read urb,"
441b62c1 745 " error %d\n", __func__, result);
372db8a7 746 pl2303_close(port, NULL);
1da177e4
LT
747 return -EPROTO;
748 }
749
441b62c1 750 dbg("%s - submitting interrupt urb", __func__);
1da177e4 751 port->interrupt_in_urb->dev = serial->dev;
372db8a7 752 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1da177e4 753 if (result) {
372db8a7 754 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
441b62c1 755 " error %d\n", __func__, result);
372db8a7 756 pl2303_close(port, NULL);
1da177e4
LT
757 return -EPROTO;
758 }
759 return 0;
760}
761
372db8a7
TG
762static int pl2303_tiocmset(struct usb_serial_port *port, struct file *file,
763 unsigned int set, unsigned int clear)
1da177e4
LT
764{
765 struct pl2303_private *priv = usb_get_serial_port_data(port);
766 unsigned long flags;
767 u8 control;
768
6fdd8e8e
FL
769 if (!usb_get_intfdata(port->serial->interface))
770 return -ENODEV;
771
372db8a7 772 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
773 if (set & TIOCM_RTS)
774 priv->line_control |= CONTROL_RTS;
775 if (set & TIOCM_DTR)
776 priv->line_control |= CONTROL_DTR;
777 if (clear & TIOCM_RTS)
778 priv->line_control &= ~CONTROL_RTS;
779 if (clear & TIOCM_DTR)
780 priv->line_control &= ~CONTROL_DTR;
781 control = priv->line_control;
372db8a7 782 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4 783
372db8a7 784 return set_control_lines(port->serial->dev, control);
1da177e4
LT
785}
786
372db8a7 787static int pl2303_tiocmget(struct usb_serial_port *port, struct file *file)
1da177e4
LT
788{
789 struct pl2303_private *priv = usb_get_serial_port_data(port);
790 unsigned long flags;
791 unsigned int mcr;
792 unsigned int status;
793 unsigned int result;
794
441b62c1 795 dbg("%s (%d)", __func__, port->number);
1da177e4 796
6fdd8e8e
FL
797 if (!usb_get_intfdata(port->serial->interface))
798 return -ENODEV;
799
372db8a7 800 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
801 mcr = priv->line_control;
802 status = priv->line_status;
372db8a7 803 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4
LT
804
805 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
806 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
807 | ((status & UART_CTS) ? TIOCM_CTS : 0)
808 | ((status & UART_DSR) ? TIOCM_DSR : 0)
809 | ((status & UART_RING) ? TIOCM_RI : 0)
810 | ((status & UART_DCD) ? TIOCM_CD : 0);
811
441b62c1 812 dbg("%s - result = %x", __func__, result);
1da177e4
LT
813
814 return result;
815}
816
817static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
818{
819 struct pl2303_private *priv = usb_get_serial_port_data(port);
820 unsigned long flags;
821 unsigned int prevstatus;
822 unsigned int status;
823 unsigned int changed;
824
372db8a7 825 spin_lock_irqsave(&priv->lock, flags);
1da177e4 826 prevstatus = priv->line_status;
372db8a7 827 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4
LT
828
829 while (1) {
830 interruptible_sleep_on(&priv->delta_msr_wait);
831 /* see if a signal did it */
832 if (signal_pending(current))
833 return -ERESTARTSYS;
372db8a7
TG
834
835 spin_lock_irqsave(&priv->lock, flags);
1da177e4 836 status = priv->line_status;
372db8a7
TG
837 spin_unlock_irqrestore(&priv->lock, flags);
838
1da177e4 839 changed=prevstatus^status;
372db8a7 840
1da177e4
LT
841 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
842 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
843 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
844 ((arg & TIOCM_CTS) && (changed & UART_CTS)) ) {
845 return 0;
846 }
847 prevstatus = status;
848 }
849 /* NOTREACHED */
850 return 0;
851}
852
372db8a7
TG
853static int pl2303_ioctl(struct usb_serial_port *port, struct file *file,
854 unsigned int cmd, unsigned long arg)
1da177e4 855{
441b62c1 856 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
1da177e4
LT
857
858 switch (cmd) {
859 case TIOCMIWAIT:
441b62c1 860 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
1da177e4
LT
861 return wait_modem_info(port, arg);
862
863 default:
441b62c1 864 dbg("%s not supported = 0x%04x", __func__, cmd);
1da177e4
LT
865 break;
866 }
867
868 return -ENOIOCTLCMD;
869}
870
372db8a7 871static void pl2303_break_ctl(struct usb_serial_port *port, int break_state)
1da177e4
LT
872{
873 struct usb_serial *serial = port->serial;
874 u16 state;
875 int result;
876
441b62c1 877 dbg("%s - port %d", __func__, port->number);
1da177e4
LT
878
879 if (break_state == 0)
880 state = BREAK_OFF;
881 else
882 state = BREAK_ON;
441b62c1 883 dbg("%s - turning break %s", __func__, state==BREAK_OFF ? "off" : "on");
1da177e4 884
372db8a7
TG
885 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
886 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
887 0, NULL, 0, 100);
1da177e4 888 if (result)
441b62c1 889 dbg("%s - error sending break = %d", __func__, result);
1da177e4
LT
890}
891
372db8a7 892static void pl2303_shutdown(struct usb_serial *serial)
1da177e4
LT
893{
894 int i;
895 struct pl2303_private *priv;
896
441b62c1 897 dbg("%s", __func__);
1da177e4
LT
898
899 for (i = 0; i < serial->num_ports; ++i) {
900 priv = usb_get_serial_port_data(serial->port[i]);
901 if (priv) {
902 pl2303_buf_free(priv->buf);
903 kfree(priv);
904 usb_set_serial_port_data(serial->port[i], NULL);
905 }
372db8a7 906 }
1da177e4
LT
907}
908
97bb13ec
FL
909static void pl2303_update_line_status(struct usb_serial_port *port,
910 unsigned char *data,
911 unsigned int actual_length)
912{
913
914 struct pl2303_private *priv = usb_get_serial_port_data(port);
915 unsigned long flags;
916 u8 status_idx = UART_STATE;
95f209f9 917 u8 length = UART_STATE + 1;
9c537616 918 u16 idv, idp;
97bb13ec 919
9c537616
TG
920 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
921 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
922
923
924 if (idv == SIEMENS_VENDOR_ID) {
925 if (idp == SIEMENS_PRODUCT_ID_X65 ||
926 idp == SIEMENS_PRODUCT_ID_SX1 ||
927 idp == SIEMENS_PRODUCT_ID_X75) {
928
929 length = 1;
930 status_idx = 0;
931 }
97bb13ec
FL
932 }
933
934 if (actual_length < length)
a009b75a 935 return;
97bb13ec
FL
936
937 /* Save off the uart status for others to look at */
938 spin_lock_irqsave(&priv->lock, flags);
939 priv->line_status = data[status_idx];
940 spin_unlock_irqrestore(&priv->lock, flags);
372db8a7 941 wake_up_interruptible(&priv->delta_msr_wait);
97bb13ec 942}
1da177e4 943
7d12e780 944static void pl2303_read_int_callback(struct urb *urb)
1da177e4
LT
945{
946 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
1da177e4 947 unsigned char *data = urb->transfer_buffer;
97bb13ec 948 unsigned int actual_length = urb->actual_length;
461d696a
GKH
949 int status = urb->status;
950 int retval;
1da177e4 951
441b62c1 952 dbg("%s (%d)", __func__, port->number);
1da177e4 953
461d696a 954 switch (status) {
1da177e4
LT
955 case 0:
956 /* success */
957 break;
958 case -ECONNRESET:
959 case -ENOENT:
960 case -ESHUTDOWN:
961 /* this urb is terminated, clean up */
441b62c1 962 dbg("%s - urb shutting down with status: %d", __func__,
461d696a 963 status);
1da177e4
LT
964 return;
965 default:
441b62c1 966 dbg("%s - nonzero urb status received: %d", __func__,
461d696a 967 status);
1da177e4
LT
968 goto exit;
969 }
970
441b62c1 971 usb_serial_debug_data(debug, &port->dev, __func__,
372db8a7
TG
972 urb->actual_length, urb->transfer_buffer);
973
97bb13ec 974 pl2303_update_line_status(port, data, actual_length);
1da177e4 975
1da177e4 976exit:
461d696a
GKH
977 retval = usb_submit_urb(urb, GFP_ATOMIC);
978 if (retval)
372db8a7
TG
979 dev_err(&urb->dev->dev,
980 "%s - usb_submit_urb failed with result %d\n",
441b62c1 981 __func__, retval);
1da177e4
LT
982}
983
7d12e780 984static void pl2303_read_bulk_callback(struct urb *urb)
1da177e4
LT
985{
986 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
987 struct pl2303_private *priv = usb_get_serial_port_data(port);
988 struct tty_struct *tty;
989 unsigned char *data = urb->transfer_buffer;
990 unsigned long flags;
991 int i;
992 int result;
461d696a
GKH
993 int status = urb->status;
994 u8 line_status;
1da177e4
LT
995 char tty_flag;
996
441b62c1 997 dbg("%s - port %d", __func__, port->number);
1da177e4 998
461d696a 999 if (status) {
441b62c1 1000 dbg("%s - urb status = %d", __func__, status);
1da177e4 1001 if (!port->open_count) {
441b62c1 1002 dbg("%s - port is closed, exiting.", __func__);
1da177e4
LT
1003 return;
1004 }
461d696a 1005 if (status == -EPROTO) {
372db8a7
TG
1006 /* PL2303 mysteriously fails with -EPROTO reschedule
1007 * the read */
1008 dbg("%s - caught -EPROTO, resubmitting the urb",
441b62c1 1009 __func__);
1da177e4
LT
1010 urb->dev = port->serial->dev;
1011 result = usb_submit_urb(urb, GFP_ATOMIC);
1012 if (result)
372db8a7
TG
1013 dev_err(&urb->dev->dev, "%s - failed"
1014 " resubmitting read urb, error %d\n",
441b62c1 1015 __func__, result);
1da177e4
LT
1016 return;
1017 }
441b62c1 1018 dbg("%s - unable to handle the error, exiting.", __func__);
1da177e4
LT
1019 return;
1020 }
1021
441b62c1 1022 usb_serial_debug_data(debug, &port->dev, __func__,
372db8a7 1023 urb->actual_length, data);
1da177e4
LT
1024
1025 /* get tty_flag from status */
1026 tty_flag = TTY_NORMAL;
1027
1028 spin_lock_irqsave(&priv->lock, flags);
461d696a 1029 line_status = priv->line_status;
1da177e4
LT
1030 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1031 spin_unlock_irqrestore(&priv->lock, flags);
372db8a7 1032 wake_up_interruptible(&priv->delta_msr_wait);
1da177e4
LT
1033
1034 /* break takes precedence over parity, */
1035 /* which takes precedence over framing errors */
461d696a 1036 if (line_status & UART_BREAK_ERROR )
1da177e4 1037 tty_flag = TTY_BREAK;
461d696a 1038 else if (line_status & UART_PARITY_ERROR)
1da177e4 1039 tty_flag = TTY_PARITY;
461d696a 1040 else if (line_status & UART_FRAME_ERROR)
1da177e4 1041 tty_flag = TTY_FRAME;
441b62c1 1042 dbg("%s - tty_flag = %d", __func__, tty_flag);
1da177e4
LT
1043
1044 tty = port->tty;
1045 if (tty && urb->actual_length) {
33f0f88f 1046 tty_buffer_request_room(tty, urb->actual_length + 1);
1da177e4 1047 /* overrun is special, not associated with a char */
461d696a 1048 if (line_status & UART_OVERRUN_ERROR)
1da177e4 1049 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
33f0f88f 1050 for (i = 0; i < urb->actual_length; ++i)
372db8a7
TG
1051 tty_insert_flip_char(tty, data[i], tty_flag);
1052 tty_flip_buffer_push(tty);
1da177e4
LT
1053 }
1054
1055 /* Schedule the next read _if_ we are still open */
1056 if (port->open_count) {
1057 urb->dev = port->serial->dev;
1058 result = usb_submit_urb(urb, GFP_ATOMIC);
1059 if (result)
372db8a7 1060 dev_err(&urb->dev->dev, "%s - failed resubmitting"
441b62c1 1061 " read urb, error %d\n", __func__, result);
1da177e4
LT
1062 }
1063
1064 return;
1065}
1066
7d12e780 1067static void pl2303_write_bulk_callback(struct urb *urb)
1da177e4
LT
1068{
1069 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
1070 struct pl2303_private *priv = usb_get_serial_port_data(port);
1071 int result;
461d696a 1072 int status = urb->status;
1da177e4 1073
441b62c1 1074 dbg("%s - port %d", __func__, port->number);
1da177e4 1075
461d696a 1076 switch (status) {
1da177e4
LT
1077 case 0:
1078 /* success */
1079 break;
1080 case -ECONNRESET:
1081 case -ENOENT:
1082 case -ESHUTDOWN:
1083 /* this urb is terminated, clean up */
441b62c1 1084 dbg("%s - urb shutting down with status: %d", __func__,
461d696a 1085 status);
1da177e4
LT
1086 priv->write_urb_in_use = 0;
1087 return;
1088 default:
1089 /* error in the urb, so we have to resubmit it */
441b62c1
HH
1090 dbg("%s - Overflow in write", __func__);
1091 dbg("%s - nonzero write bulk status received: %d", __func__,
461d696a 1092 status);
1da177e4
LT
1093 port->write_urb->transfer_buffer_length = 1;
1094 port->write_urb->dev = port->serial->dev;
372db8a7 1095 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1da177e4 1096 if (result)
372db8a7 1097 dev_err(&urb->dev->dev, "%s - failed resubmitting write"
441b62c1 1098 " urb, error %d\n", __func__, result);
1da177e4
LT
1099 else
1100 return;
1101 }
1102
1103 priv->write_urb_in_use = 0;
1104
1105 /* send any buffered data */
1106 pl2303_send(port);
1107}
1108
572d3138
TG
1109/* All of the device info needed for the PL2303 SIO serial converter */
1110static struct usb_serial_driver pl2303_device = {
1111 .driver = {
1112 .owner = THIS_MODULE,
1113 .name = "pl2303",
1114 },
1115 .id_table = id_table,
d9b1b787 1116 .usb_driver = &pl2303_driver,
572d3138
TG
1117 .num_ports = 1,
1118 .open = pl2303_open,
1119 .close = pl2303_close,
1120 .write = pl2303_write,
1121 .ioctl = pl2303_ioctl,
1122 .break_ctl = pl2303_break_ctl,
1123 .set_termios = pl2303_set_termios,
1124 .tiocmget = pl2303_tiocmget,
1125 .tiocmset = pl2303_tiocmset,
1126 .read_bulk_callback = pl2303_read_bulk_callback,
1127 .read_int_callback = pl2303_read_int_callback,
1128 .write_bulk_callback = pl2303_write_bulk_callback,
1129 .write_room = pl2303_write_room,
1130 .chars_in_buffer = pl2303_chars_in_buffer,
1131 .attach = pl2303_startup,
1132 .shutdown = pl2303_shutdown,
1133};
1da177e4 1134
372db8a7 1135static int __init pl2303_init(void)
1da177e4
LT
1136{
1137 int retval;
372db8a7 1138
1da177e4
LT
1139 retval = usb_serial_register(&pl2303_device);
1140 if (retval)
1141 goto failed_usb_serial_register;
1142 retval = usb_register(&pl2303_driver);
1143 if (retval)
1144 goto failed_usb_register;
17a882fc 1145 info(DRIVER_DESC);
1da177e4
LT
1146 return 0;
1147failed_usb_register:
1148 usb_serial_deregister(&pl2303_device);
1149failed_usb_serial_register:
1150 return retval;
1151}
1152
372db8a7 1153static void __exit pl2303_exit(void)
1da177e4 1154{
372db8a7
TG
1155 usb_deregister(&pl2303_driver);
1156 usb_serial_deregister(&pl2303_device);
1da177e4
LT
1157}
1158
1da177e4
LT
1159module_init(pl2303_init);
1160module_exit(pl2303_exit);
1161
1162MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4
LT
1163MODULE_LICENSE("GPL");
1164
1165module_param(debug, bool, S_IRUGO | S_IWUSR);
1166MODULE_PARM_DESC(debug, "Debug enabled or not");
1167