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