Zhang Rui | eec15ed | 2014-05-30 04:23:01 +0200 | [diff] [blame] | 1 | /* |
| 2 | * ACPI support for PNP bus type |
| 3 | * |
| 4 | * Copyright (C) 2014, Intel Corporation |
| 5 | * Authors: Zhang Rui <rui.zhang@intel.com> |
| 6 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. |
| 11 | */ |
| 12 | |
| 13 | #include <linux/acpi.h> |
| 14 | #include <linux/module.h> |
| 15 | |
| 16 | static const struct acpi_device_id acpi_pnp_device_ids[] = { |
| 17 | /* pata_isapnp */ |
| 18 | {"PNP0600"}, /* Generic ESDI/IDE/ATA compatible hard disk controller */ |
| 19 | /* floppy */ |
| 20 | {"PNP0700"}, |
| 21 | /* ipmi_si */ |
| 22 | {"IPI0001"}, |
| 23 | /* tpm_inf_pnp */ |
| 24 | {"IFX0101"}, /* Infineon TPMs */ |
| 25 | {"IFX0102"}, /* Infineon TPMs */ |
| 26 | /*tpm_tis */ |
| 27 | {"PNP0C31"}, /* TPM */ |
| 28 | {"ATM1200"}, /* Atmel */ |
| 29 | {"IFX0102"}, /* Infineon */ |
| 30 | {"BCM0101"}, /* Broadcom */ |
| 31 | {"BCM0102"}, /* Broadcom */ |
| 32 | {"NSC1200"}, /* National */ |
| 33 | {"ICO0102"}, /* Intel */ |
| 34 | /* ide */ |
| 35 | {"PNP0600"}, /* Generic ESDI/IDE/ATA compatible hard disk controller */ |
| 36 | /* ns558 */ |
Zhang Rui | eec15ed | 2014-05-30 04:23:01 +0200 | [diff] [blame] | 37 | {"ASB16fd"}, /* AdLib NSC16 */ |
| 38 | {"AZT3001"}, /* AZT1008 */ |
| 39 | {"CDC0001"}, /* Opl3-SAx */ |
| 40 | {"CSC0001"}, /* CS4232 */ |
| 41 | {"CSC000f"}, /* CS4236 */ |
| 42 | {"CSC0101"}, /* CS4327 */ |
| 43 | {"CTL7001"}, /* SB16 */ |
| 44 | {"CTL7002"}, /* AWE64 */ |
| 45 | {"CTL7005"}, /* Vibra16 */ |
| 46 | {"ENS2020"}, /* SoundscapeVIVO */ |
| 47 | {"ESS0001"}, /* ES1869 */ |
| 48 | {"ESS0005"}, /* ES1878 */ |
| 49 | {"ESS6880"}, /* ES688 */ |
| 50 | {"IBM0012"}, /* CS4232 */ |
| 51 | {"OPT0001"}, /* OPTi Audio16 */ |
| 52 | {"YMH0006"}, /* Opl3-SA */ |
| 53 | {"YMH0022"}, /* Opl3-SAx */ |
| 54 | {"PNPb02f"}, /* Generic */ |
| 55 | /* i8042 kbd */ |
| 56 | {"PNP0300"}, |
| 57 | {"PNP0301"}, |
| 58 | {"PNP0302"}, |
| 59 | {"PNP0303"}, |
| 60 | {"PNP0304"}, |
| 61 | {"PNP0305"}, |
| 62 | {"PNP0306"}, |
| 63 | {"PNP0309"}, |
| 64 | {"PNP030a"}, |
| 65 | {"PNP030b"}, |
| 66 | {"PNP0320"}, |
| 67 | {"PNP0343"}, |
| 68 | {"PNP0344"}, |
| 69 | {"PNP0345"}, |
| 70 | {"CPQA0D7"}, |
| 71 | /* i8042 aux */ |
| 72 | {"AUI0200"}, |
| 73 | {"FJC6000"}, |
| 74 | {"FJC6001"}, |
| 75 | {"PNP0f03"}, |
| 76 | {"PNP0f0b"}, |
| 77 | {"PNP0f0e"}, |
| 78 | {"PNP0f12"}, |
| 79 | {"PNP0f13"}, |
| 80 | {"PNP0f19"}, |
| 81 | {"PNP0f1c"}, |
| 82 | {"SYN0801"}, |
| 83 | /* fcpnp */ |
| 84 | {"AVM0900"}, |
| 85 | /* radio-cadet */ |
| 86 | {"MSM0c24"}, /* ADS Cadet AM/FM Radio Card */ |
| 87 | /* radio-gemtek */ |
| 88 | {"ADS7183"}, /* AOpen FX-3D/Pro Radio */ |
| 89 | /* radio-sf16fmr2 */ |
| 90 | {"MFRad13"}, /* tuner subdevice of SF16-FMD2 */ |
| 91 | /* ene_ir */ |
| 92 | {"ENE0100"}, |
| 93 | {"ENE0200"}, |
| 94 | {"ENE0201"}, |
| 95 | {"ENE0202"}, |
| 96 | /* fintek-cir */ |
| 97 | {"FIT0002"}, /* CIR */ |
| 98 | /* ite-cir */ |
| 99 | {"ITE8704"}, /* Default model */ |
| 100 | {"ITE8713"}, /* CIR found in EEEBox 1501U */ |
| 101 | {"ITE8708"}, /* Bridged IT8512 */ |
| 102 | {"ITE8709"}, /* SRAM-Bridged IT8512 */ |
| 103 | /* nuvoton-cir */ |
| 104 | {"WEC0530"}, /* CIR */ |
| 105 | {"NTN0530"}, /* CIR for new chip's pnp id */ |
| 106 | /* Winbond CIR */ |
| 107 | {"WEC1022"}, |
| 108 | /* wbsd */ |
| 109 | {"WEC0517"}, |
| 110 | {"WEC0518"}, |
| 111 | /* Winbond CIR */ |
| 112 | {"TCM5090"}, /* 3Com Etherlink III (TP) */ |
| 113 | {"TCM5091"}, /* 3Com Etherlink III */ |
| 114 | {"TCM5094"}, /* 3Com Etherlink III (combo) */ |
| 115 | {"TCM5095"}, /* 3Com Etherlink III (TPO) */ |
| 116 | {"TCM5098"}, /* 3Com Etherlink III (TPC) */ |
| 117 | {"PNP80f7"}, /* 3Com Etherlink III compatible */ |
| 118 | {"PNP80f8"}, /* 3Com Etherlink III compatible */ |
| 119 | /* nsc-ircc */ |
| 120 | {"NSC6001"}, |
| 121 | {"HWPC224"}, |
| 122 | {"IBM0071"}, |
| 123 | /* smsc-ircc2 */ |
| 124 | {"SMCf010"}, |
| 125 | /* sb1000 */ |
| 126 | {"GIC1000"}, |
| 127 | /* parport_pc */ |
| 128 | {"PNP0400"}, /* Standard LPT Printer Port */ |
| 129 | {"PNP0401"}, /* ECP Printer Port */ |
| 130 | /* apple-gmux */ |
| 131 | {"APP000B"}, |
| 132 | /* fujitsu-laptop.c */ |
| 133 | {"FUJ02bf"}, |
| 134 | {"FUJ02B1"}, |
| 135 | {"FUJ02E3"}, |
| 136 | /* system */ |
| 137 | {"PNP0c02"}, /* General ID for reserving resources */ |
| 138 | {"PNP0c01"}, /* memory controller */ |
| 139 | /* rtc_cmos */ |
| 140 | {"PNP0b00"}, |
| 141 | {"PNP0b01"}, |
| 142 | {"PNP0b02"}, |
| 143 | /* c6xdigio */ |
| 144 | {"PNP0400"}, /* Standard LPT Printer Port */ |
| 145 | {"PNP0401"}, /* ECP Printer Port */ |
| 146 | /* ni_atmio.c */ |
| 147 | {"NIC1900"}, |
| 148 | {"NIC2400"}, |
| 149 | {"NIC2500"}, |
| 150 | {"NIC2600"}, |
| 151 | {"NIC2700"}, |
| 152 | /* serial */ |
| 153 | {"AAC000F"}, /* Archtek America Corp. Archtek SmartLink Modem 3334BT Plug & Play */ |
| 154 | {"ADC0001"}, /* Anchor Datacomm BV. SXPro 144 External Data Fax Modem Plug & Play */ |
| 155 | {"ADC0002"}, /* SXPro 288 External Data Fax Modem Plug & Play */ |
| 156 | {"AEI0250"}, /* PROLiNK 1456VH ISA PnP K56flex Fax Modem */ |
| 157 | {"AEI1240"}, /* Actiontec ISA PNP 56K X2 Fax Modem */ |
| 158 | {"AKY1021"}, /* Rockwell 56K ACF II Fax+Data+Voice Modem */ |
| 159 | {"AZT4001"}, /* AZT3005 PnP SOUND DEVICE */ |
| 160 | {"BDP3336"}, /* Best Data Products Inc. Smart One 336F PnP Modem */ |
| 161 | {"BRI0A49"}, /* Boca Complete Ofc Communicator 14.4 Data-FAX */ |
| 162 | {"BRI1400"}, /* Boca Research 33,600 ACF Modem */ |
| 163 | {"BRI3400"}, /* Boca 33.6 Kbps Internal FD34FSVD */ |
| 164 | {"BRI0A49"}, /* Boca 33.6 Kbps Internal FD34FSVD */ |
| 165 | {"BDP3336"}, /* Best Data Products Inc. Smart One 336F PnP Modem */ |
| 166 | {"CPI4050"}, /* Computer Peripherals Inc. EuroViVa CommCenter-33.6 SP PnP */ |
| 167 | {"CTL3001"}, /* Creative Labs Phone Blaster 28.8 DSVD PnP Voice */ |
| 168 | {"CTL3011"}, /* Creative Labs Modem Blaster 28.8 DSVD PnP Voice */ |
| 169 | {"DAV0336"}, /* Davicom ISA 33.6K Modem */ |
| 170 | {"DMB1032"}, /* Creative Modem Blaster Flash56 DI5601-1 */ |
| 171 | {"DMB2001"}, /* Creative Modem Blaster V.90 DI5660 */ |
| 172 | {"ETT0002"}, /* E-Tech CyberBULLET PC56RVP */ |
| 173 | {"FUJ0202"}, /* Fujitsu 33600 PnP-I2 R Plug & Play */ |
| 174 | {"FUJ0205"}, /* Fujitsu FMV-FX431 Plug & Play */ |
| 175 | {"FUJ0206"}, /* Fujitsu 33600 PnP-I4 R Plug & Play */ |
| 176 | {"FUJ0209"}, /* Fujitsu Fax Voice 33600 PNP-I5 R Plug & Play */ |
| 177 | {"GVC000F"}, /* Archtek SmartLink Modem 3334BT Plug & Play */ |
| 178 | {"GVC0303"}, /* Archtek SmartLink Modem 3334BRV 33.6K Data Fax Voice */ |
| 179 | {"HAY0001"}, /* Hayes Optima 288 V.34-V.FC + FAX + Voice Plug & Play */ |
| 180 | {"HAY000C"}, /* Hayes Optima 336 V.34 + FAX + Voice PnP */ |
| 181 | {"HAY000D"}, /* Hayes Optima 336B V.34 + FAX + Voice PnP */ |
| 182 | {"HAY5670"}, /* Hayes Accura 56K Ext Fax Modem PnP */ |
| 183 | {"HAY5674"}, /* Hayes Accura 56K Ext Fax Modem PnP */ |
| 184 | {"HAY5675"}, /* Hayes Accura 56K Fax Modem PnP */ |
| 185 | {"HAYF000"}, /* Hayes 288, V.34 + FAX */ |
| 186 | {"HAYF001"}, /* Hayes Optima 288 V.34 + FAX + Voice, Plug & Play */ |
| 187 | {"IBM0033"}, /* IBM Thinkpad 701 Internal Modem Voice */ |
| 188 | {"PNP4972"}, /* Intermec CV60 touchscreen port */ |
| 189 | {"IXDC801"}, /* Intertex 28k8 33k6 Voice EXT PnP */ |
| 190 | {"IXDC901"}, /* Intertex 33k6 56k Voice EXT PnP */ |
| 191 | {"IXDD801"}, /* Intertex 28k8 33k6 Voice SP EXT PnP */ |
| 192 | {"IXDD901"}, /* Intertex 33k6 56k Voice SP EXT PnP */ |
| 193 | {"IXDF401"}, /* Intertex 28k8 33k6 Voice SP INT PnP */ |
| 194 | {"IXDF801"}, /* Intertex 28k8 33k6 Voice SP EXT PnP */ |
| 195 | {"IXDF901"}, /* Intertex 33k6 56k Voice SP EXT PnP */ |
| 196 | {"KOR4522"}, /* KORTEX 28800 Externe PnP */ |
| 197 | {"KORF661"}, /* KXPro 33.6 Vocal ASVD PnP */ |
| 198 | {"LAS4040"}, /* LASAT Internet 33600 PnP */ |
| 199 | {"LAS4540"}, /* Lasat Safire 560 PnP */ |
| 200 | {"LAS5440"}, /* Lasat Safire 336 PnP */ |
| 201 | {"MNP0281"}, /* Microcom TravelPorte FAST V.34 Plug & Play */ |
| 202 | {"MNP0336"}, /* Microcom DeskPorte V.34 FAST or FAST+ Plug & Play */ |
| 203 | {"MNP0339"}, /* Microcom DeskPorte FAST EP 28.8 Plug & Play */ |
| 204 | {"MNP0342"}, /* Microcom DeskPorte 28.8P Plug & Play */ |
| 205 | {"MNP0500"}, /* Microcom DeskPorte FAST ES 28.8 Plug & Play */ |
| 206 | {"MNP0501"}, /* Microcom DeskPorte FAST ES 28.8 Plug & Play */ |
| 207 | {"MNP0502"}, /* Microcom DeskPorte 28.8S Internal Plug & Play */ |
| 208 | {"MOT1105"}, /* Motorola BitSURFR Plug & Play */ |
| 209 | {"MOT1111"}, /* Motorola TA210 Plug & Play */ |
| 210 | {"MOT1114"}, /* Motorola HMTA 200 (ISDN) Plug & Play */ |
| 211 | {"MOT1115"}, /* Motorola BitSURFR Plug & Play */ |
| 212 | {"MOT1190"}, /* Motorola Lifestyle 28.8 Internal */ |
| 213 | {"MOT1501"}, /* Motorola V.3400 Plug & Play */ |
| 214 | {"MOT1502"}, /* Motorola Lifestyle 28.8 V.34 Plug & Play */ |
| 215 | {"MOT1505"}, /* Motorola Power 28.8 V.34 Plug & Play */ |
| 216 | {"MOT1509"}, /* Motorola ModemSURFR External 28.8 Plug & Play */ |
| 217 | {"MOT150A"}, /* Motorola Premier 33.6 Desktop Plug & Play */ |
| 218 | {"MOT150F"}, /* Motorola VoiceSURFR 56K External PnP */ |
| 219 | {"MOT1510"}, /* Motorola ModemSURFR 56K External PnP */ |
| 220 | {"MOT1550"}, /* Motorola ModemSURFR 56K Internal PnP */ |
| 221 | {"MOT1560"}, /* Motorola ModemSURFR Internal 28.8 Plug & Play */ |
| 222 | {"MOT1580"}, /* Motorola Premier 33.6 Internal Plug & Play */ |
| 223 | {"MOT15B0"}, /* Motorola OnlineSURFR 28.8 Internal Plug & Play */ |
| 224 | {"MOT15F0"}, /* Motorola VoiceSURFR 56K Internal PnP */ |
| 225 | {"MVX00A1"}, /* Deskline K56 Phone System PnP */ |
| 226 | {"MVX00F2"}, /* PC Rider K56 Phone System PnP */ |
| 227 | {"nEC8241"}, /* NEC 98NOTE SPEAKER PHONE FAX MODEM(33600bps) */ |
| 228 | {"PMC2430"}, /* Pace 56 Voice Internal Plug & Play Modem */ |
| 229 | {"PNP0500"}, /* Generic standard PC COM port */ |
| 230 | {"PNP0501"}, /* Generic 16550A-compatible COM port */ |
| 231 | {"PNPC000"}, /* Compaq 14400 Modem */ |
| 232 | {"PNPC001"}, /* Compaq 2400/9600 Modem */ |
| 233 | {"PNPC031"}, /* Dial-Up Networking Serial Cable between 2 PCs */ |
| 234 | {"PNPC032"}, /* Dial-Up Networking Parallel Cable between 2 PCs */ |
| 235 | {"PNPC100"}, /* Standard 9600 bps Modem */ |
| 236 | {"PNPC101"}, /* Standard 14400 bps Modem */ |
| 237 | {"PNPC102"}, /* Standard 28800 bps Modem */ |
| 238 | {"PNPC103"}, /* Standard Modem */ |
| 239 | {"PNPC104"}, /* Standard 9600 bps Modem */ |
| 240 | {"PNPC105"}, /* Standard 14400 bps Modem */ |
| 241 | {"PNPC106"}, /* Standard 28800 bps Modem */ |
| 242 | {"PNPC107"}, /* Standard Modem */ |
| 243 | {"PNPC108"}, /* Standard 9600 bps Modem */ |
| 244 | {"PNPC109"}, /* Standard 14400 bps Modem */ |
| 245 | {"PNPC10A"}, /* Standard 28800 bps Modem */ |
| 246 | {"PNPC10B"}, /* Standard Modem */ |
| 247 | {"PNPC10C"}, /* Standard 9600 bps Modem */ |
| 248 | {"PNPC10D"}, /* Standard 14400 bps Modem */ |
| 249 | {"PNPC10E"}, /* Standard 28800 bps Modem */ |
| 250 | {"PNPC10F"}, /* Standard Modem */ |
| 251 | {"PNP2000"}, /* Standard PCMCIA Card Modem */ |
| 252 | {"ROK0030"}, /* Rockwell 33.6 DPF Internal PnP, Modular Technology 33.6 Internal PnP */ |
| 253 | {"ROK0100"}, /* KORTEX 14400 Externe PnP */ |
| 254 | {"ROK4120"}, /* Rockwell 28.8 */ |
| 255 | {"ROK4920"}, /* Viking 28.8 INTERNAL Fax+Data+Voice PnP */ |
| 256 | {"RSS00A0"}, /* Rockwell 33.6 DPF External PnP, BT Prologue 33.6 External PnP, Modular Technology 33.6 External PnP */ |
| 257 | {"RSS0262"}, /* Viking 56K FAX INT */ |
| 258 | {"RSS0250"}, /* K56 par,VV,Voice,Speakphone,AudioSpan,PnP */ |
| 259 | {"SUP1310"}, /* SupraExpress 28.8 Data/Fax PnP modem */ |
| 260 | {"SUP1381"}, /* SupraExpress 336i PnP Voice Modem */ |
| 261 | {"SUP1421"}, /* SupraExpress 33.6 Data/Fax PnP modem */ |
| 262 | {"SUP1590"}, /* SupraExpress 33.6 Data/Fax PnP modem */ |
| 263 | {"SUP1620"}, /* SupraExpress 336i Sp ASVD */ |
| 264 | {"SUP1760"}, /* SupraExpress 33.6 Data/Fax PnP modem */ |
| 265 | {"SUP2171"}, /* SupraExpress 56i Sp Intl */ |
| 266 | {"TEX0011"}, /* Phoebe Micro 33.6 Data Fax 1433VQH Plug & Play */ |
| 267 | {"UAC000F"}, /* Archtek SmartLink Modem 3334BT Plug & Play */ |
| 268 | {"USR0000"}, /* 3Com Corp. Gateway Telepath IIvi 33.6 */ |
| 269 | {"USR0002"}, /* U.S. Robotics Sporster 33.6K Fax INT PnP */ |
| 270 | {"USR0004"}, /* Sportster Vi 14.4 PnP FAX Voicemail */ |
| 271 | {"USR0006"}, /* U.S. Robotics 33.6K Voice INT PnP */ |
| 272 | {"USR0007"}, /* U.S. Robotics 33.6K Voice EXT PnP */ |
| 273 | {"USR0009"}, /* U.S. Robotics Courier V.Everything INT PnP */ |
| 274 | {"USR2002"}, /* U.S. Robotics 33.6K Voice INT PnP */ |
| 275 | {"USR2070"}, /* U.S. Robotics 56K Voice INT PnP */ |
| 276 | {"USR2080"}, /* U.S. Robotics 56K Voice EXT PnP */ |
| 277 | {"USR3031"}, /* U.S. Robotics 56K FAX INT */ |
| 278 | {"USR3050"}, /* U.S. Robotics 56K FAX INT */ |
| 279 | {"USR3070"}, /* U.S. Robotics 56K Voice INT PnP */ |
| 280 | {"USR3080"}, /* U.S. Robotics 56K Voice EXT PnP */ |
| 281 | {"USR3090"}, /* U.S. Robotics 56K Voice INT PnP */ |
| 282 | {"USR9100"}, /* U.S. Robotics 56K Message */ |
| 283 | {"USR9160"}, /* U.S. Robotics 56K FAX EXT PnP */ |
| 284 | {"USR9170"}, /* U.S. Robotics 56K FAX INT PnP */ |
| 285 | {"USR9180"}, /* U.S. Robotics 56K Voice EXT PnP */ |
| 286 | {"USR9190"}, /* U.S. Robotics 56K Voice INT PnP */ |
| 287 | {"WACFXXX"}, /* Wacom tablets */ |
| 288 | {"FPI2002"}, /* Compaq touchscreen */ |
| 289 | {"FUJ02B2"}, /* Fujitsu Stylistic touchscreens */ |
| 290 | {"FUJ02B3"}, |
| 291 | {"FUJ02B4"}, /* Fujitsu Stylistic LT touchscreens */ |
| 292 | {"FUJ02B6"}, /* Passive Fujitsu Stylistic touchscreens */ |
| 293 | {"FUJ02B7"}, |
| 294 | {"FUJ02B8"}, |
| 295 | {"FUJ02B9"}, |
| 296 | {"FUJ02BC"}, |
| 297 | {"FUJ02E5"}, /* Fujitsu Wacom Tablet PC device */ |
| 298 | {"FUJ02E6"}, /* Fujitsu P-series tablet PC device */ |
| 299 | {"FUJ02E7"}, /* Fujitsu Wacom 2FGT Tablet PC device */ |
| 300 | {"FUJ02E9"}, /* Fujitsu Wacom 1FGT Tablet PC device */ |
| 301 | {"LTS0001"}, /* LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in disguise) */ |
| 302 | {"WCI0003"}, /* Rockwell's (PORALiNK) 33600 INT PNP */ |
| 303 | {"WEC1022"}, /* Winbond CIR port, should not be probed. We should keep track of it to prevent the legacy serial driver from probing it */ |
Zhang Rui | eec15ed | 2014-05-30 04:23:01 +0200 | [diff] [blame] | 304 | /* scl200wdt */ |
| 305 | {"NSC0800"}, /* National Semiconductor PC87307/PC97307 watchdog component */ |
| 306 | /* mpu401 */ |
| 307 | {"PNPb006"}, |
| 308 | /* cs423x-pnpbios */ |
| 309 | {"CSC0100"}, |
| 310 | {"CSC0000"}, |
| 311 | {"GIM0100"}, /* Guillemot Turtlebeach something appears to be cs4232 compatible */ |
| 312 | /* es18xx-pnpbios */ |
| 313 | {"ESS1869"}, |
| 314 | {"ESS1879"}, |
| 315 | /* snd-opl3sa2-pnpbios */ |
| 316 | {"YMH0021"}, |
| 317 | {"NMX2210"}, /* Gateway Solo 2500 */ |
| 318 | {""}, |
| 319 | }; |
| 320 | |
| 321 | static bool is_hex_digit(char c) |
| 322 | { |
| 323 | return (c >= 0 && c <= '9') || (c >= 'A' && c <= 'F'); |
| 324 | } |
| 325 | |
| 326 | static bool matching_id(char *idstr, char *list_id) |
| 327 | { |
| 328 | int i; |
| 329 | |
| 330 | if (memcmp(idstr, list_id, 3)) |
| 331 | return false; |
| 332 | |
| 333 | for (i = 3; i < 7; i++) { |
| 334 | char c = toupper(idstr[i]); |
| 335 | |
| 336 | if (!is_hex_digit(c) |
| 337 | || (list_id[i] != 'X' && c != toupper(list_id[i]))) |
| 338 | return false; |
| 339 | } |
| 340 | return true; |
| 341 | } |
| 342 | |
| 343 | static bool acpi_pnp_match(char *idstr, const struct acpi_device_id **matchid) |
| 344 | { |
| 345 | const struct acpi_device_id *devid; |
| 346 | |
| 347 | for (devid = acpi_pnp_device_ids; devid->id[0]; devid++) |
| 348 | if (matching_id(idstr, (char *)devid->id)) { |
| 349 | if (matchid) |
| 350 | *matchid = devid; |
| 351 | |
| 352 | return true; |
| 353 | } |
| 354 | |
| 355 | return false; |
| 356 | } |
| 357 | |
| 358 | static int acpi_pnp_attach(struct acpi_device *adev, |
| 359 | const struct acpi_device_id *id) |
| 360 | { |
| 361 | return 1; |
| 362 | } |
| 363 | |
| 364 | static struct acpi_scan_handler acpi_pnp_handler = { |
| 365 | .ids = acpi_pnp_device_ids, |
| 366 | .match = acpi_pnp_match, |
| 367 | .attach = acpi_pnp_attach, |
| 368 | }; |
| 369 | |
| 370 | /* |
| 371 | * For CMOS RTC devices, the PNP ACPI scan handler does not work, because |
| 372 | * there is a CMOS RTC ACPI scan handler installed already, so we need to |
| 373 | * check those devices and enumerate them to the PNP bus directly. |
| 374 | */ |
| 375 | static int is_cmos_rtc_device(struct acpi_device *adev) |
| 376 | { |
| 377 | struct acpi_device_id ids[] = { |
| 378 | { "PNP0B00" }, |
| 379 | { "PNP0B01" }, |
| 380 | { "PNP0B02" }, |
| 381 | {""}, |
| 382 | }; |
| 383 | return !acpi_match_device_ids(adev, ids); |
| 384 | } |
| 385 | |
| 386 | bool acpi_is_pnp_device(struct acpi_device *adev) |
| 387 | { |
| 388 | return adev->handler == &acpi_pnp_handler || is_cmos_rtc_device(adev); |
| 389 | } |
| 390 | EXPORT_SYMBOL_GPL(acpi_is_pnp_device); |
| 391 | |
| 392 | void __init acpi_pnp_init(void) |
| 393 | { |
| 394 | acpi_scan_add_handler(&acpi_pnp_handler); |
| 395 | } |