mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
USB-serial updates for v4.11-rc1 part 2
Here's one more device id for the new upd78f0730 driver and three clean-up patches that are mostly moving some code around. All have been in linux-next with no reported issues. Signed-off-by: Johan Hovold <johan@kernel.org> -----BEGIN PGP SIGNATURE----- iQIuBAABCAAYBQJYpbLDERxqb2hhbkBrZXJuZWwub3JnAAoJEEEN5E/e4bSVx7IP /3dl1j5lN1lQaJhHwwwx/iA9HfXrUd0xpNBxB/84WYA2p6sA6kLJ0vpU35l9BmnU M36P12ICp+DcfcxZTgAxBxSeymqBZ0nSjO5/0WZeHEA9YtDhN9TboOqHfWv/Noa5 916v5YVBWAl84KXVU1ptWPjUyr868K/NW78bL+SoU+QmLaMoh7p0PzMx+xKmMr5y qJR/F3kNyaPCZW9LEGFA1ivsdZ5WrlsWO6pIsbaE4lMGk7wtjhFhlojgwS+TOsLh WHKmDizsPCI6LZrqAFf1vr9VzxCprQ8VgdH4YzgR5DITv9BTzJsSfLREJf5LFGBt +WltojFPP6o7fRROD5d821tHynwRCdKxklY6Sa2+FjTFsIIVlW0FcQHr6alEEJKK iWm8+TJILP/gYCdPf7KZrvUqOLISbOuxIPrkcvIBz0me3ndCQEULNSodk2/jJR7c +Xv5CxZ2DsDZo1h7r55GUwSwiMOAx5xuhy7gjgROpsLrPkvSUJvYzdoGUNlL/XF9 Rm5aaudFNhwO2cPwSZEjdMmW9XNbnxMAOXLktrht8G5aP0V0KlXykNF65zNIIUBg QDzLFJXlmsEMX+chgpc255coFwDKXAcFAjLZZ2ZAcx7uecE1aqNFOCufirwqsgZZ PbSW89WbFK6lELUrMOc5ySVv3ms9Vih8XpJ+vPyHOnbU =9eBj -----END PGP SIGNATURE----- Merge tag 'usb-serial-4.11-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial into usb-next Johan writes: USB-serial updates for v4.11-rc1 part 2 Here's one more device id for the new upd78f0730 driver and three clean-up patches that are mostly moving some code around. All have been in linux-next with no reported issues. Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
commit
0df8a3dbac
@ -57,6 +57,88 @@
|
||||
|
||||
#define OPEN_TIMEOUT (5*HZ) /* 5 seconds */
|
||||
|
||||
static const struct usb_device_id edgeport_2port_id_table[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_421) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_21) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2_DIN) },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct usb_device_id edgeport_4port_id_table[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_RAPIDPORT_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4T) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_MT4X56USB) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4_DIN) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_22I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_COMPATIBLE) },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct usb_device_id edgeport_8port_id_table[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8R) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8RR) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_8) },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct usb_device_id Epic_port_id_table[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0202) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0203) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0310) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0311) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0312) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A758) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A794) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A225) },
|
||||
{ }
|
||||
};
|
||||
|
||||
/* Devices that this driver supports */
|
||||
static const struct usb_device_id id_table_combined[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_RAPIDPORT_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4T) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_MT4X56USB) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_421) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_21) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2_DIN) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4_DIN) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_22I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_COMPATIBLE) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8R) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8RR) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_8) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0202) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0203) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0310) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0311) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0312) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A758) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A794) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A225) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, id_table_combined);
|
||||
|
||||
|
||||
/* receive port state */
|
||||
enum RXSTATE {
|
||||
EXPECT_HDR1 = 0, /* Expect header byte 1 */
|
||||
@ -217,8 +299,6 @@ static void edge_release(struct usb_serial *serial);
|
||||
static int edge_port_probe(struct usb_serial_port *port);
|
||||
static int edge_port_remove(struct usb_serial_port *port);
|
||||
|
||||
#include "io_tables.h" /* all of the devices that this driver supports */
|
||||
|
||||
/* function prototypes for all of our local functions */
|
||||
|
||||
static void process_rcvd_data(struct edgeport_serial *edge_serial,
|
||||
@ -3032,6 +3112,139 @@ static int edge_port_remove(struct usb_serial_port *port)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct usb_serial_driver edgeport_2port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "edgeport_2",
|
||||
},
|
||||
.description = "Edgeport 2 port adapter",
|
||||
.id_table = edgeport_2port_id_table,
|
||||
.num_ports = 2,
|
||||
.open = edge_open,
|
||||
.close = edge_close,
|
||||
.throttle = edge_throttle,
|
||||
.unthrottle = edge_unthrottle,
|
||||
.attach = edge_startup,
|
||||
.disconnect = edge_disconnect,
|
||||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
.write_bulk_callback = edge_bulk_out_data_callback,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver edgeport_4port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "edgeport_4",
|
||||
},
|
||||
.description = "Edgeport 4 port adapter",
|
||||
.id_table = edgeport_4port_id_table,
|
||||
.num_ports = 4,
|
||||
.open = edge_open,
|
||||
.close = edge_close,
|
||||
.throttle = edge_throttle,
|
||||
.unthrottle = edge_unthrottle,
|
||||
.attach = edge_startup,
|
||||
.disconnect = edge_disconnect,
|
||||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
.write_bulk_callback = edge_bulk_out_data_callback,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver edgeport_8port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "edgeport_8",
|
||||
},
|
||||
.description = "Edgeport 8 port adapter",
|
||||
.id_table = edgeport_8port_id_table,
|
||||
.num_ports = 8,
|
||||
.open = edge_open,
|
||||
.close = edge_close,
|
||||
.throttle = edge_throttle,
|
||||
.unthrottle = edge_unthrottle,
|
||||
.attach = edge_startup,
|
||||
.disconnect = edge_disconnect,
|
||||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
.write_bulk_callback = edge_bulk_out_data_callback,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver epic_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "epic",
|
||||
},
|
||||
.description = "EPiC device",
|
||||
.id_table = Epic_port_id_table,
|
||||
.num_ports = 1,
|
||||
.open = edge_open,
|
||||
.close = edge_close,
|
||||
.throttle = edge_throttle,
|
||||
.unthrottle = edge_unthrottle,
|
||||
.attach = edge_startup,
|
||||
.disconnect = edge_disconnect,
|
||||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
.write_bulk_callback = edge_bulk_out_data_callback,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver * const serial_drivers[] = {
|
||||
&edgeport_2port_device, &edgeport_4port_device,
|
||||
&edgeport_8port_device, &epic_device, NULL
|
||||
};
|
||||
|
||||
module_usb_serial_driver(serial_drivers, id_table_combined);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
|
@ -1,232 +0,0 @@
|
||||
/*
|
||||
* IO Edgeport Driver tables
|
||||
*
|
||||
* Copyright (C) 2001
|
||||
* Greg Kroah-Hartman (greg@kroah.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef IO_TABLES_H
|
||||
#define IO_TABLES_H
|
||||
|
||||
static const struct usb_device_id edgeport_2port_id_table[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_421) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_21) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2_DIN) },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct usb_device_id edgeport_4port_id_table[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_RAPIDPORT_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4T) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_MT4X56USB) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4_DIN) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_22I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_COMPATIBLE) },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct usb_device_id edgeport_8port_id_table[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8R) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8RR) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_8) },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct usb_device_id Epic_port_id_table[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0202) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0203) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0310) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0311) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0312) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A758) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A794) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A225) },
|
||||
{ }
|
||||
};
|
||||
|
||||
/* Devices that this driver supports */
|
||||
static const struct usb_device_id id_table_combined[] = {
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_RAPIDPORT_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4T) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_MT4X56USB) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_421) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_21) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2_DIN) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4_DIN) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_22I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_COMPATIBLE) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8I) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8R) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8RR) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_8) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0202) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0203) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0310) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0311) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_NCR, NCR_DEVICE_ID_EPIC_0312) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A758) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A794) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A225) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, id_table_combined);
|
||||
|
||||
static struct usb_serial_driver edgeport_2port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "edgeport_2",
|
||||
},
|
||||
.description = "Edgeport 2 port adapter",
|
||||
.id_table = edgeport_2port_id_table,
|
||||
.num_ports = 2,
|
||||
.open = edge_open,
|
||||
.close = edge_close,
|
||||
.throttle = edge_throttle,
|
||||
.unthrottle = edge_unthrottle,
|
||||
.attach = edge_startup,
|
||||
.disconnect = edge_disconnect,
|
||||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
.write_bulk_callback = edge_bulk_out_data_callback,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver edgeport_4port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "edgeport_4",
|
||||
},
|
||||
.description = "Edgeport 4 port adapter",
|
||||
.id_table = edgeport_4port_id_table,
|
||||
.num_ports = 4,
|
||||
.open = edge_open,
|
||||
.close = edge_close,
|
||||
.throttle = edge_throttle,
|
||||
.unthrottle = edge_unthrottle,
|
||||
.attach = edge_startup,
|
||||
.disconnect = edge_disconnect,
|
||||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
.write_bulk_callback = edge_bulk_out_data_callback,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver edgeport_8port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "edgeport_8",
|
||||
},
|
||||
.description = "Edgeport 8 port adapter",
|
||||
.id_table = edgeport_8port_id_table,
|
||||
.num_ports = 8,
|
||||
.open = edge_open,
|
||||
.close = edge_close,
|
||||
.throttle = edge_throttle,
|
||||
.unthrottle = edge_unthrottle,
|
||||
.attach = edge_startup,
|
||||
.disconnect = edge_disconnect,
|
||||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
.write_bulk_callback = edge_bulk_out_data_callback,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver epic_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "epic",
|
||||
},
|
||||
.description = "EPiC device",
|
||||
.id_table = Epic_port_id_table,
|
||||
.num_ports = 1,
|
||||
.open = edge_open,
|
||||
.close = edge_close,
|
||||
.throttle = edge_throttle,
|
||||
.unthrottle = edge_unthrottle,
|
||||
.attach = edge_startup,
|
||||
.disconnect = edge_disconnect,
|
||||
.release = edge_release,
|
||||
.port_probe = edge_port_probe,
|
||||
.port_remove = edge_port_remove,
|
||||
.ioctl = edge_ioctl,
|
||||
.set_termios = edge_set_termios,
|
||||
.tiocmget = edge_tiocmget,
|
||||
.tiocmset = edge_tiocmset,
|
||||
.tiocmiwait = usb_serial_generic_tiocmiwait,
|
||||
.get_icount = usb_serial_generic_get_icount,
|
||||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
.write_bulk_callback = edge_bulk_out_data_callback,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver * const serial_drivers[] = {
|
||||
&edgeport_2port_device, &edgeport_4port_device,
|
||||
&edgeport_8port_device, &epic_device, NULL
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -41,11 +41,508 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
#include <linux/usb/ezusb.h>
|
||||
#include "keyspan.h"
|
||||
|
||||
#define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"
|
||||
#define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
|
||||
|
||||
/* Function prototypes for Keyspan serial converter */
|
||||
static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port);
|
||||
static void keyspan_close(struct usb_serial_port *port);
|
||||
static void keyspan_dtr_rts(struct usb_serial_port *port, int on);
|
||||
static int keyspan_startup(struct usb_serial *serial);
|
||||
static void keyspan_disconnect(struct usb_serial *serial);
|
||||
static void keyspan_release(struct usb_serial *serial);
|
||||
static int keyspan_port_probe(struct usb_serial_port *port);
|
||||
static int keyspan_port_remove(struct usb_serial_port *port);
|
||||
static int keyspan_write_room(struct tty_struct *tty);
|
||||
static int keyspan_write(struct tty_struct *tty, struct usb_serial_port *port,
|
||||
const unsigned char *buf, int count);
|
||||
static void keyspan_send_setup(struct usb_serial_port *port, int reset_port);
|
||||
static void keyspan_set_termios(struct tty_struct *tty,
|
||||
struct usb_serial_port *port,
|
||||
struct ktermios *old);
|
||||
static void keyspan_break_ctl(struct tty_struct *tty, int break_state);
|
||||
static int keyspan_tiocmget(struct tty_struct *tty);
|
||||
static int keyspan_tiocmset(struct tty_struct *tty, unsigned int set,
|
||||
unsigned int clear);
|
||||
static int keyspan_fake_startup(struct usb_serial *serial);
|
||||
|
||||
static int keyspan_usa19_calc_baud(struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low,
|
||||
u8 *prescaler, int portnum);
|
||||
static int keyspan_usa19w_calc_baud(struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low,
|
||||
u8 *prescaler, int portnum);
|
||||
static int keyspan_usa28_calc_baud(struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low,
|
||||
u8 *prescaler, int portnum);
|
||||
static int keyspan_usa19hs_calc_baud(struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low,
|
||||
u8 *prescaler, int portnum);
|
||||
|
||||
static int keyspan_usa28_send_setup(struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
static int keyspan_usa26_send_setup(struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
static int keyspan_usa49_send_setup(struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
static int keyspan_usa90_send_setup(struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
static int keyspan_usa67_send_setup(struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
|
||||
/* Values used for baud rate calculation - device specific */
|
||||
#define KEYSPAN_INVALID_BAUD_RATE (-1)
|
||||
#define KEYSPAN_BAUD_RATE_OK (0)
|
||||
#define KEYSPAN_USA18X_BAUDCLK (12000000L) /* a guess */
|
||||
#define KEYSPAN_USA19_BAUDCLK (12000000L)
|
||||
#define KEYSPAN_USA19W_BAUDCLK (24000000L)
|
||||
#define KEYSPAN_USA19HS_BAUDCLK (14769231L)
|
||||
#define KEYSPAN_USA28_BAUDCLK (1843200L)
|
||||
#define KEYSPAN_USA28X_BAUDCLK (12000000L)
|
||||
#define KEYSPAN_USA49W_BAUDCLK (48000000L)
|
||||
|
||||
/* Some constants used to characterise each device. */
|
||||
#define KEYSPAN_MAX_NUM_PORTS (4)
|
||||
#define KEYSPAN_MAX_FLIPS (2)
|
||||
|
||||
/*
|
||||
* Device info for the Keyspan serial converter, used by the overall
|
||||
* usb-serial probe function.
|
||||
*/
|
||||
#define KEYSPAN_VENDOR_ID (0x06cd)
|
||||
|
||||
/* Product IDs for the products supported, pre-renumeration */
|
||||
#define keyspan_usa18x_pre_product_id 0x0105
|
||||
#define keyspan_usa19_pre_product_id 0x0103
|
||||
#define keyspan_usa19qi_pre_product_id 0x010b
|
||||
#define keyspan_mpr_pre_product_id 0x011b
|
||||
#define keyspan_usa19qw_pre_product_id 0x0118
|
||||
#define keyspan_usa19w_pre_product_id 0x0106
|
||||
#define keyspan_usa28_pre_product_id 0x0101
|
||||
#define keyspan_usa28x_pre_product_id 0x0102
|
||||
#define keyspan_usa28xa_pre_product_id 0x0114
|
||||
#define keyspan_usa28xb_pre_product_id 0x0113
|
||||
#define keyspan_usa49w_pre_product_id 0x0109
|
||||
#define keyspan_usa49wlc_pre_product_id 0x011a
|
||||
|
||||
/*
|
||||
* Product IDs post-renumeration. Note that the 28x and 28xb have the same
|
||||
* id's post-renumeration but behave identically so it's not an issue. As
|
||||
* such, the 28xb is not listed in any of the device tables.
|
||||
*/
|
||||
#define keyspan_usa18x_product_id 0x0112
|
||||
#define keyspan_usa19_product_id 0x0107
|
||||
#define keyspan_usa19qi_product_id 0x010c
|
||||
#define keyspan_usa19hs_product_id 0x0121
|
||||
#define keyspan_mpr_product_id 0x011c
|
||||
#define keyspan_usa19qw_product_id 0x0119
|
||||
#define keyspan_usa19w_product_id 0x0108
|
||||
#define keyspan_usa28_product_id 0x010f
|
||||
#define keyspan_usa28x_product_id 0x0110
|
||||
#define keyspan_usa28xa_product_id 0x0115
|
||||
#define keyspan_usa28xb_product_id 0x0110
|
||||
#define keyspan_usa28xg_product_id 0x0135
|
||||
#define keyspan_usa49w_product_id 0x010a
|
||||
#define keyspan_usa49wlc_product_id 0x012a
|
||||
#define keyspan_usa49wg_product_id 0x0131
|
||||
|
||||
struct keyspan_device_details {
|
||||
/* product ID value */
|
||||
int product_id;
|
||||
|
||||
enum {msg_usa26, msg_usa28, msg_usa49, msg_usa90, msg_usa67} msg_format;
|
||||
|
||||
/* Number of physical ports */
|
||||
int num_ports;
|
||||
|
||||
/* 1 if endpoint flipping used on input, 0 if not */
|
||||
int indat_endp_flip;
|
||||
|
||||
/* 1 if endpoint flipping used on output, 0 if not */
|
||||
int outdat_endp_flip;
|
||||
|
||||
/*
|
||||
* Table mapping input data endpoint IDs to physical port
|
||||
* number and flip if used
|
||||
*/
|
||||
int indat_endpoints[KEYSPAN_MAX_NUM_PORTS];
|
||||
|
||||
/* Same for output endpoints */
|
||||
int outdat_endpoints[KEYSPAN_MAX_NUM_PORTS];
|
||||
|
||||
/* Input acknowledge endpoints */
|
||||
int inack_endpoints[KEYSPAN_MAX_NUM_PORTS];
|
||||
|
||||
/* Output control endpoints */
|
||||
int outcont_endpoints[KEYSPAN_MAX_NUM_PORTS];
|
||||
|
||||
/* Endpoint used for input status */
|
||||
int instat_endpoint;
|
||||
|
||||
/* Endpoint used for input data 49WG only */
|
||||
int indat_endpoint;
|
||||
|
||||
/* Endpoint used for global control functions */
|
||||
int glocont_endpoint;
|
||||
|
||||
int (*calculate_baud_rate)(struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low, u8 *prescaler,
|
||||
int portnum);
|
||||
u32 baudclk;
|
||||
};
|
||||
|
||||
/*
|
||||
* Now for each device type we setup the device detail structure with the
|
||||
* appropriate information (provided in Keyspan's documentation)
|
||||
*/
|
||||
|
||||
static const struct keyspan_device_details usa18x_device_details = {
|
||||
.product_id = keyspan_usa18x_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x85},
|
||||
.outcont_endpoints = {0x05},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA18X_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19_device_details = {
|
||||
.product_id = keyspan_usa19_product_id,
|
||||
.msg_format = msg_usa28,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 1,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x83},
|
||||
.outcont_endpoints = {0x03},
|
||||
.instat_endpoint = 0x84,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = -1,
|
||||
.calculate_baud_rate = keyspan_usa19_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19qi_device_details = {
|
||||
.product_id = keyspan_usa19qi_product_id,
|
||||
.msg_format = msg_usa28,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 1,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x83},
|
||||
.outcont_endpoints = {0x03},
|
||||
.instat_endpoint = 0x84,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = -1,
|
||||
.calculate_baud_rate = keyspan_usa28_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details mpr_device_details = {
|
||||
.product_id = keyspan_mpr_product_id,
|
||||
.msg_format = msg_usa28,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 1,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x83},
|
||||
.outcont_endpoints = {0x03},
|
||||
.instat_endpoint = 0x84,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = -1,
|
||||
.calculate_baud_rate = keyspan_usa28_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19qw_device_details = {
|
||||
.product_id = keyspan_usa19qw_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x85},
|
||||
.outcont_endpoints = {0x05},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19w_device_details = {
|
||||
.product_id = keyspan_usa19w_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x85},
|
||||
.outcont_endpoints = {0x05},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19hs_device_details = {
|
||||
.product_id = keyspan_usa19hs_product_id,
|
||||
.msg_format = msg_usa90,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {-1},
|
||||
.outcont_endpoints = {0x02},
|
||||
.instat_endpoint = 0x82,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = -1,
|
||||
.calculate_baud_rate = keyspan_usa19hs_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19HS_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa28_device_details = {
|
||||
.product_id = keyspan_usa28_product_id,
|
||||
.msg_format = msg_usa28,
|
||||
.num_ports = 2,
|
||||
.indat_endp_flip = 1,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81, 0x83},
|
||||
.outdat_endpoints = {0x01, 0x03},
|
||||
.inack_endpoints = {0x85, 0x86},
|
||||
.outcont_endpoints = {0x05, 0x06},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa28_calc_baud,
|
||||
.baudclk = KEYSPAN_USA28_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa28x_device_details = {
|
||||
.product_id = keyspan_usa28x_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 2,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81, 0x83},
|
||||
.outdat_endpoints = {0x01, 0x03},
|
||||
.inack_endpoints = {0x85, 0x86},
|
||||
.outcont_endpoints = {0x05, 0x06},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA28X_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa28xa_device_details = {
|
||||
.product_id = keyspan_usa28xa_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 2,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81, 0x83},
|
||||
.outdat_endpoints = {0x01, 0x03},
|
||||
.inack_endpoints = {0x85, 0x86},
|
||||
.outcont_endpoints = {0x05, 0x06},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA28X_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa28xg_device_details = {
|
||||
.product_id = keyspan_usa28xg_product_id,
|
||||
.msg_format = msg_usa67,
|
||||
.num_ports = 2,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {0x84, 0x88},
|
||||
.outdat_endpoints = {0x02, 0x06},
|
||||
.inack_endpoints = {-1, -1},
|
||||
.outcont_endpoints = {-1, -1},
|
||||
.instat_endpoint = 0x81,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x01,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA28X_BAUDCLK,
|
||||
};
|
||||
/*
|
||||
* We don't need a separate entry for the usa28xb as it appears as a 28x
|
||||
* anyway.
|
||||
*/
|
||||
|
||||
static const struct keyspan_device_details usa49w_device_details = {
|
||||
.product_id = keyspan_usa49w_product_id,
|
||||
.msg_format = msg_usa49,
|
||||
.num_ports = 4,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {0x81, 0x82, 0x83, 0x84},
|
||||
.outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
|
||||
.inack_endpoints = {-1, -1, -1, -1},
|
||||
.outcont_endpoints = {-1, -1, -1, -1},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA49W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa49wlc_device_details = {
|
||||
.product_id = keyspan_usa49wlc_product_id,
|
||||
.msg_format = msg_usa49,
|
||||
.num_ports = 4,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {0x81, 0x82, 0x83, 0x84},
|
||||
.outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
|
||||
.inack_endpoints = {-1, -1, -1, -1},
|
||||
.outcont_endpoints = {-1, -1, -1, -1},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa49wg_device_details = {
|
||||
.product_id = keyspan_usa49wg_product_id,
|
||||
.msg_format = msg_usa49,
|
||||
.num_ports = 4,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {-1, -1, -1, -1}, /* single 'global' data in EP */
|
||||
.outdat_endpoints = {0x01, 0x02, 0x04, 0x06},
|
||||
.inack_endpoints = {-1, -1, -1, -1},
|
||||
.outcont_endpoints = {-1, -1, -1, -1},
|
||||
.instat_endpoint = 0x81,
|
||||
.indat_endpoint = 0x88,
|
||||
.glocont_endpoint = 0x00, /* uses control EP */
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details *keyspan_devices[] = {
|
||||
&usa18x_device_details,
|
||||
&usa19_device_details,
|
||||
&usa19qi_device_details,
|
||||
&mpr_device_details,
|
||||
&usa19qw_device_details,
|
||||
&usa19w_device_details,
|
||||
&usa19hs_device_details,
|
||||
&usa28_device_details,
|
||||
&usa28x_device_details,
|
||||
&usa28xa_device_details,
|
||||
&usa28xg_device_details,
|
||||
/* 28xb not required as it renumerates as a 28x */
|
||||
&usa49w_device_details,
|
||||
&usa49wlc_device_details,
|
||||
&usa49wg_device_details,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const struct usb_device_id keyspan_ids_combined[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id)},
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wg_product_id)},
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, keyspan_ids_combined);
|
||||
|
||||
/* usb_device_id table for the pre-firmware download keyspan devices */
|
||||
static const struct usb_device_id keyspan_pre_ids[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
static const struct usb_device_id keyspan_1port_ids[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
static const struct usb_device_id keyspan_2port_ids[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
static const struct usb_device_id keyspan_4port_ids[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wg_product_id)},
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
#define INSTAT_BUFLEN 32
|
||||
#define GLOCONT_BUFLEN 64
|
||||
#define INDAT49W_BUFLEN 512
|
||||
@ -126,8 +623,6 @@ struct keyspan_port_private {
|
||||
#include "keyspan_usa67msg.h"
|
||||
|
||||
|
||||
module_usb_serial_driver(serial_drivers, keyspan_ids_combined);
|
||||
|
||||
static void keyspan_break_ctl(struct tty_struct *tty, int break_state)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
@ -2523,6 +3018,97 @@ static int keyspan_port_remove(struct usb_serial_port *port)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Structs for the devices, pre and post renumeration. */
|
||||
static struct usb_serial_driver keyspan_pre_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "keyspan_no_firm",
|
||||
},
|
||||
.description = "Keyspan - (without firmware)",
|
||||
.id_table = keyspan_pre_ids,
|
||||
.num_ports = 1,
|
||||
.attach = keyspan_fake_startup,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver keyspan_1port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "keyspan_1",
|
||||
},
|
||||
.description = "Keyspan 1 port adapter",
|
||||
.id_table = keyspan_1port_ids,
|
||||
.num_ports = 1,
|
||||
.open = keyspan_open,
|
||||
.close = keyspan_close,
|
||||
.dtr_rts = keyspan_dtr_rts,
|
||||
.write = keyspan_write,
|
||||
.write_room = keyspan_write_room,
|
||||
.set_termios = keyspan_set_termios,
|
||||
.break_ctl = keyspan_break_ctl,
|
||||
.tiocmget = keyspan_tiocmget,
|
||||
.tiocmset = keyspan_tiocmset,
|
||||
.attach = keyspan_startup,
|
||||
.disconnect = keyspan_disconnect,
|
||||
.release = keyspan_release,
|
||||
.port_probe = keyspan_port_probe,
|
||||
.port_remove = keyspan_port_remove,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver keyspan_2port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "keyspan_2",
|
||||
},
|
||||
.description = "Keyspan 2 port adapter",
|
||||
.id_table = keyspan_2port_ids,
|
||||
.num_ports = 2,
|
||||
.open = keyspan_open,
|
||||
.close = keyspan_close,
|
||||
.dtr_rts = keyspan_dtr_rts,
|
||||
.write = keyspan_write,
|
||||
.write_room = keyspan_write_room,
|
||||
.set_termios = keyspan_set_termios,
|
||||
.break_ctl = keyspan_break_ctl,
|
||||
.tiocmget = keyspan_tiocmget,
|
||||
.tiocmset = keyspan_tiocmset,
|
||||
.attach = keyspan_startup,
|
||||
.disconnect = keyspan_disconnect,
|
||||
.release = keyspan_release,
|
||||
.port_probe = keyspan_port_probe,
|
||||
.port_remove = keyspan_port_remove,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver keyspan_4port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "keyspan_4",
|
||||
},
|
||||
.description = "Keyspan 4 port adapter",
|
||||
.id_table = keyspan_4port_ids,
|
||||
.num_ports = 4,
|
||||
.open = keyspan_open,
|
||||
.close = keyspan_close,
|
||||
.dtr_rts = keyspan_dtr_rts,
|
||||
.write = keyspan_write,
|
||||
.write_room = keyspan_write_room,
|
||||
.set_termios = keyspan_set_termios,
|
||||
.break_ctl = keyspan_break_ctl,
|
||||
.tiocmget = keyspan_tiocmget,
|
||||
.tiocmset = keyspan_tiocmset,
|
||||
.attach = keyspan_startup,
|
||||
.disconnect = keyspan_disconnect,
|
||||
.release = keyspan_release,
|
||||
.port_probe = keyspan_port_probe,
|
||||
.port_remove = keyspan_port_remove,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver * const serial_drivers[] = {
|
||||
&keyspan_pre_device, &keyspan_1port_device,
|
||||
&keyspan_2port_device, &keyspan_4port_device, NULL
|
||||
};
|
||||
|
||||
module_usb_serial_driver(serial_drivers, keyspan_ids_combined);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1,629 +0,0 @@
|
||||
/*
|
||||
Keyspan USB to Serial Converter driver
|
||||
|
||||
(C) Copyright (C) 2000-2001
|
||||
Hugh Blemings <hugh@blemings.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
See http://blemings.org/hugh/keyspan.html for more information.
|
||||
|
||||
Code in this driver inspired by and in a number of places taken
|
||||
from Brian Warner's original Keyspan-PDA driver.
|
||||
|
||||
This driver has been put together with the support of Innosys, Inc.
|
||||
and Keyspan, Inc the manufacturers of the Keyspan USB-serial products.
|
||||
Thanks Guys :)
|
||||
|
||||
Thanks to Paulus for miscellaneous tidy ups, some largish chunks
|
||||
of much nicer and/or completely new code and (perhaps most uniquely)
|
||||
having the patience to sit down and explain why and where he'd changed
|
||||
stuff.
|
||||
|
||||
Tip 'o the hat to IBM (and previously Linuxcare :) for supporting
|
||||
staff in their work on open source projects.
|
||||
|
||||
See keyspan.c for update history.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_SERIAL_KEYSPAN_H
|
||||
#define __LINUX_USB_SERIAL_KEYSPAN_H
|
||||
|
||||
|
||||
/* Function prototypes for Keyspan serial converter */
|
||||
static int keyspan_open (struct tty_struct *tty,
|
||||
struct usb_serial_port *port);
|
||||
static void keyspan_close (struct usb_serial_port *port);
|
||||
static void keyspan_dtr_rts (struct usb_serial_port *port, int on);
|
||||
static int keyspan_startup (struct usb_serial *serial);
|
||||
static void keyspan_disconnect (struct usb_serial *serial);
|
||||
static void keyspan_release (struct usb_serial *serial);
|
||||
static int keyspan_port_probe(struct usb_serial_port *port);
|
||||
static int keyspan_port_remove(struct usb_serial_port *port);
|
||||
static int keyspan_write_room (struct tty_struct *tty);
|
||||
|
||||
static int keyspan_write (struct tty_struct *tty,
|
||||
struct usb_serial_port *port,
|
||||
const unsigned char *buf,
|
||||
int count);
|
||||
|
||||
static void keyspan_send_setup (struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
|
||||
|
||||
static void keyspan_set_termios (struct tty_struct *tty,
|
||||
struct usb_serial_port *port,
|
||||
struct ktermios *old);
|
||||
static void keyspan_break_ctl (struct tty_struct *tty,
|
||||
int break_state);
|
||||
static int keyspan_tiocmget (struct tty_struct *tty);
|
||||
static int keyspan_tiocmset (struct tty_struct *tty,
|
||||
unsigned int set,
|
||||
unsigned int clear);
|
||||
static int keyspan_fake_startup (struct usb_serial *serial);
|
||||
|
||||
static int keyspan_usa19_calc_baud (struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low,
|
||||
u8 *prescaler, int portnum);
|
||||
|
||||
static int keyspan_usa19w_calc_baud (struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low,
|
||||
u8 *prescaler, int portnum);
|
||||
|
||||
static int keyspan_usa28_calc_baud (struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low,
|
||||
u8 *prescaler, int portnum);
|
||||
|
||||
static int keyspan_usa19hs_calc_baud (struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low,
|
||||
u8 *prescaler, int portnum);
|
||||
|
||||
static int keyspan_usa28_send_setup (struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
static int keyspan_usa26_send_setup (struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
static int keyspan_usa49_send_setup (struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
|
||||
static int keyspan_usa90_send_setup (struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
|
||||
static int keyspan_usa67_send_setup (struct usb_serial *serial,
|
||||
struct usb_serial_port *port,
|
||||
int reset_port);
|
||||
|
||||
/* Values used for baud rate calculation - device specific */
|
||||
#define KEYSPAN_INVALID_BAUD_RATE (-1)
|
||||
#define KEYSPAN_BAUD_RATE_OK (0)
|
||||
#define KEYSPAN_USA18X_BAUDCLK (12000000L) /* a guess */
|
||||
#define KEYSPAN_USA19_BAUDCLK (12000000L)
|
||||
#define KEYSPAN_USA19W_BAUDCLK (24000000L)
|
||||
#define KEYSPAN_USA19HS_BAUDCLK (14769231L)
|
||||
#define KEYSPAN_USA28_BAUDCLK (1843200L)
|
||||
#define KEYSPAN_USA28X_BAUDCLK (12000000L)
|
||||
#define KEYSPAN_USA49W_BAUDCLK (48000000L)
|
||||
|
||||
/* Some constants used to characterise each device. */
|
||||
#define KEYSPAN_MAX_NUM_PORTS (4)
|
||||
#define KEYSPAN_MAX_FLIPS (2)
|
||||
|
||||
/* Device info for the Keyspan serial converter, used
|
||||
by the overall usb-serial probe function */
|
||||
#define KEYSPAN_VENDOR_ID (0x06cd)
|
||||
|
||||
/* Product IDs for the products supported, pre-renumeration */
|
||||
#define keyspan_usa18x_pre_product_id 0x0105
|
||||
#define keyspan_usa19_pre_product_id 0x0103
|
||||
#define keyspan_usa19qi_pre_product_id 0x010b
|
||||
#define keyspan_mpr_pre_product_id 0x011b
|
||||
#define keyspan_usa19qw_pre_product_id 0x0118
|
||||
#define keyspan_usa19w_pre_product_id 0x0106
|
||||
#define keyspan_usa28_pre_product_id 0x0101
|
||||
#define keyspan_usa28x_pre_product_id 0x0102
|
||||
#define keyspan_usa28xa_pre_product_id 0x0114
|
||||
#define keyspan_usa28xb_pre_product_id 0x0113
|
||||
#define keyspan_usa49w_pre_product_id 0x0109
|
||||
#define keyspan_usa49wlc_pre_product_id 0x011a
|
||||
|
||||
/* Product IDs post-renumeration. Note that the 28x and 28xb
|
||||
have the same id's post-renumeration but behave identically
|
||||
so it's not an issue. As such, the 28xb is not listed in any
|
||||
of the device tables. */
|
||||
#define keyspan_usa18x_product_id 0x0112
|
||||
#define keyspan_usa19_product_id 0x0107
|
||||
#define keyspan_usa19qi_product_id 0x010c
|
||||
#define keyspan_usa19hs_product_id 0x0121
|
||||
#define keyspan_mpr_product_id 0x011c
|
||||
#define keyspan_usa19qw_product_id 0x0119
|
||||
#define keyspan_usa19w_product_id 0x0108
|
||||
#define keyspan_usa28_product_id 0x010f
|
||||
#define keyspan_usa28x_product_id 0x0110
|
||||
#define keyspan_usa28xa_product_id 0x0115
|
||||
#define keyspan_usa28xb_product_id 0x0110
|
||||
#define keyspan_usa28xg_product_id 0x0135
|
||||
#define keyspan_usa49w_product_id 0x010a
|
||||
#define keyspan_usa49wlc_product_id 0x012a
|
||||
#define keyspan_usa49wg_product_id 0x0131
|
||||
|
||||
struct keyspan_device_details {
|
||||
/* product ID value */
|
||||
int product_id;
|
||||
|
||||
enum {msg_usa26, msg_usa28, msg_usa49, msg_usa90, msg_usa67} msg_format;
|
||||
|
||||
/* Number of physical ports */
|
||||
int num_ports;
|
||||
|
||||
/* 1 if endpoint flipping used on input, 0 if not */
|
||||
int indat_endp_flip;
|
||||
|
||||
/* 1 if endpoint flipping used on output, 0 if not */
|
||||
int outdat_endp_flip;
|
||||
|
||||
/* Table mapping input data endpoint IDs to physical
|
||||
port number and flip if used */
|
||||
int indat_endpoints[KEYSPAN_MAX_NUM_PORTS];
|
||||
|
||||
/* Same for output endpoints */
|
||||
int outdat_endpoints[KEYSPAN_MAX_NUM_PORTS];
|
||||
|
||||
/* Input acknowledge endpoints */
|
||||
int inack_endpoints[KEYSPAN_MAX_NUM_PORTS];
|
||||
|
||||
/* Output control endpoints */
|
||||
int outcont_endpoints[KEYSPAN_MAX_NUM_PORTS];
|
||||
|
||||
/* Endpoint used for input status */
|
||||
int instat_endpoint;
|
||||
|
||||
/* Endpoint used for input data 49WG only */
|
||||
int indat_endpoint;
|
||||
|
||||
/* Endpoint used for global control functions */
|
||||
int glocont_endpoint;
|
||||
|
||||
int (*calculate_baud_rate) (struct usb_serial_port *port,
|
||||
u32 baud_rate, u32 baudclk,
|
||||
u8 *rate_hi, u8 *rate_low, u8 *prescaler, int portnum);
|
||||
u32 baudclk;
|
||||
};
|
||||
|
||||
/* Now for each device type we setup the device detail
|
||||
structure with the appropriate information (provided
|
||||
in Keyspan's documentation) */
|
||||
|
||||
static const struct keyspan_device_details usa18x_device_details = {
|
||||
.product_id = keyspan_usa18x_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x85},
|
||||
.outcont_endpoints = {0x05},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA18X_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19_device_details = {
|
||||
.product_id = keyspan_usa19_product_id,
|
||||
.msg_format = msg_usa28,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 1,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x83},
|
||||
.outcont_endpoints = {0x03},
|
||||
.instat_endpoint = 0x84,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = -1,
|
||||
.calculate_baud_rate = keyspan_usa19_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19qi_device_details = {
|
||||
.product_id = keyspan_usa19qi_product_id,
|
||||
.msg_format = msg_usa28,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 1,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x83},
|
||||
.outcont_endpoints = {0x03},
|
||||
.instat_endpoint = 0x84,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = -1,
|
||||
.calculate_baud_rate = keyspan_usa28_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details mpr_device_details = {
|
||||
.product_id = keyspan_mpr_product_id,
|
||||
.msg_format = msg_usa28,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 1,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x83},
|
||||
.outcont_endpoints = {0x03},
|
||||
.instat_endpoint = 0x84,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = -1,
|
||||
.calculate_baud_rate = keyspan_usa28_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19qw_device_details = {
|
||||
.product_id = keyspan_usa19qw_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x85},
|
||||
.outcont_endpoints = {0x05},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19w_device_details = {
|
||||
.product_id = keyspan_usa19w_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {0x85},
|
||||
.outcont_endpoints = {0x05},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa19hs_device_details = {
|
||||
.product_id = keyspan_usa19hs_product_id,
|
||||
.msg_format = msg_usa90,
|
||||
.num_ports = 1,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {0x81},
|
||||
.outdat_endpoints = {0x01},
|
||||
.inack_endpoints = {-1},
|
||||
.outcont_endpoints = {0x02},
|
||||
.instat_endpoint = 0x82,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = -1,
|
||||
.calculate_baud_rate = keyspan_usa19hs_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19HS_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa28_device_details = {
|
||||
.product_id = keyspan_usa28_product_id,
|
||||
.msg_format = msg_usa28,
|
||||
.num_ports = 2,
|
||||
.indat_endp_flip = 1,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81, 0x83},
|
||||
.outdat_endpoints = {0x01, 0x03},
|
||||
.inack_endpoints = {0x85, 0x86},
|
||||
.outcont_endpoints = {0x05, 0x06},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa28_calc_baud,
|
||||
.baudclk = KEYSPAN_USA28_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa28x_device_details = {
|
||||
.product_id = keyspan_usa28x_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 2,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81, 0x83},
|
||||
.outdat_endpoints = {0x01, 0x03},
|
||||
.inack_endpoints = {0x85, 0x86},
|
||||
.outcont_endpoints = {0x05, 0x06},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA28X_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa28xa_device_details = {
|
||||
.product_id = keyspan_usa28xa_product_id,
|
||||
.msg_format = msg_usa26,
|
||||
.num_ports = 2,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 1,
|
||||
.indat_endpoints = {0x81, 0x83},
|
||||
.outdat_endpoints = {0x01, 0x03},
|
||||
.inack_endpoints = {0x85, 0x86},
|
||||
.outcont_endpoints = {0x05, 0x06},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA28X_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa28xg_device_details = {
|
||||
.product_id = keyspan_usa28xg_product_id,
|
||||
.msg_format = msg_usa67,
|
||||
.num_ports = 2,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {0x84, 0x88},
|
||||
.outdat_endpoints = {0x02, 0x06},
|
||||
.inack_endpoints = {-1, -1},
|
||||
.outcont_endpoints = {-1, -1},
|
||||
.instat_endpoint = 0x81,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x01,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA28X_BAUDCLK,
|
||||
};
|
||||
/* We don't need a separate entry for the usa28xb as it appears as a 28x anyway */
|
||||
|
||||
static const struct keyspan_device_details usa49w_device_details = {
|
||||
.product_id = keyspan_usa49w_product_id,
|
||||
.msg_format = msg_usa49,
|
||||
.num_ports = 4,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {0x81, 0x82, 0x83, 0x84},
|
||||
.outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
|
||||
.inack_endpoints = {-1, -1, -1, -1},
|
||||
.outcont_endpoints = {-1, -1, -1, -1},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA49W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa49wlc_device_details = {
|
||||
.product_id = keyspan_usa49wlc_product_id,
|
||||
.msg_format = msg_usa49,
|
||||
.num_ports = 4,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {0x81, 0x82, 0x83, 0x84},
|
||||
.outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
|
||||
.inack_endpoints = {-1, -1, -1, -1},
|
||||
.outcont_endpoints = {-1, -1, -1, -1},
|
||||
.instat_endpoint = 0x87,
|
||||
.indat_endpoint = -1,
|
||||
.glocont_endpoint = 0x07,
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details usa49wg_device_details = {
|
||||
.product_id = keyspan_usa49wg_product_id,
|
||||
.msg_format = msg_usa49,
|
||||
.num_ports = 4,
|
||||
.indat_endp_flip = 0,
|
||||
.outdat_endp_flip = 0,
|
||||
.indat_endpoints = {-1, -1, -1, -1}, /* single 'global' data in EP */
|
||||
.outdat_endpoints = {0x01, 0x02, 0x04, 0x06},
|
||||
.inack_endpoints = {-1, -1, -1, -1},
|
||||
.outcont_endpoints = {-1, -1, -1, -1},
|
||||
.instat_endpoint = 0x81,
|
||||
.indat_endpoint = 0x88,
|
||||
.glocont_endpoint = 0x00, /* uses control EP */
|
||||
.calculate_baud_rate = keyspan_usa19w_calc_baud,
|
||||
.baudclk = KEYSPAN_USA19W_BAUDCLK,
|
||||
};
|
||||
|
||||
static const struct keyspan_device_details *keyspan_devices[] = {
|
||||
&usa18x_device_details,
|
||||
&usa19_device_details,
|
||||
&usa19qi_device_details,
|
||||
&mpr_device_details,
|
||||
&usa19qw_device_details,
|
||||
&usa19w_device_details,
|
||||
&usa19hs_device_details,
|
||||
&usa28_device_details,
|
||||
&usa28x_device_details,
|
||||
&usa28xa_device_details,
|
||||
&usa28xg_device_details,
|
||||
/* 28xb not required as it renumerates as a 28x */
|
||||
&usa49w_device_details,
|
||||
&usa49wlc_device_details,
|
||||
&usa49wg_device_details,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const struct usb_device_id keyspan_ids_combined[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id)},
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wg_product_id)},
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, keyspan_ids_combined);
|
||||
|
||||
/* usb_device_id table for the pre-firmware download keyspan devices */
|
||||
static const struct usb_device_id keyspan_pre_ids[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
static const struct usb_device_id keyspan_1port_ids[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
static const struct usb_device_id keyspan_2port_ids[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
static const struct usb_device_id keyspan_4port_ids[] = {
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id) },
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
|
||||
{ USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wg_product_id)},
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
/* Structs for the devices, pre and post renumeration. */
|
||||
static struct usb_serial_driver keyspan_pre_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "keyspan_no_firm",
|
||||
},
|
||||
.description = "Keyspan - (without firmware)",
|
||||
.id_table = keyspan_pre_ids,
|
||||
.num_ports = 1,
|
||||
.attach = keyspan_fake_startup,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver keyspan_1port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "keyspan_1",
|
||||
},
|
||||
.description = "Keyspan 1 port adapter",
|
||||
.id_table = keyspan_1port_ids,
|
||||
.num_ports = 1,
|
||||
.open = keyspan_open,
|
||||
.close = keyspan_close,
|
||||
.dtr_rts = keyspan_dtr_rts,
|
||||
.write = keyspan_write,
|
||||
.write_room = keyspan_write_room,
|
||||
.set_termios = keyspan_set_termios,
|
||||
.break_ctl = keyspan_break_ctl,
|
||||
.tiocmget = keyspan_tiocmget,
|
||||
.tiocmset = keyspan_tiocmset,
|
||||
.attach = keyspan_startup,
|
||||
.disconnect = keyspan_disconnect,
|
||||
.release = keyspan_release,
|
||||
.port_probe = keyspan_port_probe,
|
||||
.port_remove = keyspan_port_remove,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver keyspan_2port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "keyspan_2",
|
||||
},
|
||||
.description = "Keyspan 2 port adapter",
|
||||
.id_table = keyspan_2port_ids,
|
||||
.num_ports = 2,
|
||||
.open = keyspan_open,
|
||||
.close = keyspan_close,
|
||||
.dtr_rts = keyspan_dtr_rts,
|
||||
.write = keyspan_write,
|
||||
.write_room = keyspan_write_room,
|
||||
.set_termios = keyspan_set_termios,
|
||||
.break_ctl = keyspan_break_ctl,
|
||||
.tiocmget = keyspan_tiocmget,
|
||||
.tiocmset = keyspan_tiocmset,
|
||||
.attach = keyspan_startup,
|
||||
.disconnect = keyspan_disconnect,
|
||||
.release = keyspan_release,
|
||||
.port_probe = keyspan_port_probe,
|
||||
.port_remove = keyspan_port_remove,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver keyspan_4port_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "keyspan_4",
|
||||
},
|
||||
.description = "Keyspan 4 port adapter",
|
||||
.id_table = keyspan_4port_ids,
|
||||
.num_ports = 4,
|
||||
.open = keyspan_open,
|
||||
.close = keyspan_close,
|
||||
.dtr_rts = keyspan_dtr_rts,
|
||||
.write = keyspan_write,
|
||||
.write_room = keyspan_write_room,
|
||||
.set_termios = keyspan_set_termios,
|
||||
.break_ctl = keyspan_break_ctl,
|
||||
.tiocmget = keyspan_tiocmget,
|
||||
.tiocmset = keyspan_tiocmset,
|
||||
.attach = keyspan_startup,
|
||||
.disconnect = keyspan_disconnect,
|
||||
.release = keyspan_release,
|
||||
.port_probe = keyspan_port_probe,
|
||||
.port_remove = keyspan_port_remove,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver * const serial_drivers[] = {
|
||||
&keyspan_pre_device, &keyspan_1port_device,
|
||||
&keyspan_2port_device, &keyspan_4port_device, NULL
|
||||
};
|
||||
|
||||
#endif
|
@ -17,7 +17,7 @@
|
||||
* - stop bits: 1 or 2
|
||||
* - parity: even, odd or none
|
||||
* - flow control: none
|
||||
* - baud rates: 0, 2400, 4800, 9600, 19200, 38400, 57600, 115200
|
||||
* - baud rates: 0, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 153600
|
||||
* - signals: DTR, RTS and BREAK
|
||||
*/
|
||||
|
||||
@ -32,8 +32,9 @@
|
||||
#define DRIVER_AUTHOR "Maksim Salau <maksim.salau@gmail.com>"
|
||||
|
||||
static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x045B, 0x0212) }, /* YRPBRL78G13, YRPBRL78G14 */
|
||||
{ USB_DEVICE(0x0409, 0x0063) }, /* V850ESJX3-STICK */
|
||||
{ USB_DEVICE(0x045B, 0x0212) }, /* YRPBRL78G13, YRPBRL78G14 */
|
||||
{ USB_DEVICE(0x064B, 0x7825) }, /* Analog Devices EVAL-ADXL362Z-DB */
|
||||
{}
|
||||
};
|
||||
|
||||
@ -288,7 +289,7 @@ static speed_t upd78f0730_get_baud_rate(struct tty_struct *tty)
|
||||
{
|
||||
const speed_t baud_rate = tty_get_baud_rate(tty);
|
||||
const speed_t supported[] = {
|
||||
0, 2400, 4800, 9600, 19200, 38400, 57600, 115200
|
||||
0, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 153600
|
||||
};
|
||||
int i;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user