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

Commit 54746dab authored by Naveen M's avatar Naveen M Committed by Mark Brown
Browse files

ASoC: Improve machine driver selection based on quirk data



Use quirk function to select the correct machine driver
by checking all codecs instead of only one based on quirk data.

Signed-off-by: default avatarNaveen M <naveen.m@intel.com>
Signed-off-by: default avatarHarsha Priya <harshapriya.n@intel.com>
Acked-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 7827d669
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -58,5 +58,25 @@ struct sst_acpi_mach {
	/* board name */
	const char *board;
	struct sst_acpi_mach * (*machine_quirk)(void *arg);
	const void *quirk_data;
	void *pdata;
};

#define SST_ACPI_MAX_CODECS 3

/**
 * struct sst_codecs: Structure to hold secondary codec information apart from
 * the matched one, this data will be passed to the quirk function to match
 * with the ACPI detected devices
 *
 * @num_codecs: number of secondary codecs used in the platform
 * @codecs: holds the codec IDs
 *
 */
struct sst_codecs {
	int num_codecs;
	u8 codecs[SST_ACPI_MAX_CODECS][ACPI_ID_LEN];
};

/* check all codecs */
struct sst_acpi_mach *sst_acpi_codec_list(void *arg);
+18 −0
Original line number Diff line number Diff line
@@ -151,5 +151,23 @@ bool sst_acpi_find_package_from_hid(const u8 hid[ACPI_ID_LEN],
}
EXPORT_SYMBOL_GPL(sst_acpi_find_package_from_hid);

struct sst_acpi_mach *sst_acpi_codec_list(void *arg)
{
	struct sst_acpi_mach *mach = arg;
	struct sst_codecs *codec_list = (struct sst_codecs *) mach->quirk_data;
	int i;

	if (mach->quirk_data == NULL)
		return mach;

	for (i = 0; i < codec_list->num_codecs; i++) {
		if (sst_acpi_check_hid(codec_list->codecs[i]) != true)
			return NULL;
	}

	return mach;
}
EXPORT_SYMBOL_GPL(sst_acpi_codec_list);

MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("Intel Common ACPI Match module");
+14 −0
Original line number Diff line number Diff line
@@ -876,6 +876,10 @@ static void skl_remove(struct pci_dev *pci)
	dev_set_drvdata(&pci->dev, NULL);
}

static struct sst_codecs skl_codecs = { 1, {"NAU88L25"} };
static struct sst_codecs kbl_codecs = { 1, {"NAU88L25"} };
static struct sst_codecs bxt_codecs = { 1, {"MX98357A"} };

static struct sst_acpi_mach sst_skl_devdata[] = {
	{
		.id = "INT343A",
@@ -886,12 +890,16 @@ static struct sst_acpi_mach sst_skl_devdata[] = {
		.id = "INT343B",
		.drv_name = "skl_n88l25_s4567",
		.fw_filename = "intel/dsp_fw_release.bin",
		.machine_quirk = sst_acpi_codec_list,
		.quirk_data = &skl_codecs,
		.pdata = &skl_dmic_data
	},
	{
		.id = "MX98357A",
		.drv_name = "skl_n88l25_m98357a",
		.fw_filename = "intel/dsp_fw_release.bin",
		.machine_quirk = sst_acpi_codec_list,
		.quirk_data = &skl_codecs,
		.pdata = &skl_dmic_data
	},
	{}
@@ -907,6 +915,8 @@ static struct sst_acpi_mach sst_bxtp_devdata[] = {
		.id = "DLGS7219",
		.drv_name = "bxt_da7219_max98357a_i2s",
		.fw_filename = "intel/dsp_fw_bxtn.bin",
		.machine_quirk = sst_acpi_codec_list,
		.quirk_data = &bxt_codecs,
	},
};

@@ -920,12 +930,16 @@ static struct sst_acpi_mach sst_kbl_devdata[] = {
		.id = "INT343B",
		.drv_name = "kbl_n88l25_s4567",
		.fw_filename = "intel/dsp_fw_kbl.bin",
		.machine_quirk = sst_acpi_codec_list,
		.quirk_data = &kbl_codecs,
		.pdata = &skl_dmic_data
	},
	{
		.id = "MX98357A",
		.drv_name = "kbl_n88l25_m98357a",
		.fw_filename = "intel/dsp_fw_kbl.bin",
		.machine_quirk = sst_acpi_codec_list,
		.quirk_data = &kbl_codecs,
		.pdata = &skl_dmic_data
	},
	{}