diff options
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/acpi_platform.c | 44 | ||||
-rw-r--r-- | drivers/acpi/scan.c | 42 |
2 files changed, 49 insertions, 37 deletions
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c index 3bb89def2292..2bf9082f7523 100644 --- a/drivers/acpi/acpi_platform.c +++ b/drivers/acpi/acpi_platform.c | |||
@@ -22,25 +22,11 @@ | |||
22 | 22 | ||
23 | ACPI_MODULE_NAME("platform"); | 23 | ACPI_MODULE_NAME("platform"); |
24 | 24 | ||
25 | /* | 25 | static const struct acpi_device_id forbidden_id_list[] = { |
26 | * The following ACPI IDs are known to be suitable for representing as | 26 | {"PNP0000", 0}, /* PIC */ |
27 | * platform devices. | 27 | {"PNP0100", 0}, /* Timer */ |
28 | */ | 28 | {"PNP0200", 0}, /* AT DMA Controller */ |
29 | static const struct acpi_device_id acpi_platform_device_ids[] = { | 29 | {"", 0}, |
30 | |||
31 | { "PNP0D40" }, | ||
32 | { "VPC2004" }, | ||
33 | { "BCM4752" }, | ||
34 | { "LNV4752" }, | ||
35 | { "BCM2E1A" }, | ||
36 | { "BCM2E39" }, | ||
37 | { "BCM2E3D" }, | ||
38 | |||
39 | /* Intel Smart Sound Technology */ | ||
40 | { "INT33C8" }, | ||
41 | { "80860F28" }, | ||
42 | |||
43 | { } | ||
44 | }; | 30 | }; |
45 | 31 | ||
46 | /** | 32 | /** |
@@ -67,6 +53,9 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev) | |||
67 | if (adev->physical_node_count) | 53 | if (adev->physical_node_count) |
68 | return NULL; | 54 | return NULL; |
69 | 55 | ||
56 | if (!acpi_match_device_ids(adev, forbidden_id_list)) | ||
57 | return ERR_PTR(-EINVAL); | ||
58 | |||
70 | INIT_LIST_HEAD(&resource_list); | 59 | INIT_LIST_HEAD(&resource_list); |
71 | count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL); | 60 | count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL); |
72 | if (count < 0) { | 61 | if (count < 0) { |
@@ -124,20 +113,3 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev) | |||
124 | kfree(resources); | 113 | kfree(resources); |
125 | return pdev; | 114 | return pdev; |
126 | } | 115 | } |
127 | |||
128 | static int acpi_platform_attach(struct acpi_device *adev, | ||
129 | const struct acpi_device_id *id) | ||
130 | { | ||
131 | acpi_create_platform_device(adev); | ||
132 | return 1; | ||
133 | } | ||
134 | |||
135 | static struct acpi_scan_handler platform_handler = { | ||
136 | .ids = acpi_platform_device_ids, | ||
137 | .attach = acpi_platform_attach, | ||
138 | }; | ||
139 | |||
140 | void __init acpi_platform_init(void) | ||
141 | { | ||
142 | acpi_scan_add_handler(&platform_handler); | ||
143 | } | ||
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 611bb5db7e57..df49fc8276b9 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -2070,6 +2070,44 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used, | |||
2070 | return AE_OK; | 2070 | return AE_OK; |
2071 | } | 2071 | } |
2072 | 2072 | ||
2073 | static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data) | ||
2074 | { | ||
2075 | bool *is_spi_i2c_slave_p = data; | ||
2076 | |||
2077 | if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS) | ||
2078 | return 1; | ||
2079 | |||
2080 | /* | ||
2081 | * devices that are connected to UART still need to be enumerated to | ||
2082 | * platform bus | ||
2083 | */ | ||
2084 | if (ares->data.common_serial_bus.type != ACPI_RESOURCE_SERIAL_TYPE_UART) | ||
2085 | *is_spi_i2c_slave_p = true; | ||
2086 | |||
2087 | /* no need to do more checking */ | ||
2088 | return -1; | ||
2089 | } | ||
2090 | |||
2091 | static void acpi_default_enumeration(struct acpi_device *device) | ||
2092 | { | ||
2093 | struct list_head resource_list; | ||
2094 | bool is_spi_i2c_slave = false; | ||
2095 | |||
2096 | if (!device->pnp.type.platform_id || device->handler) | ||
2097 | return; | ||
2098 | |||
2099 | /* | ||
2100 | * Do not enemerate SPI/I2C slaves as they will be enuerated by their | ||
2101 | * respective parents. | ||
2102 | */ | ||
2103 | INIT_LIST_HEAD(&resource_list); | ||
2104 | acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave, | ||
2105 | &is_spi_i2c_slave); | ||
2106 | acpi_dev_free_resource_list(&resource_list); | ||
2107 | if (!is_spi_i2c_slave) | ||
2108 | acpi_create_platform_device(device); | ||
2109 | } | ||
2110 | |||
2073 | static int acpi_scan_attach_handler(struct acpi_device *device) | 2111 | static int acpi_scan_attach_handler(struct acpi_device *device) |
2074 | { | 2112 | { |
2075 | struct acpi_hardware_id *hwid; | 2113 | struct acpi_hardware_id *hwid; |
@@ -2095,6 +2133,9 @@ static int acpi_scan_attach_handler(struct acpi_device *device) | |||
2095 | break; | 2133 | break; |
2096 | } | 2134 | } |
2097 | } | 2135 | } |
2136 | if (!ret) | ||
2137 | acpi_default_enumeration(device); | ||
2138 | |||
2098 | return ret; | 2139 | return ret; |
2099 | } | 2140 | } |
2100 | 2141 | ||
@@ -2254,7 +2295,6 @@ int __init acpi_scan_init(void) | |||
2254 | acpi_pci_root_init(); | 2295 | acpi_pci_root_init(); |
2255 | acpi_pci_link_init(); | 2296 | acpi_pci_link_init(); |
2256 | acpi_processor_init(); | 2297 | acpi_processor_init(); |
2257 | acpi_platform_init(); | ||
2258 | acpi_lpss_init(); | 2298 | acpi_lpss_init(); |
2259 | acpi_cmos_rtc_init(); | 2299 | acpi_cmos_rtc_init(); |
2260 | acpi_container_init(); | 2300 | acpi_container_init(); |