ACPI / scan: Fix enumeration for special UART devices
UART devices is expected to be enumerated by SerDev subsystem. During ACPI scan, serial devices behind SPI, I2C or UART buses are not enumerated, allowing them to be enumerated by their respective parents. Rename *spi_i2c_slave* to *serial_bus_slave* as this will be used for serial devices on serial buses (SPI, I2C or UART). On Macs an empty ResourceTemplate is returned for uart slaves. Instead the device properties "baud", "parity", "dataBits", "stopBits" are provided. Add a check for "baud" in acpi_is_serial_bus_slave(). Signed-off-by: Frédéric Danis <frederic.danis.oss@gmail.com> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Tested-by: Ronald Tschalär <ronald@innovation.ch> Tested-by: Peter Y. Chuang <peteryuchuang@gmail.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
53c7626356
commit
e361d1f858
@ -1505,41 +1505,38 @@ static void acpi_init_coherency(struct acpi_device *adev)
|
|||||||
adev->flags.coherent_dma = cca;
|
adev->flags.coherent_dma = cca;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data)
|
static int acpi_check_serial_bus_slave(struct acpi_resource *ares, void *data)
|
||||||
{
|
{
|
||||||
bool *is_spi_i2c_slave_p = data;
|
bool *is_serial_bus_slave_p = data;
|
||||||
|
|
||||||
if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
|
if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/*
|
*is_serial_bus_slave_p = true;
|
||||||
* 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 */
|
/* no need to do more checking */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool acpi_is_spi_i2c_slave(struct acpi_device *device)
|
static bool acpi_is_serial_bus_slave(struct acpi_device *device)
|
||||||
{
|
{
|
||||||
struct list_head resource_list;
|
struct list_head resource_list;
|
||||||
bool is_spi_i2c_slave = false;
|
bool is_serial_bus_slave = false;
|
||||||
|
|
||||||
/* Macs use device properties in lieu of _CRS resources */
|
/* Macs use device properties in lieu of _CRS resources */
|
||||||
if (x86_apple_machine &&
|
if (x86_apple_machine &&
|
||||||
(fwnode_property_present(&device->fwnode, "spiSclkPeriod") ||
|
(fwnode_property_present(&device->fwnode, "spiSclkPeriod") ||
|
||||||
fwnode_property_present(&device->fwnode, "i2cAddress")))
|
fwnode_property_present(&device->fwnode, "i2cAddress") ||
|
||||||
|
fwnode_property_present(&device->fwnode, "baud")))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&resource_list);
|
INIT_LIST_HEAD(&resource_list);
|
||||||
acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave,
|
acpi_dev_get_resources(device, &resource_list,
|
||||||
&is_spi_i2c_slave);
|
acpi_check_serial_bus_slave,
|
||||||
|
&is_serial_bus_slave);
|
||||||
acpi_dev_free_resource_list(&resource_list);
|
acpi_dev_free_resource_list(&resource_list);
|
||||||
|
|
||||||
return is_spi_i2c_slave;
|
return is_serial_bus_slave;
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
||||||
@ -1557,7 +1554,7 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
|||||||
acpi_bus_get_flags(device);
|
acpi_bus_get_flags(device);
|
||||||
device->flags.match_driver = false;
|
device->flags.match_driver = false;
|
||||||
device->flags.initialized = true;
|
device->flags.initialized = true;
|
||||||
device->flags.spi_i2c_slave = acpi_is_spi_i2c_slave(device);
|
device->flags.serial_bus_slave = acpi_is_serial_bus_slave(device);
|
||||||
acpi_device_clear_enumerated(device);
|
acpi_device_clear_enumerated(device);
|
||||||
device_initialize(&device->dev);
|
device_initialize(&device->dev);
|
||||||
dev_set_uevent_suppress(&device->dev, true);
|
dev_set_uevent_suppress(&device->dev, true);
|
||||||
@ -1841,10 +1838,10 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
|
|||||||
static void acpi_default_enumeration(struct acpi_device *device)
|
static void acpi_default_enumeration(struct acpi_device *device)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Do not enumerate SPI/I2C slaves as they will be enumerated by their
|
* Do not enumerate SPI/I2C/UART slaves as they will be enumerated by
|
||||||
* respective parents.
|
* their respective parents.
|
||||||
*/
|
*/
|
||||||
if (!device->flags.spi_i2c_slave) {
|
if (!device->flags.serial_bus_slave) {
|
||||||
acpi_create_platform_device(device, NULL);
|
acpi_create_platform_device(device, NULL);
|
||||||
acpi_device_set_enumerated(device);
|
acpi_device_set_enumerated(device);
|
||||||
} else {
|
} else {
|
||||||
@ -1941,7 +1938,7 @@ static void acpi_bus_attach(struct acpi_device *device)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
device->flags.match_driver = true;
|
device->flags.match_driver = true;
|
||||||
if (ret > 0 && !device->flags.spi_i2c_slave) {
|
if (ret > 0 && !device->flags.serial_bus_slave) {
|
||||||
acpi_device_set_enumerated(device);
|
acpi_device_set_enumerated(device);
|
||||||
goto ok;
|
goto ok;
|
||||||
}
|
}
|
||||||
@ -1950,7 +1947,7 @@ static void acpi_bus_attach(struct acpi_device *device)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!device->pnp.type.platform_id && !device->flags.spi_i2c_slave)
|
if (!device->pnp.type.platform_id && !device->flags.serial_bus_slave)
|
||||||
acpi_device_set_enumerated(device);
|
acpi_device_set_enumerated(device);
|
||||||
else
|
else
|
||||||
acpi_default_enumeration(device);
|
acpi_default_enumeration(device);
|
||||||
|
@ -211,7 +211,7 @@ struct acpi_device_flags {
|
|||||||
u32 of_compatible_ok:1;
|
u32 of_compatible_ok:1;
|
||||||
u32 coherent_dma:1;
|
u32 coherent_dma:1;
|
||||||
u32 cca_seen:1;
|
u32 cca_seen:1;
|
||||||
u32 spi_i2c_slave:1;
|
u32 serial_bus_slave:1;
|
||||||
u32 reserved:19;
|
u32 reserved:19;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user