linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices
@ 2014-03-13 16:16 Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 01/13] ACPI: introduce .match() callback for ACPI scan handler Zhang Rui
                   ` (12 more replies)
  0 siblings, 13 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 UTC (permalink / raw)
  To: linux-acpi, linux-kernel
  Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui

Hi, all,

Currently, PNP bus is used as the default bus for for enumerating ACPI
devices with _HID/_CID.
For a device that needs to be enumerated to platform bus, we need to add
its id string to the platform scan handler white list explicitly.

This becomes a problem as more and more _HID devices need to be
enumerated to platform bus nowadays, thus the list is continuously growing.

So, a solution that uses platform bus for _HID enumeration by default
is preferred.

In order to do this, this patch set
First (Patch 1~5), changes the way of enumerating PNP devices.
We introduce a white list to create PNP devices instead. The 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.
Second (Patch 6~13), changes the code to enumerate ACPI _HID devices to platform
bus by default, unless the device already has a scan handler attached.

The patches of this patch set has been tested on my desktop machine,
I can see that there are four PNP devices disappeared from PNP bus
/sys/bus/pnp/devices/00:01/id:PNP0200
/sys/bus/pnp/devices/00:02/id:INT0800
/sys/bus/pnp/devices/00:03/id:PNP0103
/sys/bus/pnp/devices/00:0a/id:PNP0c04
and all of these devices have no associated drivers in kernel.

At the same time there are 17 more platform devices created,
/sys/bus/platform/devices/INT0800:00  
/sys/bus/platform/devices/INT3F0D:00  
/sys/bus/platform/devices/PNP0103:00  (HPET)
/sys/bus/platform/devices/PNP0B00:00  (CMOS RTC)
/sys/bus/platform/devices/PNP0C01:00  (system board)
/sys/bus/platform/devices/PNP0C01:00  (system board)
/sys/bus/platform/devices/PNP0C02:00  (General ID for reserving resources)
/sys/bus/platform/devices/PNP0C02:01  (General ID for reserving resources)
/sys/bus/platform/devices/PNP0C02:03  (General ID for reserving resources)
/sys/bus/platform/devices/PNP0C04:00  (Numeric data processor?)
/sys/bus/platform/devices/PNP0C0B:00  (ACPI fan)
/sys/bus/platform/devices/PNP0C0B:01  (ACPI fan)
/sys/bus/platform/devices/PNP0C0B:02  (ACPI fan)
/sys/bus/platform/devices/PNP0C0B:03  (ACPI fan)
/sys/bus/platform/devices/PNP0C0B:04  (ACPI fan)
/sys/bus/platform/devices/PNP0C0D:00  (ACPI lid)
/sys/bus/platform/devices/PNP0C14:00  (ACPI wmi)

Clarification:
Although it seems that we are introducing a much bigger white list to replace
a small one, the benefit is that
1. without the patch, the acpi_platform scan handler white list is
   continuously growing.
2. with the patch set, the PNPACPI scan handler white list will become
   smaller and smaller by
   a) remove the ids from the PNPACPI white list, for the devices
      that are never enumerated via ACPI
   b) remove the ids from the PNPACPI whilte list and convert the drivers to
      platform bus drivers, for the devices that are not PNP devices in nature.
   which will be done later.

Known Issue:
PNP bus does not check the device resources when adding a new PNP device,
while Platform bus does by invoking insert_resource() in platform_device_add().
This results in failure when creating platform device node for some ACPI
device objects in case there is resource conflict.
In my desktop, I can see that
Creating PNP0200:00 (DMA controller) fails because its resource (IO: 0x81 ~ 0x91)
conflicts with "0080-008f : dma page reg"
and
Creating PNP0C02:02 fails because its resource (IO: 0x72 ~ 0x7f)
conflicts with "0070-0077 : PNP0B00:00" (CMOS RTC).

thanks,
rui

----------------------------------------------------------------
Changes from v1:
1.move acpi pnp scan handler from drivers/pnp/pnpacpi/core.c to
  drivers/acpi/acpi-pnp.c, because the scan handler needs to be always built
  in to prevent platform devices from being created for those ACPI devices.
2.remove the __init tag for the acpi pnp scan handler because the scan
  handler is still needed after system initialization, for hotplug.
3.introduce enumerable_id flag for devices that can be enumerated to platform
  bus.
4.introduce excluded id list for creating platform devices, because some
  devices have _HID but they will never be associated with a platform driver.
5.introduce dummy lpss/container/memory_hotplug scan handler to prevent
  platform devices from being created for those ACPI device objects.

----------------------------------------------------------------
Zhang Rui (13):
      ACPI: introduce .match() callback for ACPI scan handler
      PNPACPI: use whilte list for pnpacpi device enumeration
      PNPACPI: remove ids that does not comply with the ACPI PNP id rule
      PNPACPI: remove unsupported serial PNP ids from acpi pnp scan handler id lsit
      CPI: check and enumerate CMOS RTC devices explicitly
      ACPI: introduce enumerable_id flag
      ACPI: use platform bus as the default bus for _HID enumeration
      ACPI: introduce dummy lpss scan handler
      ACPI: introduce acpi platform exclude id list
      Revert "ACPI / PNP: skip ACPI device nodes associated with physical nodes already"
      ACPI: create both PNP and Platform device nodes for PNP0C01/PNP0C02
      ACPI: introduce dummy container scan handler
      ACPI: introduce dummy acpi memory hotplug scan handler

 drivers/acpi/Makefile          |    7 +-
 drivers/acpi/acpi_lpss.c       |   66 +++++--
 drivers/acpi/acpi_memhotplug.c |   43 +++--
 drivers/acpi/acpi_platform.c   |   38 ++--
 drivers/acpi/acpi_pnp.c        |  394 ++++++++++++++++++++++++++++++++++++++++
 drivers/acpi/container.c       |   21 +++
 drivers/acpi/internal.h        |   15 +-
 drivers/acpi/scan.c            |   38 ++--
 drivers/pnp/pnpacpi/core.c     |   32 +---
 include/acpi/acpi_bus.h        |    4 +-
 include/linux/acpi.h           |    2 +
 11 files changed, 544 insertions(+), 116 deletions(-)
 create mode 100644 drivers/acpi/acpi_pnp.c


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH V2 01/13] ACPI: introduce .match() callback for ACPI scan handler
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 02/13] PNPACPI: use whilte list for pnpacpi device enumeration Zhang Rui
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 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 57b053f..dca22eb 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1907,14 +1907,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 8256eb4..8c5e235 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);
 	struct acpi_hotplug_profile hotplug;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 02/13] PNPACPI: use whilte list for pnpacpi device enumeration
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 01/13] ACPI: introduce .match() callback for ACPI scan handler Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 03/13] ACPI: remove ids that does not comply with the ACPI PNP id rule Zhang Rui
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 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.

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_pnp.c    |  367 ++++++++++++++++++++++++++++++++++++++++++++
 drivers/acpi/internal.h    |    1 +
 drivers/acpi/scan.c        |    1 +
 drivers/pnp/pnpacpi/core.c |   28 +---
 include/linux/acpi.h       |    2 +
 6 files changed, 376 insertions(+), 24 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_pnp.c b/drivers/acpi/acpi_pnp.c
new file mode 100644
index 0000000..edeed1d
--- /dev/null
+++ b/drivers/acpi/acpi_pnp.c
@@ -0,0 +1,367 @@
+/*
+ * 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;
+
+               	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,
+};
+
+bool acpi_is_pnp_device(struct acpi_device *device)
+{
+	return !!(device->handler == &acpi_pnp_handler);
+}
+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 dedbb2d..74ea3f1 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 dca22eb..399257e 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2190,6 +2190,7 @@ int __init acpi_scan_init(void)
 	acpi_container_init();
 	acpi_memory_hotplug_init();
 	acpi_dock_init();
+	acpi_pnp_init();
 
 	mutex_lock(&acpi_scan_lock);
 	/*
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
index 9f611cb..7852628 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
  */
@@ -258,7 +238,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);
@@ -318,10 +298,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 1151a1d..eac79ca 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -180,6 +180,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.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 03/13] ACPI: remove ids that does not comply with the ACPI PNP id rule
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 01/13] ACPI: introduce .match() callback for ACPI scan handler Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 02/13] PNPACPI: use whilte list for pnpacpi device enumeration Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 04/13] ACPI: remove unsupported serial PNP ids from acpi pnp scan handler id lsit Zhang Rui
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 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 edeed1d..db49e9e 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.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 04/13] ACPI: remove unsupported serial PNP ids from acpi pnp scan handler id lsit
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (2 preceding siblings ...)
  2014-03-13 16:16 ` [PATCH V2 03/13] ACPI: remove ids that does not comply with the ACPI PNP id rule Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 05/13] ACPI: check and enumerate CMOS RTC devices explicitly Zhang Rui
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 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 db49e9e..2a7f86f 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.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 05/13] ACPI: check and enumerate CMOS RTC devices explicitly
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (3 preceding siblings ...)
  2014-03-13 16:16 ` [PATCH V2 04/13] ACPI: remove unsupported serial PNP ids from acpi pnp scan handler id lsit Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 06/13] ACPI: introduce enumerable_id flag Zhang Rui
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 UTC (permalink / raw)
  To: linux-acpi, linux-kernel
  Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui

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.

Note: the CMOS RTC device id is not removed from ACPI pnp scan handler
      id list, thus, if cmos rtc scan handler is compiled out, the ACPI
      pnp scan handler will be attached to the CMOS RTC devices instead,
      to prevent these devices from being created to platform bus.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/acpi/acpi_pnp.c |   22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/acpi/acpi_pnp.c b/drivers/acpi/acpi_pnp.c
index 2a7f86f..6fa482a 100644
--- a/drivers/acpi/acpi_pnp.c
+++ b/drivers/acpi/acpi_pnp.c
@@ -349,9 +349,29 @@ static struct acpi_scan_handler acpi_pnp_handler = {
 	.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)
 {
-	return !!(device->handler == &acpi_pnp_handler);
+	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);
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 06/13] ACPI: introduce enumerable_id flag
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (4 preceding siblings ...)
  2014-03-13 16:16 ` [PATCH V2 05/13] ACPI: check and enumerate CMOS RTC devices explicitly Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-15  1:03   ` Rafael J. Wysocki
  2014-03-13 16:16 ` [PATCH V2 07/13] ACPI: use platform bus as the default bus for _HID enumeration Zhang Rui
                   ` (6 subsequent siblings)
  12 siblings, 1 reply; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 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 via ACPI.
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
enumerable_id and a new function acpi_add_eid() are introduced in this patch.

Currently, only devices with _HID method have this flag set.
And in the future, if a device that has Linux specified HID strings
wants to be enumerated to platform bus, acpi_add_eid() should be used
instead of acpi_add_id() when adding its Linux specified HID string.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/acpi/scan.c     |    8 +++++++-
 include/acpi/acpi_bus.h |    3 ++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 399257e..768f81d 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1679,6 +1679,12 @@ static void acpi_add_id(struct acpi_device_pnp *pnp, const char *dev_id)
 	pnp->type.hardware_id = 1;
 }
 
+static void acpi_add_eid(struct acpi_device_pnp *pnp, const char *dev_id)
+{
+	acpi_add_id(pnp, dev_id);
+	pnp->type.enumerable_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 "_"
@@ -1729,7 +1735,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_eid(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 8c5e235..688ca44 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -217,7 +217,8 @@ struct acpi_hardware_id {
 struct acpi_pnp_type {
 	u32 hardware_id:1;
 	u32 bus_address:1;
-	u32 reserved:30;
+	u32 enumerable_id:1;
+	u32 reserved:29;
 };
 
 struct acpi_device_pnp {
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 07/13] ACPI: use platform bus as the default bus for _HID enumeration
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (5 preceding siblings ...)
  2014-03-13 16:16 ` [PATCH V2 06/13] ACPI: introduce enumerable_id flag Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 08/13] ACPI: introduce dummy lpss scan handler Zhang Rui
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 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 with _HID to
platform bus by default, unless the device already has a scan handler attached.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/acpi/acpi_platform.c |   28 ----------------------------
 drivers/acpi/scan.c          |   12 ++++++------
 2 files changed, 6 insertions(+), 34 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 768f81d..1493bc2 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2027,14 +2027,15 @@ static int acpi_scan_attach_handler(struct acpi_device *device)
 		handler = acpi_scan_match_handler(hwid->id, &devid);
 		if (handler) {
 			ret = handler->attach(device, devid);
-			if (ret > 0) {
+			if (ret > 0)
 				device->handler = handler;
-				break;
-			} else if (ret < 0) {
-				break;
-			}
+			if (ret)
+				goto end;
 		}
 	}
