Commit a74d1caf authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branches 'acpi-bus', 'acpi-sleep' and 'acpi-processor'

* acpi-bus:
  spi: acpi: Initialize modalias from of_compatible
  i2c: acpi: Initialize info.type from of_compatible
  ACPI / bus: Introduce acpi_of_modalias() equiv of of_modalias_node()

* acpi-sleep:
  ACPI: save NVS memory for Lenovo G50-45

* acpi-processor:
  x86/ACPI: keep x86_cpu_to_acpiid mapping valid on CPU hotplug
...@@ -887,7 +887,8 @@ static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) ...@@ -887,7 +887,8 @@ static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu)
} }
/* wrapper to silence section mismatch warning */ /* wrapper to silence section mismatch warning */
int __ref acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu) int __ref acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
int *pcpu)
{ {
return _acpi_map_lsapic(handle, physid, pcpu); return _acpi_map_lsapic(handle, physid, pcpu);
} }
......
...@@ -723,11 +723,12 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) ...@@ -723,11 +723,12 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
return 0; return 0;
} }
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu) int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
int *pcpu)
{ {
int cpu; int cpu;
cpu = acpi_register_lapic(physid, U32_MAX, ACPI_MADT_ENABLED); cpu = acpi_register_lapic(physid, acpi_id, ACPI_MADT_ENABLED);
if (cpu < 0) { if (cpu < 0) {
pr_info(PREFIX "Unable to map lapic to logical cpu number\n"); pr_info(PREFIX "Unable to map lapic to logical cpu number\n");
return cpu; return cpu;
......
...@@ -165,7 +165,7 @@ static int acpi_processor_errata(void) ...@@ -165,7 +165,7 @@ static int acpi_processor_errata(void)
#ifdef CONFIG_ACPI_HOTPLUG_CPU #ifdef CONFIG_ACPI_HOTPLUG_CPU
int __weak acpi_map_cpu(acpi_handle handle, int __weak acpi_map_cpu(acpi_handle handle,
phys_cpuid_t physid, int *pcpu) phys_cpuid_t physid, u32 acpi_id, int *pcpu)
{ {
return -ENODEV; return -ENODEV;
} }
...@@ -203,7 +203,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr) ...@@ -203,7 +203,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr)
cpu_maps_update_begin(); cpu_maps_update_begin();
cpu_hotplug_begin(); cpu_hotplug_begin();
ret = acpi_map_cpu(pr->handle, pr->phys_id, &pr->id); ret = acpi_map_cpu(pr->handle, pr->phys_id, pr->acpi_id, &pr->id);
if (ret) if (ret)
goto out; goto out;
......
...@@ -677,6 +677,48 @@ static bool acpi_of_match_device(struct acpi_device *adev, ...@@ -677,6 +677,48 @@ static bool acpi_of_match_device(struct acpi_device *adev,
return false; return false;
} }
static bool acpi_of_modalias(struct acpi_device *adev,
char *modalias, size_t len)
{
const union acpi_object *of_compatible;
const union acpi_object *obj;
const char *str, *chr;
of_compatible = adev->data.of_compatible;
if (!of_compatible)
return false;
if (of_compatible->type == ACPI_TYPE_PACKAGE)
obj = of_compatible->package.elements;
else /* Must be ACPI_TYPE_STRING. */
obj = of_compatible;
str = obj->string.pointer;
chr = strchr(str, ',');
strlcpy(modalias, chr ? chr + 1 : str, len);
return true;
}
/**
* acpi_set_modalias - Set modalias using "compatible" property or supplied ID
* @adev: ACPI device object to match
* @default_id: ID string to use as default if no compatible string found
* @modalias: Pointer to buffer that modalias value will be copied into
* @len: Length of modalias buffer
*
* This is a counterpart of of_modalias_node() for struct acpi_device objects.
* If there is a compatible string for @adev, it will be copied to @modalias
* with the vendor prefix stripped; otherwise, @default_id will be used.
*/
void acpi_set_modalias(struct acpi_device *adev, const char *default_id,
char *modalias, size_t len)
{
if (!acpi_of_modalias(adev, modalias, len))
strlcpy(modalias, default_id, len);
}
EXPORT_SYMBOL_GPL(acpi_set_modalias);
static bool __acpi_match_device_cls(const struct acpi_device_id *id, static bool __acpi_match_device_cls(const struct acpi_device_id *id,
struct acpi_hardware_id *hwid) struct acpi_hardware_id *hwid)
{ {
......
...@@ -130,6 +130,12 @@ void __init acpi_nvs_nosave_s3(void) ...@@ -130,6 +130,12 @@ void __init acpi_nvs_nosave_s3(void)
nvs_nosave_s3 = true; nvs_nosave_s3 = true;
} }
static int __init init_nvs_save_s3(const struct dmi_system_id *d)
{
nvs_nosave_s3 = false;
return 0;
}
/* /*
* ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the * ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the
* user to request that behavior by using the 'acpi_old_suspend_ordering' * user to request that behavior by using the 'acpi_old_suspend_ordering'
...@@ -324,6 +330,19 @@ static struct dmi_system_id acpisleep_dmi_table[] __initdata = { ...@@ -324,6 +330,19 @@ static struct dmi_system_id acpisleep_dmi_table[] __initdata = {
DMI_MATCH(DMI_PRODUCT_NAME, "K54HR"), DMI_MATCH(DMI_PRODUCT_NAME, "K54HR"),
}, },
}, },
/*
* https://bugzilla.kernel.org/show_bug.cgi?id=189431
* Lenovo G50-45 is a platform later than 2012, but needs nvs memory
* saving during S3.
*/
{
.callback = init_nvs_save_s3,
.ident = "Lenovo G50-45",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_NAME, "80E3"),
},
},
{}, {},
}; };
......
...@@ -221,7 +221,8 @@ static int i2c_acpi_get_info(struct acpi_device *adev, ...@@ -221,7 +221,8 @@ static int i2c_acpi_get_info(struct acpi_device *adev,
acpi_dev_free_resource_list(&resource_list); acpi_dev_free_resource_list(&resource_list);
strlcpy(info->type, dev_name(&adev->dev), sizeof(info->type)); acpi_set_modalias(adev, dev_name(&adev->dev), info->type,
sizeof(info->type));
return 0; return 0;
} }
......
...@@ -1722,13 +1722,15 @@ static acpi_status acpi_register_spi_device(struct spi_master *master, ...@@ -1722,13 +1722,15 @@ static acpi_status acpi_register_spi_device(struct spi_master *master,
return AE_OK; return AE_OK;
} }
acpi_set_modalias(adev, acpi_device_hid(adev), spi->modalias,
sizeof(spi->modalias));
if (spi->irq < 0) if (spi->irq < 0)
spi->irq = acpi_dev_gpio_irq_get(adev, 0); spi->irq = acpi_dev_gpio_irq_get(adev, 0);
acpi_device_set_enumerated(adev); acpi_device_set_enumerated(adev);
adev->power.flags.ignore_parent = true; adev->power.flags.ignore_parent = true;
strlcpy(spi->modalias, acpi_device_hid(adev), sizeof(spi->modalias));
if (spi_add_device(spi)) { if (spi_add_device(spi)) {
adev->power.flags.ignore_parent = false; adev->power.flags.ignore_parent = false;
dev_err(&master->dev, "failed to add SPI device %s from ACPI\n", dev_err(&master->dev, "failed to add SPI device %s from ACPI\n",
......
...@@ -522,6 +522,8 @@ void acpi_bus_trim(struct acpi_device *start); ...@@ -522,6 +522,8 @@ void acpi_bus_trim(struct acpi_device *start);
acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd); acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
int acpi_match_device_ids(struct acpi_device *device, int acpi_match_device_ids(struct acpi_device *device,
const struct acpi_device_id *ids); const struct acpi_device_id *ids);
void acpi_set_modalias(struct acpi_device *adev, const char *default_id,
char *modalias, size_t len);
int acpi_create_dir(struct acpi_device *); int acpi_create_dir(struct acpi_device *);
void acpi_remove_dir(struct acpi_device *); void acpi_remove_dir(struct acpi_device *);
......
...@@ -291,7 +291,8 @@ bool acpi_processor_validate_proc_id(int proc_id); ...@@ -291,7 +291,8 @@ bool acpi_processor_validate_proc_id(int proc_id);
#ifdef CONFIG_ACPI_HOTPLUG_CPU #ifdef CONFIG_ACPI_HOTPLUG_CPU
/* Arch dependent functions for cpu hotplug support */ /* Arch dependent functions for cpu hotplug support */
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu); int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
int *pcpu);
int acpi_unmap_cpu(int cpu); int acpi_unmap_cpu(int cpu);
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid); int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid);
#endif /* CONFIG_ACPI_HOTPLUG_CPU */ #endif /* CONFIG_ACPI_HOTPLUG_CPU */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment