root/drivers/acpi/acpi_pnp.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. matching_id
  2. acpi_pnp_match
  3. acpi_pnp_attach
  4. is_cmos_rtc_device
  5. acpi_is_pnp_device
  6. acpi_pnp_init

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

/* [<][>][^][v][top][bottom][index][help] */