diff options
author | Mika Westerberg <mika.westerberg@linux.intel.com> | 2012-10-31 17:45:02 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2012-11-14 18:28:01 -0500 |
commit | 91e5687805885f9fceb60b95e950a3d3bdcf4764 (patch) | |
tree | 4bcff02107152a509a921d34929be77681790f6f /drivers/acpi/scan.c | |
parent | a42b9bfe959519772fd8d97557c760f7cda4d325 (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.c | 16 |
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 | ||
30 | static const char *dummy_hid = "device"; | 30 | static 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 | */ | ||
36 | static const struct acpi_device_id acpi_platform_device_ids[] = { | ||
37 | |||
38 | { } | ||
39 | }; | ||
40 | |||
32 | static LIST_HEAD(acpi_device_list); | 41 | static LIST_HEAD(acpi_device_list); |
33 | static LIST_HEAD(acpi_bus_id_list); | 42 | static LIST_HEAD(acpi_bus_id_list); |
34 | DEFINE_MUTEX(acpi_device_lock); | 43 | DEFINE_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; |