* [PATCH V6 01/11] ACPI: introduce .match() callback for ACPI scan handler
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-15 6:44 ` [PATCH V6 02/11] PNPACPI: use whilte list for pnpacpi device enumeration Zhang Rui
` (9 subsequent siblings)
10 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
Currently, ACPI scan handler uses strcmp() to match device ids
and scan handler ids.
When converting PNPACPI enumeration into a scan handler, which I will do
later in this patch set, the current code becomes not flexible enough
because ACPI pnp scan handler requires wildcase and case insensitive support.
Thus a per scan handler .match() callback is introduced in this patch,
so that specified scan handler can have more flexible matching mechanism
by introduce its own .match() callback.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/scan.c | 17 +++++++++++------
include/acpi/acpi_bus.h | 1 +
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 7efe546..e46e51c 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1974,14 +1974,19 @@ static bool acpi_scan_handler_matching(struct acpi_scan_handler *handler,
const struct acpi_device_id *devid;
for (devid = handler->ids; devid->id[0]; devid++)
- if (!strcmp((char *)devid->id, idstr)) {
- if (matchid)
- *matchid = devid;
-
- return true;
- }
+ if (handler->match) {
+ if (handler->match(idstr, (char *)devid->id))
+ goto success;
+ } else
+ if (!strcmp((char *)devid->id, idstr))
+ goto success;
return false;
+
+success:
+ if (matchid)
+ *matchid = devid;
+ return true;
}
static struct acpi_scan_handler *acpi_scan_match_handler(char *idstr,
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 84a2e29..ba679af 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -131,6 +131,7 @@ static inline struct acpi_hotplug_profile *to_acpi_hotplug_profile(
struct acpi_scan_handler {
const struct acpi_device_id *ids;
struct list_head list_node;
+ int (*match)(char *devid, char *handler_id);
int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id);
void (*detach)(struct acpi_device *dev);
void (*bind)(struct device *phys_dev);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH V6 02/11] PNPACPI: use whilte list for pnpacpi device enumeration
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
2014-05-15 6:44 ` [PATCH V6 01/11] ACPI: introduce .match() callback for ACPI scan handler Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-15 6:44 ` [PATCH V6 03/11] ACPI: remove ids that does not comply with the ACPI PNP id rule Zhang Rui
` (8 subsequent siblings)
10 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
ACPI can be used to enumerate PNP devices, but the code does not
handle this in a good manner.
Currently, if an ACPI device
1. has _CRS method,
2. has an identifications of
"three capital charactors followed by four hex numbers",
3. is not in the excluded id list,
it is enumerated to PNP bus.
So actually, PNP bus is used as the default bus for enumerating _HID devices.
But, nowadays, more and more _HID devices are needed to be enumerate to
platform bus instead. And a white list is used for those devices to avoid
overlapping with PNP bus.
The problem is that this list is continuously growing.
So, a solution that uses platform bus as the default bus for _HID enumeration
is preferred.
In order to do this, this patch changes the way of enumerating PNP devices.
As the first step, we use a white list (scan handler) to create PNP devices
instead. This white list contains all the pnp_device_id strings in all the pnp
drivers, thus this change is transparent to PNP core and all the PNP drivers.
Note: I just grep all the id strings in all pnp_device_id instances and
copy them to the new white list, with a few changes to the comments
only, to follow the format of:
/* driver name, or file name if not a PNP driver */
{"id-string"}, /* optional comments for the id-string */
...
Note: the PNPACPI devices are created in two step,
1. mark the PNPACPI devices by the acpi pnp scan handler.
2. create the PNPACPI devices in PNPACPI code in a fs_initcall()
In this case, if PNP/PNPACPI is not set or "pnpacpi=off" kernel option
is used, the acpi pnp scan handler is still there, to prevent those
PNPACPI devices from being created to platform bus.
Note: For CMOS RTC devices, the acpi pnp scan handler does not work because
there is already a cmos rtc scan handler installed, thus we need to
check those devices and enumerate them to PNP bus explicitly.
Plus, the cmos rtc scan handler needs to return 1 so that it will not
be enumerated to platform bus.
TODO: Reduce this PNPACPI white list by
1. remove the ids for the devices that are never enumerated via ACPI
2. remove the ids and convert the drivers to platform bus drivers
for the devices that are not PNP devices in nature.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/Makefile | 1 +
drivers/acpi/acpi_cmos_rtc.c | 2 +-
drivers/acpi/acpi_pnp.c | 388 +++++++++++++++++++++++++++++++++++++++++++
drivers/acpi/internal.h | 1 +
drivers/acpi/scan.c | 1 +
drivers/pnp/pnpacpi/core.c | 28 +---
include/linux/acpi.h | 2 +
7 files changed, 398 insertions(+), 25 deletions(-)
create mode 100644 drivers/acpi/acpi_pnp.c
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 0331f91..9a43893 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -41,6 +41,7 @@ acpi-$(CONFIG_ACPI_DOCK) += dock.o
acpi-y += pci_root.o pci_link.o pci_irq.o
acpi-$(CONFIG_X86_INTEL_LPSS) += acpi_lpss.o
acpi-y += acpi_platform.o
+acpi-y += acpi_pnp.o
acpi-y += power.o
acpi-y += event.o
acpi-y += sysfs.o
diff --git a/drivers/acpi/acpi_cmos_rtc.c b/drivers/acpi/acpi_cmos_rtc.c
index 961b45d..2da8660 100644
--- a/drivers/acpi/acpi_cmos_rtc.c
+++ b/drivers/acpi/acpi_cmos_rtc.c
@@ -68,7 +68,7 @@ static int acpi_install_cmos_rtc_space_handler(struct acpi_device *adev,
return -ENODEV;
}
- return 0;
+ return 1;
}
static void acpi_remove_cmos_rtc_space_handler(struct acpi_device *adev)
diff --git a/drivers/acpi/acpi_pnp.c b/drivers/acpi/acpi_pnp.c
new file mode 100644
index 0000000..57d14ed
--- /dev/null
+++ b/drivers/acpi/acpi_pnp.c
@@ -0,0 +1,388 @@
+/*
+ * ACPI support for PNP bus type
+ *
+ * Copyright (C) 2014, Intel Corporation
+ * Authors: Zhang Rui <rui.zhang@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>
+
+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 */
+ {"@P@0001"}, /* ALS 100 */
+ {"@P@0020"}, /* ALS 200 */
+ {"@P@1001"}, /* ALS 100+ */
+ {"@P@2001"}, /* ALS 120 */
+ {"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"},
+ /* fujitsu-laptop.c */
+ {"FUJ02bf"},
+ {"FUJ02B1"},
+ {"FUJ02E3"},
+ /* 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 */
+ {"PNPCXXX"}, /* Unknown PnP modems */
+ {"PNPDXXX"}, /* More unknown PnP modems */
+ /* 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 int acpi_pnp_scan_handler_attach(struct acpi_device *adev,
+ const struct acpi_device_id *id)
+{
+ return 1;
+}
+
+static int acpi_pnp_scan_handler_match(char *devid, char *handlerid)
+{
+ int i;
+
+ if (memcmp(devid, handlerid, 3))
+ return 0;
+
+ for (i = 3; i < 7; i++) {
+ /* Not a HEX value */
+ if (!((devid[i] >= '0' && devid[i] <= '9') ||
+ (devid[i] > 'A' && devid[i] <= 'F')))
+ return 0;
+
+ /* Not a wildcard and not match */
+ if ((handlerid[i] != 'X') &&
+ toupper(devid[i]) != toupper(handlerid[i]))
+ return 0;
+ }
+ return 1;
+}
+
+static struct acpi_scan_handler acpi_pnp_handler = {
+ .ids = acpi_pnp_device_ids,
+ .match = acpi_pnp_scan_handler_match,
+ .attach = acpi_pnp_scan_handler_attach,
+};
+
+/*
+ * For CMOS RTC devices, the acpi pnp spcan handler does not work because
+ * there is already a cmos rtc scan handler installed, thus we need to
+ * check those devices and enumerate them to PNP bus explicitly.
+ */
+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 *device)
+{
+ if (device->handler == &acpi_pnp_handler)
+ return true;
+ if (is_cmos_rtc_device(device))
+ return true;
+ return false;
+}
+EXPORT_SYMBOL_GPL(acpi_is_pnp_device);
+
+void __init acpi_pnp_init(void)
+{
+ acpi_scan_add_handler(&acpi_pnp_handler);
+}
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 9573913..3a12866 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -30,6 +30,7 @@ void acpi_pci_root_init(void);
void acpi_pci_link_init(void);
void acpi_processor_init(void);
void acpi_platform_init(void);
+void acpi_pnp_init(void);
int acpi_sysfs_init(void);
#ifdef CONFIG_ACPI_CONTAINER
void acpi_container_init(void);
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index e46e51c..c82ab73 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2251,6 +2251,7 @@ int __init acpi_scan_init(void)
acpi_cmos_rtc_init();
acpi_container_init();
acpi_memory_hotplug_init();
+ acpi_pnp_init();
mutex_lock(&acpi_scan_lock);
/*
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
index c31aa07..b81448b 100644
--- a/drivers/pnp/pnpacpi/core.c
+++ b/drivers/pnp/pnpacpi/core.c
@@ -30,26 +30,6 @@
static int num;
-/* We need only to blacklist devices that have already an acpi driver that
- * can't use pnp layer. We don't need to blacklist device that are directly
- * used by the kernel (PCI root, ...), as it is harmless and there were
- * already present in pnpbios. But there is an exception for devices that
- * have irqs (PIC, Timer) because we call acpi_register_gsi.
- * Finally, only devices that have a CRS method need to be in this list.
- */
-static struct acpi_device_id excluded_id_list[] __initdata = {
- {"PNP0C09", 0}, /* EC */
- {"PNP0C0F", 0}, /* Link device */
- {"PNP0000", 0}, /* PIC */
- {"PNP0100", 0}, /* Timer */
- {"", 0},
-};
-
-static inline int __init is_exclusive_device(struct acpi_device *dev)
-{
- return (!acpi_match_device_ids(dev, excluded_id_list));
-}
-
/*
* Compatible Device IDs
*/
@@ -266,7 +246,7 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
if (!pnpid)
return 0;
- if (is_exclusive_device(device) || !device->status.present)
+ if (!device->status.present)
return 0;
dev = pnp_alloc_dev(&pnpacpi_protocol, num, pnpid);
@@ -326,10 +306,10 @@ static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,
{
struct acpi_device *device;
- if (!acpi_bus_get_device(handle, &device))
- pnpacpi_add_device(device);
- else
+ if (acpi_bus_get_device(handle, &device))
return AE_CTRL_DEPTH;
+ if (acpi_is_pnp_device(device))
+ pnpacpi_add_device(device);
return AE_OK;
}
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 7a8f2cd..27e2d29 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -184,6 +184,8 @@ extern int ec_transaction(u8 command,
u8 *rdata, unsigned rdata_len);
extern acpi_handle ec_get_handle(void);
+extern bool acpi_is_pnp_device(struct acpi_device *);
+
#if defined(CONFIG_ACPI_WMI) || defined(CONFIG_ACPI_WMI_MODULE)
typedef void (*wmi_notify_handler) (u32 value, void *context);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH V6 03/11] ACPI: remove ids that does not comply with the ACPI PNP id rule
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
2014-05-15 6:44 ` [PATCH V6 01/11] ACPI: introduce .match() callback for ACPI scan handler Zhang Rui
2014-05-15 6:44 ` [PATCH V6 02/11] PNPACPI: use whilte list for pnpacpi device enumeration Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-15 6:44 ` [PATCH V6 04/11] ACPI: remove unsupported serial PNP ids from acpi pnp scan handler id lsit Zhang Rui
` (7 subsequent siblings)
10 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
The acpi pnp scan handler id list just copies all the ids from all the
struct pnp_device_id instances, but some of them do not
comply with the ACPI PNP id rule (3 Alpha Charactors + 4 Hex numbers).
For those ids, the coressponding devices will never be enumerated
via ACPI, so it is safe to remove those ids from the PNPACPI white list.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/acpi_pnp.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/acpi/acpi_pnp.c b/drivers/acpi/acpi_pnp.c
index 57d14ed..d206616 100644
--- a/drivers/acpi/acpi_pnp.c
+++ b/drivers/acpi/acpi_pnp.c
@@ -33,10 +33,6 @@ static const struct acpi_device_id acpi_pnp_device_ids[] = {
/* ide */
{"PNP0600"}, /* Generic ESDI/IDE/ATA compatible hard disk controller */
/* ns558 */
- {"@P@0001"}, /* ALS 100 */
- {"@P@0020"}, /* ALS 200 */
- {"@P@1001"}, /* ALS 100+ */
- {"@P@2001"}, /* ALS 120 */
{"ASB16fd"}, /* AdLib NSC16 */
{"AZT3001"}, /* AZT1008 */
{"CDC0001"}, /* Opl3-SAx */
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH V6 04/11] ACPI: remove unsupported serial PNP ids from acpi pnp scan handler id lsit
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
` (2 preceding siblings ...)
2014-05-15 6:44 ` [PATCH V6 03/11] ACPI: remove ids that does not comply with the ACPI PNP id rule Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-15 6:44 ` [PATCH V6 05/11] ACPI: introduce dummy container scan handler Zhang Rui
` (6 subsequent siblings)
10 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
The "serial" pnp driver supports some unknown PNP modems (PNPCXXX/PNPDXXX)
by matching magic strings in the pnp device name or the pnp device card name.
ACPI enumerated PNP device neither supports pnp card, nor supports those magic
strings in its device name, which means this mechamism never works for ACPI
enumerated PNPCXXX/PNPDXXX devices.
So it is safe to remove those two ids from the ACPI pnp scan handler id list.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/acpi_pnp.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/acpi/acpi_pnp.c b/drivers/acpi/acpi_pnp.c
index d206616..a563a27 100644
--- a/drivers/acpi/acpi_pnp.c
+++ b/drivers/acpi/acpi_pnp.c
@@ -300,8 +300,6 @@ static const struct acpi_device_id acpi_pnp_device_ids[] = {
{"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 */
- {"PNPCXXX"}, /* Unknown PnP modems */
- {"PNPDXXX"}, /* More unknown PnP modems */
/* scl200wdt */
{"NSC0800"}, /* National Semiconductor PC87307/PC97307 watchdog component */
/* mpu401 */
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH V6 05/11] ACPI: introduce dummy container scan handler
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
` (3 preceding siblings ...)
2014-05-15 6:44 ` [PATCH V6 04/11] ACPI: remove unsupported serial PNP ids from acpi pnp scan handler id lsit Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-15 6:44 ` [PATCH V6 06/11] ACPI: introduce dummy memory hotplug " Zhang Rui
` (5 subsequent siblings)
10 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
The new ACPI device enumeration mechanism, which will be introduced
in a later patch, will enumerate the _HID devices w/o any scan
handler attached to platform bus.
This means that, for the devices that are attached to a configurable
scan handler, we should make sure no platform devices would be
created for them even if the scan handler is compiled out.
Fix this problem for container devices by introducing a dummy
container scan handler in this patch.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/Makefile | 2 +-
drivers/acpi/container.c | 21 +++++++++++++++++++++
drivers/acpi/internal.h | 4 ----
3 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 9a43893..5611a07 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -63,7 +63,7 @@ obj-$(CONFIG_ACPI_FAN) += fan.o
obj-$(CONFIG_ACPI_VIDEO) += video.o
obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
-obj-$(CONFIG_ACPI_CONTAINER) += container.o
+obj-y += container.o
obj-$(CONFIG_ACPI_THERMAL) += thermal.o
obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
obj-$(CONFIG_ACPI_BATTERY) += battery.o
diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c
index 63119d0..9100db7 100644
--- a/drivers/acpi/container.c
+++ b/drivers/acpi/container.c
@@ -41,6 +41,8 @@ static const struct acpi_device_id container_device_ids[] = {
{"", 0},
};
+#ifdef CONFIG_ACPI_CONTAINER
+
static int acpi_container_offline(struct container_dev *cdev)
{
struct acpi_device *adev = ACPI_COMPANION(&cdev->dev);
@@ -111,3 +113,22 @@ void __init acpi_container_init(void)
{
acpi_scan_add_handler_with_hotplug(&container_handler, "container");
}
+
+#else
+
+static inline int container_device_attach(struct acpi_device *adev,
+ const struct acpi_device_id *not_used)
+{
+ return 1;
+}
+
+static struct acpi_scan_handler container_handler = {
+ .ids = container_device_ids,
+ .attach = container_device_attach,
+};
+
+void __init acpi_container_init(void)
+{
+ acpi_scan_add_handler(&container_handler);
+}
+#endif /* CONFIG_ACPI_CONTAINER */
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 3a12866..499908e 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -32,11 +32,7 @@ void acpi_processor_init(void);
void acpi_platform_init(void);
void acpi_pnp_init(void);
int acpi_sysfs_init(void);
-#ifdef CONFIG_ACPI_CONTAINER
void acpi_container_init(void);
-#else
-static inline void acpi_container_init(void) {}
-#endif
#ifdef CONFIG_ACPI_DOCK
void register_dock_dependent_device(struct acpi_device *adev,
acpi_handle dshandle);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH V6 06/11] ACPI: introduce dummy memory hotplug scan handler
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
` (4 preceding siblings ...)
2014-05-15 6:44 ` [PATCH V6 05/11] ACPI: introduce dummy container scan handler Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-15 6:44 ` [PATCH V6 07/11] ACPI: introduce dummy lpss " Zhang Rui
` (4 subsequent siblings)
10 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
The new ACPI device enumeration mechanism, which will be introduced
in a later patch, will enumerate the _HID devices w/o any scan
handler attached to platform bus.
This means that, for the devices that are attached to a configurable
scan handler, we should make sure no platform devices would be
created for them even if the scan handler is compiled out.
Fix this problem for memory hotplug devuces by introducing a dummy
memory hotplug scan handler in this patch.
Plus, the dummy memory hotplug scan handler is also needed when
kernel parameter "acpi_no_memhotplug" is used.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/Makefile | 2 +-
drivers/acpi/acpi_memhotplug.c | 45 ++++++++++++++++++++++++++++++------------
drivers/acpi/internal.h | 6 +-----
3 files changed, 34 insertions(+), 19 deletions(-)
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 5611a07..171efc2 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -65,7 +65,7 @@ obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
obj-y += container.o
obj-$(CONFIG_ACPI_THERMAL) += thermal.o
-obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
+obj-y += acpi_memhotplug.o
obj-$(CONFIG_ACPI_BATTERY) += battery.o
obj-$(CONFIG_ACPI_SBS) += sbshc.o
obj-$(CONFIG_ACPI_SBS) += sbs.o
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
index b67be85..ed2f6a7 100644
--- a/drivers/acpi/acpi_memhotplug.c
+++ b/drivers/acpi/acpi_memhotplug.c
@@ -44,6 +44,13 @@
ACPI_MODULE_NAME("acpi_memhotplug");
+static const struct acpi_device_id memory_device_ids[] = {
+ {ACPI_MEMORY_DEVICE_HID, 0},
+ {"", 0},
+};
+
+#ifdef CONFIG_ACPI_HOTPLUG_MEMORY
+
/* Memory Device States */
#define MEMORY_INVALID_STATE 0
#define MEMORY_POWER_ON_STATE 1
@@ -53,11 +60,6 @@ static int acpi_memory_device_add(struct acpi_device *device,
const struct acpi_device_id *not_used);
static void acpi_memory_device_remove(struct acpi_device *device);
-static const struct acpi_device_id memory_device_ids[] = {
- {ACPI_MEMORY_DEVICE_HID, 0},
- {"", 0},
-};
-
static struct acpi_scan_handler memory_device_handler = {
.ids = memory_device_ids,
.attach = acpi_memory_device_add,
@@ -362,17 +364,34 @@ static void acpi_memory_device_remove(struct acpi_device *device)
static bool __initdata acpi_no_memhotplug;
-void __init acpi_memory_hotplug_init(void)
-{
- if (acpi_no_memhotplug)
- return;
-
- acpi_scan_add_handler_with_hotplug(&memory_device_handler, "memory");
-}
-
static int __init disable_acpi_memory_hotplug(char *str)
{
acpi_no_memhotplug = true;
return 1;
}
__setup("acpi_no_memhotplug", disable_acpi_memory_hotplug);
+
+#endif
+
+static int acpi_memory_dummy_add(struct acpi_device *device,
+ const struct acpi_device_id *not_used)
+{
+ return 1;
+}
+
+static struct acpi_scan_handler memory_dummy_handler = {
+ .ids = memory_device_ids,
+ .attach = acpi_memory_dummy_add,
+};
+
+void __init acpi_memory_hotplug_init(void)
+{
+#ifdef CONFIG_ACPI_HOTPLUG_MEMORY
+ if (!acpi_no_memhotplug) {
+ acpi_scan_add_handler_with_hotplug(&memory_device_handler,
+ "memory");
+ return;
+ }
+#endif
+ acpi_scan_add_handler(&memory_dummy_handler);
+}
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 499908e..4a9e999 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -33,6 +33,7 @@ void acpi_platform_init(void);
void acpi_pnp_init(void);
int acpi_sysfs_init(void);
void acpi_container_init(void);
+void acpi_memory_hotplug_init(void);
#ifdef CONFIG_ACPI_DOCK
void register_dock_dependent_device(struct acpi_device *adev,
acpi_handle dshandle);
@@ -44,11 +45,6 @@ static inline void register_dock_dependent_device(struct acpi_device *adev,
static inline int dock_notify(struct acpi_device *adev, u32 event) { return -ENODEV; }
static inline void acpi_dock_add(struct acpi_device *adev) {}
#endif
-#ifdef CONFIG_ACPI_HOTPLUG_MEMORY
-void acpi_memory_hotplug_init(void);
-#else
-static inline void acpi_memory_hotplug_init(void) {}
-#endif
#ifdef CONFIG_X86
void acpi_cmos_rtc_init(void);
#else
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH V6 07/11] ACPI: introduce dummy lpss scan handler
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
` (5 preceding siblings ...)
2014-05-15 6:44 ` [PATCH V6 06/11] ACPI: introduce dummy memory hotplug " Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-21 8:48 ` Mika Westerberg
2014-05-15 6:44 ` [PATCH V6 08/11] ACPI: introduce platform_id flag Zhang Rui
` (3 subsequent siblings)
10 siblings, 1 reply; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
The new ACPI device enumeration mechanism, which will be introduced
in a later patch, will enumerate the _HID devices w/o any scan
handler attached to platform bus.
This means that, for the devices that are attached to a configurable
scan handler, we should make sure no platform devices would be
created for them even if the scan handler is compiled out.
Fix this problem for lpss devices by introducing a dummy
lpss scan handler in this patch.
Plus, if lpt_clk_init() fails, we need this dummy scan handler as well.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/Makefile | 2 +-
drivers/acpi/acpi_lpss.c | 69 ++++++++++++++++++++++++++++++++++--------------
drivers/acpi/internal.h | 4 ---
3 files changed, 50 insertions(+), 25 deletions(-)
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 171efc2..605eff7 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -39,7 +39,7 @@ acpi-y += processor_core.o
acpi-y += ec.o
acpi-$(CONFIG_ACPI_DOCK) += dock.o
acpi-y += pci_root.o pci_link.o pci_irq.o
-acpi-$(CONFIG_X86_INTEL_LPSS) += acpi_lpss.o
+acpi-y += acpi_lpss.o
acpi-y += acpi_platform.o
acpi-y += acpi_pnp.o
acpi-y += power.o
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
index 69e29f4..965428f 100644
--- a/drivers/acpi/acpi_lpss.c
+++ b/drivers/acpi/acpi_lpss.c
@@ -24,6 +24,8 @@
ACPI_MODULE_NAME("acpi_lpss");
+#ifdef CONFIG_X86_INTEL_LPSS
+
#define LPSS_CLK_SIZE 0x04
#define LPSS_LTR_SIZE 0x18
@@ -159,40 +161,50 @@ static struct lpss_device_desc byt_i2c_dev_desc = {
.shared_clock = &i2c_clock,
};
+#define LPSS_PTR(desc) ((unsigned long)&desc)
+
+#else
+
+#define LPSS_PTR(desc) 0
+
+#endif
+
static const struct acpi_device_id acpi_lpss_device_ids[] = {
/* Generic LPSS devices */
- { "INTL9C60", (unsigned long)&lpss_dma_desc },
+ { "INTL9C60", LPSS_PTR(lpss_dma_desc) },
/* Lynxpoint LPSS devices */
- { "INT33C0", (unsigned long)&lpt_dev_desc },
- { "INT33C1", (unsigned long)&lpt_dev_desc },
- { "INT33C2", (unsigned long)&lpt_dev_desc },
- { "INT33C3", (unsigned long)&lpt_dev_desc },
- { "INT33C4", (unsigned long)&lpt_uart_dev_desc },
- { "INT33C5", (unsigned long)&lpt_uart_dev_desc },
- { "INT33C6", (unsigned long)&lpt_sdio_dev_desc },
+ { "INT33C0", LPSS_PTR(lpt_dev_desc) },
+ { "INT33C1", LPSS_PTR(lpt_dev_desc) },
+ { "INT33C2", LPSS_PTR(lpt_dev_desc) },
+ { "INT33C3", LPSS_PTR(lpt_dev_desc) },
+ { "INT33C4", LPSS_PTR(lpt_uart_dev_desc) },
+ { "INT33C5", LPSS_PTR(lpt_uart_dev_desc) },
+ { "INT33C6", LPSS_PTR(lpt_sdio_dev_desc) },
{ "INT33C7", },
/* BayTrail LPSS devices */
- { "80860F09", (unsigned long)&byt_pwm_dev_desc },
- { "80860F0A", (unsigned long)&byt_uart_dev_desc },
- { "80860F0E", (unsigned long)&byt_spi_dev_desc },
- { "80860F14", (unsigned long)&byt_sdio_dev_desc },
- { "80860F41", (unsigned long)&byt_i2c_dev_desc },
+ { "80860F09", LPSS_PTR(byt_pwm_dev_desc) },
+ { "80860F0A", LPSS_PTR(byt_uart_dev_desc) },
+ { "80860F0E", LPSS_PTR(byt_spi_dev_desc) },
+ { "80860F14", LPSS_PTR(byt_sdio_dev_desc) },
+ { "80860F41", LPSS_PTR(byt_i2c_dev_desc) },
{ "INT33B2", },
- { "INT3430", (unsigned long)&lpt_dev_desc },
- { "INT3431", (unsigned long)&lpt_dev_desc },
- { "INT3432", (unsigned long)&lpt_dev_desc },
- { "INT3433", (unsigned long)&lpt_dev_desc },
- { "INT3434", (unsigned long)&lpt_uart_dev_desc },
- { "INT3435", (unsigned long)&lpt_uart_dev_desc },
- { "INT3436", (unsigned long)&lpt_sdio_dev_desc },
+ { "INT3430", LPSS_PTR(lpt_dev_desc) },
+ { "INT3431", LPSS_PTR(lpt_dev_desc) },
+ { "INT3432", LPSS_PTR(lpt_dev_desc) },
+ { "INT3433", LPSS_PTR(lpt_dev_desc) },
+ { "INT3434", LPSS_PTR(lpt_uart_dev_desc) },
+ { "INT3435", LPSS_PTR(lpt_uart_dev_desc) },
+ { "INT3436", LPSS_PTR(lpt_sdio_dev_desc) },
{ "INT3437", },
{ }
};
+#ifdef CONFIG_X86_INTEL_LPSS
+
static int is_memory(struct acpi_resource *res, void *not_used)
{
struct resource r;
@@ -511,10 +523,27 @@ static struct acpi_scan_handler lpss_handler = {
.unbind = acpi_lpss_unbind,
};
+#endif /* CONFIG_X86_INTEL_LPSS */
+
+static int acpi_lpss_dummy_attach(struct acpi_device *adev,
+ const struct acpi_device_id *id)
+{
+ return 1;
+}
+
+static struct acpi_scan_handler lpss_dummy_handler = {
+ .ids = acpi_lpss_device_ids,
+ .attach = acpi_lpss_dummy_attach,
+};
+
void __init acpi_lpss_init(void)
{
+#ifdef CONFIG_X86_INTEL_LPSS
if (!lpt_clk_init()) {
bus_register_notifier(&platform_bus_type, &acpi_lpss_nb);
acpi_scan_add_handler(&lpss_handler);
+ return;
}
+#endif
+ acpi_scan_add_handler(&lpss_dummy_handler);
}
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 4a9e999..bc7d102 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -65,11 +65,7 @@ int acpi_debugfs_init(void);
#else
static inline void acpi_debugfs_init(void) { return; }
#endif
-#ifdef CONFIG_X86_INTEL_LPSS
void acpi_lpss_init(void);
-#else
-static inline void acpi_lpss_init(void) {}
-#endif
acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src);
bool acpi_queue_hotplug_work(struct work_struct *work);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [PATCH V6 07/11] ACPI: introduce dummy lpss scan handler
2014-05-15 6:44 ` [PATCH V6 07/11] ACPI: introduce dummy lpss " Zhang Rui
@ 2014-05-21 8:48 ` Mika Westerberg
2014-05-21 14:56 ` Zhang Rui
0 siblings, 1 reply; 25+ messages in thread
From: Mika Westerberg @ 2014-05-21 8:48 UTC (permalink / raw)
To: Zhang Rui
Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On Thu, May 15, 2014 at 02:44:12PM +0800, Zhang Rui wrote:
> The new ACPI device enumeration mechanism, which will be introduced
> in a later patch, will enumerate the _HID devices w/o any scan
> handler attached to platform bus.
> This means that, for the devices that are attached to a configurable
> scan handler, we should make sure no platform devices would be
> created for them even if the scan handler is compiled out.
>
> Fix this problem for lpss devices by introducing a dummy
> lpss scan handler in this patch.
>
> Plus, if lpt_clk_init() fails, we need this dummy scan handler as well.
>
> Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> ---
> drivers/acpi/Makefile | 2 +-
> drivers/acpi/acpi_lpss.c | 69 ++++++++++++++++++++++++++++++++++--------------
> drivers/acpi/internal.h | 4 ---
> 3 files changed, 50 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
> index 171efc2..605eff7 100644
> --- a/drivers/acpi/Makefile
> +++ b/drivers/acpi/Makefile
> @@ -39,7 +39,7 @@ acpi-y += processor_core.o
> acpi-y += ec.o
> acpi-$(CONFIG_ACPI_DOCK) += dock.o
> acpi-y += pci_root.o pci_link.o pci_irq.o
> -acpi-$(CONFIG_X86_INTEL_LPSS) += acpi_lpss.o
> +acpi-y += acpi_lpss.o
> acpi-y += acpi_platform.o
> acpi-y += acpi_pnp.o
> acpi-y += power.o
> diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
> index 69e29f4..965428f 100644
> --- a/drivers/acpi/acpi_lpss.c
> +++ b/drivers/acpi/acpi_lpss.c
> @@ -24,6 +24,8 @@
>
> ACPI_MODULE_NAME("acpi_lpss");
>
> +#ifdef CONFIG_X86_INTEL_LPSS
> +
> #define LPSS_CLK_SIZE 0x04
> #define LPSS_LTR_SIZE 0x18
>
> @@ -159,40 +161,50 @@ static struct lpss_device_desc byt_i2c_dev_desc = {
> .shared_clock = &i2c_clock,
> };
>
> +#define LPSS_PTR(desc) ((unsigned long)&desc)
> +
> +#else
> +
> +#define LPSS_PTR(desc) 0
> +
> +#endif
> +
> static const struct acpi_device_id acpi_lpss_device_ids[] = {
> /* Generic LPSS devices */
> - { "INTL9C60", (unsigned long)&lpss_dma_desc },
> + { "INTL9C60", LPSS_PTR(lpss_dma_desc) },
>
> /* Lynxpoint LPSS devices */
> - { "INT33C0", (unsigned long)&lpt_dev_desc },
> - { "INT33C1", (unsigned long)&lpt_dev_desc },
> - { "INT33C2", (unsigned long)&lpt_dev_desc },
> - { "INT33C3", (unsigned long)&lpt_dev_desc },
> - { "INT33C4", (unsigned long)&lpt_uart_dev_desc },
> - { "INT33C5", (unsigned long)&lpt_uart_dev_desc },
> - { "INT33C6", (unsigned long)&lpt_sdio_dev_desc },
> + { "INT33C0", LPSS_PTR(lpt_dev_desc) },
> + { "INT33C1", LPSS_PTR(lpt_dev_desc) },
> + { "INT33C2", LPSS_PTR(lpt_dev_desc) },
> + { "INT33C3", LPSS_PTR(lpt_dev_desc) },
> + { "INT33C4", LPSS_PTR(lpt_uart_dev_desc) },
> + { "INT33C5", LPSS_PTR(lpt_uart_dev_desc) },
> + { "INT33C6", LPSS_PTR(lpt_sdio_dev_desc) },
> { "INT33C7", },
>
> /* BayTrail LPSS devices */
> - { "80860F09", (unsigned long)&byt_pwm_dev_desc },
> - { "80860F0A", (unsigned long)&byt_uart_dev_desc },
> - { "80860F0E", (unsigned long)&byt_spi_dev_desc },
> - { "80860F14", (unsigned long)&byt_sdio_dev_desc },
> - { "80860F41", (unsigned long)&byt_i2c_dev_desc },
> + { "80860F09", LPSS_PTR(byt_pwm_dev_desc) },
> + { "80860F0A", LPSS_PTR(byt_uart_dev_desc) },
> + { "80860F0E", LPSS_PTR(byt_spi_dev_desc) },
> + { "80860F14", LPSS_PTR(byt_sdio_dev_desc) },
> + { "80860F41", LPSS_PTR(byt_i2c_dev_desc) },
> { "INT33B2", },
>
> - { "INT3430", (unsigned long)&lpt_dev_desc },
> - { "INT3431", (unsigned long)&lpt_dev_desc },
> - { "INT3432", (unsigned long)&lpt_dev_desc },
> - { "INT3433", (unsigned long)&lpt_dev_desc },
> - { "INT3434", (unsigned long)&lpt_uart_dev_desc },
> - { "INT3435", (unsigned long)&lpt_uart_dev_desc },
> - { "INT3436", (unsigned long)&lpt_sdio_dev_desc },
> + { "INT3430", LPSS_PTR(lpt_dev_desc) },
> + { "INT3431", LPSS_PTR(lpt_dev_desc) },
> + { "INT3432", LPSS_PTR(lpt_dev_desc) },
> + { "INT3433", LPSS_PTR(lpt_dev_desc) },
> + { "INT3434", LPSS_PTR(lpt_uart_dev_desc) },
> + { "INT3435", LPSS_PTR(lpt_uart_dev_desc) },
> + { "INT3436", LPSS_PTR(lpt_sdio_dev_desc) },
> { "INT3437", },
>
> { }
> };
>
> +#ifdef CONFIG_X86_INTEL_LPSS
> +
> static int is_memory(struct acpi_resource *res, void *not_used)
> {
> struct resource r;
> @@ -511,10 +523,27 @@ static struct acpi_scan_handler lpss_handler = {
> .unbind = acpi_lpss_unbind,
> };
>
> +#endif /* CONFIG_X86_INTEL_LPSS */
> +
> +static int acpi_lpss_dummy_attach(struct acpi_device *adev,
> + const struct acpi_device_id *id)
> +{
> + return 1;
> +}
> +
> +static struct acpi_scan_handler lpss_dummy_handler = {
> + .ids = acpi_lpss_device_ids,
> + .attach = acpi_lpss_dummy_attach,
> +};
> +
> void __init acpi_lpss_init(void)
> {
> +#ifdef CONFIG_X86_INTEL_LPSS
> if (!lpt_clk_init()) {
> bus_register_notifier(&platform_bus_type, &acpi_lpss_nb);
> acpi_scan_add_handler(&lpss_handler);
> + return;
> }
> +#endif
This whole #ifndef dance is ugly as hell. Can't we do any better?
> + acpi_scan_add_handler(&lpss_dummy_handler);
Also I don't like these "dummy" things at all. Can't we make the code
work so that those are not needed?
> }
> diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
> index 4a9e999..bc7d102 100644
> --- a/drivers/acpi/internal.h
> +++ b/drivers/acpi/internal.h
> @@ -65,11 +65,7 @@ int acpi_debugfs_init(void);
> #else
> static inline void acpi_debugfs_init(void) { return; }
> #endif
> -#ifdef CONFIG_X86_INTEL_LPSS
> void acpi_lpss_init(void);
> -#else
> -static inline void acpi_lpss_init(void) {}
> -#endif
>
> acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src);
> bool acpi_queue_hotplug_work(struct work_struct *work);
> --
> 1.8.3.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 07/11] ACPI: introduce dummy lpss scan handler
2014-05-21 8:48 ` Mika Westerberg
@ 2014-05-21 14:56 ` Zhang Rui
2014-05-22 9:57 ` Mika Westerberg
0 siblings, 1 reply; 25+ messages in thread
From: Zhang Rui @ 2014-05-21 14:56 UTC (permalink / raw)
To: Mika Westerberg
Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On 三, 2014-05-21 at 11:48 +0300, Mika Westerberg wrote:
> On Thu, May 15, 2014 at 02:44:12PM +0800, Zhang Rui wrote:
> > The new ACPI device enumeration mechanism, which will be introduced
> > in a later patch, will enumerate the _HID devices w/o any scan
> > handler attached to platform bus.
> > This means that, for the devices that are attached to a configurable
> > scan handler, we should make sure no platform devices would be
> > created for them even if the scan handler is compiled out.
> >
> > Fix this problem for lpss devices by introducing a dummy
> > lpss scan handler in this patch.
> >
> > Plus, if lpt_clk_init() fails, we need this dummy scan handler as well.
> >
> > Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> > ---
> > drivers/acpi/Makefile | 2 +-
> > drivers/acpi/acpi_lpss.c | 69 ++++++++++++++++++++++++++++++++++--------------
> > drivers/acpi/internal.h | 4 ---
> > 3 files changed, 50 insertions(+), 25 deletions(-)
> >
> > diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
> > index 171efc2..605eff7 100644
> > --- a/drivers/acpi/Makefile
> > +++ b/drivers/acpi/Makefile
> > @@ -39,7 +39,7 @@ acpi-y += processor_core.o
> > acpi-y += ec.o
> > acpi-$(CONFIG_ACPI_DOCK) += dock.o
> > acpi-y += pci_root.o pci_link.o pci_irq.o
> > -acpi-$(CONFIG_X86_INTEL_LPSS) += acpi_lpss.o
> > +acpi-y += acpi_lpss.o
> > acpi-y += acpi_platform.o
> > acpi-y += acpi_pnp.o
> > acpi-y += power.o
> > diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
> > index 69e29f4..965428f 100644
> > --- a/drivers/acpi/acpi_lpss.c
> > +++ b/drivers/acpi/acpi_lpss.c
> > @@ -24,6 +24,8 @@
> >
> > ACPI_MODULE_NAME("acpi_lpss");
> >
> > +#ifdef CONFIG_X86_INTEL_LPSS
> > +
> > #define LPSS_CLK_SIZE 0x04
> > #define LPSS_LTR_SIZE 0x18
> >
> > @@ -159,40 +161,50 @@ static struct lpss_device_desc byt_i2c_dev_desc = {
> > .shared_clock = &i2c_clock,
> > };
> >
> > +#define LPSS_PTR(desc) ((unsigned long)&desc)
> > +
> > +#else
> > +
> > +#define LPSS_PTR(desc) 0
> > +
> > +#endif
> > +
> > static const struct acpi_device_id acpi_lpss_device_ids[] = {
> > /* Generic LPSS devices */
> > - { "INTL9C60", (unsigned long)&lpss_dma_desc },
> > + { "INTL9C60", LPSS_PTR(lpss_dma_desc) },
> >
> > /* Lynxpoint LPSS devices */
> > - { "INT33C0", (unsigned long)&lpt_dev_desc },
> > - { "INT33C1", (unsigned long)&lpt_dev_desc },
> > - { "INT33C2", (unsigned long)&lpt_dev_desc },
> > - { "INT33C3", (unsigned long)&lpt_dev_desc },
> > - { "INT33C4", (unsigned long)&lpt_uart_dev_desc },
> > - { "INT33C5", (unsigned long)&lpt_uart_dev_desc },
> > - { "INT33C6", (unsigned long)&lpt_sdio_dev_desc },
> > + { "INT33C0", LPSS_PTR(lpt_dev_desc) },
> > + { "INT33C1", LPSS_PTR(lpt_dev_desc) },
> > + { "INT33C2", LPSS_PTR(lpt_dev_desc) },
> > + { "INT33C3", LPSS_PTR(lpt_dev_desc) },
> > + { "INT33C4", LPSS_PTR(lpt_uart_dev_desc) },
> > + { "INT33C5", LPSS_PTR(lpt_uart_dev_desc) },
> > + { "INT33C6", LPSS_PTR(lpt_sdio_dev_desc) },
> > { "INT33C7", },
> >
> > /* BayTrail LPSS devices */
> > - { "80860F09", (unsigned long)&byt_pwm_dev_desc },
> > - { "80860F0A", (unsigned long)&byt_uart_dev_desc },
> > - { "80860F0E", (unsigned long)&byt_spi_dev_desc },
> > - { "80860F14", (unsigned long)&byt_sdio_dev_desc },
> > - { "80860F41", (unsigned long)&byt_i2c_dev_desc },
> > + { "80860F09", LPSS_PTR(byt_pwm_dev_desc) },
> > + { "80860F0A", LPSS_PTR(byt_uart_dev_desc) },
> > + { "80860F0E", LPSS_PTR(byt_spi_dev_desc) },
> > + { "80860F14", LPSS_PTR(byt_sdio_dev_desc) },
> > + { "80860F41", LPSS_PTR(byt_i2c_dev_desc) },
> > { "INT33B2", },
> >
> > - { "INT3430", (unsigned long)&lpt_dev_desc },
> > - { "INT3431", (unsigned long)&lpt_dev_desc },
> > - { "INT3432", (unsigned long)&lpt_dev_desc },
> > - { "INT3433", (unsigned long)&lpt_dev_desc },
> > - { "INT3434", (unsigned long)&lpt_uart_dev_desc },
> > - { "INT3435", (unsigned long)&lpt_uart_dev_desc },
> > - { "INT3436", (unsigned long)&lpt_sdio_dev_desc },
> > + { "INT3430", LPSS_PTR(lpt_dev_desc) },
> > + { "INT3431", LPSS_PTR(lpt_dev_desc) },
> > + { "INT3432", LPSS_PTR(lpt_dev_desc) },
> > + { "INT3433", LPSS_PTR(lpt_dev_desc) },
> > + { "INT3434", LPSS_PTR(lpt_uart_dev_desc) },
> > + { "INT3435", LPSS_PTR(lpt_uart_dev_desc) },
> > + { "INT3436", LPSS_PTR(lpt_sdio_dev_desc) },
> > { "INT3437", },
> >
> > { }
> > };
> >
> > +#ifdef CONFIG_X86_INTEL_LPSS
> > +
> > static int is_memory(struct acpi_resource *res, void *not_used)
> > {
> > struct resource r;
> > @@ -511,10 +523,27 @@ static struct acpi_scan_handler lpss_handler = {
> > .unbind = acpi_lpss_unbind,
> > };
> >
> > +#endif /* CONFIG_X86_INTEL_LPSS */
> > +
> > +static int acpi_lpss_dummy_attach(struct acpi_device *adev,
> > + const struct acpi_device_id *id)
> > +{
> > + return 1;
> > +}
> > +
> > +static struct acpi_scan_handler lpss_dummy_handler = {
> > + .ids = acpi_lpss_device_ids,
> > + .attach = acpi_lpss_dummy_attach,
> > +};
> > +
> > void __init acpi_lpss_init(void)
> > {
> > +#ifdef CONFIG_X86_INTEL_LPSS
> > if (!lpt_clk_init()) {
> > bus_register_notifier(&platform_bus_type, &acpi_lpss_nb);
> > acpi_scan_add_handler(&lpss_handler);
> > + return;
> > }
> > +#endif
>
> This whole #ifndef dance is ugly as hell. Can't we do any better?
>
> > + acpi_scan_add_handler(&lpss_dummy_handler);
>
> Also I don't like these "dummy" things at all. Can't we make the code
> work so that those are not needed?
>
well, I'm not sure how to make it work w/o dummy handlers.
Do you have any idea?
Oh, wait, as the .attach() callback for all the dummy handler just do
one thing, aka, return 1 to attach the device, I think maybe we can have
an acpi_scan_handler_dummy_attach() which does the same thing in
drivers/acpi/scan.c, and invoke it for scan handlers w/o .attach().
In this way, we do not need a dummy handler, but the #ifdef thing is
still needed, to set/clear the .attach() callback.
I will do a double check if this proposal sounds okay to you.
thanks,
rui
> > }
> > diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
> > index 4a9e999..bc7d102 100644
> > --- a/drivers/acpi/internal.h
> > +++ b/drivers/acpi/internal.h
> > @@ -65,11 +65,7 @@ int acpi_debugfs_init(void);
> > #else
> > static inline void acpi_debugfs_init(void) { return; }
> > #endif
> > -#ifdef CONFIG_X86_INTEL_LPSS
> > void acpi_lpss_init(void);
> > -#else
> > -static inline void acpi_lpss_init(void) {}
> > -#endif
> >
> > acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src);
> > bool acpi_queue_hotplug_work(struct work_struct *work);
> > --
> > 1.8.3.2
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 07/11] ACPI: introduce dummy lpss scan handler
2014-05-21 14:56 ` Zhang Rui
@ 2014-05-22 9:57 ` Mika Westerberg
0 siblings, 0 replies; 25+ messages in thread
From: Mika Westerberg @ 2014-05-22 9:57 UTC (permalink / raw)
To: Zhang Rui
Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On Wed, May 21, 2014 at 10:56:59PM +0800, Zhang Rui wrote:
> On 三, 2014-05-21 at 11:48 +0300, Mika Westerberg wrote:
> > On Thu, May 15, 2014 at 02:44:12PM +0800, Zhang Rui wrote:
> > > The new ACPI device enumeration mechanism, which will be introduced
> > > in a later patch, will enumerate the _HID devices w/o any scan
> > > handler attached to platform bus.
> > > This means that, for the devices that are attached to a configurable
> > > scan handler, we should make sure no platform devices would be
> > > created for them even if the scan handler is compiled out.
> > >
> > > Fix this problem for lpss devices by introducing a dummy
> > > lpss scan handler in this patch.
> > >
> > > Plus, if lpt_clk_init() fails, we need this dummy scan handler as well.
> > >
> > > Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> > > ---
> > > drivers/acpi/Makefile | 2 +-
> > > drivers/acpi/acpi_lpss.c | 69 ++++++++++++++++++++++++++++++++++--------------
> > > drivers/acpi/internal.h | 4 ---
> > > 3 files changed, 50 insertions(+), 25 deletions(-)
> > >
> > > diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
> > > index 171efc2..605eff7 100644
> > > --- a/drivers/acpi/Makefile
> > > +++ b/drivers/acpi/Makefile
> > > @@ -39,7 +39,7 @@ acpi-y += processor_core.o
> > > acpi-y += ec.o
> > > acpi-$(CONFIG_ACPI_DOCK) += dock.o
> > > acpi-y += pci_root.o pci_link.o pci_irq.o
> > > -acpi-$(CONFIG_X86_INTEL_LPSS) += acpi_lpss.o
> > > +acpi-y += acpi_lpss.o
> > > acpi-y += acpi_platform.o
> > > acpi-y += acpi_pnp.o
> > > acpi-y += power.o
> > > diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
> > > index 69e29f4..965428f 100644
> > > --- a/drivers/acpi/acpi_lpss.c
> > > +++ b/drivers/acpi/acpi_lpss.c
> > > @@ -24,6 +24,8 @@
> > >
> > > ACPI_MODULE_NAME("acpi_lpss");
> > >
> > > +#ifdef CONFIG_X86_INTEL_LPSS
> > > +
> > > #define LPSS_CLK_SIZE 0x04
> > > #define LPSS_LTR_SIZE 0x18
> > >
> > > @@ -159,40 +161,50 @@ static struct lpss_device_desc byt_i2c_dev_desc = {
> > > .shared_clock = &i2c_clock,
> > > };
> > >
> > > +#define LPSS_PTR(desc) ((unsigned long)&desc)
> > > +
> > > +#else
> > > +
> > > +#define LPSS_PTR(desc) 0
> > > +
> > > +#endif
> > > +
> > > static const struct acpi_device_id acpi_lpss_device_ids[] = {
> > > /* Generic LPSS devices */
> > > - { "INTL9C60", (unsigned long)&lpss_dma_desc },
> > > + { "INTL9C60", LPSS_PTR(lpss_dma_desc) },
> > >
> > > /* Lynxpoint LPSS devices */
> > > - { "INT33C0", (unsigned long)&lpt_dev_desc },
> > > - { "INT33C1", (unsigned long)&lpt_dev_desc },
> > > - { "INT33C2", (unsigned long)&lpt_dev_desc },
> > > - { "INT33C3", (unsigned long)&lpt_dev_desc },
> > > - { "INT33C4", (unsigned long)&lpt_uart_dev_desc },
> > > - { "INT33C5", (unsigned long)&lpt_uart_dev_desc },
> > > - { "INT33C6", (unsigned long)&lpt_sdio_dev_desc },
> > > + { "INT33C0", LPSS_PTR(lpt_dev_desc) },
> > > + { "INT33C1", LPSS_PTR(lpt_dev_desc) },
> > > + { "INT33C2", LPSS_PTR(lpt_dev_desc) },
> > > + { "INT33C3", LPSS_PTR(lpt_dev_desc) },
> > > + { "INT33C4", LPSS_PTR(lpt_uart_dev_desc) },
> > > + { "INT33C5", LPSS_PTR(lpt_uart_dev_desc) },
> > > + { "INT33C6", LPSS_PTR(lpt_sdio_dev_desc) },
> > > { "INT33C7", },
> > >
> > > /* BayTrail LPSS devices */
> > > - { "80860F09", (unsigned long)&byt_pwm_dev_desc },
> > > - { "80860F0A", (unsigned long)&byt_uart_dev_desc },
> > > - { "80860F0E", (unsigned long)&byt_spi_dev_desc },
> > > - { "80860F14", (unsigned long)&byt_sdio_dev_desc },
> > > - { "80860F41", (unsigned long)&byt_i2c_dev_desc },
> > > + { "80860F09", LPSS_PTR(byt_pwm_dev_desc) },
> > > + { "80860F0A", LPSS_PTR(byt_uart_dev_desc) },
> > > + { "80860F0E", LPSS_PTR(byt_spi_dev_desc) },
> > > + { "80860F14", LPSS_PTR(byt_sdio_dev_desc) },
> > > + { "80860F41", LPSS_PTR(byt_i2c_dev_desc) },
> > > { "INT33B2", },
> > >
> > > - { "INT3430", (unsigned long)&lpt_dev_desc },
> > > - { "INT3431", (unsigned long)&lpt_dev_desc },
> > > - { "INT3432", (unsigned long)&lpt_dev_desc },
> > > - { "INT3433", (unsigned long)&lpt_dev_desc },
> > > - { "INT3434", (unsigned long)&lpt_uart_dev_desc },
> > > - { "INT3435", (unsigned long)&lpt_uart_dev_desc },
> > > - { "INT3436", (unsigned long)&lpt_sdio_dev_desc },
> > > + { "INT3430", LPSS_PTR(lpt_dev_desc) },
> > > + { "INT3431", LPSS_PTR(lpt_dev_desc) },
> > > + { "INT3432", LPSS_PTR(lpt_dev_desc) },
> > > + { "INT3433", LPSS_PTR(lpt_dev_desc) },
> > > + { "INT3434", LPSS_PTR(lpt_uart_dev_desc) },
> > > + { "INT3435", LPSS_PTR(lpt_uart_dev_desc) },
> > > + { "INT3436", LPSS_PTR(lpt_sdio_dev_desc) },
> > > { "INT3437", },
> > >
> > > { }
> > > };
> > >
> > > +#ifdef CONFIG_X86_INTEL_LPSS
> > > +
> > > static int is_memory(struct acpi_resource *res, void *not_used)
> > > {
> > > struct resource r;
> > > @@ -511,10 +523,27 @@ static struct acpi_scan_handler lpss_handler = {
> > > .unbind = acpi_lpss_unbind,
> > > };
> > >
> > > +#endif /* CONFIG_X86_INTEL_LPSS */
> > > +
> > > +static int acpi_lpss_dummy_attach(struct acpi_device *adev,
> > > + const struct acpi_device_id *id)
> > > +{
> > > + return 1;
> > > +}
> > > +
> > > +static struct acpi_scan_handler lpss_dummy_handler = {
> > > + .ids = acpi_lpss_device_ids,
> > > + .attach = acpi_lpss_dummy_attach,
> > > +};
> > > +
> > > void __init acpi_lpss_init(void)
> > > {
> > > +#ifdef CONFIG_X86_INTEL_LPSS
> > > if (!lpt_clk_init()) {
> > > bus_register_notifier(&platform_bus_type, &acpi_lpss_nb);
> > > acpi_scan_add_handler(&lpss_handler);
> > > + return;
> > > }
> > > +#endif
> >
> > This whole #ifndef dance is ugly as hell. Can't we do any better?
> >
> > > + acpi_scan_add_handler(&lpss_dummy_handler);
> >
> > Also I don't like these "dummy" things at all. Can't we make the code
> > work so that those are not needed?
> >
> well, I'm not sure how to make it work w/o dummy handlers.
> Do you have any idea?
>
> Oh, wait, as the .attach() callback for all the dummy handler just do
> one thing, aka, return 1 to attach the device, I think maybe we can have
> an acpi_scan_handler_dummy_attach() which does the same thing in
> drivers/acpi/scan.c, and invoke it for scan handlers w/o .attach().
> In this way, we do not need a dummy handler, but the #ifdef thing is
> still needed, to set/clear the .attach() callback.
> I will do a double check if this proposal sounds okay to you.
Yes it sounds ok to me.
I tried to figure out some way to get rid of the #ifdefs but couldn't
find any reasonable solution :-(
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH V6 08/11] ACPI: introduce platform_id flag
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
` (6 preceding siblings ...)
2014-05-15 6:44 ` [PATCH V6 07/11] ACPI: introduce dummy lpss " Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-15 6:44 ` [PATCH V6 09/11] ACPI: introduce flag .is_master_device Zhang Rui
` (2 subsequent siblings)
10 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
Only certain kind of ACPI device objects can be enumerated to platform bus.
These ACPI device objects include
1. ACPI device objects that have _HID control method.
2. some ACPI device objects that have Linux specified HID strings.
In order to distinguish those device objects from the others, a new flag
platform_id and a new function acpi_add_platform_id() are introduced
in this patch.
Currently, only devices with _HID method have this flag set.
If you want platform devices to be created for device objects without _HID,
use acpi_add_platform_id() when adding artificial Linux-specific ID strings
to them.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/scan.c | 9 ++++++++-
include/acpi/acpi_bus.h | 3 ++-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index c82ab73..451e7d9 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1730,6 +1730,13 @@ static void acpi_add_id(struct acpi_device_pnp *pnp, const char *dev_id)
pnp->type.hardware_id = 1;
}
+static void acpi_add_platform_id(struct acpi_device_pnp *pnp,
+ const char *dev_id)
+{
+ acpi_add_id(pnp, dev_id);
+ pnp->type.platform_id = 1;
+}
+
/*
* Old IBM workstations have a DSDT bug wherein the SMBus object
* lacks the SMBUS01 HID and the methods do not have the necessary "_"
@@ -1794,7 +1801,7 @@ static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
}
if (info->valid & ACPI_VALID_HID)
- acpi_add_id(pnp, info->hardware_id.string);
+ acpi_add_platform_id(pnp, info->hardware_id.string);
if (info->valid & ACPI_VALID_CID) {
cid_list = &info->compatible_id_list;
for (i = 0; i < cid_list->count; i++)
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index ba679af..ec92ad3 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -233,7 +233,8 @@ struct acpi_hardware_id {
struct acpi_pnp_type {
u32 hardware_id:1;
u32 bus_address:1;
- u32 reserved:30;
+ u32 platform_id:1;
+ u32 reserved:29;
};
struct acpi_device_pnp {
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
` (7 preceding siblings ...)
2014-05-15 6:44 ` [PATCH V6 08/11] ACPI: introduce platform_id flag Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-21 8:52 ` Mika Westerberg
2014-05-15 6:44 ` [PATCH V6 10/11] ACPI: use platform bus as the default bus for _HID enumeration Zhang Rui
2014-05-15 6:44 ` [PATCH V6 11/11] ACPI: introduce acpi platform exclude id list Zhang Rui
10 siblings, 1 reply; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
For some ACPI device objects, they represent master devices,
and their children devices are enumerated by bus controller drivers
for the buses they are on.
In this case, we do not want to enumerate their children devices to
platform bus explicitly in acpi scan code.
Thus a new flag .is_master_device is introduced in this patch.
For devices with this flag set, we will not do default enumeration
for their children.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/acpi_lpss.c | 62 +++++++++++++++++++++++++++++++++---------------
include/acpi/acpi_bus.h | 3 ++-
2 files changed, 45 insertions(+), 20 deletions(-)
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
index 965428f..4ab0915 100644
--- a/drivers/acpi/acpi_lpss.c
+++ b/drivers/acpi/acpi_lpss.c
@@ -54,6 +54,7 @@ struct lpss_shared_clock {
struct lpss_private_data;
struct lpss_device_desc {
+ bool is_master_device;
bool clk_required;
const char *clkdev_name;
bool ltr_required;
@@ -91,6 +92,7 @@ static void lpss_uart_setup(struct lpss_private_data *pdata)
}
static struct lpss_device_desc lpt_dev_desc = {
+ .is_master_device = true,
.clk_required = true,
.prv_offset = 0x800,
.ltr_required = true,
@@ -98,6 +100,7 @@ static struct lpss_device_desc lpt_dev_desc = {
};
static struct lpss_device_desc lpt_uart_dev_desc = {
+ .is_master_device = true,
.clk_required = true,
.prv_offset = 0x800,
.ltr_required = true,
@@ -106,6 +109,7 @@ static struct lpss_device_desc lpt_uart_dev_desc = {
};
static struct lpss_device_desc lpt_sdio_dev_desc = {
+ .is_master_device = true,
.prv_offset = 0x1000,
.prv_size_override = 0x1018,
.ltr_required = true,
@@ -127,6 +131,7 @@ static struct lpss_shared_clock uart_clock = {
};
static struct lpss_device_desc byt_uart_dev_desc = {
+ .is_master_device = true,
.clk_required = true,
.prv_offset = 0x800,
.clk_gate = true,
@@ -140,6 +145,7 @@ static struct lpss_shared_clock spi_clock = {
};
static struct lpss_device_desc byt_spi_dev_desc = {
+ .is_master_device = true,
.clk_required = true,
.prv_offset = 0x400,
.clk_gate = true,
@@ -147,6 +153,7 @@ static struct lpss_device_desc byt_spi_dev_desc = {
};
static struct lpss_device_desc byt_sdio_dev_desc = {
+ .is_master_device = true,
.clk_required = true,
};
@@ -156,16 +163,24 @@ static struct lpss_shared_clock i2c_clock = {
};
static struct lpss_device_desc byt_i2c_dev_desc = {
+ .is_master_device = true,
.clk_required = true,
.prv_offset = 0x800,
.shared_clock = &i2c_clock,
};
#define LPSS_PTR(desc) ((unsigned long)&desc)
+#define LPSS_MASTER_PTR(desc) LPSS_PTR(desc)
#else
-#define LPSS_PTR(desc) 0
+static struct lpss_device_desc lpss_dummy_desc;
+static struct lpss_device_desc lpss_dummy_master_desc = {
+ .is_master_device = true,
+};
+
+#define LPSS_PTR(desc) (&lpss_dummy_desc)
+#define LPSS_MASTER_PTR(desc) (&lpss_dummy_master_desc)
#endif
@@ -174,30 +189,30 @@ static const struct acpi_device_id acpi_lpss_device_ids[] = {
{ "INTL9C60", LPSS_PTR(lpss_dma_desc) },
/* Lynxpoint LPSS devices */
- { "INT33C0", LPSS_PTR(lpt_dev_desc) },
- { "INT33C1", LPSS_PTR(lpt_dev_desc) },
- { "INT33C2", LPSS_PTR(lpt_dev_desc) },
- { "INT33C3", LPSS_PTR(lpt_dev_desc) },
- { "INT33C4", LPSS_PTR(lpt_uart_dev_desc) },
- { "INT33C5", LPSS_PTR(lpt_uart_dev_desc) },
- { "INT33C6", LPSS_PTR(lpt_sdio_dev_desc) },
+ { "INT33C0", LPSS_MASTER_PTR(lpt_dev_desc) },
+ { "INT33C1", LPSS_MASTER_PTR(lpt_dev_desc) },
+ { "INT33C2", LPSS_MASTER_PTR(lpt_dev_desc) },
+ { "INT33C3", LPSS_MASTER_PTR(lpt_dev_desc) },
+ { "INT33C4", LPSS_MASTER_PTR(lpt_uart_dev_desc) },
+ { "INT33C5", LPSS_MASTER_PTR(lpt_uart_dev_desc) },
+ { "INT33C6", LPSS_MASTER_PTR(lpt_sdio_dev_desc) },
{ "INT33C7", },
/* BayTrail LPSS devices */
{ "80860F09", LPSS_PTR(byt_pwm_dev_desc) },
- { "80860F0A", LPSS_PTR(byt_uart_dev_desc) },
- { "80860F0E", LPSS_PTR(byt_spi_dev_desc) },
- { "80860F14", LPSS_PTR(byt_sdio_dev_desc) },
- { "80860F41", LPSS_PTR(byt_i2c_dev_desc) },
+ { "80860F0A", LPSS_MASTER_PTR(byt_uart_dev_desc) },
+ { "80860F0E", LPSS_MASTER_PTR(byt_spi_dev_desc) },
+ { "80860F14", LPSS_MASTER_PTR(byt_sdio_dev_desc) },
+ { "80860F41", LPSS_MASTER_PTR(byt_i2c_dev_desc) },
{ "INT33B2", },
- { "INT3430", LPSS_PTR(lpt_dev_desc) },
- { "INT3431", LPSS_PTR(lpt_dev_desc) },
- { "INT3432", LPSS_PTR(lpt_dev_desc) },
- { "INT3433", LPSS_PTR(lpt_dev_desc) },
- { "INT3434", LPSS_PTR(lpt_uart_dev_desc) },
- { "INT3435", LPSS_PTR(lpt_uart_dev_desc) },
- { "INT3436", LPSS_PTR(lpt_sdio_dev_desc) },
+ { "INT3430", LPSS_MASTER_PTR(lpt_dev_desc) },
+ { "INT3431", LPSS_MASTER_PTR(lpt_dev_desc) },
+ { "INT3432", LPSS_MASTER_PTR(lpt_dev_desc) },
+ { "INT3433", LPSS_MASTER_PTR(lpt_dev_desc) },
+ { "INT3434", LPSS_MASTER_PTR(lpt_uart_dev_desc) },
+ { "INT3435", LPSS_MASTER_PTR(lpt_uart_dev_desc) },
+ { "INT3436", LPSS_MASTER_PTR(lpt_sdio_dev_desc) },
{ "INT3437", },
{ }
@@ -285,6 +300,8 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
if (!dev_desc)
return acpi_create_platform_device(adev, id);
+ adev->flags.is_master_device = dev_desc->is_master_device;
+
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return -ENOMEM;
@@ -528,6 +545,13 @@ static struct acpi_scan_handler lpss_handler = {
static int acpi_lpss_dummy_attach(struct acpi_device *adev,
const struct acpi_device_id *id)
{
+ struct lpss_device_desc *dev_desc;
+
+ dev_desc = (struct lpss_device_desc *)id->driver_data;
+ if (!dev_desc)
+ return 1;
+
+ adev->flags.is_master_device = dev_desc->is_master_device;
return 1;
}
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index ec92ad3..13ac75f 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -207,7 +207,8 @@ struct acpi_device_flags {
u32 no_hotplug:1;
u32 hotplug_notify:1;
u32 is_dock_station:1;
- u32 reserved:22;
+ u32 is_master_device:1;
+ u32 reserved:21;
};
/* File System */
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-15 6:44 ` [PATCH V6 09/11] ACPI: introduce flag .is_master_device Zhang Rui
@ 2014-05-21 8:52 ` Mika Westerberg
2014-05-21 11:10 ` Rafael J. Wysocki
2014-05-21 14:43 ` Zhang Rui
0 siblings, 2 replies; 25+ messages in thread
From: Mika Westerberg @ 2014-05-21 8:52 UTC (permalink / raw)
To: Zhang Rui
Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
> For some ACPI device objects, they represent master devices,
> and their children devices are enumerated by bus controller drivers
> for the buses they are on.
>
> In this case, we do not want to enumerate their children devices to
> platform bus explicitly in acpi scan code.
>
> Thus a new flag .is_master_device is introduced in this patch.
>
> For devices with this flag set, we will not do default enumeration
> for their children.
Is there any particular reason we would like to enumerate everything
below the first device by default?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-21 8:52 ` Mika Westerberg
@ 2014-05-21 11:10 ` Rafael J. Wysocki
2014-05-21 11:04 ` Mika Westerberg
2014-05-21 15:09 ` Zhang Rui
2014-05-21 14:43 ` Zhang Rui
1 sibling, 2 replies; 25+ messages in thread
From: Rafael J. Wysocki @ 2014-05-21 11:10 UTC (permalink / raw)
To: Mika Westerberg
Cc: Zhang Rui, linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On Wednesday, May 21, 2014 11:52:07 AM Mika Westerberg wrote:
> On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
> > For some ACPI device objects, they represent master devices,
> > and their children devices are enumerated by bus controller drivers
> > for the buses they are on.
> >
> > In this case, we do not want to enumerate their children devices to
> > platform bus explicitly in acpi scan code.
> >
> > Thus a new flag .is_master_device is introduced in this patch.
> >
> > For devices with this flag set, we will not do default enumeration
> > for their children.
>
> Is there any particular reason we would like to enumerate everything
> below the first device by default?
Yes, there is. Device objects without _ADR under the PCI host bridge.
Or we can skip the children under every *platform* device created by this by
default and mark the ones where we want the children to be enumerated as
platform devices too in a special way if needed.
I guess we could try that (that was the Rui's original idea IIRC).
Rafael
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-21 11:10 ` Rafael J. Wysocki
@ 2014-05-21 11:04 ` Mika Westerberg
2014-05-21 11:59 ` Rafael J. Wysocki
2014-05-21 15:09 ` Zhang Rui
1 sibling, 1 reply; 25+ messages in thread
From: Mika Westerberg @ 2014-05-21 11:04 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: Zhang Rui, linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On Wed, May 21, 2014 at 01:10:33PM +0200, Rafael J. Wysocki wrote:
> On Wednesday, May 21, 2014 11:52:07 AM Mika Westerberg wrote:
> > On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
> > > For some ACPI device objects, they represent master devices,
> > > and their children devices are enumerated by bus controller drivers
> > > for the buses they are on.
> > >
> > > In this case, we do not want to enumerate their children devices to
> > > platform bus explicitly in acpi scan code.
> > >
> > > Thus a new flag .is_master_device is introduced in this patch.
> > >
> > > For devices with this flag set, we will not do default enumeration
> > > for their children.
> >
> > Is there any particular reason we would like to enumerate everything
> > below the first device by default?
>
> Yes, there is. Device objects without _ADR under the PCI host bridge.
OK.
> Or we can skip the children under every *platform* device created by this by
> default and mark the ones where we want the children to be enumerated as
> platform devices too in a special way if needed.
>
> I guess we could try that (that was the Rui's original idea IIRC).
That sounds better to me.
I wonder if we can do this analogous to of_platform_bus_probe() and
friends?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-21 11:04 ` Mika Westerberg
@ 2014-05-21 11:59 ` Rafael J. Wysocki
0 siblings, 0 replies; 25+ messages in thread
From: Rafael J. Wysocki @ 2014-05-21 11:59 UTC (permalink / raw)
To: Mika Westerberg, Rafael J. Wysocki
Cc: Zhang Rui, linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
dmitry.torokhov
On 5/21/2014 1:04 PM, Mika Westerberg wrote:
> On Wed, May 21, 2014 at 01:10:33PM +0200, Rafael J. Wysocki wrote:
>> On Wednesday, May 21, 2014 11:52:07 AM Mika Westerberg wrote:
>>> On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
>>>> For some ACPI device objects, they represent master devices,
>>>> and their children devices are enumerated by bus controller drivers
>>>> for the buses they are on.
>>>>
>>>> In this case, we do not want to enumerate their children devices to
>>>> platform bus explicitly in acpi scan code.
>>>>
>>>> Thus a new flag .is_master_device is introduced in this patch.
>>>>
>>>> For devices with this flag set, we will not do default enumeration
>>>> for their children.
>>> Is there any particular reason we would like to enumerate everything
>>> below the first device by default?
>> Yes, there is. Device objects without _ADR under the PCI host bridge.
> OK.
>
>> Or we can skip the children under every *platform* device created by this by
>> default and mark the ones where we want the children to be enumerated as
>> platform devices too in a special way if needed.
>>
>> I guess we could try that (that was the Rui's original idea IIRC).
> That sounds better to me.
>
> I wonder if we can do this analogous to of_platform_bus_probe() and
> friends?
Yes, we should actually.
Rafael
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-21 11:10 ` Rafael J. Wysocki
2014-05-21 11:04 ` Mika Westerberg
@ 2014-05-21 15:09 ` Zhang Rui
2014-05-22 8:08 ` Mika Westerberg
1 sibling, 1 reply; 25+ messages in thread
From: Zhang Rui @ 2014-05-21 15:09 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: Mika Westerberg, linux-acpi, linux-kernel, bhelgaas,
matthew.garrett, rafael.j.wysocki, dmitry.torokhov
On 三, 2014-05-21 at 13:10 +0200, Rafael J. Wysocki wrote:
> On Wednesday, May 21, 2014 11:52:07 AM Mika Westerberg wrote:
> > On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
> > > For some ACPI device objects, they represent master devices,
> > > and their children devices are enumerated by bus controller drivers
> > > for the buses they are on.
> > >
> > > In this case, we do not want to enumerate their children devices to
> > > platform bus explicitly in acpi scan code.
> > >
> > > Thus a new flag .is_master_device is introduced in this patch.
> > >
> > > For devices with this flag set, we will not do default enumeration
> > > for their children.
> >
> > Is there any particular reason we would like to enumerate everything
> > below the first device by default?
>
> Yes, there is. Device objects without _ADR under the PCI host bridge.
>
I'm confused. Mika, what do you mean by saying "first device"?
thanks,
rui
> Or we can skip the children under every *platform* device created by this by
> default and mark the ones where we want the children to be enumerated as
> platform devices too in a special way if needed.
>
> I guess we could try that (that was the Rui's original idea IIRC).
>
> Rafael
>
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-21 15:09 ` Zhang Rui
@ 2014-05-22 8:08 ` Mika Westerberg
0 siblings, 0 replies; 25+ messages in thread
From: Mika Westerberg @ 2014-05-22 8:08 UTC (permalink / raw)
To: Zhang Rui
Cc: Rafael J. Wysocki, linux-acpi, linux-kernel, bhelgaas,
matthew.garrett, rafael.j.wysocki, dmitry.torokhov
On Wed, May 21, 2014 at 11:09:42PM +0800, Zhang Rui wrote:
> On 三, 2014-05-21 at 13:10 +0200, Rafael J. Wysocki wrote:
> > On Wednesday, May 21, 2014 11:52:07 AM Mika Westerberg wrote:
> > > On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
> > > > For some ACPI device objects, they represent master devices,
> > > > and their children devices are enumerated by bus controller drivers
> > > > for the buses they are on.
> > > >
> > > > In this case, we do not want to enumerate their children devices to
> > > > platform bus explicitly in acpi scan code.
> > > >
> > > > Thus a new flag .is_master_device is introduced in this patch.
> > > >
> > > > For devices with this flag set, we will not do default enumeration
> > > > for their children.
> > >
> > > Is there any particular reason we would like to enumerate everything
> > > below the first device by default?
> >
> > Yes, there is. Device objects without _ADR under the PCI host bridge.
> >
> I'm confused. Mika, what do you mean by saying "first device"?
I mean the first level devices right below the host bridge, such as
\_SB.PCI0.* but not \_SB.PCI0.*.FOO.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-21 8:52 ` Mika Westerberg
2014-05-21 11:10 ` Rafael J. Wysocki
@ 2014-05-21 14:43 ` Zhang Rui
2014-05-22 8:51 ` Mika Westerberg
1 sibling, 1 reply; 25+ messages in thread
From: Zhang Rui @ 2014-05-21 14:43 UTC (permalink / raw)
To: Mika Westerberg
Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On 三, 2014-05-21 at 11:52 +0300, Mika Westerberg wrote:
> On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
> > For some ACPI device objects, they represent master devices,
> > and their children devices are enumerated by bus controller drivers
> > for the buses they are on.
> >
> > In this case, we do not want to enumerate their children devices to
> > platform bus explicitly in acpi scan code.
> >
> > Thus a new flag .is_master_device is introduced in this patch.
> >
> > For devices with this flag set, we will not do default enumeration
> > for their children.
>
> Is there any particular reason we would like to enumerate everything
> below the first device by default?
we do not enumerate everything below the first device by default, we
just enumerate all the devices with _HID.
But if a device has _HID and it is enumerated by its parents to a
separate bus, we need this flag set for its parent.
thanks,
rui
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-21 14:43 ` Zhang Rui
@ 2014-05-22 8:51 ` Mika Westerberg
2014-05-22 14:26 ` Zhang Rui
0 siblings, 1 reply; 25+ messages in thread
From: Mika Westerberg @ 2014-05-22 8:51 UTC (permalink / raw)
To: Zhang Rui
Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On Wed, May 21, 2014 at 10:43:07PM +0800, Zhang Rui wrote:
> On 三, 2014-05-21 at 11:52 +0300, Mika Westerberg wrote:
> > On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
> > > For some ACPI device objects, they represent master devices,
> > > and their children devices are enumerated by bus controller drivers
> > > for the buses they are on.
> > >
> > > In this case, we do not want to enumerate their children devices to
> > > platform bus explicitly in acpi scan code.
> > >
> > > Thus a new flag .is_master_device is introduced in this patch.
> > >
> > > For devices with this flag set, we will not do default enumeration
> > > for their children.
> >
> > Is there any particular reason we would like to enumerate everything
> > below the first device by default?
>
> we do not enumerate everything below the first device by default, we
> just enumerate all the devices with _HID.
OK.
> But if a device has _HID and it is enumerated by its parents to a
> separate bus, we need this flag set for its parent.
How about checking if the device has *SerialBus() connector and in such
case skip the device (given that it is not listed in a special list,
like acpi_platform_device_ids)?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH V6 09/11] ACPI: introduce flag .is_master_device
2014-05-22 8:51 ` Mika Westerberg
@ 2014-05-22 14:26 ` Zhang Rui
0 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-22 14:26 UTC (permalink / raw)
To: Mika Westerberg
Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov, Lan, Tianyu
On Thu, 2014-05-22 at 11:51 +0300, Mika Westerberg wrote:
> On Wed, May 21, 2014 at 10:43:07PM +0800, Zhang Rui wrote:
> > On 三, 2014-05-21 at 11:52 +0300, Mika Westerberg wrote:
> > > On Thu, May 15, 2014 at 02:44:14PM +0800, Zhang Rui wrote:
> > > > For some ACPI device objects, they represent master devices,
> > > > and their children devices are enumerated by bus controller drivers
> > > > for the buses they are on.
> > > >
> > > > In this case, we do not want to enumerate their children devices to
> > > > platform bus explicitly in acpi scan code.
> > > >
> > > > Thus a new flag .is_master_device is introduced in this patch.
> > > >
> > > > For devices with this flag set, we will not do default enumeration
> > > > for their children.
> > >
> > > Is there any particular reason we would like to enumerate everything
> > > below the first device by default?
> >
> > we do not enumerate everything below the first device by default, we
> > just enumerate all the devices with _HID.
>
> OK.
>
> > But if a device has _HID and it is enumerated by its parents to a
> > separate bus, we need this flag set for its parent.
>
> How about checking if the device has *SerialBus() connector and in such
> case skip the device (given that it is not listed in a special list,
> like acpi_platform_device_ids)?
This sounds like a good idea.
I think we can just ignore devices with ACPI_RESOURCE_TYPE_SERIAL_BUS
resources, and this can be done in drivers/acpi/scan.c for all _HID
devices w/o handler attached, right?
thanks,
rui
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH V6 10/11] ACPI: use platform bus as the default bus for _HID enumeration
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
` (8 preceding siblings ...)
2014-05-15 6:44 ` [PATCH V6 09/11] ACPI: introduce flag .is_master_device Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
2014-05-22 9:58 ` Mika Westerberg
2014-05-15 6:44 ` [PATCH V6 11/11] ACPI: introduce acpi platform exclude id list Zhang Rui
10 siblings, 1 reply; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
Because of the growing demand for enumerating ACPI devices to
platform bus, this patch changes the code to enumerate ACPI
devices to platform bus by default, if the device
1. has _HID.
2. does not have a scan handler attached.
3. will not be enumerated by its parent.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/acpi_platform.c | 28 ----------------------------
drivers/acpi/scan.c | 25 ++++++++++++++++++++++++-
2 files changed, 24 insertions(+), 29 deletions(-)
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index dbfe49e..33376a9 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -22,24 +22,6 @@
ACPI_MODULE_NAME("platform");
-/*
- * The following ACPI IDs are known to be suitable for representing as
- * platform devices.
- */
-static const struct acpi_device_id acpi_platform_device_ids[] = {
-
- { "PNP0D40" },
- { "ACPI0003" },
- { "VPC2004" },
- { "BCM4752" },
-
- /* Intel Smart Sound Technology */
- { "INT33C8" },
- { "80860F28" },
-
- { }
-};
-
/**
* acpi_create_platform_device - Create platform device for ACPI device node
* @adev: ACPI device node to create a platform device for.
@@ -125,13 +107,3 @@ int acpi_create_platform_device(struct acpi_device *adev,
kfree(resources);
return 1;
}
-
-static struct acpi_scan_handler platform_handler = {
- .ids = acpi_platform_device_ids,
- .attach = acpi_create_platform_device,
-};
-
-void __init acpi_platform_init(void)
-{
- acpi_scan_add_handler(&platform_handler);
-}
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 451e7d9..756977e 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2073,6 +2073,27 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
return AE_OK;
}
+static void acpi_do_default_enumeration(struct acpi_device *device)
+{
+ /*
+ * Do not do enumeration for device object that has been/will be
+ * enumerated by its parent.
+ */
+ if (device->parent && device->parent->flags.is_master_device)
+ return;
+
+ /* Do not do enumeration for device object with scan handler attached */
+ if (device->handler)
+ return;
+
+ /* Do not do enumeration for device object w/o platform_id */
+ if (!device->pnp.type.platform_id)
+ return;
+
+ acpi_create_platform_device(device, NULL);
+}
+
+
static int acpi_scan_attach_handler(struct acpi_device *device)
{
struct acpi_hardware_id *hwid;
@@ -2094,6 +2115,9 @@ static int acpi_scan_attach_handler(struct acpi_device *device)
break;
}
}
+
+ acpi_do_default_enumeration(device);
+
return ret;
}
@@ -2253,7 +2277,6 @@ int __init acpi_scan_init(void)
acpi_pci_root_init();
acpi_pci_link_init();
acpi_processor_init();
- acpi_platform_init();
acpi_lpss_init();
acpi_cmos_rtc_init();
acpi_container_init();
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [PATCH V6 10/11] ACPI: use platform bus as the default bus for _HID enumeration
2014-05-15 6:44 ` [PATCH V6 10/11] ACPI: use platform bus as the default bus for _HID enumeration Zhang Rui
@ 2014-05-22 9:58 ` Mika Westerberg
0 siblings, 0 replies; 25+ messages in thread
From: Mika Westerberg @ 2014-05-22 9:58 UTC (permalink / raw)
To: Zhang Rui
Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett,
rafael.j.wysocki, dmitry.torokhov
On Thu, May 15, 2014 at 02:44:15PM +0800, Zhang Rui wrote:
> +static void acpi_do_default_enumeration(struct acpi_device *device)
> +{
> + /*
> + * Do not do enumeration for device object that has been/will be
> + * enumerated by its parent.
> + */
> + if (device->parent && device->parent->flags.is_master_device)
> + return;
> +
> + /* Do not do enumeration for device object with scan handler attached */
> + if (device->handler)
> + return;
> +
> + /* Do not do enumeration for device object w/o platform_id */
> + if (!device->pnp.type.platform_id)
> + return;
> +
> + acpi_create_platform_device(device, NULL);
> +}
> +
> +
You have an extra empty line here.
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH V6 11/11] ACPI: introduce acpi platform exclude id list
2014-05-15 6:44 [PATCH V6 00/11] ACPI: ACPI enumeration rework Zhang Rui
` (9 preceding siblings ...)
2014-05-15 6:44 ` [PATCH V6 10/11] ACPI: use platform bus as the default bus for _HID enumeration Zhang Rui
@ 2014-05-15 6:44 ` Zhang Rui
10 siblings, 0 replies; 25+ messages in thread
From: Zhang Rui @ 2014-05-15 6:44 UTC (permalink / raw)
To: linux-acpi, linux-kernel
Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui
For ACPI PIC (PNP0000), Timer (PNP0100) and DMA controller (PNP0200)
device objects, although they have _HID control method, but they
should not be enumerated to platform bus, because there will never be
any platform drivers for them.
Thus an exclude id list is introduced in this patch to prevent
those platform device nodes from being created.
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
drivers/acpi/acpi_platform.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index 33376a9..db89480 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -22,6 +22,18 @@
ACPI_MODULE_NAME("platform");
+static const struct acpi_device_id excluded_id_list[] = {
+ {"PNP0000", 0}, /* PIC */
+ {"PNP0100", 0}, /* Timer */
+ {"PNP0200", 0}, /* AT DMA Controller */
+ {"", 0},
+};
+
+static bool is_exclusive_device(struct acpi_device *dev)
+{
+ return !acpi_match_device_ids(dev, excluded_id_list);
+}
+
/**
* acpi_create_platform_device - Create platform device for ACPI device node
* @adev: ACPI device node to create a platform device for.
@@ -48,6 +60,9 @@ int acpi_create_platform_device(struct acpi_device *adev,
if (adev->physical_node_count)
return 0;
+ if (is_exclusive_device(adev))
+ return 0;
+
INIT_LIST_HEAD(&resource_list);
count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
if (count < 0) {
--
1.8.3.2
^ permalink raw reply related [flat|nested] 25+ messages in thread