Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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");