^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * USB FTDI SIO driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2009 - 2013
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Johan Hovold (jhovold@gmail.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 1999 - 2001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Greg Kroah-Hartman (greg@kroah.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Bill Ryder (bryder@sgi.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Copyright (C) 2002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Kuba Ober (kuba@mareimbrium.org)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * See Documentation/usb/usb-serial.rst for more information on using this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * See http://ftdi-usb-sio.sourceforge.net for up to date testing info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * and extra documentation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * Change entries from 2004 and earlier can be found in versions of this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * file in kernel versions prior to the 2.6.24 release.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /* Thanx to FTDI for so kindly providing details of the protocol required */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* to talk to the device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* Thanx to gkh and the rest of the usb dev group for all code I have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) assimilated :-) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/tty.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/tty_driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/tty_flip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <linux/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <linux/gpio/driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include <linux/usb/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include "ftdi_sio.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include "ftdi_sio_ids.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>, Andreas Mohr, Johan Hovold <jhovold@gmail.com>"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define DRIVER_DESC "USB FTDI Serial Converters Driver"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct ftdi_private {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) enum ftdi_chip_type chip_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* type of device, either SIO or FT8U232AM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) int baud_base; /* baud base clock for divisor setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int custom_divisor; /* custom_divisor kludge, this is for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) baud_base (different from what goes to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) chip!) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) u16 last_set_data_value; /* the last data state set - needed for doing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * a break
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) int flags; /* some ASYNC_xxxx flags are supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) unsigned long last_dtr_rts; /* saved modem control outputs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) char prev_status; /* Used for TIOCMIWAIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) char transmit_empty; /* If transmitter is empty or not */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) u16 interface; /* FT2232C, FT2232H or FT4232H port interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) (0 for FT232/245) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) speed_t force_baud; /* if non-zero, force the baud rate to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) this value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) int force_rtscts; /* if non-zero, force RTS-CTS to always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) be enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) unsigned int latency; /* latency setting in use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) unsigned short max_packet_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) struct mutex cfg_lock; /* Avoid mess by parallel calls of config ioctl() and change_speed() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #ifdef CONFIG_GPIOLIB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct gpio_chip gc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct mutex gpio_lock; /* protects GPIO state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) bool gpio_registered; /* is the gpiochip in kernel registered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) bool gpio_used; /* true if the user requested a gpio */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u8 gpio_altfunc; /* which pins are in gpio mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u8 gpio_output; /* pin directions cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u8 gpio_value; /* pin value for outputs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* struct ftdi_sio_quirk is used by devices requiring special attention. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct ftdi_sio_quirk {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) int (*probe)(struct usb_serial *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* Special settings for probed ports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) void (*port_probe)(struct ftdi_private *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static int ftdi_jtag_probe(struct usb_serial *serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) static int ftdi_NDI_device_setup(struct usb_serial *serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) static int ftdi_stmclite_probe(struct usb_serial *serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static int ftdi_8u2232c_probe(struct usb_serial *serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static void ftdi_USB_UIRT_setup(struct ftdi_private *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) static const struct ftdi_sio_quirk ftdi_jtag_quirk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .probe = ftdi_jtag_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static const struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .probe = ftdi_NDI_device_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static const struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) .port_probe = ftdi_USB_UIRT_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static const struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .port_probe = ftdi_HE_TIRA1_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static const struct ftdi_sio_quirk ftdi_stmclite_quirk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .probe = ftdi_stmclite_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) static const struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) .probe = ftdi_8u2232c_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * The 8U232AM has the same API as the sio except for:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * - it can support MUCH higher baudrates; up to:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * o 921600 for RS232 and 2000000 for RS422/485 at 48MHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * o 230400 at 12MHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * so .. 8U232AM's baudrate setting codes are different
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * - it has a two byte status code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * - it returns characters every 16ms (the FTDI does it every 40ms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * the bcdDevice value is used to differentiate FT232BM and FT245BM from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * the earlier FT8U232AM and FT8U232BM. For now, include all known VID/PID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * combinations in both tables.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * FIXME: perhaps bcdDevice can also identify 12MHz FT8U232AM devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * but I don't know if those ever went into mass production. [Ian Abbott]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * Device ID not listed? Test it using
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) static const struct usb_device_id id_table_combined[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) { USB_DEVICE(FTDI_VID, FTDI_BRICK_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) { USB_DEVICE(FTDI_VID, FTDI_BM_ATOM_NANO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) { USB_DEVICE(FTDI_VID, FTDI_USINT_CAT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) { USB_DEVICE(FTDI_VID, FTDI_USINT_WKEY_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) { USB_DEVICE(FTDI_VID, FTDI_USINT_RS232_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) { USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) { USB_DEVICE(FTDI_VID, FTDI_232H_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) { USB_DEVICE(FTDI_VID, FTDI_FTX_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) { USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_CC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) { USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_AGP_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) { USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) { USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) { USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) { USB_DEVICE(FTDI_VID, FTDI_URBAN_0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) { USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) { USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) { USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) { USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) { USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) { USB_DEVICE(FTDI_VID, FTDI_AUTO_M3_OP_COM_V2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_4701_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9300_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9301_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9302_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9303_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9304_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9305_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9306_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9307_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9308_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9309_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9310_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9311_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9312_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9313_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9314_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9315_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9316_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9317_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9318_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9319_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) { USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) { USB_DEVICE(OCT_VID, OCT_US101_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) { USB_DEVICE(OCT_VID, OCT_DK201_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) .driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) { USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) { USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) { USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) { USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) { USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) { USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLX_PLUS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) { USB_DEVICE(FTDI_VID, FTDI_NT_ORION_IO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONMX_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) { USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2WI_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) * ELV devices:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) { USB_DEVICE(FTDI_ELV_VID, FTDI_ELV_WS300_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) { USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) { USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) { USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) { USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) { USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) { USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) { USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) { USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) { USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) { USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) { USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) { USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) { USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) { USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) { USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) { USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) { USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) { USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) { USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) { USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) { USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) { USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) { USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) { USB_DEVICE(FTDI_VID, FTDI_PALMSENS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) { USB_DEVICE(FTDI_VID, FTDI_IVIUM_XSTAT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) { USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) { USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) { USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) { USB_DEVICE(FTDI_VID, FTDI_CCSLOAD_N_GO_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) { USB_DEVICE(FTDI_VID, FTDI_CCSICDU64_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) { USB_DEVICE(FTDI_VID, FTDI_CCSPRIME8_5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) { USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) { USB_DEVICE(MITSUBISHI_VID, MITSUBISHI_FXUSB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) { USB_DEVICE(BANDB_VID, BANDB_USOPTL4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) { USB_DEVICE(BANDB_VID, BANDB_USPTL4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) { USB_DEVICE(BANDB_VID, BANDB_485USB9F_2W_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) { USB_DEVICE(BANDB_VID, BANDB_485USB9F_4W_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) { USB_DEVICE(BANDB_VID, BANDB_232USB9M_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) { USB_DEVICE(BANDB_VID, BANDB_485USBTB_2W_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) { USB_DEVICE(BANDB_VID, BANDB_485USBTB_4W_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) { USB_DEVICE(BANDB_VID, BANDB_TTL5USB9M_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) { USB_DEVICE(BANDB_VID, BANDB_TTL3USB9M_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) { USB_DEVICE(BANDB_VID, BANDB_ZZ_PROG1_USB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) { USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) { USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) { USB_DEVICE(XSENS_VID, XSENS_MTIUSBCONVERTER_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) { USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) { USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) { USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) { USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) { USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) { USB_DEVICE(TESTO_VID, TESTO_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) { USB_DEVICE(TESTO_VID, TESTO_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) { USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) { USB_DEVICE(FTDI_VID, RTSYSTEMS_USB_VX8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) { USB_DEVICE(FTDI_VID, CYBER_CORTEX_AV_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) { USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID, 1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) { USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID, 1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) { USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_TINY_PID, 1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) { USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_TINY_H_PID, 1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) { USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) { USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_SCU18) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) /* Papouch devices based on FTDI chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) { USB_DEVICE(ATMEL_VID, STK541_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) { USB_DEVICE(DE_VID, STB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) { USB_DEVICE(DE_VID, WHT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) USB_CLASS_VENDOR_SPEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) USB_SUBCLASS_VENDOR_SPEC, 0x00) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) { USB_DEVICE_INTERFACE_NUMBER(ACTEL_VID, MICROSEMI_ARROW_SF2PLUS_BOARD_PID, 2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) { USB_DEVICE(FTDI_VID, PI_C865_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) { USB_DEVICE(FTDI_VID, PI_C857_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) { USB_DEVICE(PI_VID, PI_C866_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) { USB_DEVICE(PI_VID, PI_C663_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) { USB_DEVICE(PI_VID, PI_C725_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) { USB_DEVICE(PI_VID, PI_E517_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) { USB_DEVICE(PI_VID, PI_C863_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) { USB_DEVICE(PI_VID, PI_E861_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) { USB_DEVICE(PI_VID, PI_C867_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) { USB_DEVICE(PI_VID, PI_E609_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) { USB_DEVICE(PI_VID, PI_E709_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) { USB_DEVICE(PI_VID, PI_100F_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) { USB_DEVICE(PI_VID, PI_1011_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) { USB_DEVICE(PI_VID, PI_1012_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) { USB_DEVICE(PI_VID, PI_1013_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) { USB_DEVICE(PI_VID, PI_1014_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) { USB_DEVICE(PI_VID, PI_1015_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) { USB_DEVICE(PI_VID, PI_1016_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) { USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) { USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) { USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) { USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) { USB_DEVICE(FTDI_VID, FTDI_FHE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) { USB_DEVICE(ST_VID, ST_STMCLT_2232_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) { USB_DEVICE(ST_VID, ST_STMCLT_4232_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) { USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) /* Crucible Devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) /* Cressi Devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) /* Brainboxes Devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_001_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_012_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_023_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_034_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_101_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_159_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_5_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_6_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_7_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_8_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_235_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_257_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_313_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_320_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_324_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_357_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_1_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) /* ekey Devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) /* Infineon Devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_TC1798_PID, 1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_TC2X7_PID, 1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) /* GE Healthcare devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) { USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) /* Active Research (Actisense) devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) { USB_DEVICE(FTDI_VID, ACTISENSE_NDC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) { USB_DEVICE(FTDI_VID, ACTISENSE_USG_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) { USB_DEVICE(FTDI_VID, ACTISENSE_NGT_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) { USB_DEVICE(FTDI_VID, ACTISENSE_NGW_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) { USB_DEVICE(FTDI_VID, ACTISENSE_D9AC_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) { USB_DEVICE(FTDI_VID, ACTISENSE_D9AD_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) { USB_DEVICE(FTDI_VID, ACTISENSE_D9AE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) { USB_DEVICE(FTDI_VID, ACTISENSE_D9AF_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) { USB_DEVICE(FTDI_VID, CHETCO_SEAGAUGE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) { USB_DEVICE(FTDI_VID, CHETCO_SEASWITCH_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_NMEA2000_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ETHERNET_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_WIFI_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_DISPLAY_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_LITE_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ANALOG_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) /* ICP DAS I-756xU devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) { USB_DEVICE(ICPDAS_VID, ICPDAS_I7560U_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) { USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) { USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) { USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) { USB_DEVICE(TI_VID, TI_CC3200_LAUNCHPAD_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_BT_USB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_WL_USB_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) /* EZPrototypes devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) { USB_DEVICE(EZPROTOTYPES_VID, HJELMSLUND_USB485_ISO_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) { USB_DEVICE_INTERFACE_NUMBER(UNJO_VID, UNJO_ISODEBUG_V1_PID, 1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) /* Sienna devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) { USB_DEVICE(FTDI_VID, FTDI_SIENNA_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) { USB_DEVICE(ECHELON_VID, ECHELON_U20_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) /* IDS GmbH devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) { USB_DEVICE(IDS_VID, IDS_SI31A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) { USB_DEVICE(IDS_VID, IDS_CM31A_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) /* U-Blox devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ZED_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ODIN_PID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) /* FreeCalypso USB adapters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) { USB_DEVICE(FTDI_VID, FTDI_FALCONIA_JTAG_BUF_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) { USB_DEVICE(FTDI_VID, FTDI_FALCONIA_JTAG_UNBUF_PID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) MODULE_DEVICE_TABLE(usb, id_table_combined);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) static const char *ftdi_chip_name[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) [SIO] = "SIO", /* the serial part of FT8U100AX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) [FT8U232AM] = "FT8U232AM",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) [FT232BM] = "FT232BM",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) [FT2232C] = "FT2232C",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) [FT232RL] = "FT232RL",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) [FT2232H] = "FT2232H",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) [FT4232H] = "FT4232H",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) [FT232H] = "FT232H",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) [FTX] = "FT-X"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) /* Used for TIOCMIWAIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) #define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) #define FTDI_STATUS_B1_MASK (FTDI_RS_BI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) /* End TIOCMIWAIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) /* function prototypes for a FTDI serial converter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) static int ftdi_sio_probe(struct usb_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) const struct usb_device_id *id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) static int ftdi_sio_port_probe(struct usb_serial_port *port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) static int ftdi_sio_port_remove(struct usb_serial_port *port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) static void ftdi_dtr_rts(struct usb_serial_port *port, int on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) static void ftdi_process_read_urb(struct urb *urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) void *dest, size_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) static void ftdi_set_termios(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) struct usb_serial_port *port, struct ktermios *old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) static int ftdi_tiocmget(struct tty_struct *tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) static int ftdi_tiocmset(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) unsigned int set, unsigned int clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) static int ftdi_ioctl(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) unsigned int cmd, unsigned long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) static int get_serial_info(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) struct serial_struct *ss);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) static int set_serial_info(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) struct serial_struct *ss);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) static bool ftdi_tx_empty(struct usb_serial_port *port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static int ftdi_get_modem_status(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) unsigned char status[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) static unsigned short int ftdi_232am_baud_to_divisor(int baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) static u32 ftdi_232bm_baud_base_to_divisor(int baud, int base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) static u32 ftdi_232bm_baud_to_divisor(int baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) static u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) static u32 ftdi_2232h_baud_to_divisor(int baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) static struct usb_serial_driver ftdi_sio_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) .name = "ftdi_sio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) .description = "FTDI USB Serial Device",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) .id_table = id_table_combined,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) .num_ports = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) .bulk_in_size = 512,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) .bulk_out_size = 256,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) .probe = ftdi_sio_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) .port_probe = ftdi_sio_port_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) .port_remove = ftdi_sio_port_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) .open = ftdi_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) .dtr_rts = ftdi_dtr_rts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) .throttle = usb_serial_generic_throttle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) .unthrottle = usb_serial_generic_unthrottle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) .process_read_urb = ftdi_process_read_urb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) .prepare_write_buffer = ftdi_prepare_write_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) .tiocmget = ftdi_tiocmget,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) .tiocmset = ftdi_tiocmset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) .tiocmiwait = usb_serial_generic_tiocmiwait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) .get_icount = usb_serial_generic_get_icount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) .ioctl = ftdi_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) .get_serial = get_serial_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) .set_serial = set_serial_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) .set_termios = ftdi_set_termios,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) .break_ctl = ftdi_break_ctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) .tx_empty = ftdi_tx_empty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) static struct usb_serial_driver * const serial_drivers[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) &ftdi_sio_device, NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) #define WDR_TIMEOUT 5000 /* default urb timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) #define WDR_SHORT_TIMEOUT 1000 /* shorter urb timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) * ***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) * Utility functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) * ***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) unsigned short int divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) /* divisor shifted 3 bits to the left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) int divisor3 = DIV_ROUND_CLOSEST(base, 2 * baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) if ((divisor3 & 0x7) == 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) divisor3++; /* round x.7/8 up to x+1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) divisor = divisor3 >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) divisor3 &= 0x7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) if (divisor3 == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) divisor |= 0xc000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) else if (divisor3 >= 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) divisor |= 0x4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) else if (divisor3 != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) divisor |= 0x8000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) else if (divisor == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) divisor = 0; /* special case for maximum baud rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) return divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) static unsigned short int ftdi_232am_baud_to_divisor(int baud)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) return ftdi_232am_baud_base_to_divisor(baud, 48000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) static u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) u32 divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) /* divisor shifted 3 bits to the left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) int divisor3 = DIV_ROUND_CLOSEST(base, 2 * baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) divisor = divisor3 >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) divisor |= (u32)divfrac[divisor3 & 0x7] << 14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) /* Deal with special cases for highest baud rates. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) if (divisor == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) divisor = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) else if (divisor == 0x4001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) divisor = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) return divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) static u32 ftdi_232bm_baud_to_divisor(int baud)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) return ftdi_232bm_baud_base_to_divisor(baud, 48000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) static u32 ftdi_2232h_baud_base_to_divisor(int baud, int base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) u32 divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) int divisor3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) /* hi-speed baud rate is 10-bit sampling instead of 16-bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) divisor3 = DIV_ROUND_CLOSEST(8 * base, 10 * baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) divisor = divisor3 >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) divisor |= (u32)divfrac[divisor3 & 0x7] << 14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) /* Deal with special cases for highest baud rates. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) if (divisor == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) divisor = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) else if (divisor == 0x4001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) divisor = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) * Set this bit to turn off a divide by 2.5 on baud rate generator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) * This enables baud rates up to 12Mbaud but cannot reach below 1200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) * baud with this bit set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) divisor |= 0x00020000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) return divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) static u32 ftdi_2232h_baud_to_divisor(int baud)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) return ftdi_2232h_baud_base_to_divisor(baud, 120000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) #define set_mctrl(port, set) update_mctrl((port), (set), 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) #define clear_mctrl(port, clear) update_mctrl((port), 0, (clear))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) static int update_mctrl(struct usb_serial_port *port, unsigned int set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) unsigned int clear)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) struct device *dev = &port->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) unsigned value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) dev_dbg(dev, "%s - DTR|RTS not being set|cleared\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) return 0; /* no change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) clear &= ~set; /* 'set' takes precedence over 'clear' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) if (clear & TIOCM_DTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) value |= FTDI_SIO_SET_DTR_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) if (clear & TIOCM_RTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) value |= FTDI_SIO_SET_RTS_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) if (set & TIOCM_DTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) value |= FTDI_SIO_SET_DTR_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) if (set & TIOCM_RTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) value |= FTDI_SIO_SET_RTS_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) rv = usb_control_msg(port->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) usb_sndctrlpipe(port->serial->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) FTDI_SIO_SET_MODEM_CTRL_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) value, priv->interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) NULL, 0, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) if (rv < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) dev_dbg(dev, "%s Error from MODEM_CTRL urb: DTR %s, RTS %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) rv = usb_translate_errors(rv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) dev_dbg(dev, "%s - DTR %s, RTS %s\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) /* FIXME: locking on last_dtr_rts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) static u32 get_ftdi_divisor(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) struct device *dev = &port->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) u32 div_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) int div_okay = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) int baud;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) baud = tty_get_baud_rate(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) dev_dbg(dev, "%s - tty_get_baud_rate reports speed %d\n", __func__, baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) * Observe deprecated async-compatible custom_divisor hack, update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) * baudrate if needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) if (baud == 38400 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) (priv->custom_divisor)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) baud = priv->baud_base / priv->custom_divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) dev_dbg(dev, "%s - custom divisor %d sets baud rate to %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) __func__, priv->custom_divisor, baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) if (!baud)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) baud = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) switch (priv->chip_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) case SIO: /* SIO chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) switch (baud) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) case 300: div_value = ftdi_sio_b300; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) case 600: div_value = ftdi_sio_b600; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) case 1200: div_value = ftdi_sio_b1200; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) case 2400: div_value = ftdi_sio_b2400; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) case 4800: div_value = ftdi_sio_b4800; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) case 9600: div_value = ftdi_sio_b9600; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) case 19200: div_value = ftdi_sio_b19200; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) case 38400: div_value = ftdi_sio_b38400; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) case 57600: div_value = ftdi_sio_b57600; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) case 115200: div_value = ftdi_sio_b115200; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) } /* baud */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) if (div_value == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) dev_dbg(dev, "%s - Baudrate (%d) requested is not supported\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) __func__, baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) div_value = ftdi_sio_b9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) baud = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) div_okay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) case FT8U232AM: /* 8U232AM chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) if (baud <= 3000000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) div_value = ftdi_232am_baud_to_divisor(baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) baud = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) div_value = ftdi_232am_baud_to_divisor(9600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) div_okay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) case FT232BM: /* FT232BM chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) case FT2232C: /* FT2232C chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) case FT232RL: /* FT232RL chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) case FTX: /* FT-X series */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) if (baud <= 3000000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) u16 product_id = le16_to_cpu(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) port->serial->dev->descriptor.idProduct);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) if (((product_id == FTDI_NDI_HUC_PID) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) (product_id == FTDI_NDI_SPECTRA_SCU_PID) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) (product_id == FTDI_NDI_FUTURE_2_PID) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) (product_id == FTDI_NDI_FUTURE_3_PID) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) (product_id == FTDI_NDI_AURORA_SCU_PID)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) (baud == 19200)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) baud = 1200000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) div_value = ftdi_232bm_baud_to_divisor(baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) div_value = ftdi_232bm_baud_to_divisor(9600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) div_okay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) baud = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) case FT2232H: /* FT2232H chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) case FT4232H: /* FT4232H chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) case FT232H: /* FT232H chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) if ((baud <= 12000000) && (baud >= 1200)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) div_value = ftdi_2232h_baud_to_divisor(baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) } else if (baud < 1200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) div_value = ftdi_232bm_baud_to_divisor(baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) div_value = ftdi_232bm_baud_to_divisor(9600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) div_okay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) baud = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) } /* priv->chip_type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) if (div_okay) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) dev_dbg(dev, "%s - Baud rate set to %d (divisor 0x%lX) on chip %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) __func__, baud, (unsigned long)div_value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) ftdi_chip_name[priv->chip_type]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) tty_encode_baud_rate(tty, baud, baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) return div_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) u16 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) u16 index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) u32 index_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) index_value = get_ftdi_divisor(tty, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) value = (u16)index_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) index = (u16)(index_value >> 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) if (priv->chip_type == FT2232C || priv->chip_type == FT2232H ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) priv->chip_type == FT4232H || priv->chip_type == FT232H ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) priv->chip_type == FTX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) /* Probably the BM type needs the MSB of the encoded fractional
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) * divider also moved like for the chips above. Any infos? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) index = (u16)((index << 8) | priv->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) rv = usb_control_msg(port->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) usb_sndctrlpipe(port->serial->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) FTDI_SIO_SET_BAUDRATE_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) value, index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) NULL, 0, WDR_SHORT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) static int write_latency_timer(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) struct usb_device *udev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) int l = priv->latency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) if (priv->chip_type == SIO || priv->chip_type == FT8U232AM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (priv->flags & ASYNC_LOW_LATENCY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) l = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) dev_dbg(&port->dev, "%s: setting latency timer = %i\n", __func__, l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) rv = usb_control_msg(udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) usb_sndctrlpipe(udev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) l, priv->interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) NULL, 0, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) dev_err(&port->dev, "Unable to write latency timer: %i\n", rv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) static int _read_latency_timer(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) struct usb_device *udev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) unsigned char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) buf = kmalloc(1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) rv = usb_control_msg(udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) usb_rcvctrlpipe(udev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 0, priv->interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) buf, 1, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) if (rv < 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) if (rv >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) rv = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) rv = buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) static int read_latency_timer(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) if (priv->chip_type == SIO || priv->chip_type == FT8U232AM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) rv = _read_latency_timer(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) if (rv < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) dev_err(&port->dev, "Unable to read latency timer: %i\n", rv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) priv->latency = rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) static int get_serial_info(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) struct serial_struct *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) ss->flags = priv->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) ss->baud_base = priv->baud_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) ss->custom_divisor = priv->custom_divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) static int set_serial_info(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) struct serial_struct *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) struct ftdi_private old_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) mutex_lock(&priv->cfg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) old_priv = *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) /* Do error checking and permission checking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) if (!capable(CAP_SYS_ADMIN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) if ((ss->flags ^ priv->flags) & ~ASYNC_USR_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) mutex_unlock(&priv->cfg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) (ss->flags & ASYNC_USR_MASK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) priv->custom_divisor = ss->custom_divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) goto check_and_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) if (ss->baud_base != priv->baud_base) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) mutex_unlock(&priv->cfg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) /* Make the changes - these are privileged changes! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) (ss->flags & ASYNC_FLAGS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) priv->custom_divisor = ss->custom_divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) check_and_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) write_latency_timer(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) if ((priv->flags ^ old_priv.flags) & ASYNC_SPD_MASK ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) priv->custom_divisor != old_priv.custom_divisor)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) /* warn about deprecation unless clearing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) if (priv->flags & ASYNC_SPD_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) dev_warn_ratelimited(&port->dev, "use of SPD flags is deprecated\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) change_speed(tty, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) mutex_unlock(&priv->cfg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) static int get_lsr_info(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) unsigned int __user *retinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) unsigned int result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) if (priv->transmit_empty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) result = TIOCSER_TEMT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) if (copy_to_user(retinfo, &result, sizeof(unsigned int)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) /* Determine type of FTDI chip based on USB config and descriptor. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) static void ftdi_determine_type(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) struct usb_device *udev = serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) unsigned version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) unsigned interfaces;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) /* Assume it is not the original SIO device for now. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) priv->baud_base = 48000000 / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) version = le16_to_cpu(udev->descriptor.bcdDevice);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) interfaces = udev->actconfig->desc.bNumInterfaces;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) dev_dbg(&port->dev, "%s: bcdDevice = 0x%x, bNumInterfaces = %u\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) version, interfaces);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) if (interfaces > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) struct usb_interface *intf = serial->interface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) int ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) /* Multiple interfaces.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) if (version == 0x0800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) priv->chip_type = FT4232H;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) /* Hi-speed - baud clock runs at 120MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) priv->baud_base = 120000000 / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) } else if (version == 0x0700) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) priv->chip_type = FT2232H;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) /* Hi-speed - baud clock runs at 120MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) priv->baud_base = 120000000 / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) priv->chip_type = FT2232C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) /* Determine interface code. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) if (ifnum == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) priv->interface = INTERFACE_A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) else if (ifnum == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) priv->interface = INTERFACE_B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) else if (ifnum == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) priv->interface = INTERFACE_C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) else if (ifnum == 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) priv->interface = INTERFACE_D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) /* BM-type devices have a bug where bcdDevice gets set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) * to 0x200 when iSerialNumber is 0. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) if (version < 0x500) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) dev_dbg(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) "%s: something fishy - bcdDevice too low for multi-interface device\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) } else if (version < 0x200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) /* Old device. Assume it's the original SIO. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) priv->chip_type = SIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) priv->baud_base = 12000000 / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) } else if (version < 0x400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) /* Assume it's an FT8U232AM (or FT8U245AM) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) priv->chip_type = FT8U232AM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) * It might be a BM type because of the iSerialNumber bug.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) * If iSerialNumber==0 and the latency timer is readable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) * assume it is BM type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) if (udev->descriptor.iSerialNumber == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) _read_latency_timer(port) >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) dev_dbg(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) "%s: has latency timer so not an AM type\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) priv->chip_type = FT232BM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) } else if (version < 0x600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) /* Assume it's an FT232BM (or FT245BM) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) priv->chip_type = FT232BM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) } else if (version < 0x900) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) /* Assume it's an FT232RL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) priv->chip_type = FT232RL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) } else if (version < 0x1000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) /* Assume it's an FT232H */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) priv->chip_type = FT232H;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) /* Assume it's an FT-X series device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) priv->chip_type = FTX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) * Determine the maximum packet size for the device. This depends on the chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) * type and the USB host capabilities. The value should be obtained from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) * device descriptor as the chip will use the appropriate values for the host.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) static void ftdi_set_max_packet_size(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) struct usb_interface *interface = port->serial->interface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) struct usb_endpoint_descriptor *ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) unsigned num_endpoints;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) unsigned i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) if (!num_endpoints)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) * NOTE: Some customers have programmed FT232R/FT245R devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) * with an endpoint size of 0 - not good. In this case, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) * want to override the endpoint descriptor setting and use a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) * value of 64 for wMaxPacketSize.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) for (i = 0; i < num_endpoints; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) ep_desc = &interface->cur_altsetting->endpoint[i].desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) if (!ep_desc->wMaxPacketSize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) dev_warn(&port->dev, "Overriding wMaxPacketSize on endpoint %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) usb_endpoint_num(ep_desc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) /* Set max packet size based on last descriptor. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) priv->max_packet_size = usb_endpoint_maxp(ep_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) * ***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) * Sysfs Attribute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) * ***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) static ssize_t latency_timer_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) struct usb_serial_port *port = to_usb_serial_port(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) if (priv->flags & ASYNC_LOW_LATENCY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) return sprintf(buf, "1\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) return sprintf(buf, "%i\n", priv->latency);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) /* Write a new value of the latency timer, in units of milliseconds. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) static ssize_t latency_timer_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) const char *valbuf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) struct usb_serial_port *port = to_usb_serial_port(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) u8 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) if (kstrtou8(valbuf, 10, &v))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) priv->latency = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) rv = write_latency_timer(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) static DEVICE_ATTR_RW(latency_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) /* Write an event character directly to the FTDI register. The ASCII
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) value is in the low 8 bits, with the enable bit in the 9th bit. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) static ssize_t event_char_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) struct device_attribute *attr, const char *valbuf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) struct usb_serial_port *port = to_usb_serial_port(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) struct usb_device *udev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) unsigned int v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) if (kstrtouint(valbuf, 0, &v) || v >= 0x200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) dev_dbg(&port->dev, "%s: setting event char = 0x%03x\n", __func__, v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) rv = usb_control_msg(udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) usb_sndctrlpipe(udev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) FTDI_SIO_SET_EVENT_CHAR_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) v, priv->interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) NULL, 0, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) if (rv < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) dev_dbg(&port->dev, "Unable to write event character: %i\n", rv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) static DEVICE_ATTR_WO(event_char);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) static int create_sysfs_attrs(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) /* XXX I've no idea if the original SIO supports the event_char
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) * sysfs parameter, so I'm playing it safe. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) if (priv->chip_type != SIO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) dev_dbg(&port->dev, "sysfs attributes for %s\n", ftdi_chip_name[priv->chip_type]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) retval = device_create_file(&port->dev, &dev_attr_event_char);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) if ((!retval) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) (priv->chip_type == FT232BM ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) priv->chip_type == FT2232C ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) priv->chip_type == FT232RL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) priv->chip_type == FT2232H ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) priv->chip_type == FT4232H ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) priv->chip_type == FT232H ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) priv->chip_type == FTX)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) retval = device_create_file(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) &dev_attr_latency_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) static void remove_sysfs_attrs(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) /* XXX see create_sysfs_attrs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) if (priv->chip_type != SIO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) device_remove_file(&port->dev, &dev_attr_event_char);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) if (priv->chip_type == FT232BM ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) priv->chip_type == FT2232C ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) priv->chip_type == FT232RL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) priv->chip_type == FT2232H ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) priv->chip_type == FT4232H ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) priv->chip_type == FT232H ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) priv->chip_type == FTX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) device_remove_file(&port->dev, &dev_attr_latency_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) #ifdef CONFIG_GPIOLIB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) static int ftdi_set_bitmode(struct usb_serial_port *port, u8 mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) u16 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) result = usb_autopm_get_interface(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) if (result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) val = (mode << 8) | (priv->gpio_output << 4) | priv->gpio_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) result = usb_control_msg(serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) usb_sndctrlpipe(serial->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) FTDI_SIO_SET_BITMODE_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) FTDI_SIO_SET_BITMODE_REQUEST_TYPE, val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) priv->interface, NULL, 0, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) if (result < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) dev_err(&serial->interface->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) "bitmode request failed for value 0x%04x: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) val, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) usb_autopm_put_interface(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) static int ftdi_set_cbus_pins(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) return ftdi_set_bitmode(port, FTDI_SIO_BITMODE_CBUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) static int ftdi_exit_cbus_mode(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) priv->gpio_output = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) priv->gpio_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) return ftdi_set_bitmode(port, FTDI_SIO_BITMODE_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) static int ftdi_gpio_request(struct gpio_chip *gc, unsigned int offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) struct usb_serial_port *port = gpiochip_get_data(gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) if (priv->gpio_altfunc & BIT(offset))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) mutex_lock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) if (!priv->gpio_used) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) /* Set default pin states, as we cannot get them from device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) priv->gpio_output = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) priv->gpio_value = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) result = ftdi_set_cbus_pins(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) if (result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) mutex_unlock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) priv->gpio_used = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) mutex_unlock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) static int ftdi_read_cbus_pins(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) unsigned char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) result = usb_autopm_get_interface(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) if (result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) buf = kmalloc(1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) if (!buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) usb_autopm_put_interface(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) result = usb_control_msg(serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) usb_rcvctrlpipe(serial->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) FTDI_SIO_READ_PINS_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) FTDI_SIO_READ_PINS_REQUEST_TYPE, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) priv->interface, buf, 1, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) if (result < 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) if (result >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) result = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) result = buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) usb_autopm_put_interface(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) static int ftdi_gpio_get(struct gpio_chip *gc, unsigned int gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) struct usb_serial_port *port = gpiochip_get_data(gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) result = ftdi_read_cbus_pins(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) if (result < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) return !!(result & BIT(gpio));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) static void ftdi_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) struct usb_serial_port *port = gpiochip_get_data(gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) mutex_lock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) if (value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) priv->gpio_value |= BIT(gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) priv->gpio_value &= ~BIT(gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) ftdi_set_cbus_pins(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) mutex_unlock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) static int ftdi_gpio_get_multiple(struct gpio_chip *gc, unsigned long *mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) unsigned long *bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) struct usb_serial_port *port = gpiochip_get_data(gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) result = ftdi_read_cbus_pins(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) if (result < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) *bits = result & *mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) static void ftdi_gpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) unsigned long *bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) struct usb_serial_port *port = gpiochip_get_data(gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) mutex_lock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) priv->gpio_value &= ~(*mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) priv->gpio_value |= *bits & *mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) ftdi_set_cbus_pins(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) mutex_unlock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) static int ftdi_gpio_direction_get(struct gpio_chip *gc, unsigned int gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) struct usb_serial_port *port = gpiochip_get_data(gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) return !(priv->gpio_output & BIT(gpio));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) static int ftdi_gpio_direction_input(struct gpio_chip *gc, unsigned int gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) struct usb_serial_port *port = gpiochip_get_data(gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) mutex_lock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) priv->gpio_output &= ~BIT(gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) result = ftdi_set_cbus_pins(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) mutex_unlock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) static int ftdi_gpio_direction_output(struct gpio_chip *gc, unsigned int gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) struct usb_serial_port *port = gpiochip_get_data(gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) mutex_lock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) priv->gpio_output |= BIT(gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) if (value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) priv->gpio_value |= BIT(gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) priv->gpio_value &= ~BIT(gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) result = ftdi_set_cbus_pins(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) mutex_unlock(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) static int ftdi_read_eeprom(struct usb_serial *serial, void *dst, u16 addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) u16 nbytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) int read = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) if (addr % 2 != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) if (nbytes % 2 != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) /* Read EEPROM two bytes at a time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) while (read < nbytes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) rv = usb_control_msg(serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) usb_rcvctrlpipe(serial->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) FTDI_SIO_READ_EEPROM_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) FTDI_SIO_READ_EEPROM_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) 0, (addr + read) / 2, dst + read, 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) if (rv < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) if (rv >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) read += rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) static int ftdi_gpio_init_ft232h(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) u16 cbus_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) buf = kmalloc(4, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) ret = ftdi_read_eeprom(port->serial, buf, 0x1a, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) * FT232H CBUS Memory Map
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) * 0x1a: X- (upper nibble -> AC5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) * 0x1b: -X (lower nibble -> AC6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) * 0x1c: XX (upper nibble -> AC9 | lower nibble -> AC8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) cbus_config = buf[2] << 8 | (buf[1] & 0xf) << 4 | (buf[0] & 0xf0) >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) priv->gc.ngpio = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) priv->gpio_altfunc = 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) for (i = 0; i < priv->gc.ngpio; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) if ((cbus_config & 0xf) == FTDI_FTX_CBUS_MUX_GPIO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) priv->gpio_altfunc &= ~BIT(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) cbus_config >>= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) static int ftdi_gpio_init_ft232r(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) u16 cbus_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) buf = kmalloc(2, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) ret = ftdi_read_eeprom(port->serial, buf, 0x14, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) cbus_config = le16_to_cpup((__le16 *)buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) dev_dbg(&port->dev, "cbus_config = 0x%04x\n", cbus_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) priv->gc.ngpio = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) priv->gpio_altfunc = 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) for (i = 0; i < priv->gc.ngpio; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) if ((cbus_config & 0xf) == FTDI_FT232R_CBUS_MUX_GPIO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) priv->gpio_altfunc &= ~BIT(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) cbus_config >>= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) static int ftdi_gpio_init_ftx(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) const u16 cbus_cfg_addr = 0x1a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) const u16 cbus_cfg_size = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) u8 *cbus_cfg_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) u8 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) cbus_cfg_buf = kmalloc(cbus_cfg_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) if (!cbus_cfg_buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) result = ftdi_read_eeprom(serial, cbus_cfg_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) cbus_cfg_addr, cbus_cfg_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) if (result < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) /* FIXME: FT234XD alone has 1 GPIO, but how to recognize this IC? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) priv->gc.ngpio = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) /* Determine which pins are configured for CBUS bitbanging */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) priv->gpio_altfunc = 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) for (i = 0; i < priv->gc.ngpio; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) if (cbus_cfg_buf[i] == FTDI_FTX_CBUS_MUX_GPIO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) priv->gpio_altfunc &= ~BIT(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) kfree(cbus_cfg_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) static int ftdi_gpio_init(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) switch (priv->chip_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) case FT232H:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) result = ftdi_gpio_init_ft232h(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) case FT232RL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) result = ftdi_gpio_init_ft232r(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) case FTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) result = ftdi_gpio_init_ftx(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) if (result < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) mutex_init(&priv->gpio_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) priv->gc.label = "ftdi-cbus";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) priv->gc.request = ftdi_gpio_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) priv->gc.get_direction = ftdi_gpio_direction_get;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) priv->gc.direction_input = ftdi_gpio_direction_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) priv->gc.direction_output = ftdi_gpio_direction_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) priv->gc.get = ftdi_gpio_get;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) priv->gc.set = ftdi_gpio_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) priv->gc.get_multiple = ftdi_gpio_get_multiple;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) priv->gc.set_multiple = ftdi_gpio_set_multiple;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) priv->gc.owner = THIS_MODULE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) priv->gc.parent = &serial->interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) priv->gc.base = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) priv->gc.can_sleep = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) result = gpiochip_add_data(&priv->gc, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) if (!result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) priv->gpio_registered = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) static void ftdi_gpio_remove(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) if (priv->gpio_registered) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) gpiochip_remove(&priv->gc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) priv->gpio_registered = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) if (priv->gpio_used) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) /* Exiting CBUS-mode does not reset pin states. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) ftdi_exit_cbus_mode(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) priv->gpio_used = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) static int ftdi_gpio_init(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) static void ftdi_gpio_remove(struct usb_serial_port *port) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) #endif /* CONFIG_GPIOLIB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) * ***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) * FTDI driver specific functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) * ***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) /* Probe function to check for special devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) static int ftdi_sio_probe(struct usb_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) const struct ftdi_sio_quirk *quirk =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) (struct ftdi_sio_quirk *)id->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) if (quirk && quirk->probe) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) int ret = quirk->probe(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) usb_set_serial_data(serial, (void *)id->driver_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) static int ftdi_sio_port_probe(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) struct ftdi_private *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) const struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) if (!priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) mutex_init(&priv->cfg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) if (quirk && quirk->port_probe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) quirk->port_probe(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) usb_set_serial_port_data(port, priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) ftdi_determine_type(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) ftdi_set_max_packet_size(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) if (read_latency_timer(port) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) priv->latency = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) write_latency_timer(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) create_sysfs_attrs(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) result = ftdi_gpio_init(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) if (result < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) dev_err(&port->serial->interface->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) "GPIO initialisation failed: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) /* Setup for the USB-UIRT device, which requires hardwired
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) * baudrate (38400 gets mapped to 312500) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) /* Called from usbserial:serial_probe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) priv->flags |= ASYNC_SPD_CUST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) priv->custom_divisor = 77;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) priv->force_baud = 38400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) /* Setup for the HE-TIRA1 device, which requires hardwired
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) priv->flags |= ASYNC_SPD_CUST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) priv->custom_divisor = 240;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) priv->force_baud = 38400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) priv->force_rtscts = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) * Module parameter to control latency timer for NDI FTDI-based USB devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) * If this value is not set in /etc/modprobe.d/ its value will be set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) * to 1ms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) static int ndi_latency_timer = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) /* Setup for the NDI FTDI-based USB devices, which requires hardwired
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) * baudrate (19200 gets mapped to 1200000).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) * Called from usbserial:serial_probe.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) static int ftdi_NDI_device_setup(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) struct usb_device *udev = serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) int latency = ndi_latency_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) if (latency == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) latency = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) if (latency > 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) latency = 99;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) dev_dbg(&udev->dev, "%s setting NDI device latency to %d\n", __func__, latency);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) dev_info(&udev->dev, "NDI device with a latency value of %d\n", latency);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) /* FIXME: errors are not returned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) latency, 0, NULL, 0, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) * userspace using openocd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) static int ftdi_jtag_probe(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) struct usb_interface *intf = serial->interface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) int ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) if (ifnum == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) dev_info(&intf->dev, "Ignoring interface reserved for JTAG\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) static int ftdi_8u2232c_probe(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) struct usb_device *udev = serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) if (udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) return ftdi_jtag_probe(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) if (udev->product &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) (!strcmp(udev->product, "Arrow USB Blaster") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) !strcmp(udev->product, "BeagleBone/XDS100V2") ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) !strcmp(udev->product, "SNAP Connect E10")))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) return ftdi_jtag_probe(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) * First two ports on JTAG adaptors using an FT4232 such as STMicroelectronics's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) * can be accessed from userspace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) * The next two ports are enabled as UARTs by default, where port 2 is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) * a conventional RS-232 UART.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) static int ftdi_stmclite_probe(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) struct usb_interface *intf = serial->interface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) int ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) if (ifnum < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) dev_info(&intf->dev, "Ignoring interface reserved for JTAG\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) static int ftdi_sio_port_remove(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) ftdi_gpio_remove(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) remove_sysfs_attrs(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) kfree(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) struct usb_device *dev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) /* No error checking for this (will get errors later anyway) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) /* See ftdi_sio.h for description of what is reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) FTDI_SIO_RESET_SIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) priv->interface, NULL, 0, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) /* Termios defaults are set by usb_serial_init. We don't change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) port->tty->termios - this would lose speed settings, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) This is same behaviour as serial.c/rs_open() - Kuba */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) /* ftdi_set_termios will send usb control messages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) if (tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) ftdi_set_termios(tty, port, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) return usb_serial_generic_open(tty, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) static void ftdi_dtr_rts(struct usb_serial_port *port, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) /* Disable flow control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) if (!on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) if (usb_control_msg(port->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) usb_sndctrlpipe(port->serial->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) FTDI_SIO_SET_FLOW_CTRL_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) 0, priv->interface, NULL, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) WDR_TIMEOUT) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) dev_err(&port->dev, "error from flowcontrol urb\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) /* drop RTS and DTR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) if (on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) /* The SIO requires the first byte to have:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) * B0 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) * B1 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) * B2..7 length of message excluding byte 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) * The new devices do not require this byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) void *dest, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) struct ftdi_private *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) if (priv->chip_type == SIO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) unsigned char *buffer = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) int i, len, c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) spin_lock_irqsave(&port->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) for (i = 0; i < size - 1; i += priv->max_packet_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) len = min_t(int, size - i, priv->max_packet_size) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) c = kfifo_out(&port->write_fifo, &buffer[i + 1], len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) if (!c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) port->icount.tx += c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) buffer[i] = (c << 2) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) count += c + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) spin_unlock_irqrestore(&port->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) count = kfifo_out_locked(&port->write_fifo, dest, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) &port->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) port->icount.tx += count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) #define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) static int ftdi_process_packet(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) struct ftdi_private *priv, unsigned char *buf, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) unsigned char status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) bool brkint = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) char flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) if (len < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) dev_dbg(&port->dev, "malformed packet\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) /* Compare new line status to the old one, signal if different/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) N.B. packet may be processed more than once, but differences
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) are only processed once. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) status = buf[0] & FTDI_STATUS_B0_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) if (status != priv->prev_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) char diff_status = status ^ priv->prev_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) if (diff_status & FTDI_RS0_CTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) port->icount.cts++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) if (diff_status & FTDI_RS0_DSR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) port->icount.dsr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) if (diff_status & FTDI_RS0_RI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) port->icount.rng++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) if (diff_status & FTDI_RS0_RLSD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) port->icount.dcd++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) tty = tty_port_tty_get(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) if (tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) usb_serial_handle_dcd_change(port, tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) status & FTDI_RS0_RLSD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) wake_up_interruptible(&port->port.delta_msr_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) priv->prev_status = status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) /* save if the transmitter is empty or not */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) if (buf[1] & FTDI_RS_TEMT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) priv->transmit_empty = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) priv->transmit_empty = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) if (len == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) return 0; /* status only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) * Break and error status must only be processed for packets with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) * data payload to avoid over-reporting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) flag = TTY_NORMAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) if (buf[1] & FTDI_RS_ERR_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) * Break takes precedence over parity, which takes precedence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) * over framing errors. Note that break is only associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) * with the last character in the buffer and only when it's a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) * NUL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) if (buf[1] & FTDI_RS_BI && buf[len - 1] == '\0') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) port->icount.brk++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) brkint = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) if (buf[1] & FTDI_RS_PE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) flag = TTY_PARITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) port->icount.parity++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) } else if (buf[1] & FTDI_RS_FE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) flag = TTY_FRAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) port->icount.frame++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) /* Overrun is special, not associated with a char */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) if (buf[1] & FTDI_RS_OE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) port->icount.overrun++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) port->icount.rx += len - 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) if (brkint || port->sysrq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) for (i = 2; i < len; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) if (brkint && i == len - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) if (usb_serial_handle_break(port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) return len - 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) flag = TTY_BREAK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) if (usb_serial_handle_sysrq_char(port, buf[i]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) tty_insert_flip_char(&port->port, buf[i], flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) tty_insert_flip_string_fixed_flag(&port->port, buf + 2, flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) len - 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) return len - 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) static void ftdi_process_read_urb(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) struct usb_serial_port *port = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) char *data = urb->transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) len = min_t(int, urb->actual_length - i, priv->max_packet_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) count += ftdi_process_packet(port, priv, &data[i], len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) if (count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) tty_flip_buffer_push(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) u16 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) /* break_state = -1 to turn on break, and 0 to turn off break */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) /* see drivers/char/tty_io.c to see it used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) /* last_set_data_value NEVER has the break bit set in it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) if (break_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) value = priv->last_set_data_value | FTDI_SIO_SET_BREAK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) value = priv->last_set_data_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) if (usb_control_msg(port->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) usb_sndctrlpipe(port->serial->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) FTDI_SIO_SET_DATA_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) FTDI_SIO_SET_DATA_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) value , priv->interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) NULL, 0, WDR_TIMEOUT) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) dev_err(&port->dev, "%s FAILED to enable/disable break state (state was %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) __func__, break_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) dev_dbg(&port->dev, "%s break state is %d - urb is %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) break_state, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) static bool ftdi_tx_empty(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) unsigned char buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) ret = ftdi_get_modem_status(port, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) if (ret == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) if (!(buf[1] & FTDI_RS_TEMT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) /* old_termios contains the original termios settings and tty->termios contains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) * the new setting to be used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) * WARNING: set_termios calls this with old_termios in kernel space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) static void ftdi_set_termios(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) struct usb_serial_port *port, struct ktermios *old_termios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) struct usb_device *dev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) struct device *ddev = &port->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) struct ktermios *termios = &tty->termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) unsigned int cflag = termios->c_cflag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) u16 value, index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) /* Force baud rate if this device requires it, unless it is set to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) B0. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) dev_dbg(ddev, "%s: forcing baud rate for this device\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) tty_encode_baud_rate(tty, priv->force_baud,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) priv->force_baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) /* Force RTS-CTS if this device requires it. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) if (priv->force_rtscts) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) dev_dbg(ddev, "%s: forcing rtscts for this device\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) termios->c_cflag |= CRTSCTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) * support CS5/6 and revert the CSIZE setting instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) * CS5 however is used to control some smartcard readers which abuse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) * this limitation to switch modes. Original FTDI chips fall back to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) * eight data bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) * TODO: Implement a quirk to only allow this with mentioned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) * readers. One I know of (Argolis Smartreader V1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) * returns "USB smartcard server" as iInterface string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) * The vendor didn't bother with a custom VID/PID of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) * course.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) if (C_CSIZE(tty) == CS6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) dev_warn(ddev, "requested CSIZE setting not supported\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) termios->c_cflag &= ~CSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) if (old_termios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) termios->c_cflag |= old_termios->c_cflag & CSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) termios->c_cflag |= CS8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) cflag = termios->c_cflag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) if (!old_termios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) goto no_skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) if (old_termios->c_cflag == termios->c_cflag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) && old_termios->c_ispeed == termios->c_ispeed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) && old_termios->c_ospeed == termios->c_ospeed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) goto no_c_cflag_changes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) /* NOTE These routines can get interrupted by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) ftdi_sio_read_bulk_callback - need to examine what this means -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) don't see any problems yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) (termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) goto no_data_parity_stop_changes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) no_skip:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) /* Set number of data bits, parity, stop bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) FTDI_SIO_SET_DATA_STOP_BITS_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) if (cflag & PARENB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) if (cflag & CMSPAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) value |= cflag & PARODD ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) FTDI_SIO_SET_DATA_PARITY_MARK :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) FTDI_SIO_SET_DATA_PARITY_SPACE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) value |= cflag & PARODD ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) FTDI_SIO_SET_DATA_PARITY_ODD :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) FTDI_SIO_SET_DATA_PARITY_EVEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) value |= FTDI_SIO_SET_DATA_PARITY_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) switch (cflag & CSIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) case CS5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) dev_dbg(ddev, "Setting CS5 quirk\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) case CS7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) value |= 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) dev_dbg(ddev, "Setting CS7\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) case CS8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) value |= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) dev_dbg(ddev, "Setting CS8\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) /* This is needed by the break command since it uses the same command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) - but is or'ed with this value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) priv->last_set_data_value = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) FTDI_SIO_SET_DATA_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) FTDI_SIO_SET_DATA_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) value , priv->interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) NULL, 0, WDR_SHORT_TIMEOUT) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) dev_err(ddev, "%s FAILED to set databits/stopbits/parity\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) /* Now do the baudrate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) no_data_parity_stop_changes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) if ((cflag & CBAUD) == B0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) /* Disable flow control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) FTDI_SIO_SET_FLOW_CTRL_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) 0, priv->interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) NULL, 0, WDR_TIMEOUT) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) dev_err(ddev, "%s error from disable flowcontrol urb\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) /* Drop RTS and DTR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) /* set the baudrate determined before */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) mutex_lock(&priv->cfg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) if (change_speed(tty, port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) dev_err(ddev, "%s urb failed to set baudrate\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) mutex_unlock(&priv->cfg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) /* Ensure RTS and DTR are raised when baudrate changed from 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) no_c_cflag_changes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) /* Set hardware-assisted flow control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) if (C_CRTSCTS(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) dev_dbg(&port->dev, "enabling rts/cts flow control\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) index = FTDI_SIO_RTS_CTS_HS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) } else if (I_IXON(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) dev_dbg(&port->dev, "enabling xon/xoff flow control\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) index = FTDI_SIO_XON_XOFF_HS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) value = STOP_CHAR(tty) << 8 | START_CHAR(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) dev_dbg(&port->dev, "disabling flow control\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) index = FTDI_SIO_DISABLE_FLOW_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) index |= priv->interface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) FTDI_SIO_SET_FLOW_CTRL_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) value, index, NULL, 0, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) dev_err(&port->dev, "failed to set flow control: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) * Get modem-control status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) * Returns the number of status bytes retrieved (device dependant), or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) * negative error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) static int ftdi_get_modem_status(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) unsigned char status[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) unsigned char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) buf = kmalloc(2, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) * The 8U232AM returns a two byte value (the SIO a 1 byte value) in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) * the same format as the data returned from the in point.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) switch (priv->chip_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) case SIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) case FT8U232AM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) case FT232BM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) case FT2232C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) case FT232RL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) case FT2232H:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) case FT4232H:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) case FT232H:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) case FTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) ret = usb_control_msg(port->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) usb_rcvctrlpipe(port->serial->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) FTDI_SIO_GET_MODEM_STATUS_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) 0, priv->interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) buf, len, WDR_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) /* NOTE: We allow short responses and handle that below. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) if (ret < 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) dev_err(&port->dev, "failed to get modem status: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) if (ret >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) ret = usb_translate_errors(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) status[0] = buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) if (ret > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) status[1] = buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) status[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) dev_dbg(&port->dev, "%s - 0x%02x%02x\n", __func__, status[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) status[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) static int ftdi_tiocmget(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) struct ftdi_private *priv = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) unsigned char buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) ret = ftdi_get_modem_status(port, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) (buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) (buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) priv->last_dtr_rts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) static int ftdi_tiocmset(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) unsigned int set, unsigned int clear)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) return update_mctrl(port, set, clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) static int ftdi_ioctl(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) void __user *argp = (void __user *)arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) case TIOCSERGETLSR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) return get_lsr_info(port, argp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) module_usb_serial_driver(serial_drivers, id_table_combined);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) MODULE_AUTHOR(DRIVER_AUTHOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) MODULE_DESCRIPTION(DRIVER_DESC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) module_param(ndi_latency_timer, int, S_IRUGO | S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");