162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * USB Serial "Simple" driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2001-2006,2008,2013 Greg Kroah-Hartman <greg@kroah.com>
662306a36Sopenharmony_ci * Copyright (C) 2005 Arthur Huillet (ahuillet@users.sf.net)
762306a36Sopenharmony_ci * Copyright (C) 2005 Thomas Hergenhahn <thomas.hergenhahn@suse.de>
862306a36Sopenharmony_ci * Copyright (C) 2009 Outpost Embedded, LLC
962306a36Sopenharmony_ci * Copyright (C) 2010 Zilogic Systems <code@zilogic.com>
1062306a36Sopenharmony_ci * Copyright (C) 2013 Wei Shuai <cpuwolf@gmail.com>
1162306a36Sopenharmony_ci * Copyright (C) 2013 Linux Foundation
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/kernel.h>
1562306a36Sopenharmony_ci#include <linux/tty.h>
1662306a36Sopenharmony_ci#include <linux/module.h>
1762306a36Sopenharmony_ci#include <linux/usb.h>
1862306a36Sopenharmony_ci#include <linux/usb/serial.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define DEVICE_N(vendor, IDS, nport)				\
2162306a36Sopenharmony_cistatic const struct usb_device_id vendor##_id_table[] = {	\
2262306a36Sopenharmony_ci	IDS(),							\
2362306a36Sopenharmony_ci	{ },							\
2462306a36Sopenharmony_ci};								\
2562306a36Sopenharmony_cistatic struct usb_serial_driver vendor##_device = {		\
2662306a36Sopenharmony_ci	.driver = {						\
2762306a36Sopenharmony_ci		.owner =	THIS_MODULE,			\
2862306a36Sopenharmony_ci		.name =		#vendor,			\
2962306a36Sopenharmony_ci	},							\
3062306a36Sopenharmony_ci	.id_table =		vendor##_id_table,		\
3162306a36Sopenharmony_ci	.num_ports =		nport,				\
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define DEVICE(vendor, IDS)	DEVICE_N(vendor, IDS, 1)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* Medtronic CareLink USB driver */
3762306a36Sopenharmony_ci#define CARELINK_IDS()			\
3862306a36Sopenharmony_ci	{ USB_DEVICE(0x0a21, 0x8001) }	/* MMT-7305WW */
3962306a36Sopenharmony_ciDEVICE(carelink, CARELINK_IDS);
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/* Infineon Flashloader driver */
4262306a36Sopenharmony_ci#define FLASHLOADER_IDS()		\
4362306a36Sopenharmony_ci	{ USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \
4462306a36Sopenharmony_ci	{ USB_DEVICE(0x8087, 0x0716) }, \
4562306a36Sopenharmony_ci	{ USB_DEVICE(0x8087, 0x0801) }
4662306a36Sopenharmony_ciDEVICE(flashloader, FLASHLOADER_IDS);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* Funsoft Serial USB driver */
4962306a36Sopenharmony_ci#define FUNSOFT_IDS()			\
5062306a36Sopenharmony_ci	{ USB_DEVICE(0x1404, 0xcddc) }
5162306a36Sopenharmony_ciDEVICE(funsoft, FUNSOFT_IDS);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/* Google Serial USB SubClass */
5462306a36Sopenharmony_ci#define GOOGLE_IDS()						\
5562306a36Sopenharmony_ci	{ USB_VENDOR_AND_INTERFACE_INFO(0x18d1,			\
5662306a36Sopenharmony_ci					USB_CLASS_VENDOR_SPEC,	\
5762306a36Sopenharmony_ci					0x50,			\
5862306a36Sopenharmony_ci					0x01) }
5962306a36Sopenharmony_ciDEVICE(google, GOOGLE_IDS);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* HP4x (48/49) Generic Serial driver */
6262306a36Sopenharmony_ci#define HP4X_IDS()			\
6362306a36Sopenharmony_ci	{ USB_DEVICE(0x03f0, 0x0121) }
6462306a36Sopenharmony_ciDEVICE(hp4x, HP4X_IDS);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* KAUFMANN RKS+CAN VCP */
6762306a36Sopenharmony_ci#define KAUFMANN_IDS()			\
6862306a36Sopenharmony_ci	{ USB_DEVICE(0x16d0, 0x0870) }
6962306a36Sopenharmony_ciDEVICE(kaufmann, KAUFMANN_IDS);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* Libtransistor USB console */
7262306a36Sopenharmony_ci#define LIBTRANSISTOR_IDS()			\
7362306a36Sopenharmony_ci	{ USB_DEVICE(0x1209, 0x8b00) }
7462306a36Sopenharmony_ciDEVICE(libtransistor, LIBTRANSISTOR_IDS);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* Motorola USB Phone driver */
7762306a36Sopenharmony_ci#define MOTO_IDS()			\
7862306a36Sopenharmony_ci	{ USB_DEVICE(0x05c6, 0x3197) },	/* unknown Motorola phone */	\
7962306a36Sopenharmony_ci	{ USB_DEVICE(0x0c44, 0x0022) },	/* unknown Motorola phone */	\
8062306a36Sopenharmony_ci	{ USB_DEVICE(0x22b8, 0x2a64) },	/* Motorola KRZR K1m */		\
8162306a36Sopenharmony_ci	{ USB_DEVICE(0x22b8, 0x2c84) },	/* Motorola VE240 phone */	\
8262306a36Sopenharmony_ci	{ USB_DEVICE(0x22b8, 0x2c64) }	/* Motorola V950 phone */
8362306a36Sopenharmony_ciDEVICE(moto_modem, MOTO_IDS);
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/* Motorola Tetra driver */
8662306a36Sopenharmony_ci#define MOTOROLA_TETRA_IDS()			\
8762306a36Sopenharmony_ci	{ USB_DEVICE(0x0cad, 0x9011) },	/* Motorola Solutions TETRA PEI */ \
8862306a36Sopenharmony_ci	{ USB_DEVICE(0x0cad, 0x9012) },	/* MTP6550 */ \
8962306a36Sopenharmony_ci	{ USB_DEVICE(0x0cad, 0x9013) },	/* MTP3xxx */ \
9062306a36Sopenharmony_ci	{ USB_DEVICE(0x0cad, 0x9015) },	/* MTP85xx */ \
9162306a36Sopenharmony_ci	{ USB_DEVICE(0x0cad, 0x9016) }	/* TPG2200 */
9262306a36Sopenharmony_ciDEVICE(motorola_tetra, MOTOROLA_TETRA_IDS);
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* Nokia mobile phone driver */
9562306a36Sopenharmony_ci#define NOKIA_IDS()			\
9662306a36Sopenharmony_ci	{ USB_DEVICE(0x0421, 0x069a) }	/* Nokia 130 (RM-1035) */
9762306a36Sopenharmony_ciDEVICE(nokia, NOKIA_IDS);
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci/* Novatel Wireless GPS driver */
10062306a36Sopenharmony_ci#define NOVATEL_IDS()			\
10162306a36Sopenharmony_ci	{ USB_DEVICE(0x09d7, 0x0100) }	/* NovAtel FlexPack GPS */
10262306a36Sopenharmony_ciDEVICE_N(novatel_gps, NOVATEL_IDS, 3);
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/* Siemens USB/MPI adapter */
10562306a36Sopenharmony_ci#define SIEMENS_IDS()			\
10662306a36Sopenharmony_ci	{ USB_DEVICE(0x908, 0x0004) }
10762306a36Sopenharmony_ciDEVICE(siemens_mpi, SIEMENS_IDS);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/* Suunto ANT+ USB Driver */
11062306a36Sopenharmony_ci#define SUUNTO_IDS()			\
11162306a36Sopenharmony_ci	{ USB_DEVICE(0x0fcf, 0x1008) },	\
11262306a36Sopenharmony_ci	{ USB_DEVICE(0x0fcf, 0x1009) } /* Dynastream ANT USB-m Stick */
11362306a36Sopenharmony_ciDEVICE(suunto, SUUNTO_IDS);
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* ViVOpay USB Serial Driver */
11662306a36Sopenharmony_ci#define VIVOPAY_IDS()			\
11762306a36Sopenharmony_ci	{ USB_DEVICE(0x1d5f, 0x1004) }	/* ViVOpay 8800 */
11862306a36Sopenharmony_ciDEVICE(vivopay, VIVOPAY_IDS);
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci/* ZIO Motherboard USB driver */
12162306a36Sopenharmony_ci#define ZIO_IDS()			\
12262306a36Sopenharmony_ci	{ USB_DEVICE(0x1CBE, 0x0103) }
12362306a36Sopenharmony_ciDEVICE(zio, ZIO_IDS);
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci/* All of the above structures mushed into two lists */
12662306a36Sopenharmony_cistatic struct usb_serial_driver * const serial_drivers[] = {
12762306a36Sopenharmony_ci	&carelink_device,
12862306a36Sopenharmony_ci	&flashloader_device,
12962306a36Sopenharmony_ci	&funsoft_device,
13062306a36Sopenharmony_ci	&google_device,
13162306a36Sopenharmony_ci	&hp4x_device,
13262306a36Sopenharmony_ci	&kaufmann_device,
13362306a36Sopenharmony_ci	&libtransistor_device,
13462306a36Sopenharmony_ci	&moto_modem_device,
13562306a36Sopenharmony_ci	&motorola_tetra_device,
13662306a36Sopenharmony_ci	&nokia_device,
13762306a36Sopenharmony_ci	&novatel_gps_device,
13862306a36Sopenharmony_ci	&siemens_mpi_device,
13962306a36Sopenharmony_ci	&suunto_device,
14062306a36Sopenharmony_ci	&vivopay_device,
14162306a36Sopenharmony_ci	&zio_device,
14262306a36Sopenharmony_ci	NULL
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_cistatic const struct usb_device_id id_table[] = {
14662306a36Sopenharmony_ci	CARELINK_IDS(),
14762306a36Sopenharmony_ci	FLASHLOADER_IDS(),
14862306a36Sopenharmony_ci	FUNSOFT_IDS(),
14962306a36Sopenharmony_ci	GOOGLE_IDS(),
15062306a36Sopenharmony_ci	HP4X_IDS(),
15162306a36Sopenharmony_ci	KAUFMANN_IDS(),
15262306a36Sopenharmony_ci	LIBTRANSISTOR_IDS(),
15362306a36Sopenharmony_ci	MOTO_IDS(),
15462306a36Sopenharmony_ci	MOTOROLA_TETRA_IDS(),
15562306a36Sopenharmony_ci	NOKIA_IDS(),
15662306a36Sopenharmony_ci	NOVATEL_IDS(),
15762306a36Sopenharmony_ci	SIEMENS_IDS(),
15862306a36Sopenharmony_ci	SUUNTO_IDS(),
15962306a36Sopenharmony_ci	VIVOPAY_IDS(),
16062306a36Sopenharmony_ci	ZIO_IDS(),
16162306a36Sopenharmony_ci	{ },
16262306a36Sopenharmony_ci};
16362306a36Sopenharmony_ciMODULE_DEVICE_TABLE(usb, id_table);
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cimodule_usb_serial_driver(serial_drivers, id_table);
16662306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
167