+end:
+	if (device->pnp.type.enumerable_id && !device->handler)
+		acpi_create_platform_device(device, NULL);
 	return ret;
 }
 
@@ -2190,7 +2191,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.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 08/13] ACPI: introduce dummy lpss scan handler
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (6 preceding siblings ...)
  2014-03-13 16:16 ` [PATCH V2 07/13] ACPI: use platform bus as the default bus for _HID enumeration Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [PATCH V2 09/13] ACPI: introduce acpi platform exclude id list Zhang Rui
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 UTC (permalink / raw)
  To: linux-acpi, linux-kernel
  Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui

When the lpss scan handler is compiled out, aka, CONFIG_X86_INTEL_LPSS
is cleared, those ACPI device objects will be recgonized as regular
_HID devices, and a platform device would be created for each of them.
This is wrong because the platform drivers for those devices would
be loaded, but with broken behavior.

In order to fix this, a dummy lpss scan handler is introduced
to prevent those platform devices from being created.
Plus, this dummy scan handler is needed as well if lpt_clk_init() fails.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/acpi/Makefile    |    2 +-
 drivers/acpi/acpi_lpss.c |   66 +++++++++++++++++++++++++++++++++-------------
 drivers/acpi/internal.h  |    4 ---
 3 files changed, 48 insertions(+), 24 deletions(-)

diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 9a43893..2173e30 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 6745fe1..6f753fe 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
 
@@ -142,39 +144,48 @@ 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 */
-	{ "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 },
+	{ "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;
@@ -431,10 +442,27 @@ static struct acpi_scan_handler lpss_handler = {
 	.attach = acpi_lpss_create_device,
 };
 
+#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 74ea3f1..a0c9368 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -67,11 +67,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
 
 bool acpi_queue_hotplug_work(struct work_struct *work);
 bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH V2 09/13] ACPI: introduce acpi platform exclude id list
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (7 preceding siblings ...)
  2014-03-13 16:16 ` [PATCH V2 08/13] ACPI: introduce dummy lpss scan handler Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [RFC PATCH V2 10/13] Revert "ACPI / PNP: skip ACPI device nodes associated with physical nodes already" Zhang Rui
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 UTC (permalink / raw)
  To: linux-acpi, linux-kernel
  Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui

