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