8250_pnp.c revision 7fdd4f76e9a289592d020538f1837a7541ea89ff
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/drivers/char/8250_pnp.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Probe module for 8250/16550-type ISAPNP serial ports.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (C) 2001 Russell King, All Rights Reserved.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Ported to the Linux PnP Layer - (C) Adam Belay.
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License as published by
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Free Software Foundation; either version 2 of the License.
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pnp.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/serial_core.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bitops.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/byteorder.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "8250.h"
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define UNKNOWN_DEV 0x3000
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const struct pnp_device_id pnp_dev_table[] = {
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek America Corp. */
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek SmartLink Modem 3334BT Plug & Play */
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AAC000F",		0	},
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Anchor Datacomm BV */
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SXPro 144 External Data Fax Modem Plug & Play */
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ADC0001",		0	},
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SXPro 288 External Data Fax Modem Plug & Play */
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ADC0002",		0	},
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* PROLiNK 1456VH ISA PnP K56flex Fax Modem */
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AEI0250",		0	},
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Actiontec ISA PNP 56K X2 Fax Modem */
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AEI1240",		0	},
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell 56K ACF II Fax+Data+Voice Modem */
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AKY1021",		0 /*SPCI_FL_NO_SHIRQ*/	},
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* AZT3005 PnP SOUND DEVICE */
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AZT4001",		0	},
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Best Data Products Inc. Smart One 336F PnP Modem */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BDP3336",		0	},
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Boca Research */
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Boca Complete Ofc Communicator 14.4 Data-FAX */
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BRI0A49",		0	},
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Boca Research 33,600 ACF Modem */
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BRI1400",		0	},
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Boca 33.6 Kbps Internal FD34FSVD */
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BRI3400",		0	},
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Boca 33.6 Kbps Internal FD34FSVD */
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BRI0A49",		0	},
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Best Data Products Inc. Smart One 336F PnP Modem */
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BDP3336",		0	},
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Computer Peripherals Inc */
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* EuroViVa CommCenter-33.6 SP PnP */
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"CPI4050",		0	},
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative Labs */
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative Labs Phone Blaster 28.8 DSVD PnP Voice */
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"CTL3001",		0	},
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative Labs Modem Blaster 28.8 DSVD PnP Voice */
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"CTL3011",		0	},
70dbd0cf48842700c3a694dcd32b29e63e27f37accBjorn Helgaas	/* Davicom ISA 33.6K Modem */
71dbd0cf48842700c3a694dcd32b29e63e27f37accBjorn Helgaas	{	"DAV0336",		0	},
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative */
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative Modem Blaster Flash56 DI5601-1 */
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"DMB1032",		0	},
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative Modem Blaster V.90 DI5660 */
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"DMB2001",		0	},
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* E-Tech */
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* E-Tech CyberBULLET PC56RVP */
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ETT0002",		0	},
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* FUJITSU */
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Fujitsu 33600 PnP-I2 R Plug & Play */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"FUJ0202",		0	},
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Fujitsu FMV-FX431 Plug & Play */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"FUJ0205",		0	},
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Fujitsu 33600 PnP-I4 R Plug & Play */
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"FUJ0206",		0	},
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Fujitsu Fax Voice 33600 PNP-I5 R Plug & Play */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"FUJ0209",		0	},
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek America Corp. */
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek SmartLink Modem 3334BT Plug & Play */
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"GVC000F",		0	},
9251587cb54fb2b27c5e0db9078a61261c9359142aBjorn Helgaas	/* Archtek SmartLink Modem 3334BRV 33.6K Data Fax Voice */
9351587cb54fb2b27c5e0db9078a61261c9359142aBjorn Helgaas	{	"GVC0303",		0	},
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes */
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes Optima 288 V.34-V.FC + FAX + Voice Plug & Play */
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"HAY0001",		0	},
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes Optima 336 V.34 + FAX + Voice PnP */
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"HAY000C",		0	},
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes Optima 336B V.34 + FAX + Voice PnP */
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"HAY000D",		0	},
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes Accura 56K Ext Fax Modem PnP */
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"HAY5670",		0	},
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes Accura 56K Ext Fax Modem PnP */
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"HAY5674",		0	},
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes Accura 56K Fax Modem PnP */
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"HAY5675",		0	},
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes 288, V.34 + FAX */
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"HAYF000",		0	},
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hayes Optima 288 V.34 + FAX + Voice, Plug & Play */
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"HAYF001",		0	},
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* IBM */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* IBM Thinkpad 701 Internal Modem Voice */
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IBM0033",		0	},
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex */
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 28k8 33k6 Voice EXT PnP */
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDC801",		0	},
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 33k6 56k Voice EXT PnP */
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDC901",		0	},
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 28k8 33k6 Voice SP EXT PnP */
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDD801",		0	},
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 33k6 56k Voice SP EXT PnP */
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDD901",		0	},
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 28k8 33k6 Voice SP INT PnP */
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDF401",		0	},
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 28k8 33k6 Voice SP EXT PnP */
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDF801",		0	},
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 33k6 56k Voice SP EXT PnP */
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDF901",		0	},
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Kortex International */
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* KORTEX 28800 Externe PnP */
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"KOR4522",		0	},
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* KXPro 33.6 Vocal ASVD PnP */
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"KORF661",		0	},
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Lasat */
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* LASAT Internet 33600 PnP */
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"LAS4040",		0	},
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Lasat Safire 560 PnP */
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"LAS4540",		0	},
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Lasat Safire 336  PnP */
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"LAS5440",		0	},
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom, Inc. */
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom TravelPorte FAST V.34 Plug & Play */
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0281",		0	},
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte V.34 FAST or FAST+ Plug & Play */
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0336",		0	},
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte FAST EP 28.8 Plug & Play */
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0339",		0	},
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte 28.8P Plug & Play */
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0342",		0	},
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte FAST ES 28.8 Plug & Play */
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0500",		0	},
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte FAST ES 28.8 Plug & Play */
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0501",		0	},
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte 28.8S Internal Plug & Play */
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0502",		0	},
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola */
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola BitSURFR Plug & Play */
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1105",		0	},
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola TA210 Plug & Play */
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1111",		0	},
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola HMTA 200 (ISDN) Plug & Play */
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1114",		0	},
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola BitSURFR Plug & Play */
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1115",		0	},
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Lifestyle 28.8 Internal */
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1190",		0	},
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola V.3400 Plug & Play */
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1501",		0	},
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Lifestyle 28.8 V.34 Plug & Play */
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1502",		0	},
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Power 28.8 V.34 Plug & Play */
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1505",		0	},
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola ModemSURFR External 28.8 Plug & Play */
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1509",		0	},
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Premier 33.6 Desktop Plug & Play */
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT150A",		0	},
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola VoiceSURFR 56K External PnP */
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT150F",		0	},
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola ModemSURFR 56K External PnP */
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1510",		0	},
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola ModemSURFR 56K Internal PnP */
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1550",		0	},
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola ModemSURFR Internal 28.8 Plug & Play */
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1560",		0	},
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Premier 33.6 Internal Plug & Play */
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1580",		0	},
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola OnlineSURFR 28.8 Internal Plug & Play */
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT15B0",		0	},
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola VoiceSURFR 56K Internal PnP */
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT15F0",		0	},
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Com 1 */
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Deskline K56 Phone System PnP */
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MVX00A1",		0	},
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* PC Rider K56 Phone System PnP */
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MVX00F2",		0	},
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* NEC 98NOTE SPEAKER PHONE FAX MODEM(33600bps) */
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"nEC8241",		0	},
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Pace 56 Voice Internal Plug & Play Modem */
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PMC2430",		0	},
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Generic */
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Generic standard PC COM port	 */
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNP0500",		0	},
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Generic 16550A-compatible COM port */
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNP0501",		0	},
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Compaq 14400 Modem */
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC000",		0	},
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Compaq 2400/9600 Modem */
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC001",		0	},
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Dial-Up Networking Serial Cable between 2 PCs */
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC031",		0	},
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Dial-Up Networking Parallel Cable between 2 PCs */
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC032",		0	},
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 9600 bps Modem */
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC100",		0	},
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 14400 bps Modem */
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC101",		0	},
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard 28800 bps Modem*/
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC102",		0	},
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard Modem*/
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC103",		0	},
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard 9600 bps Modem*/
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC104",		0	},
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard 14400 bps Modem*/
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC105",		0	},
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard 28800 bps Modem*/
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC106",		0	},
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard Modem */
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC107",		0	},
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 9600 bps Modem */
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC108",		0	},
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 14400 bps Modem */
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC109",		0	},
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 28800 bps Modem */
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10A",		0	},
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard Modem */
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10B",		0	},
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 9600 bps Modem */
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10C",		0	},
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 14400 bps Modem */
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10D",		0	},
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 28800 bps Modem */
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10E",		0	},
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard Modem */
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10F",		0	},
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard PCMCIA Card Modem */
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNP2000",		0	},
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell */
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Modular Technology */
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell 33.6 DPF Internal PnP */
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Modular Technology 33.6 Internal PnP */
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ROK0030",		0	},
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Kortex International */
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* KORTEX 14400 Externe PnP */
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ROK0100",		0	},
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell 28.8 */
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ROK4120",		0	},
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Viking Components, Inc */
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Viking 28.8 INTERNAL Fax+Data+Voice PnP */
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ROK4920",		0	},
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell */
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* British Telecom */
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Modular Technology */
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell 33.6 DPF External PnP */
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* BT Prologue 33.6 External PnP */
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Modular Technology 33.6 External PnP */
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"RSS00A0",		0	},
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Viking 56K FAX INT */
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"RSS0262",		0	},
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* K56 par,VV,Voice,Speakphone,AudioSpan,PnP */
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{       "RSS0250",              0       },
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SupraExpress 28.8 Data/Fax PnP modem */
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"SUP1310",		0	},
2737fdd4f76e9a289592d020538f1837a7541ea89ffDaniel Gagnon	/* SupraExpress 336i PnP Voice Modem */
2747fdd4f76e9a289592d020538f1837a7541ea89ffDaniel Gagnon	{	"SUP1381",		0	},
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SupraExpress 33.6 Data/Fax PnP modem */
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"SUP1421",		0	},
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SupraExpress 33.6 Data/Fax PnP modem */
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"SUP1590",		0	},
27904f03bf7dbd04c15c30d91c6a277f6970cc4ef14Baris Cicek	/* SupraExpress 336i Sp ASVD */
28004f03bf7dbd04c15c30d91c6a277f6970cc4ef14Baris Cicek	{	"SUP1620",		0	},
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SupraExpress 33.6 Data/Fax PnP modem */
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"SUP1760",		0	},
283c1542cbc50d19565006633827532ab9f96c92ceamaximilian attems	/* SupraExpress 56i Sp Intl */
284c1542cbc50d19565006633827532ab9f96c92ceamaximilian attems	{	"SUP2171",		0	},
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Phoebe Micro */
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Phoebe Micro 33.6 Data Fax 1433VQH Plug & Play */
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"TEX0011",		0	},
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek America Corp. */
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek SmartLink Modem 3334BT Plug & Play */
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"UAC000F",		0	},
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* 3Com Corp. */
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Gateway Telepath IIvi 33.6 */
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0000",		0	},
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics Sporster 33.6K Fax INT PnP */
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0002",		0	},
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Sportster Vi 14.4 PnP FAX Voicemail */
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0004",		0	},
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 33.6K Voice INT PnP */
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0006",		0	},
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 33.6K Voice EXT PnP */
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0007",		0	},
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics Courier V.Everything INT PnP */
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0009",		0	},
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 33.6K Voice INT PnP */
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR2002",		0	},
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice INT PnP */
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR2070",		0	},
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice EXT PnP */
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR2080",		0	},
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K FAX INT */
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3031",		0	},
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K FAX INT */
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3050",		0	},
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice INT PnP */
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3070",		0	},
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice EXT PnP */
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3080",		0	},
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice INT PnP */
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3090",		0	},
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Message  */
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9100",		0	},
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K FAX EXT PnP*/
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9160",		0	},
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K FAX INT PnP*/
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9170",		0	},
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice EXT PnP*/
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9180",		0	},
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice INT PnP*/
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9190",		0	},
330b07076e6173a2593e369c3375f07c1cd7d78c36fBen Collins	/* Wacom tablets */
331b07076e6173a2593e369c3375f07c1cd7d78c36fBen Collins	{	"WACF004",		0	},
332fa609435a6edaaca14a646d470d7e10abebc8604Bjorn Helgaas	{	"WACF005",		0	},
333b07076e6173a2593e369c3375f07c1cd7d78c36fBen Collins	{       "WACF006",              0       },
334cc84634f29d5a92932400a2d52ca17dee2c8a462Maik Broemme	{       "WACF007",              0       },
335cc84634f29d5a92932400a2d52ca17dee2c8a462Maik Broemme	{       "WACF008",              0       },
33675fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	/* Compaq touchscreen */
33775fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FPI2002",              0 },
33875fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	/* Fujitsu Stylistic touchscreens */
33975fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FUJ02B2",              0 },
34075fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FUJ02B3",              0 },
34175fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	/* Fujitsu Stylistic LT touchscreens */
34275fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FUJ02B4",              0 },
34375fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	/* Passive Fujitsu Stylistic touchscreens */
34475fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FUJ02B6",              0 },
34575fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FUJ02B7",              0 },
34675fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FUJ02B8",              0 },
34775fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FUJ02B9",              0 },
34875fde2eddcfcd1dcc87a72dc6cd3c859420b6148Matthew Garrett	{       "FUJ02BC",              0 },
3496149dd5cfaea9889060f2c039eaf45e2b39f7fb3Danny Kukawka	/* Fujitsu Wacom Tablet PC devices */
3506149dd5cfaea9889060f2c039eaf45e2b39f7fb3Danny Kukawka	{	"FUJ02E5",		0	},
3516149dd5cfaea9889060f2c039eaf45e2b39f7fb3Danny Kukawka	{	"FUJ02E6",		0	},
3527105458563213b6f6fb523065474cfe1d6c22a67Damian Jurd	/*
3537105458563213b6f6fb523065474cfe1d6c22a67Damian Jurd	 * LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in
3547105458563213b6f6fb523065474cfe1d6c22a67Damian Jurd	 * disguise)
3557105458563213b6f6fb523065474cfe1d6c22a67Damian Jurd	 */
3567105458563213b6f6fb523065474cfe1d6c22a67Damian Jurd	{	"LTS0001",		0       },
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell's (PORALiNK) 33600 INT PNP */
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"WCI0003",		0	},
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Unkown PnP modems */
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPCXXX",		UNKNOWN_DEV	},
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* More unkown PnP modems */
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPDXXX",		UNKNOWN_DEV	},
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"",			0	}
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pnp, pnp_dev_table);
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char *modem_names[] __devinitdata = {
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"MODEM", "Modem", "modem", "FAX", "Fax", "fax",
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"56K", "56k", "K56", "33.6", "28.8", "14.4",
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"33,600", "28,800", "14,400", "33.600", "28.800", "14.400",
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"33600", "28800", "14400", "V.90", "V.34", "V.32", NULL
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit check_name(char *name)
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char **tmp;
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (tmp = modem_names; *tmp; tmp++)
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (strstr(name, *tmp))
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
38657fd51a8be26921b56747ddd09d1d9e01c11c9e0Bjorn Helgaasstatic int __devinit check_resources(struct pnp_dev *dev)
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
38857fd51a8be26921b56747ddd09d1d9e01c11c9e0Bjorn Helgaas	resource_size_t base[] = {0x2f8, 0x3f8, 0x2e8, 0x3e8};
38957fd51a8be26921b56747ddd09d1d9e01c11c9e0Bjorn Helgaas	int i;
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39157fd51a8be26921b56747ddd09d1d9e01c11c9e0Bjorn Helgaas	for (i = 0; i < ARRAY_SIZE(base); i++) {
39257fd51a8be26921b56747ddd09d1d9e01c11c9e0Bjorn Helgaas		if (pnp_possible_config(dev, IORESOURCE_IO, base[i], 8))
39357fd51a8be26921b56747ddd09d1d9e01c11c9e0Bjorn Helgaas			return 1;
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Given a complete unknown PnP device, try to use some heuristics to
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * detect modems. Currently use such heuristic set:
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     - dev->name or dev->bus->name must contain "modem" substring;
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     - device must have only one IO region (8 byte long) with base address
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       0x2e8, 0x3e8, 0x2f8 or 0x3f8.
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Such detection looks very ugly, but can detect at least some of numerous
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PnP modems, alternatively we must hardcode all modems in pnp_devices[]
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * table.
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags)
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4123e8d4e2075e049664294722b436edfc5ced6ca53Alan Cox	if (!(check_name(pnp_dev_name(dev)) ||
4133e8d4e2075e049664294722b436edfc5ced6ca53Alan Cox		(dev->card && check_name(dev->card->name))))
4143e8d4e2075e049664294722b436edfc5ced6ca53Alan Cox			return -ENODEV;
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41657fd51a8be26921b56747ddd09d1d9e01c11c9e0Bjorn Helgaas	if (check_resources(dev))
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return -ENODEV;
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit
423655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaasserial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct uart_port port;
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int ret, line, flags = dev_id->driver_data;
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (flags & UNKNOWN_DEV) {
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = serial_pnp_guess_board(dev, &flags);
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ret < 0)
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return ret;
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memset(&port, 0, sizeof(struct uart_port));
435e02f5f52cafbea013817d81f1acc4baf50d6324bBjorn Helgaas	if (pnp_irq_valid(dev, 0))
436e02f5f52cafbea013817d81f1acc4baf50d6324bBjorn Helgaas		port.irq = pnp_irq(dev, 0);
437655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	if (pnp_port_valid(dev, 0)) {
438655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.iobase = pnp_port_start(dev, 0);
439655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.iotype = UPIO_PORT;
440655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	} else if (pnp_mem_valid(dev, 0)) {
441655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.mapbase = pnp_mem_start(dev, 0);
442655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.iotype = UPIO_MEM;
443655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.flags = UPF_IOREMAP;
444655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	} else
445655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		return -ENODEV;
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef SERIAL_DEBUG_PNP
4483e8d4e2075e049664294722b436edfc5ced6ca53Alan Cox	printk(KERN_DEBUG
4493e8d4e2075e049664294722b436edfc5ced6ca53Alan Cox		"Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n",
4503e8d4e2075e049664294722b436edfc5ced6ca53Alan Cox		       port.iobase, port.mapbase, port.irq, port.iotype);
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
453655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
454cb6358eb69d9854f65f2979c0ce9280eee041828Bjorn Helgaas	if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE)
455cb6358eb69d9854f65f2979c0ce9280eee041828Bjorn Helgaas		port.flags |= UPF_SHARE_IRQ;
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	port.uartclk = 1843200;
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	port.dev = &dev->dev;
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	line = serial8250_register_port(&port);
4609b22271d4b8c1be8a81563c322d3f04e7cbe2153Bjorn Helgaas	if (line < 0)
4619b22271d4b8c1be8a81563c322d3f04e7cbe2153Bjorn Helgaas		return -ENODEV;
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4639b22271d4b8c1be8a81563c322d3f04e7cbe2153Bjorn Helgaas	pnp_set_drvdata(dev, (void *)((long)line + 1));
4649b22271d4b8c1be8a81563c322d3f04e7cbe2153Bjorn Helgaas	return 0;
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
467655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaasstatic void __devexit serial_pnp_remove(struct pnp_dev *dev)
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	long line = (long)pnp_get_drvdata(dev);
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (line)
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		serial8250_unregister_port(line - 1);
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
474f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith#ifdef CONFIG_PM
475f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraithstatic int serial_pnp_suspend(struct pnp_dev *dev, pm_message_t state)
476f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith{
477f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	long line = (long)pnp_get_drvdata(dev);
478f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith
479f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	if (!line)
480f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith		return -ENODEV;
481f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	serial8250_suspend_port(line - 1);
482f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	return 0;
483f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith}
484f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith
485f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraithstatic int serial_pnp_resume(struct pnp_dev *dev)
486f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith{
487f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	long line = (long)pnp_get_drvdata(dev);
488f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith
489f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	if (!line)
490f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith		return -ENODEV;
491f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	serial8250_resume_port(line - 1);
492f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	return 0;
493f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith}
494f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith#else
495f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith#define serial_pnp_suspend NULL
496f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith#define serial_pnp_resume NULL
497f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith#endif /* CONFIG_PM */
498f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pnp_driver serial_pnp_driver = {
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.name		= "serial",
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.probe		= serial_pnp_probe,
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.remove		= __devexit_p(serial_pnp_remove),
503f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	.suspend	= serial_pnp_suspend,
504f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	.resume		= serial_pnp_resume,
505f29219f17ae46cc182123bc7d2089b69869935aeMike Galbraith	.id_table	= pnp_dev_table,
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init serial8250_pnp_init(void)
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return pnp_register_driver(&serial_pnp_driver);
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit serial8250_pnp_exit(void)
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pnp_unregister_driver(&serial_pnp_driver);
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(serial8250_pnp_init);
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(serial8250_pnp_exit);
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL");
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("Generic 8250/16x50 PnP serial driver");
523