Skip to content

Commit

Permalink
Merge branches 'acpi-bus', 'acpi-sleep' and 'acpi-processor'
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
rafaeljw committed Feb 20, 2017
4 parents 014f403 + 0c6543f + cbc00c1 + febf240 commit a74d1ca
Show file tree
Hide file tree
Showing 9 changed files with 77 additions and 8 deletions.
3 changes: 2 additions & 1 deletion arch/ia64/kernel/acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -887,7 +887,8 @@ static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu)
}

/* 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);
}
Expand Down
5 changes: 3 additions & 2 deletions arch/x86/kernel/acpi/boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -723,11 +723,12 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
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;

cpu = acpi_register_lapic(physid, U32_MAX, ACPI_MADT_ENABLED);
cpu = acpi_register_lapic(physid, acpi_id, ACPI_MADT_ENABLED);
if (cpu < 0) {
pr_info(PREFIX "Unable to map lapic to logical cpu number\n");
return cpu;
Expand Down
4 changes: 2 additions & 2 deletions drivers/acpi/acpi_processor.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ static int acpi_processor_errata(void)

#ifdef CONFIG_ACPI_HOTPLUG_CPU
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;
}
Expand Down Expand Up @@ -203,7 +203,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr)
cpu_maps_update_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)
goto out;

Expand Down
42 changes: 42 additions & 0 deletions drivers/acpi/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,48 @@ static bool acpi_of_match_device(struct acpi_device *adev,
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,
struct acpi_hardware_id *hwid)
{
Expand Down
19 changes: 19 additions & 0 deletions drivers/acpi/sleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,12 @@ void __init acpi_nvs_nosave_s3(void)
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
* user to request that behavior by using the 'acpi_old_suspend_ordering'
Expand Down Expand Up @@ -324,6 +330,19 @@ static struct dmi_system_id acpisleep_dmi_table[] __initdata = {
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"),
},
},
{},
};

Expand Down
3 changes: 2 additions & 1 deletion drivers/i2c/i2c-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,8 @@ static int i2c_acpi_get_info(struct acpi_device *adev,

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;
}
Expand Down
4 changes: 3 additions & 1 deletion drivers/spi/spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1722,13 +1722,15 @@ static acpi_status acpi_register_spi_device(struct spi_master *master,
return AE_OK;
}

acpi_set_modalias(adev, acpi_device_hid(adev), spi->modalias,
sizeof(spi->modalias));

if (spi->irq < 0)
spi->irq = acpi_dev_gpio_irq_get(adev, 0);

acpi_device_set_enumerated(adev);

adev->power.flags.ignore_parent = true;
strlcpy(spi->modalias, acpi_device_hid(adev), sizeof(spi->modalias));
if (spi_add_device(spi)) {
adev->power.flags.ignore_parent = false;
dev_err(&master->dev, "failed to add SPI device %s from ACPI\n",
Expand Down
2 changes: 2 additions & 0 deletions include/acpi/acpi_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,8 @@ void acpi_bus_trim(struct acpi_device *start);
acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
int acpi_match_device_ids(struct acpi_device *device,
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 *);
void acpi_remove_dir(struct acpi_device *);

Expand Down
3 changes: 2 additions & 1 deletion include/linux/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,8 @@ bool acpi_processor_validate_proc_id(int proc_id);

#ifdef CONFIG_ACPI_HOTPLUG_CPU
/* 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_map_cpu2node(acpi_handle handle, int cpu, int physid);
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
Expand Down

0 comments on commit a74d1ca

Please sign in to comment.