Merge branches 'acpi-spcr', 'acpi-osi', 'acpi-bus', 'acpi-scan' and 'acpi-misc'

* acpi-spcr:
  ACPI: SPCR: Workaround for APM X-Gene 8250 UART 32-alignment errata
  ACPI: SPCR: Use access width to determine mmio usage

* acpi-osi:
  ACPI / osi: Make local function acpi_osi_dmi_linux() static

* acpi-bus:
  ACPI / bus: handle ACPI hotplug schedule errors completely

* acpi-scan:
  ACPI / scan: Indicate to platform when hot remove returns busy

* acpi-misc:
  ACPI / DPTF: constify attribute_group structures
  ACPI / LPSS: constify attribute_group structures
  ACPI: BGRT: constify attribute_group structures
  ACPI / power: constify attribute_group structures
This commit is contained in:
Rafael J. Wysocki 2017-07-10 22:46:21 +02:00
9 changed files with 74 additions and 18 deletions

View File

@ -576,7 +576,7 @@ static struct attribute *lpss_attrs[] = {
NULL, NULL,
}; };
static struct attribute_group lpss_attr_group = { static const struct attribute_group lpss_attr_group = {
.attrs = lpss_attrs, .attrs = lpss_attrs,
.name = "lpss_ltr", .name = "lpss_ltr",
}; };

View File

@ -76,7 +76,7 @@ static struct bin_attribute *bgrt_bin_attributes[] = {
NULL, NULL,
}; };
static struct attribute_group bgrt_attribute_group = { static const struct attribute_group bgrt_attribute_group = {
.attrs = bgrt_attributes, .attrs = bgrt_attributes,
.bin_attrs = bgrt_bin_attributes, .bin_attrs = bgrt_bin_attributes,
}; };

View File

@ -409,11 +409,15 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
(driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS)) (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS))
driver->ops.notify(adev, type); driver->ops.notify(adev, type);
if (hotplug_event && ACPI_SUCCESS(acpi_hotplug_schedule(adev, type))) if (!hotplug_event) {
acpi_bus_put_acpi_device(adev);
return;
}
if (ACPI_SUCCESS(acpi_hotplug_schedule(adev, type)))
return; return;
acpi_bus_put_acpi_device(adev); acpi_bus_put_acpi_device(adev);
return;
err: err:
acpi_evaluate_ost(handle, type, ost_code, NULL); acpi_evaluate_ost(handle, type, ost_code, NULL);

View File

@ -65,7 +65,7 @@ static struct attribute *dptf_power_attrs[] = {
NULL NULL
}; };
static struct attribute_group dptf_power_attribute_group = { static const struct attribute_group dptf_power_attribute_group = {
.attrs = dptf_power_attrs, .attrs = dptf_power_attrs,
.name = "dptf_power" .name = "dptf_power"
}; };

View File

