/*
 * ACPI support for PNP bus type
 *
 * Copyright (C) 2014, Intel Corporation
 * Authors: Zhang Rui <rui.zhang@intel.com>
 *          Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/acpi.h>
#include <linux/module.h>
#include <linux/ctype.h>

static const struct acpi_device_id acpi_pnp_device_ids[] = {
	/* pata_isapnp */
	{"PNP0600"},		/* Generic ESDI/IDE/ATA compatible hard disk controller */
	/* floppy */
	{"PNP0700"},
	/* ipmi_si */
	{"IPI0001"},
	/* tpm_inf_pnp */
	{"IFX0101"},		/* Infineon TPMs */
	{"IFX0102"},		/* Infineon TPMs */
	/*tpm_tis */
	{"PNP0C31"},		/* TPM */
	{"ATM1200"},		/* Atmel */
	{"IFX0102"},		/* Infineon */
	{"BCM0101"},		/* Broadcom */
	{"BCM0102"},		/* Broadcom */
	{"NSC1200"},		/* National */
	{"ICO0102"},		/* Intel */
	/* ide   */
	{"PNP0600"},		/* Generic ESDI/IDE/ATA compatible hard disk controller */
	/* ns558 */
	{"ASB16fd"},		/* AdLib NSC16 */
	{"AZT3001"},		/* AZT1008 */
	{"CDC0001"},		/* Opl3-SAx */
	{"CSC0001"},		/* CS4232 */
	{"CSC000f"},		/* CS4236 */
	{"CSC0101"},		/* CS4327 */
	{"CTL7001"},		/* SB16 */
	{"CTL7002"},		/* AWE64 */
	{"CTL7005"},		/* Vibra16 */
	{"ENS2020"},		/* SoundscapeVIVO */
	{"ESS0001"},		/* ES1869 */
	{"ESS0005"},		/* ES1878 */
	{"ESS6880"},		/* ES688 */
	{"IBM0012"},		/* CS4232 */
	{"OPT0001"},		/* OPTi Audio16 */
	{"YMH0006"},		/* Opl3-SA */
	{"YMH0022"},		/* Opl3-SAx */
	{"PNPb02f"},		/* Generic */
	/* i8042 kbd */
	{"PNP0300"},
	{"PNP0301"},
	{"PNP0302"},
	{"PNP0303"},
	{"PNP0304"},
	{"PNP0305"},
	{"PNP0306"},
	{"PNP0309"},
	{"PNP030a"},
	{"PNP030b"},
	{"PNP0320"},
	{"PNP0343"},
	{"PNP0344"},
	{"PNP0345"},
	{"CPQA0D7"},
	/* i8042 aux */
	{"AUI0200"},
	{"FJC6000"},
	{"FJC6001"},
	{"PNP0f03"},
	{"PNP0f0b"},
	{"PNP0f0e"},
	{"PNP0f12"},
	{"PNP0f13"},
	{"PNP0f19"},
	{"PNP0f1c"},
	{"SYN0801"},
	/* fcpnp */
	{"AVM0900"},
	/* radio-cadet */
	{"MSM0c24"},		/* ADS Cadet AM/FM Radio Card */
	/* radio-gemtek */
	{"ADS7183"},		/* AOpen FX-3D/Pro Radio */
	/* radio-sf16fmr2 */
	{"MFRad13"},		/* tuner subdevice of SF16-FMD2 */
	/* ene_ir */
	{"ENE0100"},
	{"ENE0200"},
	{"ENE0201"},
	{"ENE0202"},
	/* fintek-cir */
	{"FIT0002"},		/* CIR */
	/* ite-cir */
	{"ITE8704"},		/* Default model */
	{"ITE8713"},		/* CIR found in EEEBox 1501U */
	{"ITE8708"},		/* Bridged IT8512 */
	{"ITE8709"},		/* SRAM-Bridged IT8512 */
	/* nuvoton-cir */
	{"WEC0530"},		/* CIR */
	{"NTN0530"},		/* CIR for new chip's pnp id */
	/* Winbond CIR */
	{"WEC1022"},
	/* wbsd */
	{"WEC0517"},
	{"WEC0518"},
	/* Winbond CIR */
	{"TCM5090"},		/* 3Com Etherlink III (TP) */
	{"TCM5091"},		/* 3Com Etherlink III */
	{"TCM5094"},		/* 3Com Etherlink III (combo) */
	{"TCM5095"},		/* 3Com Etherlink III (TPO) */
	{"TCM5098"},		/* 3Com Etherlink III (TPC) */
	{"PNP80f7"},		/* 3Com Etherlink III compatible */
	{"PNP80f8"},		/* 3Com Etherlink III compatible */
	/* nsc-ircc */
	{"NSC6001"},
	{"HWPC224"},
	{"IBM0071"},
	/* smsc-ircc2 */
	{"SMCf010"},
	/* sb1000 */
	{"GIC1000"},
	/* parport_pc */
	{"PNP0400"},		/* Standard LPT Printer Port */
	{"PNP0401"},		/* ECP Printer Port */
	/* apple-gmux */
	{"APP000B"},
	/* system */
	{"PNP0c02"},		/* General ID for reserving resources */
	{"PNP0c01"},		/* memory controller */
	/* rtc_cmos */
	{"PNP0b00"},
	{"PNP0b01"},
	{"PNP0b02"},
	/* c6xdigio */
	{"PNP0400"},		/* Standard LPT Printer Port */
	{"PNP0401"},		/* ECP Printer Port */
	/* ni_atmio.c */
	{"NIC1900"},
	{"NIC2400"},
	{"NIC2500"},
	{"NIC2600"},
	{"NIC2700"},
	/* serial */
	{"AAC000F"},		/* Archtek America Corp. Archtek SmartLink Modem 3334BT Plug & Play */
	{"ADC0001"},		/* Anchor Datacomm BV. SXPro 144 External Data Fax Modem Plug & Play */
	{"ADC0002"},		/* SXPro 288 External Data Fax Modem Plug & Play */
	{"AEI0250"},		/* PROLiNK 1456VH ISA PnP K56flex Fax Modem */
	{"AEI1240"},		/* Actiontec ISA PNP 56K X2 Fax Modem */
	{"AKY1021"},		/* Rockwell 56K ACF II Fax+Data+Voice Modem */
	{"AZT4001"},		/* AZT3005 PnP SOUND DEVICE */
	{"BDP3336"},		/* Best Data Products Inc. Smart One 336F PnP Modem */
	{"BRI0A49"},		/* Boca Complete Ofc Communicator 14.4 Data-FAX */
	{"BRI1400"},		/* Boca Research 33,600 ACF Modem */
	{"BRI3400"},		/* Boca 33.6 Kbps Internal FD34FSVD */
	{"BRI0A49"},		/* Boca 33.6 Kbps Internal FD34FSVD */
	{"BDP3336"},		/* Best Data Products Inc. Smart One 336F PnP Modem */
	{"CPI4050"},		/* Computer Peripherals Inc. EuroViVa CommCenter-33.6 SP PnP */
	{"CTL3001"},		/* Creative Labs Phone Blaster 28.8 DSVD PnP Voice */
	{"CTL3011"},		/* Creative Labs Modem Blaster 28.8 DSVD PnP Voice */
	{"DAV0336"},		/* Davicom ISA 33.6K Modem */
	{"DMB1032"},		/* Creative Modem Blaster Flash56 DI5601-1 */
	{"DMB2001"},		/* Creative Modem Blaster V.90 DI5660 */
	{"ETT0002"},		/* E-Tech CyberBULLET PC56RVP */
	{"FUJ0202"},		/* Fujitsu 33600 PnP-I2 R Plug & Play */
	{"FUJ0205"},		/* Fujitsu FMV-FX431 Plug & Play */
	{"FUJ0206"},		/* Fujitsu 33600 PnP-I4 R Plug & Play */
	{"FUJ0209"},		/* Fujitsu Fax Voice 33600 PNP-I5 R Plug & Play */
	{"GVC000F"},		/* Archtek SmartLink Modem 3334BT Plug & Play */
	{"GVC0303"},		/* Archtek SmartLink Modem 3334BRV 33.6K Data Fax Voice */
	{"HAY0001"},		/* Hayes Optima 288 V.34-V.FC + FAX + Voice Plug & Play */
	{"HAY000C"},		/* Hayes Optima 336 V.34 + FAX + Voice PnP */
	{"HAY000D"},		/* Hayes Optima 336B V.34 + FAX + Voice PnP */
	{"HAY5670"},		/* Hayes Accura 56K Ext Fax Modem PnP */
	{"HAY5674"},		/* Hayes Accura 56K Ext Fax Modem PnP */
	{"HAY5675"},		/* Hayes Accura 56K Fax Modem PnP */
	{"HAYF000"},		/* Hayes 288, V.34 + FAX */
	{"HAYF001"},		/* Hayes Optima 288 V.34 + FAX + Voice, Plug & Play */
	{"IBM0033"},		/* IBM Thinkpad 701 Internal Modem Voice */
	{"PNP4972"},		/* Intermec CV60 touchscreen port */
	{"IXDC801"},		/* Intertex 28k8 33k6 Voice EXT PnP */
	{"IXDC901"},		/* Intertex 33k6 56k Voice EXT PnP */
	{"IXDD801"},		/* Intertex 28k8 33k6 Voice SP EXT PnP */
	{"IXDD901"},		/* Intertex 33k6 56k Voice SP EXT PnP */
	{"IXDF401"},		/* Intertex 28k8 33k6 Voice SP INT PnP */
	{"IXDF801"},		/* Intertex 28k8 33k6 Voice SP EXT PnP */
	{"IXDF901"},		/* Intertex 33k6 56k Voice SP EXT PnP */
	{"KOR4522"},		/* KORTEX 28800 Externe PnP */
	{"KORF661"},		/* KXPro 33.6 Vocal ASVD PnP */
	{"LAS4040"},		/* LASAT Internet 33600 PnP */
	{"LAS4540"},		/* Lasat Safire 560 PnP */
	{"LAS5440"},		/* Lasat Safire 336  PnP */
	{"MNP0281"},		/* Microcom TravelPorte FAST V.34 Plug & Play */
	{"MNP0336"},		/* Microcom DeskPorte V.34 FAST or FAST+ Plug & Play */
	{"MNP0339"},		/* Microcom DeskPorte FAST EP 28.8 Plug & Play */
	{"MNP0342"},		/* Microcom DeskPorte 28.8P Plug & Play */
	{"MNP0500"},		/* Microcom DeskPorte FAST ES 28.8 Plug & Play */
	{"MNP0501"},		/* Microcom DeskPorte FAST ES 28.8 Plug & Play */
	{"MNP0502"},		/* Microcom DeskPorte 28.8S Internal Plug & Play */
	{"MOT1105"},		/* Motorola BitSURFR Plug & Play */
	{"MOT1111"},		/* Motorola TA210 Plug & Play */
	{"MOT1114"},		/* Motorola HMTA 200 (ISDN) Plug & Play */
	{"MOT1115"},		/* Motorola BitSURFR Plug & Play */
	{"MOT1190"},		/* Motorola Lifestyle 28.8 Internal */
	{"MOT1501"},		/* Motorola V.3400 Plug & Play */
	{"MOT1502"},		/* Motorola Lifestyle 28.8 V.34 Plug & Play */
	{"MOT1505"},		/* Motorola Power 28.8 V.34 Plug & Play */
	{"MOT1509"},		/* Motorola ModemSURFR External 28.8 Plug & Play */
	{"MOT150A"},		/* Motorola Premier 33.6 Desktop Plug & Play */
	{"MOT150F"},		/* Motorola VoiceSURFR 56K External PnP */
	{"MOT1510"},		/* Motorola ModemSURFR 56K External PnP */
	{"MOT1550"},		/* Motorola ModemSURFR 56K Internal PnP */
	{"MOT1560"},		/* Motorola ModemSURFR Internal 28.8 Plug & Play */
	{"MOT1580"},		/* Motorola Premier 33.6 Internal Plug & Play */
	{"MOT15B0"},		/* Motorola OnlineSURFR 28.8 Internal Plug & Play */
	{"MOT15F0"},		/* Motorola VoiceSURFR 56K Internal PnP */
	{"MVX00A1"},		/*  Deskline K56 Phone System PnP */
	{"MVX00F2"},		/* PC Rider K56 Phone System PnP */
	{"nEC8241"},		/* NEC 98NOTE SPEAKER PHONE FAX MODEM(33600bps) */
	{"PMC2430"},		/* Pace 56 Voice Internal Plug & Play Modem */
	{"PNP0500"},		/* Generic standard PC COM port     */
	{"PNP0501"},		/* Generic 16550A-compatible COM port */
	{"PNPC000"},		/* Compaq 14400 Modem */
	{"PNPC001"},		/* Compaq 2400/9600 Modem */
	{"PNPC031"},		/* Dial-Up Networking Serial Cable between 2 PCs */
	{"PNPC032"},		/* Dial-Up Networking Parallel Cable between 2 PCs */
	{"PNPC100"},		/* Standard 9600 bps Modem */
	{"PNPC101"},		/* Standard 14400 bps Modem */
	{"PNPC102"},		/*  Standard 28800 bps Modem */
	{"PNPC103"},		/*  Standard Modem */
	{"PNPC104"},		/*  Standard 9600 bps Modem */
	{"PNPC105"},		/*  Standard 14400 bps Modem */
	{"PNPC106"},		/*  Standard 28800 bps Modem */
	{"PNPC107"},		/*  Standard Modem */
	{"PNPC108"},		/* Standard 9600 bps Modem */
	{"PNPC109"},		/* Standard 14400 bps Modem */
	{"PNPC10A"},		/* Standard 28800 bps Modem */
	{"PNPC10B"},		/* Standard Modem */
	{"PNPC10C"},		/* Standard 9600 bps Modem */
	{"PNPC10D"},		/* Standard 14400 bps Modem */
	{"PNPC10E"},		/* Standard 28800 bps Modem */
	{"PNPC10F"},		/* Standard Modem */
	{"PNP2000"},		/* Standard PCMCIA Card Modem */
	{"ROK0030"},		/* Rockwell 33.6 DPF Internal PnP, Modular Technology 33.6 Internal PnP */
	{"ROK0100"},		/* KORTEX 14400 Externe PnP */
	{"ROK4120"},		/* Rockwell 28.8 */
	{"ROK4920"},		/* Viking 28.8 INTERNAL Fax+Data+Voice PnP */
	{"RSS00A0"},		/* Rockwell 33.6 DPF External PnP, BT Prologue 33.6 External PnP, Modular Technology 33.6 External PnP */
	{"RSS0262"},		/* Viking 56K FAX INT */
	{"RSS0250"},		/* K56 par,VV,Voice,Speakphone,AudioSpan,PnP */
	{"SUP1310"},		/* SupraExpress 28.8 Data/Fax PnP modem */
	{"SUP1381"},		/* SupraExpress 336i PnP Voice Modem */
	{"SUP1421"},		/* SupraExpress 33.6 Data/Fax PnP modem */
	{"SUP1590"},		/* SupraExpress 33.6 Data/Fax PnP modem */
	{"SUP1620"},		/* SupraExpress 336i Sp ASVD */
	{"SUP1760"},		/* SupraExpress 33.6 Data/Fax PnP modem */
	{"SUP2171"},		/* SupraExpress 56i Sp Intl */
	{"TEX0011"},		/* Phoebe Micro 33.6 Data Fax 1433VQH Plug & Play */
	{"UAC000F"},		/* Archtek SmartLink Modem 3334BT Plug & Play */
	{"USR0000"},		/* 3Com Corp. Gateway Telepath IIvi 33.6 */
	{"USR0002"},		/* U.S. Robotics Sporster 33.6K Fax INT PnP */
	{"USR0004"},		/*  Sportster Vi 14.4 PnP FAX Voicemail */
	{"USR0006"},		/* U.S. Robotics 33.6K Voice INT PnP */
	{"USR0007"},		/* U.S. Robotics 33.6K Voice EXT PnP */
	{"USR0009"},		/* U.S. Robotics Courier V.Everything INT PnP */
	{"USR2002"},		/* U.S. Robotics 33.6K Voice INT PnP */
	{"USR2070"},		/* U.S. Robotics 56K Voice INT PnP */
	{"USR2080"},		/* U.S. Robotics 56K Voice EXT PnP */
	{"USR3031"},		/* U.S. Robotics 56K FAX INT */
	{"USR3050"},		/* U.S. Robotics 56K FAX INT */
	{"USR3070"},		/* U.S. Robotics 56K Voice INT PnP */
	{"USR3080"},		/* U.S. Robotics 56K Voice EXT PnP */
	{"USR3090"},		/* U.S. Robotics 56K Voice INT PnP */
	{"USR9100"},		/* U.S. Robotics 56K Message  */
	{"USR9160"},		/* U.S. Robotics 56K FAX EXT PnP */
	{"USR9170"},		/* U.S. Robotics 56K FAX INT PnP */
	{"USR9180"},		/* U.S. Robotics 56K Voice EXT PnP */
	{"USR9190"},		/* U.S. Robotics 56K Voice INT PnP */
	{"WACFXXX"},		/* Wacom tablets */
	{"FPI2002"},		/* Compaq touchscreen */
	{"FUJ02B2"},		/* Fujitsu Stylistic touchscreens */
	{"FUJ02B3"},
	{"FUJ02B4"},		/* Fujitsu Stylistic LT touchscreens */
	{"FUJ02B6"},		/* Passive Fujitsu Stylistic touchscreens */
	{"FUJ02B7"},
	{"FUJ02B8"},
	{"FUJ02B9"},
	{"FUJ02BC"},
	{"FUJ02E5"},		/* Fujitsu Wacom Tablet PC device */
	{"FUJ02E6"},		/* Fujitsu P-series tablet PC device */
	{"FUJ02E7"},		/* Fujitsu Wacom 2FGT Tablet PC device */
	{"FUJ02E9"},		/* Fujitsu Wacom 1FGT Tablet PC device */
	{"LTS0001"},		/* LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in disguise) */
	{"WCI0003"},		/* Rockwell's (PORALiNK) 33600 INT PNP */
	{"WEC1022"},		/* Winbond CIR port, should not be probed. We should keep track of it to prevent the legacy serial driver from probing it */
	/* scl200wdt */
	{"NSC0800"},		/* National Semiconductor PC87307/PC97307 watchdog component */
	/* mpu401 */
	{"PNPb006"},
	/* cs423x-pnpbios */
	{"CSC0100"},
	{"CSC0000"},
	{"GIM0100"},		/* Guillemot Turtlebeach something appears to be cs4232 compatible */
	/* es18xx-pnpbios */
	{"ESS1869"},
	{"ESS1879"},
	/* snd-opl3sa2-pnpbios */
	{"YMH0021"},
	{"NMX2210"},		/* Gateway Solo 2500 */
	{""},
};

