[PATCH] USB: cypress_m8: add support for the Nokia ca42-version 2 cable

This patch adds support for the Nokia ca42 version 2 cable to the
cypress_m8 driver.  The device was tested by others with this patch and
found to be compatible with the cypress_m8 driver.  A special note
should be taken that this cable seems to vary in the type of chipset
used.  This patch supports the cable with product id 0x4101.

Signed-off-by: Lonnie Mendez <lmendez19@austin.rr.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Lonnie Mendez 2006-03-01 10:45:24 -06:00 committed by Greg Kroah-Hartman
parent a847423905
commit a5c44e29e5
2 changed files with 75 additions and 0 deletions

View File

@ -98,10 +98,16 @@ static struct usb_device_id id_table_cyphidcomrs232 [] = {
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
static struct usb_device_id id_table_nokiaca42v2 [] = {
{ USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) },
{ } /* Terminating entry */
};
static struct usb_device_id id_table_combined [] = { static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) },
{ USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) },
{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
{ USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) },
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
@ -149,6 +155,7 @@ struct cypress_buf {
/* function prototypes for the Cypress USB to serial device */ /* function prototypes for the Cypress USB to serial device */
static int cypress_earthmate_startup (struct usb_serial *serial); static int cypress_earthmate_startup (struct usb_serial *serial);
static int cypress_hidcom_startup (struct usb_serial *serial); static int cypress_hidcom_startup (struct usb_serial *serial);
static int cypress_ca42v2_startup (struct usb_serial *serial);
static void cypress_shutdown (struct usb_serial *serial); static void cypress_shutdown (struct usb_serial *serial);
static int cypress_open (struct usb_serial_port *port, struct file *filp); static int cypress_open (struct usb_serial_port *port, struct file *filp);
static void cypress_close (struct usb_serial_port *port, struct file *filp); static void cypress_close (struct usb_serial_port *port, struct file *filp);
@ -235,6 +242,34 @@ static struct usb_serial_driver cypress_hidcom_device = {
.write_int_callback = cypress_write_int_callback, .write_int_callback = cypress_write_int_callback,
}; };
static struct usb_serial_driver cypress_ca42v2_device = {
.driver = {
.owner = THIS_MODULE,
.name = "nokiaca42v2",
},
.description = "Nokia CA-42 V2 Adapter",
.id_table = id_table_nokiaca42v2,
.num_interrupt_in = 1,
.num_interrupt_out = 1,
.num_bulk_in = NUM_DONT_CARE,
.num_bulk_out = NUM_DONT_CARE,
.num_ports = 1,
.attach = cypress_ca42v2_startup,
.shutdown = cypress_shutdown,
.open = cypress_open,
.close = cypress_close,
.write = cypress_write,
.write_room = cypress_write_room,
.ioctl = cypress_ioctl,
.set_termios = cypress_set_termios,
.tiocmget = cypress_tiocmget,
.tiocmset = cypress_tiocmset,
.chars_in_buffer = cypress_chars_in_buffer,
.throttle = cypress_throttle,
.unthrottle = cypress_unthrottle,
.read_int_callback = cypress_read_int_callback,
.write_int_callback = cypress_write_int_callback,
};
/***************************************************************************** /*****************************************************************************
* Cypress serial helper functions * Cypress serial helper functions
@ -286,6 +321,12 @@ static int cypress_serial_control (struct usb_serial_port *port, unsigned baud_m
__FUNCTION__); __FUNCTION__);
new_baudrate = priv->baud_rate; new_baudrate = priv->baud_rate;
} }
} else if (priv->chiptype == CT_CA42V2) {
if ( (new_baudrate = mask_to_rate(baud_mask)) == -1) {
err("%s - failed setting baud rate, unsupported speed",
__FUNCTION__);
new_baudrate = priv->baud_rate;
}
} else if (priv->chiptype == CT_GENERIC) { } else if (priv->chiptype == CT_GENERIC) {
if ( (new_baudrate = mask_to_rate(baud_mask)) == -1) { if ( (new_baudrate = mask_to_rate(baud_mask)) == -1) {
err("%s - failed setting baud rate, unsupported speed", err("%s - failed setting baud rate, unsupported speed",
@ -499,6 +540,25 @@ static int cypress_hidcom_startup (struct usb_serial *serial)
} /* cypress_hidcom_startup */ } /* cypress_hidcom_startup */
static int cypress_ca42v2_startup (struct usb_serial *serial)
{
struct cypress_private *priv;
dbg("%s", __FUNCTION__);
if (generic_startup(serial)) {
dbg("%s - Failed setting up port %d", __FUNCTION__,
serial->port[0]->number);
return 1;
}
priv = usb_get_serial_port_data(serial->port[0]);
priv->chiptype = CT_CA42V2;
return 0;
} /* cypress_ca42v2_startup */
static void cypress_shutdown (struct usb_serial *serial) static void cypress_shutdown (struct usb_serial *serial)
{ {
struct cypress_private *priv; struct cypress_private *priv;
@ -943,6 +1003,10 @@ static void cypress_set_termios (struct usb_serial_port *port,
*(tty->termios) = tty_std_termios; *(tty->termios) = tty_std_termios;
tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL |
CLOCAL; CLOCAL;
} else if (priv->chiptype == CT_CA42V2) {
*(tty->termios) = tty_std_termios;
tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL |
CLOCAL;
} }
priv->termios_initialized = 1; priv->termios_initialized = 1;
} }
@ -1541,6 +1605,9 @@ static int __init cypress_init(void)
retval = usb_serial_register(&cypress_hidcom_device); retval = usb_serial_register(&cypress_hidcom_device);
if (retval) if (retval)
goto failed_hidcom_register; goto failed_hidcom_register;
retval = usb_serial_register(&cypress_ca42v2_device);
if (retval)
goto failed_ca42v2_register;
retval = usb_register(&cypress_driver); retval = usb_register(&cypress_driver);
if (retval) if (retval)
goto failed_usb_register; goto failed_usb_register;
@ -1549,6 +1616,8 @@ static int __init cypress_init(void)
return 0; return 0;
failed_usb_register: failed_usb_register:
usb_deregister(&cypress_driver); usb_deregister(&cypress_driver);
failed_ca42v2_register:
usb_serial_deregister(&cypress_ca42v2_device);
failed_hidcom_register: failed_hidcom_register:
usb_serial_deregister(&cypress_hidcom_device); usb_serial_deregister(&cypress_hidcom_device);
failed_em_register: failed_em_register:
@ -1565,6 +1634,7 @@ static void __exit cypress_exit (void)
usb_deregister (&cypress_driver); usb_deregister (&cypress_driver);
usb_serial_deregister (&cypress_earthmate_device); usb_serial_deregister (&cypress_earthmate_device);
usb_serial_deregister (&cypress_hidcom_device); usb_serial_deregister (&cypress_hidcom_device);
usb_serial_deregister (&cypress_ca42v2_device);
} }

View File

@ -18,6 +18,10 @@
/* Cypress HID->COM RS232 Adapter */ /* Cypress HID->COM RS232 Adapter */
#define VENDOR_ID_CYPRESS 0x04b4 #define VENDOR_ID_CYPRESS 0x04b4
#define PRODUCT_ID_CYPHIDCOM 0x5500 #define PRODUCT_ID_CYPHIDCOM 0x5500
/* Nokia CA-42 USB to serial cable */
#define VENDOR_ID_DAZZLE 0x07d0
#define PRODUCT_ID_CA42 0x4101
/* End of device listing */ /* End of device listing */
/* Used for setting / requesting serial line settings */ /* Used for setting / requesting serial line settings */
@ -34,6 +38,7 @@
#define CT_EARTHMATE 0x01 #define CT_EARTHMATE 0x01
#define CT_CYPHIDCOM 0x02 #define CT_CYPHIDCOM 0x02
#define CT_CA42V2 0x03
#define CT_GENERIC 0x0F #define CT_GENERIC 0x0F
/* End of chiptype definitions */ /* End of chiptype definitions */