For ACPI PIC (PNP0000) and Timer (PNP0100) 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 |   14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index 33376a9..0cf291e 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -22,6 +22,17 @@
 
 ACPI_MODULE_NAME("platform");
 
+static const struct acpi_device_id excluded_id_list[] = {
+	{"PNP0000", 0},	/* PIC */
+	{"PNP0100", 0},	/* Timer */
+	{"", 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 +59,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.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH V2 10/13] Revert "ACPI / PNP: skip ACPI device nodes associated with physical nodes already"
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (8 preceding siblings ...)
  2014-03-13 16:16 ` [PATCH V2 09/13] ACPI: introduce acpi platform exclude id list Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [RFC PATCH V2 11/13] ACPI: create both PNP and Platform device nodes for PNP0C01/PNP0C02 Zhang Rui
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 UTC (permalink / raw)
  To: linux-acpi, linux-kernel
  Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui

This reverts commit 2905875344f977acd188a2b0f1d163491e91459b.

commit 2905875344f977acd188a2b0f1d163491e91459b was introduced to prevent
PNP device objects from being created for ACPI device nodes already associated
with platform devices.

This is not needed any more because the platform device node won't be created
if a device has already been attached to the PNPACPI scan handler.

Plus, in some cases, we may need both PNP node and platform node for the
same ACPI device object, on purpose, like what I will do in next patch.

Thus reverting this commit.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/pnp/pnpacpi/core.c |    4 ----
 1 file changed, 4 deletions(-)

diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
index 7852628..f7aa435 100644
--- a/drivers/pnp/pnpacpi/core.c
+++ b/drivers/pnp/pnpacpi/core.c
@@ -223,10 +223,6 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
 	struct acpi_hardware_id *id;
 	int error;
 
-	/* Skip devices that are already bound */
-	if (device->physical_node_count)
-		return 0;
-
 	/*
 	 * If a PnPacpi device is not present , the device
 	 * driver should not be loaded.
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH V2 11/13] ACPI: create both PNP and Platform device nodes for PNP0C01/PNP0C02
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (9 preceding siblings ...)
  2014-03-13 16:16 ` [RFC PATCH V2 10/13] Revert "ACPI / PNP: skip ACPI device nodes associated with physical nodes already" Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [RFC PATCH V2 12/13] ACPI: introduce dummy container scan handler Zhang Rui
  2014-03-13 16:16 ` [RFC PATCH V2 13/13] ACPI: introduce dummy memory hotplug " Zhang Rui
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 UTC (permalink / raw)
  To: linux-acpi, linux-kernel
  Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui

ACPI devices with id "PNP0C01/PNP0C02" means that we need to
protect their resources from being allocated by others.

Currently, this is done in drivers/pnp/system.c.

But the problem is that, there are some devices with extra ids besides
PNP0C01/PNP0C02, and for these devices,
1) PNP0C01/PNP0C02 suggest that resource reservation is still needed.
2) the other ids suggest that we should enumerate them to platform bus

To reserve resources for those devices, we should either use the current code
by exporting the device to PNP bus, or introduce resource reservation support
in platform bus/ACPI.

This patch follows the first way by enumerating an ACPI device to platform bus
AND pnp bus at the same time.
Its PNP device node will be probed by drivers/pnp/system.c and do
everything as we do today.
Its platform device node will also be created so that a platform bus
driver can be probed.

The advantage is that, it brings little change to the current code,
the patch itself looks safe and clear.
The disadvantage is that
1) we create two physical device nodes for the same ACPI node,
   this is against our effort that has been doing recently.
2) we still depend on PNP bus to do this (resouce reservation) for us,
   which is still a problem we need to fix sooner or later.

An alternative proposal is to remove the depedency of PNP bus and
do resource management in ACPI for all PNP0C01/PNP0C02 devices instead,
no matter what bus they are enumerated to.
To do this, we need to
1) introduce a fs_initcall() in ACPI, to reserve all PNP0C01/PNP0C02 resources
in ACPI, something like we did via drivers/acpi/motherboard.c before
(but the code needs to follow drivers/pnp/quirks.c and system.c strictly).
This initcall will be run after PCI claiming BARs and before PCI assigning
resources for uninitialized devices.
2) skip drivers/pnp/quirks.c and drivers/pnp/system.c for ACPI
   enumerted PNP devices, by checking pnp_device->protocal.
3) remove PNP0C01/PNP0C02 from PNPACPI white list.

By doing this, we can remove the depedency of PNP bus, but this requires
a lot of code duplication(need to copy quirks.c and system.c logic into ACPI),
which does not look good neither.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/acpi/acpi_pnp.c |   19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/acpi_pnp.c b/drivers/acpi/acpi_pnp.c
index 6fa482a..ad84f4e 100644
--- a/drivers/acpi/acpi_pnp.c
+++ b/drivers/acpi/acpi_pnp.c
@@ -132,9 +132,6 @@ static const struct acpi_device_id acpi_pnp_device_ids[]= {
 	{"FUJ02bf"},
 	{"FUJ02B1"},
 	{"FUJ02E3"},
-	/* system */
-	{"PNP0c02"}, /* General ID for reserving resources */
-	{"PNP0c01"}, /* memory controller */
 	/* rtc_cmos */
 	{"PNP0b00"},
 	{"PNP0b01"},
@@ -365,12 +362,28 @@ static int is_cmos_rtc_device(struct acpi_device *adev)
 	return !acpi_match_device_ids(adev, ids);
 }
 
+/*
+ * For devices with id "PNP0C01"/"PNP0C02", they will be enumerated
+ * to PNP bus anyway to do resource reservation.
+ */
+static int is_system_device(struct acpi_device *adev)
+{
+	struct acpi_device_id ids[] = {
+		{"PNP0C02"},
+		{"PNP0C01"},
+		{""},
+	};
+	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;
+	if (is_system_device(device))
+		return true;
 	return false;
 }
 EXPORT_SYMBOL_GPL(acpi_is_pnp_device);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH V2 12/13] ACPI: introduce dummy container scan handler
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (10 preceding siblings ...)
  2014-03-13 16:16 ` [RFC PATCH V2 11/13] ACPI: create both PNP and Platform device nodes for PNP0C01/PNP0C02 Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  2014-03-13 16:16 ` [RFC PATCH V2 13/13] ACPI: introduce dummy memory hotplug " Zhang Rui
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 UTC (permalink / raw)
  To: linux-acpi, linux-kernel
  Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui

When CONFIG_ACPI_CONTAINER is cleared, platform devices would be
created for ACPI container objects.

Introduce a dummy container scan handler in this patch to prevent
these platform devices from being created.

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 2173e30..871d70d 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 368f9dd..c2ec401 100644
--- a/drivers/acpi/container.c
+++ b/drivers/acpi/container.c
@@ -43,6 +43,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);
@@ -110,3 +112,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 a0c9368..253758a 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 acpi_dock_init(void);
 #else
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH V2 13/13] ACPI: introduce dummy memory hotplug scan handler
  2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
                   ` (11 preceding siblings ...)
  2014-03-13 16:16 ` [RFC PATCH V2 12/13] ACPI: introduce dummy container scan handler Zhang Rui
@ 2014-03-13 16:16 ` Zhang Rui
  12 siblings, 0 replies; 16+ messages in thread
From: Zhang Rui @ 2014-03-13 16:16 UTC (permalink / raw)
  To: linux-acpi, linux-kernel
  Cc: bhelgaas, matthew.garrett, rafael.j.wysocki, dmitry.torokhov, Zhang Rui

If CONFIG_ACPI_HOTPLUG_MEMORY is cleared, platform devices would be
created for ACPI hotplug memory device objects.

Introduce a dummy memory hotplug scan handler in this patch,
to prevent those platform devices from being created.

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 871d70d..605eff7 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..427e32b 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 253758a..4e96e84 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -33,16 +33,12 @@ 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 acpi_dock_init(void);
 #else
 static inline void acpi_dock_init(void) {}
 #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.7.9.5


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH V2 06/13] ACPI: introduce enumerable_id flag
  2014-03-13 16:16 ` [PATCH V2 06/13] ACPI: introduce enumerable_id flag Zhang Rui
@ 2014-03-15  1:03   ` Rafael J. Wysocki
  2014-03-15  1:12     ` Zhang, Rui
  0 siblings, 1 reply; 16+ messages in thread
From: Rafael J. Wysocki @ 2014-03-15  1:03 UTC (permalink / raw)
  To: Zhang Rui
  Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett, dmitry.torokhov

On 3/13/2014 5:16 PM, Zhang Rui wrote:
> Only certain kind of ACPI device objects can be enumerated via ACPI.
> 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
> enumerable_id and a new function acpi_add_eid() are introduced in this patch.

I don't really like the name of the new flag.  What about calling it 
platform_id (it is supposed to indicate that the core should create a 
platform device for it)?

> Currently, only devices with _HID method have this flag set.
> And in the future, if a device that has Linux specified HID strings
> wants to be enumerated to platform bus, acpi_add_eid() should be used

And what about calling the new function acpi_add_platform_id() accordingly?

> instead of acpi_add_id() when adding its Linux specified HID string.

And I don't quite understand the last paragraph as a whole.  Is it 
supposed to mean "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     |    8 +++++++-
>   include/acpi/acpi_bus.h |    3 ++-
>   2 files changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index 399257e..768f81d 100644
> --- a/drivers/acpi/scan.c
> +++ b/drivers/acpi/scan.c
> @@ -1679,6 +1679,12 @@ static void acpi_add_id(struct acpi_device_pnp *pnp, const char *dev_id)
>   	pnp->type.hardware_id = 1;
>   }
>   
> +static void acpi_add_eid(struct acpi_device_pnp *pnp, const char *dev_id)
> +{
> +	acpi_add_id(pnp, dev_id);
> +	pnp->type.enumerable_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 "_"
> @@ -1729,7 +1735,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_eid(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 8c5e235..688ca44 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -217,7 +217,8 @@ struct acpi_hardware_id {
>   struct acpi_pnp_type {
>   	u32 hardware_id:1;
>   	u32 bus_address:1;
> -	u32 reserved:30;
> +	u32 enumerable_id:1;
> +	u32 reserved:29;
>   };
>   
>   struct acpi_device_pnp {


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: [PATCH V2 06/13] ACPI: introduce enumerable_id flag
  2014-03-15  1:03   ` Rafael J. Wysocki
