aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/scan.c
diff options
context:
space:
mode:
authorMika Westerberg <mika.westerberg@linux.intel.com>2012-10-31 17:45:02 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2012-11-14 18:28:01 -0500
commit91e5687805885f9fceb60b95e950a3d3bdcf4764 (patch)
tree4bcff02107152a509a921d34929be77681790f6f /drivers/acpi/scan.c
parenta42b9bfe959519772fd8d97557c760f7cda4d325 (diff)
ACPI: Add support for platform bus type
With ACPI 5 it is now possible to enumerate traditional SoC peripherals, like serial bus controllers and slave devices behind them. These devices are typically based on IP-blocks used in many existing SoC platforms and platform drivers for them may already be present in the kernel tree. To make driver "porting" more straightforward, add ACPI support to the platform bus type. Instead of writing ACPI "glue" drivers for the existing platform drivers, register the platform bus type with ACPI to create platform device objects for the drivers and bind the corresponding ACPI handles to those platform devices. This should allow us to reuse the existing platform drivers for the devices in question with the minimum amount of modifications. This changeset is based on Mika Westerberg's and Mathias Nyman's work. Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Acked-by: H. Peter Anvin <hpa@zytor.com> Acked-by: Tony Luck <tony.luck@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r--drivers/acpi/scan.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index a0dfdffe54d4..d842569395a9 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -29,6 +29,15 @@ extern struct acpi_device *acpi_root;
29 29
30static const char *dummy_hid = "device"; 30static const char *dummy_hid = "device";
31 31
32/*
33 * The following ACPI IDs are known to be suitable for representing as
34 * platform devices.
35 */
36static const struct acpi_device_id acpi_platform_device_ids[] = {
37
38 { }
39};
40
32static LIST_HEAD(acpi_device_list); 41static LIST_HEAD(acpi_device_list);
33static LIST_HEAD(acpi_bus_id_list); 42static LIST_HEAD(acpi_bus_id_list);
34DEFINE_MUTEX(acpi_device_lock); 43DEFINE_MUTEX(acpi_device_lock);
@@ -1513,8 +1522,13 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl,
1513 */ 1522 */
1514 device = NULL; 1523 device = NULL;
1515 acpi_bus_get_device(handle, &device); 1524 acpi_bus_get_device(handle, &device);
1516 if (ops->acpi_op_add && !device) 1525 if (ops->acpi_op_add && !device) {
1517 acpi_add_single_object(&device, handle, type, sta, ops); 1526 acpi_add_single_object(&device, handle, type, sta, ops);
1527 /* Is the device a known good platform device? */
1528 if (device
1529 && !acpi_match_device_ids(device, acpi_platform_device_ids))
1530 acpi_create_platform_device(device);
1531 }
1518 1532
1519 if (!device) 1533 if (!device)
1520 return AE_CTRL_DEPTH; 1534 return AE_CTRL_DEPTH;