USB: Add user defined IDs to ftdi

From: Pete Zaitcev
Date: Wed Jan 05 2005 - 04:15:12 EST


This should be self-evident. Patch by Rogier Wolff.

diff -urp -X dontdiff linux-2.4.29-pre3/drivers/usb/serial/ftdi_sio.c linux-2.4.29-pre3-sx3/drivers/usb/serial/ftdi_sio.c
--- linux-2.4.29-pre3/drivers/usb/serial/ftdi_sio.c 2004-08-10 13:43:36.000000000 -0700
+++ linux-2.4.29-pre3-sx3/drivers/usb/serial/ftdi_sio.c 2005-01-05 00:41:54.744764124 -0800
@@ -449,6 +449,12 @@ static struct usb_device_id id_table_HE_
};


+static struct usb_device_id id_table_userdev [] = {
+ { USB_DEVICE(-1, -1) },
+ { } /* Terminating entry */
+};
+
+
static __devinitdata struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
@@ -548,6 +554,10 @@ MODULE_DEVICE_TABLE (usb, id_table_combi
#define BUFSZ 512
#define PKTSZ 64

+static int vendor =-1, product = -1, baud_base = 48000000/2;
+ /* User specified VID and Product ID and baud base. */
+
+
struct ftdi_private {
ftdi_chip_type_t chip_type;
/* type of the device, either SIO or FT8U232AM */
@@ -584,6 +594,7 @@ static int ftdi_8U232AM_startup (struct
static int ftdi_FT232BM_startup (struct usb_serial *serial);
static int ftdi_USB_UIRT_startup (struct usb_serial *serial);
static int ftdi_HE_TIRA1_startup (struct usb_serial *serial);
+static int ftdi_userdev_startup (struct usb_serial *serial);
static void ftdi_shutdown (struct usb_serial *serial);
static int ftdi_open (struct usb_serial_port *port, struct file *filp);
static void ftdi_close (struct usb_serial_port *port, struct file *filp);
@@ -727,6 +738,28 @@ static struct usb_serial_device_type ftd



+
+static struct usb_serial_device_type ftdi_userdev_device = {
+ .owner = THIS_MODULE,
+ .name = "FTDI SIO compatible",
+ .id_table = id_table_userdev,
+ .num_interrupt_in = 0,
+ .num_bulk_in = 1,
+ .num_bulk_out = 1,
+ .num_ports = 1,
+ .open = ftdi_open,
+ .close = ftdi_close,
+ .write = ftdi_write,
+ .write_room = ftdi_write_room,
+ .read_bulk_callback = ftdi_read_bulk_callback,
+ .write_bulk_callback = ftdi_write_bulk_callback,
+ .ioctl = ftdi_ioctl,
+ .set_termios = ftdi_set_termios,
+ .break_ctl = ftdi_break_ctl,
+ .startup = ftdi_userdev_startup,
+ .shutdown = ftdi_shutdown,
+};
+
#define WDR_TIMEOUT (HZ * 5 ) /* default urb timeout */

/* High and low are for DTR, RTS etc etc */
@@ -1216,6 +1249,30 @@ static int ftdi_HE_TIRA1_startup (struct
*/


+/* Startup for the 8U232AM chip */
+static int ftdi_userdev_startup (struct usb_serial *serial)
+{
+ struct ftdi_private *priv;
+
+ priv = serial->port->private = kmalloc(sizeof(struct ftdi_private), GFP_KERNEL);
+ if (!priv){
+ err("%s- kmalloc(%Zd) failed.", __FUNCTION__, sizeof(struct ftdi_private));
+ return -ENOMEM;
+ }
+
+ priv->chip_type = FT8U232AM; /* XXX: Hmm. Keep this.... -- REW */
+ priv->baud_base = baud_base;
+ priv->custom_divisor = 0;
+ priv->write_offset = 0;
+ init_waitqueue_head(&priv->delta_msr_wait);
+ /* This will push the characters through immediately rather
+ than queue a task to deliver them */
+ priv->flags = ASYNC_LOW_LATENCY;
+
+ return (0);
+}
+
+
static void ftdi_shutdown (struct usb_serial *serial)
{ /* ftdi_shutdown */

@@ -2134,6 +2191,14 @@ static int __init ftdi_init (void)
usb_serial_register (&ftdi_USB_UIRT_device);
usb_serial_register (&ftdi_HE_TIRA1_device);

+ if (vendor != -1) {
+ /* User specified USB vendor and device id */
+ /* The macro initialized "matchvendor" as the matching flags */
+ id_table_userdev[0].idVendor = vendor;
+ id_table_userdev[0].idProduct = product;
+ usb_serial_register (&ftdi_userdev_device);
+ }
+

info(DRIVER_VERSION ":" DRIVER_DESC);
return 0;
@@ -2164,3 +2229,8 @@ MODULE_LICENSE("GPL");
MODULE_PARM(debug, "i");
MODULE_PARM_DESC(debug, "Debug enabled or not");

+MODULE_PARM(vendor, "i");
+MODULE_PARM_DESC(vendor, "User specified USB idVendor");
+
+MODULE_PARM(product, "i");
+MODULE_PARM_DESC(product, "User specified USB idProduct");
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/