Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cab47385 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Mark Brown
Browse files

ASoC: Intel: common: filter ACPI devices with _STA return value



BIOS vendors typically list multiple audio codecs in the DSDT
table and enable the relevant one by changing the return value
of the _STA method.

With the current code, all devices are reported by
acpi_dev_present(), regardless of the _STA return values. This
causes errors on probe with the wrong machine driver being loaded.

This patch essentially reverts 'commit 6f08cbda
("ASoC: Intel: Use acpi_dev_present()")' and adds code to
force the evaluation of the _STA method.

A better solution might be to make sure the ACPI subsystem only
reports devices with a _STA value of 0xf but apparently it's
problematic so dealing with this in the audio subsystem directly.

Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent fdd69c57
Loading
Loading
Loading
Loading
+18 −2
Original line number Original line Diff line number Diff line
@@ -16,14 +16,30 @@


#include "sst-acpi.h"
#include "sst-acpi.h"


static acpi_status sst_acpi_mach_match(acpi_handle handle, u32 level,
				       void *context, void **ret)
{
	unsigned long long sta;
	acpi_status status;

	*(bool *)context = true;
	status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
	if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_PRESENT))
		*(bool *)context = false;

	return AE_OK;
}

struct sst_acpi_mach *sst_acpi_find_machine(struct sst_acpi_mach *machines)
struct sst_acpi_mach *sst_acpi_find_machine(struct sst_acpi_mach *machines)
{
{
	struct sst_acpi_mach *mach;
	struct sst_acpi_mach *mach;
	bool found = false;


	for (mach = machines; mach->id[0]; mach++)
	for (mach = machines; mach->id[0]; mach++)
		if (acpi_dev_present(mach->id))
		if (ACPI_SUCCESS(acpi_get_devices(mach->id,
						  sst_acpi_mach_match,
						  &found, NULL)) && found)
			return mach;
			return mach;

	return NULL;
	return NULL;
}
}
EXPORT_SYMBOL_GPL(sst_acpi_find_machine);
EXPORT_SYMBOL_GPL(sst_acpi_find_machine);