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 | #include "internal.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 | /* tpm_inf_pnp */ |
22 | {"IFX0101" }, /* Infineon TPMs */ |
23 | {"IFX0102" }, /* Infineon TPMs */ |
24 | /*tpm_tis */ |
25 | {"PNP0C31" }, /* TPM */ |
26 | {"ATM1200" }, /* Atmel */ |
27 | {"IFX0102" }, /* Infineon */ |
28 | {"BCM0101" }, /* Broadcom */ |
29 | {"BCM0102" }, /* Broadcom */ |
30 | {"NSC1200" }, /* National */ |
31 | {"ICO0102" }, /* Intel */ |
32 | /* ide */ |
33 | {"PNP0600" }, /* Generic ESDI/IDE/ATA compatible hard disk controller */ |
34 | /* ns558 */ |
35 | {"ASB16fd" }, /* AdLib NSC16 */ |
36 | {"AZT3001" }, /* AZT1008 */ |
37 | {"CDC0001" }, /* Opl3-SAx */ |
38 | {"CSC0001" }, /* CS4232 */ |
39 | {"CSC000f" }, /* CS4236 */ |
40 | {"CSC0101" }, /* CS4327 */ |
41 | {"CTL7001" }, /* SB16 */ |
42 | {"CTL7002" }, /* AWE64 */ |
43 | {"CTL7005" }, /* Vibra16 */ |
44 | {"ENS2020" }, /* SoundscapeVIVO */ |
45 | {"ESS0001" }, /* ES1869 */ |
46 | {"ESS0005" }, /* ES1878 */ |
47 | {"ESS6880" }, /* ES688 */ |
48 | {"IBM0012" }, /* CS4232 */ |
49 | {"OPT0001" }, /* OPTi Audio16 */ |
50 | {"YMH0006" }, /* Opl3-SA */ |
51 | {"YMH0022" }, /* Opl3-SAx */ |
52 | {"PNPb02f" }, /* Generic */ |
53 | /* i8042 kbd */ |
54 | {"PNP0300" }, |
55 | {"PNP0301" }, |
56 | {"PNP0302" }, |
57 | {"PNP0303" }, |
58 | {"PNP0304" }, |
59 | {"PNP0305" }, |
60 | {"PNP0306" }, |
61 | {"PNP0309" }, |
62 | {"PNP030a" }, |
63 | {"PNP030b" }, |
64 | {"PNP0320" }, |
65 | {"PNP0343" }, |
66 | {"PNP0344" }, |
67 | {"PNP0345" }, |
68 | {"CPQA0D7" }, |
69 | /* i8042 aux */ |
70 | {"AUI0200" }, |
71 | {"FJC6000" }, |
72 | {"FJC6001" }, |
73 | {"PNP0f03" }, |
74 | {"PNP0f0b" }, |
75 | {"PNP0f0e" }, |
76 | {"PNP0f12" }, |
77 | {"PNP0f13" }, |
78 | {"PNP0f19" }, |
79 | {"PNP0f1c" }, |
80 | {"SYN0801" }, |
81 | /* fcpnp */ |
82 | {"AVM0900" }, |
83 | /* radio-cadet */ |
84 | {"MSM0c24" }, /* ADS Cadet AM/FM Radio Card */ |
85 | /* radio-gemtek */ |
86 | {"ADS7183" }, /* AOpen FX-3D/Pro Radio */ |
87 | /* radio-sf16fmr2 */ |
88 | {"MFRad13" }, /* tuner subdevice of SF16-FMD2 */ |
89 | /* ene_ir */ |
90 | {"ENE0100" }, |
91 | {"ENE0200" }, |
92 | {"ENE0201" }, |
93 | {"ENE0202" }, |
94 | /* fintek-cir */ |
95 | {"FIT0002" }, /* CIR */ |
96 | /* ite-cir */ |
97 | {"ITE8704" }, /* Default model */ |
98 | {"ITE8713" }, /* CIR found in EEEBox 1501U */ |
99 | {"ITE8708" }, /* Bridged IT8512 */ |
100 | {"ITE8709" }, /* SRAM-Bridged IT8512 */ |
101 | /* nuvoton-cir */ |
102 | {"WEC0530" }, /* CIR */ |
103 | {"NTN0530" }, /* CIR for new chip's pnp id */ |
104 | /* Winbond CIR */ |
105 | {"WEC1022" }, |
106 | /* wbsd */ |
107 | {"WEC0517" }, |
108 | {"WEC0518" }, |
109 | /* Winbond CIR */ |
110 | {"TCM5090" }, /* 3Com Etherlink III (TP) */ |
111 | {"TCM5091" }, /* 3Com Etherlink III */ |
112 | {"TCM5094" }, /* 3Com Etherlink III (combo) */ |
113 | {"TCM5095" }, /* 3Com Etherlink III (TPO) */ |
114 | {"TCM5098" }, /* 3Com Etherlink III (TPC) */ |
115 | {"PNP80f7" }, /* 3Com Etherlink III compatible */ |
116 | {"PNP80f8" }, /* 3Com Etherlink III compatible */ |
117 | /* nsc-ircc */ |
118 | {"NSC6001" }, |
119 | {"HWPC224" }, |
120 | {"IBM0071" }, |
121 | /* smsc-ircc2 */ |
122 | {"SMCf010" }, |
123 | /* sb1000 */ |
124 | {"GIC1000" }, |
125 | /* parport_pc */ |
126 | {"PNP0400" }, /* Standard LPT Printer Port */ |
127 | {"PNP0401" }, /* ECP Printer Port */ |
128 | /* apple-gmux */ |
129 | {"APP000B" }, |
130 | /* system */ |
131 | {"PNP0c02" }, /* General ID for reserving resources */ |
132 | {"PNP0c01" }, /* memory controller */ |
133 | /* rtc_cmos */ |
134 | {"PNP0b00" }, |
135 | {"PNP0b01" }, |
136 | {"PNP0b02" }, |
137 | /* c6xdigio */ |
138 | {"PNP0400" }, /* Standard LPT Printer Port */ |
139 | {"PNP0401" }, /* ECP Printer Port */ |
140 | /* ni_atmio.c */ |
141 | {"NIC1900" }, |
142 | {"NIC2400" }, |
143 | {"NIC2500" }, |
144 | {"NIC2600" }, |
145 | {"NIC2700" }, |
146 | /* serial */ |
147 | {"AAC000F" }, /* Archtek America Corp. Archtek SmartLink Modem 3334BT Plug & Play */ |
148 | {"ADC0001" }, /* Anchor Datacomm BV. SXPro 144 External Data Fax Modem Plug & Play */ |
149 | {"ADC0002" }, /* SXPro 288 External Data Fax Modem Plug & Play */ |
150 | {"AEI0250" }, /* PROLiNK 1456VH ISA PnP K56flex Fax Modem */ |
151 | {"AEI1240" }, /* Actiontec ISA PNP 56K X2 Fax Modem */ |
152 | {"AKY1021" }, /* Rockwell 56K ACF II Fax+Data+Voice Modem */ |
153 | {"ALI5123" }, /* ALi Fast Infrared Controller */ |
154 | {"AZT4001" }, /* AZT3005 PnP SOUND DEVICE */ |
155 | {"BDP3336" }, /* Best Data Products Inc. Smart One 336F PnP Modem */ |
156 | {"BRI0A49" }, /* Boca Complete Ofc Communicator 14.4 Data-FAX */ |
157 | {"BRI1400" }, /* Boca Research 33,600 ACF Modem */ |
158 | {"BRI3400" }, /* Boca 33.6 Kbps Internal FD34FSVD */ |
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 (strlen(idstr) != strlen(list_id)) |
321 | return false; |
322 | |
323 | if (memcmp(p: idstr, q: list_id, size: 3)) |
324 | return false; |
325 | |
326 | for (i = 3; i < 7; i++) { |
327 | char c = toupper(idstr[i]); |
328 | |
329 | if (!isxdigit(c) |
330 | || (list_id[i] != 'X' && c != toupper(list_id[i]))) |
331 | return false; |
332 | } |
333 | return true; |
334 | } |
335 | |
336 | static bool acpi_pnp_match(const char *idstr, const struct acpi_device_id **matchid) |
337 | { |
338 | const struct acpi_device_id *devid; |
339 | |
340 | for (devid = acpi_pnp_device_ids; devid->id[0]; devid++) |
341 | if (matching_id(idstr, list_id: (char *)devid->id)) { |
342 | if (matchid) |
343 | *matchid = devid; |
344 | |
345 | return true; |
346 | } |
347 | |
348 | return false; |
349 | } |
350 | |
351 | /* |
352 | * If one of the device IDs below is present in the list of device IDs of a |
353 | * given ACPI device object, the PNP scan handler will not attach to that |
354 | * object, because there is a proper non-PNP driver in the kernel for the |
355 | * device represented by it. |
356 | */ |
357 | static const struct acpi_device_id acpi_nonpnp_device_ids[] = { |
358 | {"INTC1080" }, |
359 | {"INTC1081" }, |
360 | {"" }, |
361 | }; |
362 | |
363 | static int acpi_pnp_attach(struct acpi_device *adev, |
364 | const struct acpi_device_id *id) |
365 | { |
366 | return !!acpi_match_device_ids(device: adev, ids: acpi_nonpnp_device_ids); |
367 | } |
368 | |
369 | static struct acpi_scan_handler acpi_pnp_handler = { |
370 | .ids = acpi_pnp_device_ids, |
371 | .match = acpi_pnp_match, |
372 | .attach = acpi_pnp_attach, |
373 | }; |
374 | |
375 | /* |
376 | * For CMOS RTC devices, the PNP ACPI scan handler does not work, because |
377 | * there is a CMOS RTC ACPI scan handler installed already, so we need to |
378 | * check those devices and enumerate them to the PNP bus directly. |
379 | */ |
380 | static int is_cmos_rtc_device(struct acpi_device *adev) |
381 | { |
382 | static const struct acpi_device_id ids[] = { |
383 | { "PNP0B00" }, |
384 | { "PNP0B01" }, |
385 | { "PNP0B02" }, |
386 | {"" }, |
387 | }; |
388 | return !acpi_match_device_ids(device: adev, ids); |
389 | } |
390 | |
391 | bool acpi_is_pnp_device(struct acpi_device *adev) |
392 | { |
393 | return adev->handler == &acpi_pnp_handler || is_cmos_rtc_device(adev); |
394 | } |
395 | EXPORT_SYMBOL_GPL(acpi_is_pnp_device); |
396 | |
397 | void __init acpi_pnp_init(void) |
398 | { |
399 | acpi_scan_add_handler(handler: &acpi_pnp_handler); |
400 | } |
401 | |