Since we don't want to create the Lynxpoint LPSS clock tree on a machines where no LPSS exists at all we look for the Lynxpoint device ACPI HIDs during ACPI namespace scan and if a known device is seen we assume that it is safe to create the LPSS clocks.
Therefore we allow init function to be passed via acpi_platform_device_ids[] table which is called whenever the corresponding device is found. Signed-off-by: Mika Westerberg <mika.westerb...@linux.intel.com> --- drivers/acpi/scan.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 6a12702..8d9965e 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -11,6 +11,7 @@ #include <linux/kthread.h> #include <linux/dmi.h> #include <linux/nls.h> +#include <linux/platform_device.h> #include <acpi/acpi_drivers.h> @@ -29,6 +30,15 @@ extern struct acpi_device *acpi_root; static const char *dummy_hid = "device"; +static void lpt_lpss_init_once(void) +{ + static struct platform_device *pdev; + + /* Lynxpoint LPSS clocks */ + if (!pdev) + pdev = platform_device_register_simple("clk-lpt", -1, NULL, 0); +} + /* * The following ACPI IDs are known to be suitable for representing as * platform devices. @@ -38,14 +48,14 @@ static const struct acpi_device_id acpi_platform_device_ids[] = { { "PNP0D40" }, /* Haswell LPSS devices */ - { "INT33C0", 0 }, - { "INT33C1", 0 }, - { "INT33C2", 0 }, - { "INT33C3", 0 }, - { "INT33C4", 0 }, - { "INT33C5", 0 }, - { "INT33C6", 0 }, - { "INT33C7", 0 }, + { "INT33C0", (kernel_ulong_t)lpt_lpss_init_once }, + { "INT33C1", (kernel_ulong_t)lpt_lpss_init_once }, + { "INT33C2", (kernel_ulong_t)lpt_lpss_init_once }, + { "INT33C3", (kernel_ulong_t)lpt_lpss_init_once }, + { "INT33C4", (kernel_ulong_t)lpt_lpss_init_once }, + { "INT33C5", (kernel_ulong_t)lpt_lpss_init_once }, + { "INT33C6", (kernel_ulong_t)lpt_lpss_init_once }, + { "INT33C7", (kernel_ulong_t)lpt_lpss_init_once }, { } }; @@ -1580,6 +1590,7 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used, static acpi_status acpi_bus_device_attach(acpi_handle handle, u32 lvl_not_used, void *not_used, void **ret_not_used) { + const struct acpi_device_id *id; acpi_status status = AE_OK; struct acpi_device *device; unsigned long long sta_not_used; @@ -1595,7 +1606,14 @@ static acpi_status acpi_bus_device_attach(acpi_handle handle, u32 lvl_not_used, if (acpi_bus_get_device(handle, &device)) return AE_CTRL_DEPTH; - if (!acpi_match_device_ids(device, acpi_platform_device_ids)) { + id = __acpi_match_device(device, acpi_platform_device_ids); + if (id) { + void (*init)(void) = (void (*)(void))id->driver_data; + + /* Run any initialization if required */ + if (init) + init(); + /* This is a known good platform device. */ acpi_create_platform_device(device); } else if (device_attach(&device->dev) < 0) { -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/