8250_pnp.c revision cb6358eb69d9854f65f2979c0ce9280eee041828
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 *  $Id: 8250_pnp.c,v 1.10 2002/07/21 21:32:30 rmk Exp $
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pnp.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/serial_core.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bitops.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/byteorder.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "8250.h"
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define UNKNOWN_DEV 0x3000
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const struct pnp_device_id pnp_dev_table[] = {
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek America Corp. */
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek SmartLink Modem 3334BT Plug & Play */
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AAC000F",		0	},
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Anchor Datacomm BV */
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SXPro 144 External Data Fax Modem Plug & Play */
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ADC0001",		0	},
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SXPro 288 External Data Fax Modem Plug & Play */
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ADC0002",		0	},
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* PROLiNK 1456VH ISA PnP K56flex Fax Modem */
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AEI0250",		0	},
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Actiontec ISA PNP 56K X2 Fax Modem */
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AEI1240",		0	},
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell 56K ACF II Fax+Data+Voice Modem */
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AKY1021",		0 /*SPCI_FL_NO_SHIRQ*/	},
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* AZT3005 PnP SOUND DEVICE */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"AZT4001",		0	},
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Best Data Products Inc. Smart One 336F PnP Modem */
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BDP3336",		0	},
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Boca Research */
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Boca Complete Ofc Communicator 14.4 Data-FAX */
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BRI0A49",		0	},
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Boca Research 33,600 ACF Modem */
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BRI1400",		0	},
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Boca 33.6 Kbps Internal FD34FSVD */
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BRI3400",		0	},
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Boca 33.6 Kbps Internal FD34FSVD */
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BRI0A49",		0	},
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Best Data Products Inc. Smart One 336F PnP Modem */
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"BDP3336",		0	},
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Computer Peripherals Inc */
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* EuroViVa CommCenter-33.6 SP PnP */
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"CPI4050",		0	},
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative Labs */
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative Labs Phone Blaster 28.8 DSVD PnP Voice */
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"CTL3001",		0	},
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Creative Labs Modem Blaster 28.8 DSVD PnP Voice */
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"CTL3011",		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	},
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	},
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex */
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 28k8 33k6 Voice EXT PnP */
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDC801",		0	},
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 33k6 56k Voice EXT PnP */
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDC901",		0	},
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 28k8 33k6 Voice SP EXT PnP */
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDD801",		0	},
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 33k6 56k Voice SP EXT PnP */
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDD901",		0	},
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 28k8 33k6 Voice SP INT PnP */
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDF401",		0	},
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 28k8 33k6 Voice SP EXT PnP */
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDF801",		0	},
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Intertex 33k6 56k Voice SP EXT PnP */
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"IXDF901",		0	},
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Kortex International */
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* KORTEX 28800 Externe PnP */
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"KOR4522",		0	},
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* KXPro 33.6 Vocal ASVD PnP */
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"KORF661",		0	},
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Lasat */
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* LASAT Internet 33600 PnP */
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"LAS4040",		0	},
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Lasat Safire 560 PnP */
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"LAS4540",		0	},
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Lasat Safire 336  PnP */
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"LAS5440",		0	},
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom, Inc. */
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom TravelPorte FAST V.34 Plug & Play */
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0281",		0	},
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte V.34 FAST or FAST+ Plug & Play */
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0336",		0	},
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte FAST EP 28.8 Plug & Play */
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0339",		0	},
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte 28.8P Plug & Play */
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0342",		0	},
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte FAST ES 28.8 Plug & Play */
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0500",		0	},
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte FAST ES 28.8 Plug & Play */
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0501",		0	},
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Microcom DeskPorte 28.8S Internal Plug & Play */
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MNP0502",		0	},
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola */
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola BitSURFR Plug & Play */
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1105",		0	},
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola TA210 Plug & Play */
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1111",		0	},
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola HMTA 200 (ISDN) Plug & Play */
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1114",		0	},
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola BitSURFR Plug & Play */
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1115",		0	},
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Lifestyle 28.8 Internal */
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1190",		0	},
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola V.3400 Plug & Play */
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1501",		0	},
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Lifestyle 28.8 V.34 Plug & Play */
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1502",		0	},
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Power 28.8 V.34 Plug & Play */
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1505",		0	},
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola ModemSURFR External 28.8 Plug & Play */
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1509",		0	},
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Premier 33.6 Desktop Plug & Play */
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT150A",		0	},
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola VoiceSURFR 56K External PnP */
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT150F",		0	},
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola ModemSURFR 56K External PnP */
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1510",		0	},
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola ModemSURFR 56K Internal PnP */
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1550",		0	},
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola ModemSURFR Internal 28.8 Plug & Play */
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1560",		0	},
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola Premier 33.6 Internal Plug & Play */
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT1580",		0	},
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola OnlineSURFR 28.8 Internal Plug & Play */
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT15B0",		0	},
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Motorola VoiceSURFR 56K Internal PnP */
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MOT15F0",		0	},
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Com 1 */
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Deskline K56 Phone System PnP */
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MVX00A1",		0	},
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* PC Rider K56 Phone System PnP */
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"MVX00F2",		0	},
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* NEC 98NOTE SPEAKER PHONE FAX MODEM(33600bps) */
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"nEC8241",		0	},
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Pace 56 Voice Internal Plug & Play Modem */
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PMC2430",		0	},
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Generic */
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Generic standard PC COM port	 */
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNP0500",		0	},
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Generic 16550A-compatible COM port */
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNP0501",		0	},
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Compaq 14400 Modem */
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC000",		0	},
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Compaq 2400/9600 Modem */
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC001",		0	},
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Dial-Up Networking Serial Cable between 2 PCs */
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC031",		0	},
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Dial-Up Networking Parallel Cable between 2 PCs */
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC032",		0	},
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 9600 bps Modem */
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC100",		0	},
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 14400 bps Modem */
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC101",		0	},
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard 28800 bps Modem*/
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC102",		0	},
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard Modem*/
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC103",		0	},
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard 9600 bps Modem*/
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC104",		0	},
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard 14400 bps Modem*/
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC105",		0	},
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard 28800 bps Modem*/
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC106",		0	},
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Standard Modem */
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC107",		0	},
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 9600 bps Modem */
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC108",		0	},
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 14400 bps Modem */
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC109",		0	},
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 28800 bps Modem */
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10A",		0	},
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard Modem */
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10B",		0	},
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 9600 bps Modem */
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10C",		0	},
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 14400 bps Modem */
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10D",		0	},
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard 28800 bps Modem */
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10E",		0	},
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard Modem */
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPC10F",		0	},
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Standard PCMCIA Card Modem */
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNP2000",		0	},
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell */
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Modular Technology */
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell 33.6 DPF Internal PnP */
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Modular Technology 33.6 Internal PnP */
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ROK0030",		0	},
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Kortex International */
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* KORTEX 14400 Externe PnP */
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ROK0100",		0	},
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell 28.8 */
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ROK4120",		0	},
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Viking Components, Inc */
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Viking 28.8 INTERNAL Fax+Data+Voice PnP */
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"ROK4920",		0	},
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell */
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* British Telecom */
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Modular Technology */
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell 33.6 DPF External PnP */
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* BT Prologue 33.6 External PnP */
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Modular Technology 33.6 External PnP */
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"RSS00A0",		0	},
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Viking 56K FAX INT */
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"RSS0262",		0	},
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* K56 par,VV,Voice,Speakphone,AudioSpan,PnP */
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{       "RSS0250",              0       },
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SupraExpress 28.8 Data/Fax PnP modem */
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"SUP1310",		0	},
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SupraExpress 33.6 Data/Fax PnP modem */
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"SUP1421",		0	},
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SupraExpress 33.6 Data/Fax PnP modem */
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"SUP1590",		0	},
27504f03bf7dbd04c15c30d91c6a277f6970cc4ef14Baris Cicek	/* SupraExpress 336i Sp ASVD */
27604f03bf7dbd04c15c30d91c6a277f6970cc4ef14Baris Cicek	{	"SUP1620",		0	},
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* SupraExpress 33.6 Data/Fax PnP modem */
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"SUP1760",		0	},
279c1542cbc50d19565006633827532ab9f96c92ceamaximilian attems	/* SupraExpress 56i Sp Intl */
280c1542cbc50d19565006633827532ab9f96c92ceamaximilian attems	{	"SUP2171",		0	},
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Phoebe Micro */
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Phoebe Micro 33.6 Data Fax 1433VQH Plug & Play */
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"TEX0011",		0	},
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek America Corp. */
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Archtek SmartLink Modem 3334BT Plug & Play */
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"UAC000F",		0	},
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* 3Com Corp. */
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Gateway Telepath IIvi 33.6 */
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0000",		0	},
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics Sporster 33.6K Fax INT PnP */
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0002",		0	},
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  Sportster Vi 14.4 PnP FAX Voicemail */
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0004",		0	},
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 33.6K Voice INT PnP */
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0006",		0	},
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 33.6K Voice EXT PnP */
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0007",		0	},
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics Courier V.Everything INT PnP */
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR0009",		0	},
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 33.6K Voice INT PnP */
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR2002",		0	},
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice INT PnP */
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR2070",		0	},
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice EXT PnP */
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR2080",		0	},
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K FAX INT */
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3031",		0	},
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K FAX INT */
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3050",		0	},
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice INT PnP */
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3070",		0	},
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice EXT PnP */
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3080",		0	},
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice INT PnP */
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR3090",		0	},
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Message  */
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9100",		0	},
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K FAX EXT PnP*/
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9160",		0	},
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K FAX INT PnP*/
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9170",		0	},
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice EXT PnP*/
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9180",		0	},
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* U.S. Robotics 56K Voice INT PnP*/
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"USR9190",		0	},
326b07076e6173a2593e369c3375f07c1cd7d78c36fBen Collins	/* Wacom tablets */
327b07076e6173a2593e369c3375f07c1cd7d78c36fBen Collins	{	"WACF004",		0	},
328fa609435a6edaaca14a646d470d7e10abebc8604Bjorn Helgaas	{	"WACF005",		0	},
329b07076e6173a2593e369c3375f07c1cd7d78c36fBen Collins	{       "WACF006",              0       },
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Rockwell's (PORALiNK) 33600 INT PNP */
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"WCI0003",		0	},
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Unkown PnP modems */
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPCXXX",		UNKNOWN_DEV	},
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* More unkown PnP modems */
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"PNPDXXX",		UNKNOWN_DEV	},
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{	"",			0	}
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pnp, pnp_dev_table);
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char *modem_names[] __devinitdata = {
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"MODEM", "Modem", "modem", "FAX", "Fax", "fax",
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"56K", "56k", "K56", "33.6", "28.8", "14.4",
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"33,600", "28,800", "14,400", "33.600", "28.800", "14.400",
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"33600", "28800", "14400", "V.90", "V.34", "V.32", NULL
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit check_name(char *name)
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char **tmp;
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (tmp = modem_names; *tmp; tmp++)
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (strstr(name, *tmp))
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit check_resources(struct pnp_option *option)
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pnp_option *tmp;
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!option)
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (tmp = option; tmp; tmp = tmp->next) {
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct pnp_port *port;
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (port = tmp->port; port; port = port->next)
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if ((port->size == 8) &&
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			    ((port->min == 0x2f8) ||
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			     (port->min == 0x3f8) ||
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			     (port->min == 0x2e8) ||
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			     (port->min == 0x3e8)))
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 1;
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Given a complete unknown PnP device, try to use some heuristics to
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * detect modems. Currently use such heuristic set:
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     - dev->name or dev->bus->name must contain "modem" substring;
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     - device must have only one IO region (8 byte long) with base address
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       0x2e8, 0x3e8, 0x2f8 or 0x3f8.
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Such detection looks very ugly, but can detect at least some of numerous
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PnP modems, alternatively we must hardcode all modems in pnp_devices[]
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * table.
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags)
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(check_name(pnp_dev_name(dev)) || (dev->card && check_name(dev->card->name))))
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (check_resources(dev->independent))
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (check_resources(dev->dependent))
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return -ENODEV;
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit
405655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaasserial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct uart_port port;
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int ret, line, flags = dev_id->driver_data;
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (flags & UNKNOWN_DEV) {
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = serial_pnp_guess_board(dev, &flags);
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ret < 0)
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return ret;
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memset(&port, 0, sizeof(struct uart_port));
417655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	port.irq = pnp_irq(dev, 0);
418655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	if (pnp_port_valid(dev, 0)) {
419655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.iobase = pnp_port_start(dev, 0);
420655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.iotype = UPIO_PORT;
421655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	} else if (pnp_mem_valid(dev, 0)) {
422655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.mapbase = pnp_mem_start(dev, 0);
423655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.iotype = UPIO_MEM;
424655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		port.flags = UPF_IOREMAP;
425655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	} else
426655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas		return -ENODEV;
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef SERIAL_DEBUG_PNP
429655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	printk("Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n",
430655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	       port.iobase, port.mapbase, port.irq, port.iotype);
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
433655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaas	port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
434cb6358eb69d9854f65f2979c0ce9280eee041828Bjorn Helgaas	if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE)
435cb6358eb69d9854f65f2979c0ce9280eee041828Bjorn Helgaas		port.flags |= UPF_SHARE_IRQ;
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	port.uartclk = 1843200;
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	port.dev = &dev->dev;
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	line = serial8250_register_port(&port);
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (line >= 0)
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pnp_set_drvdata(dev, (void *)((long)line + 1));
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return line >= 0 ? 0 : -ENODEV;
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
447655a0a7799cddf9a469916c07ac22f1106abc2beBjorn Helgaasstatic void __devexit serial_pnp_remove(struct pnp_dev *dev)
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	long line = (long)pnp_get_drvdata(dev);
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (line)
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		serial8250_unregister_port(line - 1);
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pnp_driver serial_pnp_driver = {
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.name		= "serial",
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.id_table	= pnp_dev_table,
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.probe		= serial_pnp_probe,
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.remove		= __devexit_p(serial_pnp_remove),
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init serial8250_pnp_init(void)
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return pnp_register_driver(&serial_pnp_driver);
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit serial8250_pnp_exit(void)
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pnp_unregister_driver(&serial_pnp_driver);
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(serial8250_pnp_init);
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(serial8250_pnp_exit);
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL");
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("Generic 8250/16x50 PnP serial driver");
476