|
@@ -1428,6 +1428,37 @@ static void acpi_init_coherency(struct acpi_device *adev)
|
|
|
adev->flags.coherent_dma = cca;
|
|
|
}
|
|
|
|
|
|
+static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data)
|
|
|
+{
|
|
|
+ bool *is_spi_i2c_slave_p = data;
|
|
|
+
|
|
|
+ if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * devices that are connected to UART still need to be enumerated to
|
|
|
+ * platform bus
|
|
|
+ */
|
|
|
+ if (ares->data.common_serial_bus.type != ACPI_RESOURCE_SERIAL_TYPE_UART)
|
|
|
+ *is_spi_i2c_slave_p = true;
|
|
|
+
|
|
|
+ /* no need to do more checking */
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+static bool acpi_is_spi_i2c_slave(struct acpi_device *device)
|
|
|
+{
|
|
|
+ struct list_head resource_list;
|
|
|
+ bool is_spi_i2c_slave = false;
|
|
|
+
|
|
|
+ INIT_LIST_HEAD(&resource_list);
|
|
|
+ acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave,
|
|
|
+ &is_spi_i2c_slave);
|
|
|
+ acpi_dev_free_resource_list(&resource_list);
|
|
|
+
|
|
|
+ return is_spi_i2c_slave;
|
|
|
+}
|
|
|
+
|
|
|
void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
|
|
int type, unsigned long long sta)
|
|
|
{
|
|
@@ -1443,6 +1474,7 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
|
|
acpi_bus_get_flags(device);
|
|
|
device->flags.match_driver = false;
|
|
|
device->flags.initialized = true;
|
|
|
+ device->flags.spi_i2c_slave = acpi_is_spi_i2c_slave(device);
|
|
|
acpi_device_clear_enumerated(device);
|
|
|
device_initialize(&device->dev);
|
|
|
dev_set_uevent_suppress(&device->dev, true);
|
|
@@ -1727,38 +1759,13 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
|
|
|
return AE_OK;
|
|
|
}
|
|
|
|
|
|
-static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data)
|
|
|
-{
|
|
|
- bool *is_spi_i2c_slave_p = data;
|
|
|
-
|
|
|
- if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
|
|
|
- return 1;
|
|
|
-
|
|
|
- /*
|
|
|
- * devices that are connected to UART still need to be enumerated to
|
|
|
- * platform bus
|
|
|
- */
|
|
|
- if (ares->data.common_serial_bus.type != ACPI_RESOURCE_SERIAL_TYPE_UART)
|
|
|
- *is_spi_i2c_slave_p = true;
|
|
|
-
|
|
|
- /* no need to do more checking */
|
|
|
- return -1;
|
|
|
-}
|
|
|
-
|
|
|
static void acpi_default_enumeration(struct acpi_device *device)
|
|
|
{
|
|
|
- struct list_head resource_list;
|
|
|
- bool is_spi_i2c_slave = false;
|
|
|
-
|
|
|
/*
|
|
|
* Do not enumerate SPI/I2C slaves as they will be enumerated by their
|
|
|
* respective parents.
|
|
|
*/
|
|
|
- INIT_LIST_HEAD(&resource_list);
|
|
|
- acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave,
|
|
|
- &is_spi_i2c_slave);
|
|
|
- acpi_dev_free_resource_list(&resource_list);
|
|
|
- if (!is_spi_i2c_slave) {
|
|
|
+ if (!device->flags.spi_i2c_slave) {
|
|
|
acpi_create_platform_device(device, NULL);
|
|
|
acpi_device_set_enumerated(device);
|
|
|
} else {
|
|
@@ -1854,7 +1861,7 @@ static void acpi_bus_attach(struct acpi_device *device)
|
|
|
return;
|
|
|
|
|
|
device->flags.match_driver = true;
|
|
|
- if (ret > 0) {
|
|
|
+ if (ret > 0 && !device->flags.spi_i2c_slave) {
|
|
|
acpi_device_set_enumerated(device);
|
|
|
goto ok;
|
|
|
}
|
|
@@ -1863,10 +1870,10 @@ static void acpi_bus_attach(struct acpi_device *device)
|
|
|
if (ret < 0)
|
|
|
return;
|
|
|
|
|
|
- if (device->pnp.type.platform_id)
|
|
|
- acpi_default_enumeration(device);
|
|
|
- else
|
|
|
+ if (!device->pnp.type.platform_id && !device->flags.spi_i2c_slave)
|
|
|
acpi_device_set_enumerated(device);
|
|
|
+ else
|
|
|
+ acpi_default_enumeration(device);
|
|
|
|
|
|
ok:
|
|
|
list_for_each_entry(child, &device->children, node)
|