Unverified Commit aaadc1f8 authored by Mark Brown's avatar Mark Brown
Browse files

Merge series "Add rt1015 support to CML boards" from Brent Lu <brent.lu@intel.com>:

First patch adds tdm 4-slot 100fs DAI setting to avoid jitter of using
64fs on CML boards. Second patch is a DMI quirk for HP Dooly.

Changes since v1:
-Add comment on Dooly's DMI quirk

Brent Lu (2):
  ASoC: intel: sof_rt5682: Add support for cml_rt1015_rt5682
  ASoC: intel: sof_rt5682: Add quirk for Dooly

 sound/soc/intel/boards/sof_rt5682.c           | 65 +++++++++++++++++--
 .../intel/common/soc-acpi-intel-cml-match.c   | 13 ++++
 2 files changed, 73 insertions(+), 5 deletions(-)

--
2.17.1
parents 0bc1bf24 bdd088ce
Loading
Loading
Loading
Loading
+60 −5
Original line number Diff line number Diff line
@@ -42,8 +42,9 @@
#define SOF_RT5682_NUM_HDMIDEV(quirk)	\
	((quirk << SOF_RT5682_NUM_HDMIDEV_SHIFT) & SOF_RT5682_NUM_HDMIDEV_MASK)
#define SOF_RT1015_SPEAKER_AMP_PRESENT		BIT(13)
#define SOF_MAX98373_SPEAKER_AMP_PRESENT	BIT(14)
#define SOF_MAX98360A_SPEAKER_AMP_PRESENT	BIT(15)
#define SOF_RT1015_SPEAKER_AMP_100FS		BIT(14)
#define SOF_MAX98373_SPEAKER_AMP_PRESENT	BIT(15)
#define SOF_MAX98360A_SPEAKER_AMP_PRESENT	BIT(16)

/* Default: MCLK on, MCLK 19.2M, SSP0  */
static unsigned long sof_rt5682_quirk = SOF_RT5682_MCLK_EN |
@@ -99,6 +100,24 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
					SOF_RT5682_MCLK_24MHZ |
					SOF_RT5682_SSP_CODEC(1)),
	},
	{
		/*
		 * Dooly is hatch family but using rt1015 amp so it
		 * requires a quirk before "Google_Hatch".
		 */
		.callback = sof_rt5682_quirk_cb,
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
			DMI_MATCH(DMI_PRODUCT_NAME, "Dooly"),
		},
		.driver_data = (void *)(SOF_RT5682_MCLK_EN |
					SOF_RT5682_MCLK_24MHZ |
					SOF_RT5682_SSP_CODEC(0) |
					SOF_SPEAKER_AMP_PRESENT |
					SOF_RT1015_SPEAKER_AMP_PRESENT |
					SOF_RT1015_SPEAKER_AMP_100FS |
					SOF_RT5682_SSP_AMP(1)),
	},
	{
		.callback = sof_rt5682_quirk_cb,
		.matches = {
@@ -291,21 +310,26 @@ static int sof_rt1015_hw_params(struct snd_pcm_substream *substream,
	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
	struct snd_soc_card *card = rtd->card;
	struct snd_soc_dai *codec_dai;
	int i, ret;
	int i, fs, ret;

	if (!snd_soc_card_get_codec_dai(card, "rt1015-aif"))
		return 0;

	if (sof_rt5682_quirk & SOF_RT1015_SPEAKER_AMP_100FS)
		fs = 100;
	else
		fs = 64;

	for_each_rtd_codec_dais(rtd, i, codec_dai) {
		/* Set tdm/i2s1 master bclk ratio */
		ret = snd_soc_dai_set_bclk_ratio(codec_dai, 64);
		ret = snd_soc_dai_set_bclk_ratio(codec_dai, fs);
		if (ret < 0) {
			dev_err(card->dev, "failed to set bclk ratio\n");
			return ret;
		}

		ret = snd_soc_dai_set_pll(codec_dai, 0, RT1015_PLL_S_BCLK,
					  params_rate(params) * 64,
					  params_rate(params) * fs,
					  params_rate(params) * 256);
		if (ret < 0) {
			dev_err(card->dev, "failed to set pll\n");
@@ -319,6 +343,26 @@ static int sof_rt1015_hw_params(struct snd_pcm_substream *substream,
			dev_err(card->dev, "failed to set sysclk\n");
			return ret;
		}

		if (sof_rt5682_quirk & SOF_RT1015_SPEAKER_AMP_100FS) {
			if (!strcmp(codec_dai->component->name, "i2c-10EC1015:00")) {
				ret = snd_soc_dai_set_tdm_slot(codec_dai,
							       0x0, 0x1, 4, 24);
				if (ret < 0) {
					dev_err(card->dev, "failed to set tdm slot\n");
					return ret;
				}
			}

			if (!strcmp(codec_dai->component->name, "i2c-10EC1015:01")) {
				ret = snd_soc_dai_set_tdm_slot(codec_dai,
							       0x0, 0x2, 4, 24);
				if (ret < 0) {
					dev_err(card->dev, "failed to set tdm slot\n");
					return ret;
				}
			}
		}
	}

	return 0;
@@ -875,6 +919,16 @@ static const struct platform_device_id board_ids[] = {
					SOF_MAX98360A_SPEAKER_AMP_PRESENT |
					SOF_RT5682_SSP_AMP(1)),
	},
	{
		.name = "cml_rt1015_rt5682",
		.driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN |
					SOF_RT5682_MCLK_24MHZ |
					SOF_RT5682_SSP_CODEC(0) |
					SOF_SPEAKER_AMP_PRESENT |
					SOF_RT1015_SPEAKER_AMP_PRESENT |
					SOF_RT1015_SPEAKER_AMP_100FS |
					SOF_RT5682_SSP_AMP(1)),
	},
	{ }
};

@@ -898,3 +952,4 @@ MODULE_ALIAS("platform:tgl_max98357a_rt5682");
MODULE_ALIAS("platform:jsl_rt5682_rt1015");
MODULE_ALIAS("platform:tgl_max98373_rt5682");
MODULE_ALIAS("platform:jsl_rt5682_max98360a");
MODULE_ALIAS("platform:cml_rt1015_rt5682");
+13 −0
Original line number Diff line number Diff line
@@ -14,6 +14,11 @@ static struct snd_soc_acpi_codecs rt1011_spk_codecs = {
	.codecs = {"10EC1011"}
};

static struct snd_soc_acpi_codecs rt1015_spk_codecs = {
	.num_codecs = 1,
	.codecs = {"10EC1015"}
};

static struct snd_soc_acpi_codecs max98357a_spk_codecs = {
	.num_codecs = 1,
	.codecs = {"MX98357A"}
@@ -38,6 +43,14 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = {
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg",
	},
	{
		.id = "10EC5682",
		.drv_name = "cml_rt1015_rt5682",
		.machine_quirk = snd_soc_acpi_codec_list,
		.quirk_data = &rt1015_spk_codecs,
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg",
	},
	{
		.id = "10EC5682",
		.drv_name = "sof_rt5682",