static bool matching_id(char *idstr, char *list_id)
{
	int i;

	if (memcmp(idstr, list_id, 3))
		return false;

	for (i = 3; i < 7; i++) {
		char c = toupper(idstr[i]);

		if (!isxdigit(c)
		    || (list_id[i] != 'X' && c != toupper(list_id[i])))
			return false;
	}
	return true;
}

static bool acpi_pnp_match(char *idstr, const struct acpi_device_id **matchid)
{
	const struct acpi_device_id *devid;

	for (devid = acpi_pnp_device_ids; devid->id[0]; devid++)
		if (matching_id(idstr, (char *)devid->id)) {
			if (matchid)
				*matchid = devid;

			return true;
		}

	return false;
}

static int acpi_pnp_attach(struct acpi_device *adev,
			   const struct acpi_device_id *id)
{
	return 1;
}

static struct acpi_scan_handler acpi_pnp_handler = {
	.ids = acpi_pnp_device_ids,
	.match = acpi_pnp_match,
	.attach = acpi_pnp_attach,
};

/*
 * For CMOS RTC devices, the PNP ACPI scan handler does not work, because
 * there is a CMOS RTC ACPI scan handler installed already, so we need to
 * check those devices and enumerate them to the PNP bus directly.
 */
static int is_cmos_rtc_device(struct acpi_device *adev)
{
	struct acpi_device_id ids[] = {
		{ "PNP0B00" },
		{ "PNP0B01" },
		{ "PNP0B02" },
		{""},
	};
	return !acpi_match_device_ids(adev, ids);
}

bool acpi_is_pnp_device(struct acpi_device *adev)
{
	return adev->handler == &acpi_pnp_handler || is_cmos_rtc_device(adev);
}
EXPORT_SYMBOL_GPL(acpi_is_pnp_device);

void __init acpi_pnp_init(void)
{
	acpi_scan_add_handler(&acpi_pnp_handler);
}
