Merge tag 'usb-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[linux-2.6-block.git] / drivers / tty / serial / 8250 / 8250_pnp.c
CommitLineData
e3b3d0f5 1// SPDX-License-Identifier: GPL-2.0
1da177e4 2/*
835d844d 3 * Probe for 8250/16550-type ISAPNP serial ports.
1da177e4
LT
4 *
5 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
6 *
7 * Copyright (C) 2001 Russell King, All Rights Reserved.
8 *
9 * Ported to the Linux PnP Layer - (C) Adam Belay.
1da177e4
LT
10 */
11#include <linux/module.h>
1da177e4
LT
12#include <linux/pci.h>
13#include <linux/pnp.h>
14#include <linux/string.h>
15#include <linux/kernel.h>
13043207 16#include <linux/property.h>
1da177e4
LT
17#include <linux/serial_core.h>
18#include <linux/bitops.h>
19
20#include <asm/byteorder.h>
21
22#include "8250.h"
23
24#define UNKNOWN_DEV 0x3000
65ecc9c0 25#define CIR_PORT 0x0800
1da177e4
LT
26
27static const struct pnp_device_id pnp_dev_table[] = {
28 /* Archtek America Corp. */
29 /* Archtek SmartLink Modem 3334BT Plug & Play */
30 { "AAC000F", 0 },
31 /* Anchor Datacomm BV */
32 /* SXPro 144 External Data Fax Modem Plug & Play */
33 { "ADC0001", 0 },
34 /* SXPro 288 External Data Fax Modem Plug & Play */
35 { "ADC0002", 0 },
36 /* PROLiNK 1456VH ISA PnP K56flex Fax Modem */
37 { "AEI0250", 0 },
38 /* Actiontec ISA PNP 56K X2 Fax Modem */
39 { "AEI1240", 0 },
40 /* Rockwell 56K ACF II Fax+Data+Voice Modem */
41 { "AKY1021", 0 /*SPCI_FL_NO_SHIRQ*/ },
1d700277
MS
42 /*
43 * ALi Fast Infrared Controller
44 * Native driver (ali-ircc) is broken so at least
45 * it can be used with irtty-sir.
46 */
47 { "ALI5123", 0 },
1da177e4
LT
48 /* AZT3005 PnP SOUND DEVICE */
49 { "AZT4001", 0 },
50 /* Best Data Products Inc. Smart One 336F PnP Modem */
51 { "BDP3336", 0 },
52 /* Boca Research */
53 /* Boca Complete Ofc Communicator 14.4 Data-FAX */
54 { "BRI0A49", 0 },
55 /* Boca Research 33,600 ACF Modem */
56 { "BRI1400", 0 },
57 /* Boca 33.6 Kbps Internal FD34FSVD */
58 { "BRI3400", 0 },
1da177e4
LT
59 /* Computer Peripherals Inc */
60 /* EuroViVa CommCenter-33.6 SP PnP */
61 { "CPI4050", 0 },
62 /* Creative Labs */
63 /* Creative Labs Phone Blaster 28.8 DSVD PnP Voice */
64 { "CTL3001", 0 },
65 /* Creative Labs Modem Blaster 28.8 DSVD PnP Voice */
66 { "CTL3011", 0 },
dbd0cf48
BH
67 /* Davicom ISA 33.6K Modem */
68 { "DAV0336", 0 },
1da177e4
LT
69 /* Creative */
70 /* Creative Modem Blaster Flash56 DI5601-1 */
71 { "DMB1032", 0 },
72 /* Creative Modem Blaster V.90 DI5660 */
73 { "DMB2001", 0 },
74 /* E-Tech */
75 /* E-Tech CyberBULLET PC56RVP */
76 { "ETT0002", 0 },
77 /* FUJITSU */
78 /* Fujitsu 33600 PnP-I2 R Plug & Play */
79 { "FUJ0202", 0 },
80 /* Fujitsu FMV-FX431 Plug & Play */
81 { "FUJ0205", 0 },
82 /* Fujitsu 33600 PnP-I4 R Plug & Play */
83 { "FUJ0206", 0 },
84 /* Fujitsu Fax Voice 33600 PNP-I5 R Plug & Play */
85 { "FUJ0209", 0 },
86 /* Archtek America Corp. */
87 /* Archtek SmartLink Modem 3334BT Plug & Play */
88 { "GVC000F", 0 },
51587cb5
BH
89 /* Archtek SmartLink Modem 3334BRV 33.6K Data Fax Voice */
90 { "GVC0303", 0 },
1da177e4
LT
91 /* Hayes */
92 /* Hayes Optima 288 V.34-V.FC + FAX + Voice Plug & Play */
93 { "HAY0001", 0 },
94 /* Hayes Optima 336 V.34 + FAX + Voice PnP */
95 { "HAY000C", 0 },
96 /* Hayes Optima 336B V.34 + FAX + Voice PnP */
97 { "HAY000D", 0 },
98 /* Hayes Accura 56K Ext Fax Modem PnP */
99 { "HAY5670", 0 },
100 /* Hayes Accura 56K Ext Fax Modem PnP */
101 { "HAY5674", 0 },
102 /* Hayes Accura 56K Fax Modem PnP */
103 { "HAY5675", 0 },
104 /* Hayes 288, V.34 + FAX */
105 { "HAYF000", 0 },
106 /* Hayes Optima 288 V.34 + FAX + Voice, Plug & Play */
107 { "HAYF001", 0 },
108 /* IBM */
109 /* IBM Thinkpad 701 Internal Modem Voice */
110 { "IBM0033", 0 },
ab8ba3a2
BH
111 /* Intermec */
112 /* Intermec CV60 touchscreen port */
113 { "PNP4972", 0 },
1da177e4
LT
114 /* Intertex */
115 /* Intertex 28k8 33k6 Voice EXT PnP */
116 { "IXDC801", 0 },
117 /* Intertex 33k6 56k Voice EXT PnP */
118 { "IXDC901", 0 },
119 /* Intertex 28k8 33k6 Voice SP EXT PnP */
120 { "IXDD801", 0 },
121 /* Intertex 33k6 56k Voice SP EXT PnP */
122 { "IXDD901", 0 },
123 /* Intertex 28k8 33k6 Voice SP INT PnP */
124 { "IXDF401", 0 },
125 /* Intertex 28k8 33k6 Voice SP EXT PnP */
126 { "IXDF801", 0 },
127 /* Intertex 33k6 56k Voice SP EXT PnP */
128 { "IXDF901", 0 },
129 /* Kortex International */
130 /* KORTEX 28800 Externe PnP */
131 { "KOR4522", 0 },
132 /* KXPro 33.6 Vocal ASVD PnP */
133 { "KORF661", 0 },
134 /* Lasat */
135 /* LASAT Internet 33600 PnP */
136 { "LAS4040", 0 },
137 /* Lasat Safire 560 PnP */
138 { "LAS4540", 0 },
139 /* Lasat Safire 336 PnP */
140 { "LAS5440", 0 },
141 /* Microcom, Inc. */
142 /* Microcom TravelPorte FAST V.34 Plug & Play */
143 { "MNP0281", 0 },
144 /* Microcom DeskPorte V.34 FAST or FAST+ Plug & Play */
145 { "MNP0336", 0 },
146 /* Microcom DeskPorte FAST EP 28.8 Plug & Play */
147 { "MNP0339", 0 },
148 /* Microcom DeskPorte 28.8P Plug & Play */
149 { "MNP0342", 0 },
150 /* Microcom DeskPorte FAST ES 28.8 Plug & Play */
151 { "MNP0500", 0 },
152 /* Microcom DeskPorte FAST ES 28.8 Plug & Play */
153 { "MNP0501", 0 },
154 /* Microcom DeskPorte 28.8S Internal Plug & Play */
155 { "MNP0502", 0 },
156 /* Motorola */
157 /* Motorola BitSURFR Plug & Play */
158 { "MOT1105", 0 },
159 /* Motorola TA210 Plug & Play */
160 { "MOT1111", 0 },
161 /* Motorola HMTA 200 (ISDN) Plug & Play */
162 { "MOT1114", 0 },
163 /* Motorola BitSURFR Plug & Play */
164 { "MOT1115", 0 },
165 /* Motorola Lifestyle 28.8 Internal */
166 { "MOT1190", 0 },
167 /* Motorola V.3400 Plug & Play */
168 { "MOT1501", 0 },
169 /* Motorola Lifestyle 28.8 V.34 Plug & Play */
170 { "MOT1502", 0 },
171 /* Motorola Power 28.8 V.34 Plug & Play */
172 { "MOT1505", 0 },
173 /* Motorola ModemSURFR External 28.8 Plug & Play */
174 { "MOT1509", 0 },
175 /* Motorola Premier 33.6 Desktop Plug & Play */
176 { "MOT150A", 0 },
177 /* Motorola VoiceSURFR 56K External PnP */
178 { "MOT150F", 0 },
179 /* Motorola ModemSURFR 56K External PnP */
180 { "MOT1510", 0 },
181 /* Motorola ModemSURFR 56K Internal PnP */
182 { "MOT1550", 0 },
183 /* Motorola ModemSURFR Internal 28.8 Plug & Play */
184 { "MOT1560", 0 },
185 /* Motorola Premier 33.6 Internal Plug & Play */
186 { "MOT1580", 0 },
187 /* Motorola OnlineSURFR 28.8 Internal Plug & Play */
188 { "MOT15B0", 0 },
189 /* Motorola VoiceSURFR 56K Internal PnP */
190 { "MOT15F0", 0 },
191 /* Com 1 */
192 /* Deskline K56 Phone System PnP */
193 { "MVX00A1", 0 },
194 /* PC Rider K56 Phone System PnP */
195 { "MVX00F2", 0 },
196 /* NEC 98NOTE SPEAKER PHONE FAX MODEM(33600bps) */
197 { "nEC8241", 0 },
198 /* Pace 56 Voice Internal Plug & Play Modem */
199 { "PMC2430", 0 },
200 /* Generic */
201 /* Generic standard PC COM port */
202 { "PNP0500", 0 },
203 /* Generic 16550A-compatible COM port */
204 { "PNP0501", 0 },
205 /* Compaq 14400 Modem */
206 { "PNPC000", 0 },
207 /* Compaq 2400/9600 Modem */
208 { "PNPC001", 0 },
209 /* Dial-Up Networking Serial Cable between 2 PCs */
210 { "PNPC031", 0 },
211 /* Dial-Up Networking Parallel Cable between 2 PCs */
212 { "PNPC032", 0 },
213 /* Standard 9600 bps Modem */
214 { "PNPC100", 0 },
215 /* Standard 14400 bps Modem */
216 { "PNPC101", 0 },
217 /* Standard 28800 bps Modem*/
218 { "PNPC102", 0 },
219 /* Standard Modem*/
220 { "PNPC103", 0 },
221 /* Standard 9600 bps Modem*/
222 { "PNPC104", 0 },
223 /* Standard 14400 bps Modem*/
224 { "PNPC105", 0 },
225 /* Standard 28800 bps Modem*/
226 { "PNPC106", 0 },
227 /* Standard Modem */
228 { "PNPC107", 0 },
229 /* Standard 9600 bps Modem */
230 { "PNPC108", 0 },
231 /* Standard 14400 bps Modem */
232 { "PNPC109", 0 },
233 /* Standard 28800 bps Modem */
234 { "PNPC10A", 0 },
235 /* Standard Modem */
236 { "PNPC10B", 0 },
237 /* Standard 9600 bps Modem */
238 { "PNPC10C", 0 },
239 /* Standard 14400 bps Modem */
240 { "PNPC10D", 0 },
241 /* Standard 28800 bps Modem */
242 { "PNPC10E", 0 },
243 /* Standard Modem */
244 { "PNPC10F", 0 },
245 /* Standard PCMCIA Card Modem */
246 { "PNP2000", 0 },
247 /* Rockwell */
248 /* Modular Technology */
249 /* Rockwell 33.6 DPF Internal PnP */
250 /* Modular Technology 33.6 Internal PnP */
251 { "ROK0030", 0 },
252 /* Kortex International */
253 /* KORTEX 14400 Externe PnP */
254 { "ROK0100", 0 },
255 /* Rockwell 28.8 */
256 { "ROK4120", 0 },
257 /* Viking Components, Inc */
258 /* Viking 28.8 INTERNAL Fax+Data+Voice PnP */
259 { "ROK4920", 0 },
260 /* Rockwell */
261 /* British Telecom */
262 /* Modular Technology */
263 /* Rockwell 33.6 DPF External PnP */
264 /* BT Prologue 33.6 External PnP */
265 /* Modular Technology 33.6 External PnP */
266 { "RSS00A0", 0 },
267 /* Viking 56K FAX INT */
268 { "RSS0262", 0 },
269 /* K56 par,VV,Voice,Speakphone,AudioSpan,PnP */
270 { "RSS0250", 0 },
271 /* SupraExpress 28.8 Data/Fax PnP modem */
272 { "SUP1310", 0 },
7fdd4f76
DG
273 /* SupraExpress 336i PnP Voice Modem */
274 { "SUP1381", 0 },
1da177e4
LT
275 /* SupraExpress 33.6 Data/Fax PnP modem */
276 { "SUP1421", 0 },
277 /* SupraExpress 33.6 Data/Fax PnP modem */
278 { "SUP1590", 0 },
04f03bf7
BC
279 /* SupraExpress 336i Sp ASVD */
280 { "SUP1620", 0 },
1da177e4
LT
281 /* SupraExpress 33.6 Data/Fax PnP modem */
282 { "SUP1760", 0 },
c1542cbc 283 /* SupraExpress 56i Sp Intl */
284 { "SUP2171", 0 },
1da177e4
LT
285 /* Phoebe Micro */
286 /* Phoebe Micro 33.6 Data Fax 1433VQH Plug & Play */
287 { "TEX0011", 0 },
288 /* Archtek America Corp. */
289 /* Archtek SmartLink Modem 3334BT Plug & Play */
290 { "UAC000F", 0 },
291 /* 3Com Corp. */
292 /* Gateway Telepath IIvi 33.6 */
293 { "USR0000", 0 },
294 /* U.S. Robotics Sporster 33.6K Fax INT PnP */
295 { "USR0002", 0 },
296 /* Sportster Vi 14.4 PnP FAX Voicemail */
297 { "USR0004", 0 },
298 /* U.S. Robotics 33.6K Voice INT PnP */
299 { "USR0006", 0 },
300 /* U.S. Robotics 33.6K Voice EXT PnP */
301 { "USR0007", 0 },
302 /* U.S. Robotics Courier V.Everything INT PnP */
303 { "USR0009", 0 },
304 /* U.S. Robotics 33.6K Voice INT PnP */
305 { "USR2002", 0 },
306 /* U.S. Robotics 56K Voice INT PnP */
307 { "USR2070", 0 },
308 /* U.S. Robotics 56K Voice EXT PnP */
309 { "USR2080", 0 },
310 /* U.S. Robotics 56K FAX INT */
311 { "USR3031", 0 },
312 /* U.S. Robotics 56K FAX INT */
313 { "USR3050", 0 },
314 /* U.S. Robotics 56K Voice INT PnP */
315 { "USR3070", 0 },
316 /* U.S. Robotics 56K Voice EXT PnP */
317 { "USR3080", 0 },
318 /* U.S. Robotics 56K Voice INT PnP */
319 { "USR3090", 0 },
320 /* U.S. Robotics 56K Message */
321 { "USR9100", 0 },
322 /* U.S. Robotics 56K FAX EXT PnP*/
323 { "USR9160", 0 },
324 /* U.S. Robotics 56K FAX INT PnP*/
325 { "USR9170", 0 },
326 /* U.S. Robotics 56K Voice EXT PnP*/
327 { "USR9180", 0 },
328 /* U.S. Robotics 56K Voice INT PnP*/
329 { "USR9190", 0 },
b07076e6 330 /* Wacom tablets */
6d34855d 331 { "WACFXXX", 0 },
75fde2ed
MG
332 /* Compaq touchscreen */
333 { "FPI2002", 0 },
334 /* Fujitsu Stylistic touchscreens */
335 { "FUJ02B2", 0 },
336 { "FUJ02B3", 0 },
337 /* Fujitsu Stylistic LT touchscreens */
338 { "FUJ02B4", 0 },
339 /* Passive Fujitsu Stylistic touchscreens */
340 { "FUJ02B6", 0 },
341 { "FUJ02B7", 0 },
342 { "FUJ02B8", 0 },
343 { "FUJ02B9", 0 },
344 { "FUJ02BC", 0 },
97ea33f9 345 /* Fujitsu Wacom Tablet PC device */
6149dd5c 346 { "FUJ02E5", 0 },
97ea33f9 347 /* Fujitsu P-series tablet PC device */
6149dd5c 348 { "FUJ02E6", 0 },
3018aa4b
P
349 /* Fujitsu Wacom 2FGT Tablet PC device */
350 { "FUJ02E7", 0 },
d9901660
PC
351 /* Fujitsu Wacom 1FGT Tablet PC device */
352 { "FUJ02E9", 0 },
71054585 353 /*
740dc2de
AW
354 * LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6
355 * in disguise).
71054585
DJ
356 */
357 { "LTS0001", 0 },
1da177e4
LT
358 /* Rockwell's (PORALiNK) 33600 INT PNP */
359 { "WCI0003", 0 },
af901ca1 360 /* Unknown PnP modems */
1da177e4 361 { "PNPCXXX", UNKNOWN_DEV },
af901ca1 362 /* More unknown PnP modems */
1da177e4 363 { "PNPDXXX", UNKNOWN_DEV },
740dc2de
AW
364 /*
365 * Winbond CIR port, should not be probed. We should keep track of
366 * it to prevent the legacy serial driver from probing it.
367 */
65ecc9c0 368 { "WEC1022", CIR_PORT },
ffa34de0 369 /*
740dc2de
AW
370 * SMSC IrCC SIR/FIR port, should not be probed by serial driver as
371 * well so its own driver can bind to it.
ffa34de0
MS
372 */
373 { "SMCF010", CIR_PORT },
1da177e4
LT
374 { "", 0 }
375};
376
377MODULE_DEVICE_TABLE(pnp, pnp_dev_table);
378
aa3188d0 379static const char *modem_names[] = {
1da177e4
LT
380 "MODEM", "Modem", "modem", "FAX", "Fax", "fax",
381 "56K", "56k", "K56", "33.6", "28.8", "14.4",
382 "33,600", "28,800", "14,400", "33.600", "28.800", "14.400",
383 "33600", "28800", "14400", "V.90", "V.34", "V.32", NULL
384};
385
1497f2ce 386static bool check_name(const char *name)
1da177e4 387{
aa3188d0 388 const char **tmp;
1da177e4
LT
389
390 for (tmp = modem_names; *tmp; tmp++)
391 if (strstr(name, *tmp))
1497f2ce 392 return true;
1da177e4 393
1497f2ce 394 return false;
1da177e4
LT
395}
396
1497f2ce 397static bool check_resources(struct pnp_dev *dev)
1da177e4 398{
aa3188d0 399 static const resource_size_t base[] = {0x2f8, 0x3f8, 0x2e8, 0x3e8};
1497f2ce 400 unsigned int i;
1da177e4 401
57fd51a8
BH
402 for (i = 0; i < ARRAY_SIZE(base); i++) {
403 if (pnp_possible_config(dev, IORESOURCE_IO, base[i], 8))
1497f2ce 404 return true;
1da177e4
LT
405 }
406
1497f2ce 407 return false;
1da177e4
LT
408}
409
410/*
411 * Given a complete unknown PnP device, try to use some heuristics to
412 * detect modems. Currently use such heuristic set:
413 * - dev->name or dev->bus->name must contain "modem" substring;
414 * - device must have only one IO region (8 byte long) with base address
415 * 0x2e8, 0x3e8, 0x2f8 or 0x3f8.
416 *
417 * Such detection looks very ugly, but can detect at least some of numerous
418 * PnP modems, alternatively we must hardcode all modems in pnp_devices[]
419 * table.
420 */
9671f099 421static int serial_pnp_guess_board(struct pnp_dev *dev)
1da177e4 422{
3e8d4e20 423 if (!(check_name(pnp_dev_name(dev)) ||
b3d67936
AW
424 (dev->card && check_name(dev->card->name))))
425 return -ENODEV;
1da177e4 426
57fd51a8 427 if (check_resources(dev))
1da177e4
LT
428 return 0;
429
430 return -ENODEV;
431}
432
9671f099 433static int
655a0a77 434serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
1da177e4 435{
ee15947c 436 struct uart_8250_port uart, *port;
1da177e4
LT
437 int ret, line, flags = dev_id->driver_data;
438
439 if (flags & UNKNOWN_DEV) {
65ecc9c0 440 ret = serial_pnp_guess_board(dev);
1da177e4
LT
441 if (ret < 0)
442 return ret;
443 }
444
2655a2c7 445 memset(&uart, 0, sizeof(uart));
e02f5f52 446 if (pnp_irq_valid(dev, 0))
2655a2c7 447 uart.port.irq = pnp_irq(dev, 0);
c12f9ea2
SY
448 if ((flags & CIR_PORT) && pnp_port_valid(dev, 2)) {
449 uart.port.iobase = pnp_port_start(dev, 2);
450 uart.port.iotype = UPIO_PORT;
451 } else if (pnp_port_valid(dev, 0)) {
452 uart.port.iobase = pnp_port_start(dev, 0);
2655a2c7 453 uart.port.iotype = UPIO_PORT;
655a0a77 454 } else if (pnp_mem_valid(dev, 0)) {
2655a2c7
AC
455 uart.port.mapbase = pnp_mem_start(dev, 0);
456 uart.port.iotype = UPIO_MEM;
457 uart.port.flags = UPF_IOREMAP;
655a0a77
BH
458 } else
459 return -ENODEV;
1da177e4 460
952773b5 461 dev_dbg(&dev->dev,
dfaffb9d
HL
462 "Setup PNP port: port %#lx, mem %#llx, irq %u, type %u\n",
463 uart.port.iobase, (unsigned long long)uart.port.mapbase,
952773b5
PR
464 uart.port.irq, uart.port.iotype);
465
65ecc9c0
SY
466 if (flags & CIR_PORT) {
467 uart.port.flags |= UPF_FIXED_PORT | UPF_FIXED_TYPE;
468 uart.port.type = PORT_8250_CIR;
469 }
1da177e4 470
2655a2c7 471 uart.port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
cb6358eb 472 if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE)
2655a2c7
AC
473 uart.port.flags |= UPF_SHARE_IRQ;
474 uart.port.uartclk = 1843200;
13043207 475 device_property_read_u32(&dev->dev, "clock-frequency", &uart.port.uartclk);
2655a2c7 476 uart.port.dev = &dev->dev;
1da177e4 477
2655a2c7 478 line = serial8250_register_8250_port(&uart);
65ecc9c0 479 if (line < 0 || (flags & CIR_PORT))
9b22271d 480 return -ENODEV;
1da177e4 481
ee15947c
PH
482 port = serial8250_get_port(line);
483 if (uart_console(&port->port))
484 dev->capabilities |= PNP_CONSOLE;
485
9b22271d
BH
486 pnp_set_drvdata(dev, (void *)((long)line + 1));
487 return 0;
1da177e4
LT
488}
489
ae8d8a14 490static void serial_pnp_remove(struct pnp_dev *dev)
1da177e4
LT
491{
492 long line = (long)pnp_get_drvdata(dev);
ee15947c
PH
493
494 dev->capabilities &= ~PNP_CONSOLE;
1da177e4
LT
495 if (line)
496 serial8250_unregister_port(line - 1);
497}
498
72d81961 499static int __maybe_unused serial_pnp_suspend(struct device *dev)
f29219f1 500{
72d81961 501 long line = (long)dev_get_drvdata(dev);
f29219f1
MG
502
503 if (!line)
504 return -ENODEV;
505 serial8250_suspend_port(line - 1);
506 return 0;
507}
508
72d81961 509static int __maybe_unused serial_pnp_resume(struct device *dev)
f29219f1 510{
72d81961 511 long line = (long)dev_get_drvdata(dev);
f29219f1
MG
512
513 if (!line)
514 return -ENODEV;
515 serial8250_resume_port(line - 1);
516 return 0;
517}
72d81961
AS
518
519static SIMPLE_DEV_PM_OPS(serial_pnp_pm_ops, serial_pnp_suspend, serial_pnp_resume);
f29219f1 520
1da177e4
LT
521static struct pnp_driver serial_pnp_driver = {
522 .name = "serial",
1da177e4 523 .probe = serial_pnp_probe,
2d47b716 524 .remove = serial_pnp_remove,
72d81961
AS
525 .driver = {
526 .pm = &serial_pnp_pm_ops,
527 },
f29219f1 528 .id_table = pnp_dev_table,
1da177e4
LT
529};
530
835d844d 531int serial8250_pnp_init(void)
1da177e4
LT
532{
533 return pnp_register_driver(&serial_pnp_driver);
534}
535
835d844d 536void serial8250_pnp_exit(void)
1da177e4
LT
537{
538 pnp_unregister_driver(&serial_pnp_driver);
539}
540