@ 2014-03-15  1:12     ` Zhang, Rui
  0 siblings, 0 replies; 16+ messages in thread
From: Zhang, Rui @ 2014-03-15  1:12 UTC (permalink / raw)
  To: Wysocki, Rafael J
  Cc: linux-acpi, linux-kernel, bhelgaas, matthew.garrett, dmitry.torokhov



> -----Original Message-----
> From: Wysocki, Rafael J
> Sent: Saturday, March 15, 2014 9:03 AM
> To: Zhang, Rui
> Cc: linux-acpi@vger.kernel.org; linux-kernel@vger.kernel.org;
> bhelgaas@google.com; matthew.garrett@nebula.com;
> dmitry.torokhov@gmail.com
> Subject: Re: [PATCH V2 06/13] ACPI: introduce enumerable_id flag
> Importance: High
> 
> On 3/13/2014 5:16 PM, Zhang Rui wrote:
> > Only certain kind of ACPI device objects can be enumerated via ACPI.
> > 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 enumerable_id and a new function acpi_add_eid() are introduced
> in this patch.
> 
> I don't really like the name of the new flag.  What about calling it
> platform_id (it is supposed to indicate that the core should create a
> platform device for it)?
>
I concerned about the same problem, but could not get a better name.
Yes, platform_id sounds much better.

> > Currently, only devices with _HID method have this flag set.
> > And in the future, if a device that has Linux specified HID strings
> > wants to be enumerated to platform bus, acpi_add_eid() should be used
> 
> And what about calling the new function acpi_add_platform_id()
> accordingly?
>
Agreed.
 
> > instead of acpi_add_id() when adding its Linux specified HID string.
> 
> And I don't quite understand the last paragraph as a whole.  Is it
> supposed to mean "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"?
> 
Yes.
Currently, we use acpi_add_id() for devices like video, thermal, etc,
If we want to see them in platform bus, we just a one line change to
replace acpi_add_id() with acpi_add_platform_id().

Thanks,
rui

> > Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> > ---
> >   drivers/acpi/scan.c     |    8 +++++++-
> >   include/acpi/acpi_bus.h |    3 ++-
> >   2 files changed, 9 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index
> > 399257e..768f81d 100644
> > --- a/drivers/acpi/scan.c
> > +++ b/drivers/acpi/scan.c
> > @@ -1679,6 +1679,12 @@ static void acpi_add_id(struct acpi_device_pnp
> *pnp, const char *dev_id)
> >   	pnp->type.hardware_id = 1;
> >   }
> >
> > +static void acpi_add_eid(struct acpi_device_pnp *pnp, const char
> > +*dev_id) {
> > +	acpi_add_id(pnp, dev_id);
> > +	pnp->type.enumerable_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
> "_"
> > @@ -1729,7 +1735,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_eid(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
> > 8c5e235..688ca44 100644
> > --- a/include/acpi/acpi_bus.h
> > +++ b/include/acpi/acpi_bus.h
> > @@ -217,7 +217,8 @@ struct acpi_hardware_id {
> >   struct acpi_pnp_type {
> >   	u32 hardware_id:1;
> >   	u32 bus_address:1;
> > -	u32 reserved:30;
> > +	u32 enumerable_id:1;
> > +	u32 reserved:29;
> >   };
> >
> >   struct acpi_device_pnp {


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2014-03-15  1:12 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-13 16:16 [PATCH V2 0/13] ACPI: change the way of enumerating PNPACPI/Platform devices Zhang Rui
2014-03-13 16:16 ` [PATCH V2 01/13] ACPI: introduce .match() callback for ACPI scan handler Zhang Rui
2014-03-13 16:16 ` [PATCH V2 02/13] PNPACPI: use whilte list for pnpacpi device enumeration Zhang Rui
2014-03-13 16:16 ` [PATCH V2 03/13] ACPI: remove ids that does not comply with the ACPI PNP id rule Zhang Rui
2014-03-13 16:16 ` [PATCH V2 04/13] ACPI: remove unsupported serial PNP ids from acpi pnp scan handler id lsit Zhang Rui
2014-03-13 16:16 ` [PATCH V2 05/13] ACPI: check and enumerate CMOS RTC devices explicitly Zhang Rui
2014-03-13 16:16 ` [PATCH V2 06/13] ACPI: introduce enumerable_id flag Zhang Rui
2014-03-15  1:03   ` Rafael J. Wysocki
2014-03-15  1:12     ` Zhang, Rui
2014-03-13 16:16 ` [PATCH V2 07/13] ACPI: use platform bus as the default bus for _HID enumeration Zhang Rui
2014-03-13 16:16 ` [PATCH V2 08/13] ACPI: introduce dummy lpss scan handler Zhang Rui
2014-03-13 16:16 ` [PATCH V2 09/13] ACPI: introduce acpi platform exclude id list Zhang Rui
2014-03-13 16:16 ` [RFC PATCH V2 10/13] Revert "ACPI / PNP: skip ACPI device nodes associated with physical nodes already" Zhang Rui
2014-03-13 16:16 ` [RFC PATCH V2 11/13] ACPI: create both PNP and Platform device nodes for PNP0C01/PNP0C02 Zhang Rui
2014-03-13 16:16 ` [RFC PATCH V2 12/13] ACPI: introduce dummy container scan handler Zhang Rui
2014-03-13 16:16 ` [RFC PATCH V2 13/13] ACPI: introduce dummy memory hotplug " Zhang Rui

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).