1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * USB Serial "Simple" driver |
4 | * |
5 | * Copyright (C) 2001-2006,2008,2013 Greg Kroah-Hartman <greg@kroah.com> |
6 | * Copyright (C) 2005 Arthur Huillet (ahuillet@users.sf.net) |
7 | * Copyright (C) 2005 Thomas Hergenhahn <thomas.hergenhahn@suse.de> |
8 | * Copyright (C) 2009 Outpost Embedded, LLC |
9 | * Copyright (C) 2010 Zilogic Systems <code@zilogic.com> |
10 | * Copyright (C) 2013 Wei Shuai <cpuwolf@gmail.com> |
11 | * Copyright (C) 2013 Linux Foundation |
12 | */ |
13 | |
14 | #include <linux/kernel.h> |
15 | #include <linux/tty.h> |
16 | #include <linux/module.h> |
17 | #include <linux/usb.h> |
18 | #include <linux/usb/serial.h> |
19 | |
20 | #define DEVICE_N(vendor, IDS, nport) \ |
21 | static const struct usb_device_id vendor##_id_table[] = { \ |
22 | IDS(), \ |
23 | { }, \ |
24 | }; \ |
25 | static struct usb_serial_driver vendor##_device = { \ |
26 | .driver = { \ |
27 | .owner = THIS_MODULE, \ |
28 | .name = #vendor, \ |
29 | }, \ |
30 | .id_table = vendor##_id_table, \ |
31 | .num_ports = nport, \ |
32 | }; |
33 | |
34 | #define DEVICE(vendor, IDS) DEVICE_N(vendor, IDS, 1) |
35 | |
36 | /* Medtronic CareLink USB driver */ |
37 | #define CARELINK_IDS() \ |
38 | { USB_DEVICE(0x0a21, 0x8001) } /* MMT-7305WW */ |
39 | DEVICE(carelink, CARELINK_IDS); |
40 | |
41 | /* Infineon Flashloader driver */ |
42 | #define FLASHLOADER_IDS() \ |
43 | { USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \ |
44 | { USB_DEVICE(0x8087, 0x0716) }, \ |
45 | { USB_DEVICE(0x8087, 0x0801) } |
46 | DEVICE(flashloader, FLASHLOADER_IDS); |
47 | |
48 | /* Funsoft Serial USB driver */ |
49 | #define FUNSOFT_IDS() \ |
50 | { USB_DEVICE(0x1404, 0xcddc) } |
51 | DEVICE(funsoft, FUNSOFT_IDS); |
52 | |
53 | /* Google Serial USB SubClass */ |
54 | #define GOOGLE_IDS() \ |
55 | { USB_VENDOR_AND_INTERFACE_INFO(0x18d1, \ |
56 | USB_CLASS_VENDOR_SPEC, \ |
57 | 0x50, \ |
58 | 0x01) } |
59 | DEVICE(google, GOOGLE_IDS); |
60 | |
61 | /* HP4x (48/49) Generic Serial driver */ |
62 | #define HP4X_IDS() \ |
63 | { USB_DEVICE(0x03f0, 0x0121) } |
64 | DEVICE(hp4x, HP4X_IDS); |
65 | |
66 | /* KAUFMANN RKS+CAN VCP */ |
67 | #define KAUFMANN_IDS() \ |
68 | { USB_DEVICE(0x16d0, 0x0870) } |
69 | DEVICE(kaufmann, KAUFMANN_IDS); |
70 | |
71 | /* Libtransistor USB console */ |
72 | #define LIBTRANSISTOR_IDS() \ |
73 | { USB_DEVICE(0x1209, 0x8b00) } |
74 | DEVICE(libtransistor, LIBTRANSISTOR_IDS); |
75 | |
76 | /* Motorola USB Phone driver */ |
77 | #define MOTO_IDS() \ |
78 | { USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */ \ |
79 | { USB_DEVICE(0x0c44, 0x0022) }, /* unknown Motorola phone */ \ |
80 | { USB_DEVICE(0x22b8, 0x2a64) }, /* Motorola KRZR K1m */ \ |
81 | { USB_DEVICE(0x22b8, 0x2c84) }, /* Motorola VE240 phone */ \ |
82 | { USB_DEVICE(0x22b8, 0x2c64) } /* Motorola V950 phone */ |
83 | DEVICE(moto_modem, MOTO_IDS); |
84 | |
85 | /* Motorola Tetra driver */ |
86 | #define MOTOROLA_TETRA_IDS() \ |
87 | { USB_DEVICE(0x0cad, 0x9011) }, /* Motorola Solutions TETRA PEI */ \ |
88 | { USB_DEVICE(0x0cad, 0x9012) }, /* MTP6550 */ \ |
89 | { USB_DEVICE(0x0cad, 0x9013) }, /* MTP3xxx */ \ |
90 | { USB_DEVICE(0x0cad, 0x9015) }, /* MTP85xx */ \ |
91 | { USB_DEVICE(0x0cad, 0x9016) } /* TPG2200 */ |
92 | DEVICE(motorola_tetra, MOTOROLA_TETRA_IDS); |
93 | |
94 | /* Nokia mobile phone driver */ |
95 | #define NOKIA_IDS() \ |
96 | { USB_DEVICE(0x0421, 0x069a) } /* Nokia 130 (RM-1035) */ |
97 | DEVICE(nokia, NOKIA_IDS); |
98 | |
99 | /* Novatel Wireless GPS driver */ |
100 | #define NOVATEL_IDS() \ |
101 | { USB_DEVICE(0x09d7, 0x0100) } /* NovAtel FlexPack GPS */ |
102 | DEVICE_N(novatel_gps, NOVATEL_IDS, 3); |
103 | |
104 | /* Siemens USB/MPI adapter */ |
105 | #define SIEMENS_IDS() \ |
106 | { USB_DEVICE(0x908, 0x0004) } |
107 | DEVICE(siemens_mpi, SIEMENS_IDS); |
108 | |
109 | /* Suunto ANT+ USB Driver */ |
110 | #define SUUNTO_IDS() \ |
111 | { USB_DEVICE(0x0fcf, 0x1008) }, \ |
112 | { USB_DEVICE(0x0fcf, 0x1009) } /* Dynastream ANT USB-m Stick */ |
113 | DEVICE(suunto, SUUNTO_IDS); |
114 | |
115 | /* ViVOpay USB Serial Driver */ |
116 | #define VIVOPAY_IDS() \ |
117 | { USB_DEVICE(0x1d5f, 0x1004) } /* ViVOpay 8800 */ |
118 | DEVICE(vivopay, VIVOPAY_IDS); |
119 | |
120 | /* ZIO Motherboard USB driver */ |
121 | #define ZIO_IDS() \ |
122 | { USB_DEVICE(0x1CBE, 0x0103) } |
123 | DEVICE(zio, ZIO_IDS); |
124 | |
125 | /* All of the above structures mushed into two lists */ |
126 | static struct usb_serial_driver * const serial_drivers[] = { |
127 | &carelink_device, |
128 | &flashloader_device, |
129 | &funsoft_device, |
130 | &google_device, |
131 | &hp4x_device, |
132 | &kaufmann_device, |
133 | &libtransistor_device, |
134 | &moto_modem_device, |
135 | &motorola_tetra_device, |
136 | &nokia_device, |
137 | &novatel_gps_device, |
138 | &siemens_mpi_device, |
139 | &suunto_device, |
140 | &vivopay_device, |
141 | &zio_device, |
142 | NULL |
143 | }; |
144 | |
145 | static const struct usb_device_id id_table[] = { |
146 | CARELINK_IDS(), |
147 | FLASHLOADER_IDS(), |
148 | FUNSOFT_IDS(), |
149 | GOOGLE_IDS(), |
150 | HP4X_IDS(), |
151 | KAUFMANN_IDS(), |
152 | LIBTRANSISTOR_IDS(), |
153 | MOTO_IDS(), |
154 | MOTOROLA_TETRA_IDS(), |
155 | NOKIA_IDS(), |
156 | NOVATEL_IDS(), |
157 | SIEMENS_IDS(), |
158 | SUUNTO_IDS(), |
159 | VIVOPAY_IDS(), |
160 | ZIO_IDS(), |
161 | { }, |
162 | }; |
163 | MODULE_DEVICE_TABLE(usb, id_table); |
164 | |
165 | module_usb_serial_driver(serial_drivers, id_table); |
166 | MODULE_LICENSE("GPL v2" ); |
167 | |