@ -265,7 +265,8 @@ static void __init acpi_osi_dmi_darwin(bool enable,
__acpi_osi_setup_darwin(enable); __acpi_osi_setup_darwin(enable);
} }
void __init acpi_osi_dmi_linux(bool enable, const struct dmi_system_id *d) static void __init acpi_osi_dmi_linux(bool enable,
const struct dmi_system_id *d)
{ {
pr_notice("DMI detected to setup _OSI(\"Linux\"): %s\n", d->ident); pr_notice("DMI detected to setup _OSI(\"Linux\"): %s\n", d->ident);
osi_config.linux_dmi = 1; osi_config.linux_dmi = 1;

View File

@ -352,7 +352,7 @@ static struct attribute *attrs[] = {
NULL, NULL,
}; };
static struct attribute_group attr_groups[] = { static const struct attribute_group attr_groups[] = {
[ACPI_STATE_D0] = { [ACPI_STATE_D0] = {
.name = "power_resources_D0", .name = "power_resources_D0",
.attrs = attrs, .attrs = attrs,
@ -371,14 +371,14 @@ static struct attribute_group attr_groups[] = {
}, },
}; };
static struct attribute_group wakeup_attr_group = { static const struct attribute_group wakeup_attr_group = {
.name = "power_resources_wakeup", .name = "power_resources_wakeup",
.attrs = attrs, .attrs = attrs,
}; };
static void acpi_power_hide_list(struct acpi_device *adev, static void acpi_power_hide_list(struct acpi_device *adev,
struct list_head *resources, struct list_head *resources,
struct attribute_group *attr_group) const struct attribute_group *attr_group)
{ {
struct acpi_power_resource_entry *entry; struct acpi_power_resource_entry *entry;
@ -397,7 +397,7 @@ static void acpi_power_hide_list(struct acpi_device *adev,
static void acpi_power_expose_list(struct acpi_device *adev, static void acpi_power_expose_list(struct acpi_device *adev,
struct list_head *resources, struct list_head *resources,
struct attribute_group *attr_group) const struct attribute_group *attr_group)
{ {
struct acpi_power_resource_entry *entry; struct acpi_power_resource_entry *entry;
int ret; int ret;
@ -425,7 +425,7 @@ static void acpi_power_expose_list(struct acpi_device *adev,
static void acpi_power_expose_hide(struct acpi_device *adev, static void acpi_power_expose_hide(struct acpi_device *adev,
struct list_head *resources, struct list_head *resources,
struct attribute_group *attr_group, const struct attribute_group *attr_group,
bool expose) bool expose)
{ {
if (expose) if (expose)

View File

@ -404,10 +404,6 @@ void acpi_device_hotplug(struct acpi_device *adev, u32 src)
error = dock_notify(adev, src); error = dock_notify(adev, src);
} else if (adev->flags.hotplug_notify) { } else if (adev->flags.hotplug_notify) {
error = acpi_generic_hotplug_event(adev, src); error = acpi_generic_hotplug_event(adev, src);
if (error == -EPERM) {
ost_code = ACPI_OST_SC_EJECT_NOT_SUPPORTED;
goto err_out;
}
} else { } else {
int (*notify)(struct acpi_device *, u32); int (*notify)(struct acpi_device *, u32);
@ -423,8 +419,20 @@ void acpi_device_hotplug(struct acpi_device *adev, u32 src)
else else
goto out; goto out;
} }
if (!error) switch (error) {
case 0:
ost_code = ACPI_OST_SC_SUCCESS; ost_code = ACPI_OST_SC_SUCCESS;
break;
case -EPERM:
ost_code = ACPI_OST_SC_EJECT_NOT_SUPPORTED;
break;
case -EBUSY:
ost_code = ACPI_OST_SC_DEVICE_BUSY;
break;
default:
ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE;
break;
}
err_out: err_out:
acpi_evaluate_ost(adev->handle, src, ost_code, NULL); acpi_evaluate_ost(adev->handle, src, ost_code, NULL);

View File

@ -36,6 +36,26 @@ static bool qdf2400_erratum_44_present(struct acpi_table_header *h)
return false; return false;
} }
/*
* APM X-Gene v1 and v2 UART hardware is an 16550 like device but has its
* register aligned to 32-bit. In addition, the BIOS also encoded the
* access width to be 8 bits. This function detects this errata condition.
*/
static bool xgene_8250_erratum_present(struct acpi_table_spcr *tb)
{
if (tb->interface_type != ACPI_DBG2_16550_COMPATIBLE)
return false;
if (memcmp(tb->header.oem_id, "APMC0D", ACPI_OEM_ID_SIZE))
return false;
if (!memcmp(tb->header.oem_table_id, "XGENESPC",
ACPI_OEM_TABLE_ID_SIZE) && tb->header.oem_revision == 0)
return true;
return false;
}
/** /**
* parse_spcr() - parse ACPI SPCR table and add preferred console * parse_spcr() - parse ACPI SPCR table and add preferred console
* *
@ -74,8 +94,22 @@ int __init parse_spcr(bool earlycon)
goto done; goto done;
} }
iotype = table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY ? if (table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
"mmio" : "io"; switch (table->serial_port.access_width) {
default:
pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n");
case ACPI_ACCESS_SIZE_BYTE:
iotype = "mmio";
break;
case ACPI_ACCESS_SIZE_WORD:
iotype = "mmio16";
break;
case ACPI_ACCESS_SIZE_DWORD:
iotype = "mmio32";
break;
}
} else
iotype = "io";
switch (table->interface_type) { switch (table->interface_type) {
case ACPI_DBG2_ARM_SBSA_32BIT: case ACPI_DBG2_ARM_SBSA_32BIT:
@ -115,6 +149,8 @@ int __init parse_spcr(bool earlycon)
if (qdf2400_erratum_44_present(&table->header)) if (qdf2400_erratum_44_present(&table->header))
uart = "qdf2400_e44"; uart = "qdf2400_e44";
if (xgene_8250_erratum_present(table))
iotype = "mmio32";
snprintf(opts, sizeof(opts), "%s,%s,0x%llx,%d", uart, iotype, snprintf(opts, sizeof(opts), "%s,%s,0x%llx,%d", uart, iotype,
table->serial_port.address, baud_rate); table->serial_port.address, baud_rate);

View File

@ -377,6 +377,13 @@ struct acpi_resource_generic_register {
u64 address; u64 address;
}; };
/* Generic Address Space Access Sizes */
#define ACPI_ACCESS_SIZE_UNDEFINED 0
#define ACPI_ACCESS_SIZE_BYTE 1
#define ACPI_ACCESS_SIZE_WORD 2
#define ACPI_ACCESS_SIZE_DWORD 3
#define ACPI_ACCESS_SIZE_QWORD 4
struct acpi_resource_gpio { struct acpi_resource_gpio {
u8 revision_id; u8 revision_id;
u8 connection_type; u8 connection_type;