diff mbox series

ASoC: Intel: boards: Add Cometlake machine driver support

Message ID 1565251120-13082-1-git-send-email-mac.chiang@intel.com (mailing list archive)
State New, archived
Headers show
Series ASoC: Intel: boards: Add Cometlake machine driver support | expand

Commit Message

Chiang, Mac Aug. 8, 2019, 7:58 a.m. UTC
From: Mac Chiang <mac.chiang@intel.com>

reuse and add Cometlake support with:
SSP0 for DA7219 headphone codec
SSP1 for MAX98357a speaker amp codec

Signed-off-by: Mac Chiang <mac.chiang@intel.com>
---
 sound/soc/intel/boards/Kconfig                    | 15 +++++++++
 sound/soc/intel/boards/bxt_da7219_max98357a.c     | 37 ++++++++++++++++++++++-
 sound/soc/intel/common/soc-acpi-intel-cnl-match.c | 12 ++++++++
 sound/soc/intel/common/soc-intel-quirks.h         |  5 +++
 4 files changed, 68 insertions(+), 1 deletion(-)

Comments

Pierre-Louis Bossart Aug. 8, 2019, 2:39 p.m. UTC | #1
On 8/8/19 2:58 AM, mac.chiang@intel.com wrote:
> From: Mac Chiang <mac.chiang@intel.com>
> 
> reuse and add Cometlake support with:
> SSP0 for DA7219 headphone codec
> SSP1 for MAX98357a speaker amp codec

Thanks, this is a good improvement compared to the previous version, but 
there are a couple of fixes needed, see comments below.
-Pierre

> 
> Signed-off-by: Mac Chiang <mac.chiang@intel.com>
> ---
>   sound/soc/intel/boards/Kconfig                    | 15 +++++++++
>   sound/soc/intel/boards/bxt_da7219_max98357a.c     | 37 ++++++++++++++++++++++-
>   sound/soc/intel/common/soc-acpi-intel-cnl-match.c | 12 ++++++++
>   sound/soc/intel/common/soc-intel-quirks.h         |  5 +++
>   4 files changed, 68 insertions(+), 1 deletion(-)
> 
> diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig
> index 50bf149..617d63c 100644
> --- a/sound/soc/intel/boards/Kconfig
> +++ b/sound/soc/intel/boards/Kconfig
> @@ -256,6 +256,21 @@ config SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH
>   
>   endif ## SND_SOC_INTEL_SKL
>   
> +config SND_SOC_INTEL_DA7219_MAX98357A_GENERIC
> +	tristate
> +	select SND_SOC_DA7219
> +	select SND_SOC_MAX98357A
> +	select SND_SOC_DMIC
> +	select SND_SOC_HDAC_HDMI

This should be used in the other cases as well.

> +
> +if SND_SOC_SOF_COMETLAKE_LP

we probably need to check that the HDA link is enabled as done for APL

Also try to put CML after GLK/CNL, we try to have a semi-historical 
platform order, and there is no good reason to show CML before APL.

> +config SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH
> +	tristate "CML_LP with DA7219 and MAX98357A in I2S Mode"
> +	depends on I2C && ACPI
> +	depends on MFD_INTEL_LPSS || COMPILE_TEST
> +	select SND_SOC_INTEL_DA7219_MAX98357A_GENERIC
> +endif
> +
>   if SND_SOC_INTEL_APL
>   
>   config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH
> diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c b/sound/soc/intel/boards/bxt_da7219_max98357a.c
> index c0d865a..e5941ff 100644
> --- a/sound/soc/intel/boards/bxt_da7219_max98357a.c
> +++ b/sound/soc/intel/boards/bxt_da7219_max98357a.c
> @@ -24,6 +24,8 @@
>   
>   #define BXT_DIALOG_CODEC_DAI	"da7219-hifi"
>   #define BXT_MAXIM_CODEC_DAI	"HiFi"
> +#define MCLK_19M	19200000
> +#define MCLK_24M	24576000

Oh, this is suspicious. If this is the oscillator frequency, then this 
is 24.0 MHz.

>   #define DUAL_CHANNEL		2
>   #define QUAD_CHANNEL		4
>   
> @@ -181,8 +183,13 @@ static int broxton_da7219_codec_init(struct snd_soc_pcm_runtime *rtd)
>   	struct snd_soc_component *component = rtd->codec_dai->component;
>   
>   	/* Configure sysclk for codec */
> -	ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, 19200000,
> +#if !IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
> +	ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, MCLK_19M,
>   				     SND_SOC_CLOCK_IN);
> +#else
> +	ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, MCLK_24M,
> +				     SND_SOC_CLOCK_IN);
> +#endif

No, this needs to be a dynamic selection based on the platform, not a 
preprocessor define that will be evaluated at build time. Otherwise if 
we have a distribution that compiles support for BXT/GLK/CML_H then it 
will select 24M even for BXT/GLK.

>   	if (ret) {
>   		dev_err(rtd->dev, "can't set codec sysclk configuration\n");
>   		return ret;
> @@ -224,7 +231,11 @@ static int broxton_hdmi_init(struct snd_soc_pcm_runtime *rtd)
>   	if (!pcm)
>   		return -ENOMEM;
>   
> +#if !IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
>   	pcm->device = BXT_DPCM_AUDIO_HDMI1_PB + dai->id;
> +#else
> +	pcm->device = dai->id;
> +#endif

same here, this needs to be based on a quirk evaluated at run-time.
I actually don't know why there should be any difference here?

>   	pcm->codec_dai = dai;
>   
>   	list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
> @@ -683,6 +694,27 @@ static int broxton_audio_probe(struct platform_device *pdev)
>   				broxton_dais[i].cpus->dai_name = "SSP2 Pin";
>   			}
>   		}
> +	} else if (soc_intel_is_cml()) {
> +		unsigned int i;
> +
> +		broxton_audio_card.name = "cmlda7219max";
> +
> +		for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
> +			/* MAXIM_CODEC is connected to SSP1. */
> +			if (!strcmp(broxton_dais[i].codecs->dai_name,
> +					BXT_MAXIM_CODEC_DAI)) {
> +				broxton_dais[i].id = 1;
> +				broxton_dais[i].name = "SSP1-Codec";
> +				broxton_dais[i].cpus->dai_name = "SSP1 Pin";
> +			}
> +			/* DIALOG_CODEC is connected to SSP0 */
> +			else if (!strcmp(broxton_dais[i].codecs->dai_name,
> +					BXT_DIALOG_CODEC_DAI)) {
> +				broxton_dais[i].id = 0;
> +				broxton_dais[i].name = "SSP0-Codec";
> +				broxton_dais[i].cpus->dai_name = "SSP0 Pin";
> +			}
> +		}
>   	}
>   
>   	/* override plaform name, if required */
> @@ -700,6 +732,7 @@ static int broxton_audio_probe(struct platform_device *pdev)
>   static const struct platform_device_id bxt_board_ids[] = {
>   	{ .name = "bxt_da7219_max98357a" },
>   	{ .name = "glk_da7219_max98357a" },
> +	{ .name = "cml_da7219_max98357a" },
>   	{ }
>   };
>   
> @@ -720,6 +753,8 @@ MODULE_AUTHOR("Rohit Ainapure <rohit.m.ainapure@intel.com>");
>   MODULE_AUTHOR("Harsha Priya <harshapriya.n@intel.com>");
>   MODULE_AUTHOR("Conrad Cooke <conrad.cooke@intel.com>");
>   MODULE_AUTHOR("Naveen Manohar <naveen.m@intel.com>");
> +MODULE_AUTHOR("Mac Chiang <mac.chiang@intel.com>");
>   MODULE_LICENSE("GPL v2");
>   MODULE_ALIAS("platform:bxt_da7219_max98357a");
>   MODULE_ALIAS("platform:glk_da7219_max98357a");
> +MODULE_ALIAS("platform:cml_da7219_max98357a");
> diff --git a/sound/soc/intel/common/soc-acpi-intel-cnl-match.c b/sound/soc/intel/common/soc-acpi-intel-cnl-match.c
> index c36c0aa..4ea32b2 100644
> --- a/sound/soc/intel/common/soc-acpi-intel-cnl-match.c
> +++ b/sound/soc/intel/common/soc-acpi-intel-cnl-match.c
> @@ -19,6 +19,11 @@ static struct snd_soc_acpi_codecs cml_codecs = {
>   	.codecs = {"10EC5682"}
>   };
>   
> +static struct snd_soc_acpi_codecs cml_spk_codecs = {
> +	.num_codecs = 1,
> +	.codecs = {"MX98357A"}
> +};
> +
>   struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[] = {
>   	{
>   		.id = "INT34C2",
> @@ -29,6 +34,13 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[] = {
>   		.sof_tplg_filename = "sof-cnl-rt274.tplg",
>   	},
>   	{
> +		.id = "DLGS7219",
> +		.drv_name = "cml_da7219_max98357a",
> +		.quirk_data = &cml_spk_codecs,
> +		.sof_fw_filename = "sof-cnl.ri",
> +		.sof_tplg_filename = "sof-cml-da7219-max98357a.tplg",
> +	},
> +	{
>   		.id = "MX98357A",
>   		.drv_name = "sof_rt5682",
>   		.quirk_data = &cml_codecs,
> diff --git a/sound/soc/intel/common/soc-intel-quirks.h b/sound/soc/intel/common/soc-intel-quirks.h
> index 4718fd3..e6357d3 100644
> --- a/sound/soc/intel/common/soc-intel-quirks.h
> +++ b/sound/soc/intel/common/soc-intel-quirks.h
> @@ -36,6 +36,7 @@ SOC_INTEL_IS_CPU(byt, INTEL_FAM6_ATOM_SILVERMONT);
>   SOC_INTEL_IS_CPU(cht, INTEL_FAM6_ATOM_AIRMONT);
>   SOC_INTEL_IS_CPU(apl, INTEL_FAM6_ATOM_GOLDMONT);
>   SOC_INTEL_IS_CPU(glk, INTEL_FAM6_ATOM_GOLDMONT_PLUS);
> +SOC_INTEL_IS_CPU(cml, INTEL_FAM6_KABYLAKE_MOBILE);
>   
>   static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)
>   {
> @@ -110,6 +111,10 @@ static inline bool soc_intel_is_glk(void)
>   	return false;
>   }
>   
> +static inline bool soc_intel_is_cml(void)
> +{
> +	return false;
> +}
>   #endif
>   
>    #endif /* _SND_SOC_INTEL_QUIRKS_H */

Humm, which branch does this apply against? It's not in Mark's tree nor 
in the SOF tree, so how did you test this?

I remember submitting this quirk suggestion but it was not approved 
upstream, or needed more work (this was before I dropped everything to 
work on SoundWire). You may have to do this manually for now with the 
cpu_id method, and we'll replace it later with a better solution.
Sridharan, Ranjani Aug. 8, 2019, 5:38 p.m. UTC | #2
On Thu, Aug 8, 2019 at 1:00 AM <mac.chiang@intel.com> wrote:

> From: Mac Chiang <mac.chiang@intel.com>
>
> reuse and add Cometlake support with:
> SSP0 for DA7219 headphone codec
> SSP1 for MAX98357a speaker amp codec
>
> Signed-off-by: Mac Chiang <mac.chiang@intel.com>
> ---
>  sound/soc/intel/boards/Kconfig                    | 15 +++++++++
>  sound/soc/intel/boards/bxt_da7219_max98357a.c     | 37
> ++++++++++++++++++++++-
>  sound/soc/intel/common/soc-acpi-intel-cnl-match.c | 12 ++++++++
>  sound/soc/intel/common/soc-intel-quirks.h         |  5 +++
>  4 files changed, 68 insertions(+), 1 deletion(-)
>
> diff --git a/sound/soc/intel/boards/Kconfig
> b/sound/soc/intel/boards/Kconfig
> index 50bf149..617d63c 100644
> --- a/sound/soc/intel/boards/Kconfig
> +++ b/sound/soc/intel/boards/Kconfig
> @@ -256,6 +256,21 @@ config SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH
>
>  endif ## SND_SOC_INTEL_SKL
>
> +config SND_SOC_INTEL_DA7219_MAX98357A_GENERIC
> +       tristate
> +       select SND_SOC_DA7219
> +       select SND_SOC_MAX98357A
> +       select SND_SOC_DMIC
> +       select SND_SOC_HDAC_HDMI
> +
> +if SND_SOC_SOF_COMETLAKE_LP
> +config SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH
> +       tristate "CML_LP with DA7219 and MAX98357A in I2S Mode"
> +       depends on I2C && ACPI
> +       depends on MFD_INTEL_LPSS || COMPILE_TEST
> +       select SND_SOC_INTEL_DA7219_MAX98357A_GENERIC
> +endif
> +
>  if SND_SOC_INTEL_APL
>
>  config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH
> diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c
> b/sound/soc/intel/boards/bxt_da7219_max98357a.c
> index c0d865a..e5941ff 100644
> --- a/sound/soc/intel/boards/bxt_da7219_max98357a.c
> +++ b/sound/soc/intel/boards/bxt_da7219_max98357a.c
> @@ -24,6 +24,8 @@
>
>  #define BXT_DIALOG_CODEC_DAI   "da7219-hifi"
>  #define BXT_MAXIM_CODEC_DAI    "HiFi"
> +#define MCLK_19M       19200000
> +#define MCLK_24M       24576000
>  #define DUAL_CHANNEL           2
>  #define QUAD_CHANNEL           4
>
> @@ -181,8 +183,13 @@ static int broxton_da7219_codec_init(struct
> snd_soc_pcm_runtime *rtd)
>         struct snd_soc_component *component = rtd->codec_dai->component;
>
>         /* Configure sysclk for codec */
> -       ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK,
> 19200000,
> +#if !IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
> +       ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK,
> MCLK_19M,
>                                      SND_SOC_CLOCK_IN);
> +#else
> +       ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK,
> MCLK_24M,
> +                                    SND_SOC_CLOCK_IN);
> +#endif
>         if (ret) {
>                 dev_err(rtd->dev, "can't set codec sysclk
> configuration\n");
>                 return ret;
> @@ -224,7 +231,11 @@ static int broxton_hdmi_init(struct
> snd_soc_pcm_runtime *rtd)
>         if (!pcm)
>                 return -ENOMEM;
>
> +#if !IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
>         pcm->device = BXT_DPCM_AUDIO_HDMI1_PB + dai->id;
> +#else
> +       pcm->device = dai->id;
> +#endif
>         pcm->codec_dai = dai;
>
>         list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
> @@ -683,6 +694,27 @@ static int broxton_audio_probe(struct platform_device
> *pdev)
>                                 broxton_dais[i].cpus->dai_name = "SSP2
> Pin";
>                         }
>                 }
> +       } else if (soc_intel_is_cml()) {
> +               unsigned int i;
> +
> +               broxton_audio_card.name = "cmlda7219max";
> +
> +               for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
> +                       /* MAXIM_CODEC is connected to SSP1. */
> +                       if (!strcmp(broxton_dais[i].codecs->dai_name,
> +                                       BXT_MAXIM_CODEC_DAI)) {
> +                               broxton_dais[i].id = 1;
> +                               broxton_dais[i].name = "SSP1-Codec";
> +                               broxton_dais[i].cpus->dai_name = "SSP1
> Pin";
> +                       }
> +                       /* DIALOG_CODEC is connected to SSP0 */
> +                       else if (!strcmp(broxton_dais[i].codecs->dai_name,
> +                                       BXT_DIALOG_CODEC_DAI)) {
> +                               broxton_dais[i].id = 0;
> +                               broxton_dais[i].name = "SSP0-Codec";
> +                               broxton_dais[i].cpus->dai_name = "SSP0
> Pin";
> +                       }
> +               }
>         }
>
Would it be possible to keep the ID's unchanged? Its quite confusing with
so many platforms reusing the machine driver so it would help if the
changes are minimal.
I understand why you want to change the ID's but it would be simpler to
just use the existing ID's in topology I think.

Thanks,
Ranjani
Pierre-Louis Bossart Aug. 8, 2019, 7:06 p.m. UTC | #3
>> diff --git a/sound/soc/intel/common/soc-intel-quirks.h 
>> b/sound/soc/intel/common/soc-intel-quirks.h
>> index 4718fd3..e6357d3 100644
>> --- a/sound/soc/intel/common/soc-intel-quirks.h
>> +++ b/sound/soc/intel/common/soc-intel-quirks.h
>> @@ -36,6 +36,7 @@ SOC_INTEL_IS_CPU(byt, INTEL_FAM6_ATOM_SILVERMONT);
>>   SOC_INTEL_IS_CPU(cht, INTEL_FAM6_ATOM_AIRMONT);
>>   SOC_INTEL_IS_CPU(apl, INTEL_FAM6_ATOM_GOLDMONT);
>>   SOC_INTEL_IS_CPU(glk, INTEL_FAM6_ATOM_GOLDMONT_PLUS);
>> +SOC_INTEL_IS_CPU(cml, INTEL_FAM6_KABYLAKE_MOBILE);
>>   static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)
>>   {
>> @@ -110,6 +111,10 @@ static inline bool soc_intel_is_glk(void)
>>       return false;
>>   }
>> +static inline bool soc_intel_is_cml(void)
>> +{
>> +    return false;
>> +}
>>   #endif
>>    #endif /* _SND_SOC_INTEL_QUIRKS_H */
> 
> Humm, which branch does this apply against? It's not in Mark's tree nor 
> in the SOF tree, so how did you test this?
> 
> I remember submitting this quirk suggestion but it was not approved 
> upstream, or needed more work (this was before I dropped everything to 
> work on SoundWire). You may have to do this manually for now with the 
> cpu_id method, and we'll replace it later with a better solution.

Please ignore this last comment, I need more coffee before reviewing. 
The code was indeed merged...
Pierre-Louis Bossart Aug. 8, 2019, 7:15 p.m. UTC | #4
>     +       } else if (soc_intel_is_cml()) {
>     +               unsigned int i;
>     +
>     + broxton_audio_card.name <http://broxton_audio_card.name> =
>     "cmlda7219max";
>     +
>     +               for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
>     +                       /* MAXIM_CODEC is connected to SSP1. */
>     +                       if (!strcmp(broxton_dais[i].codecs->dai_name,
>     +                                       BXT_MAXIM_CODEC_DAI)) {
>     +                               broxton_dais[i].id = 1;
>     +                               broxton_dais[i].name = "SSP1-Codec";
>     +                               broxton_dais[i].cpus->dai_name =
>     "SSP1 Pin";
>     +                       }
>     +                       /* DIALOG_CODEC is connected to SSP0 */
>     +                       else if
>     (!strcmp(broxton_dais[i].codecs->dai_name,
>     +                                       BXT_DIALOG_CODEC_DAI)) {
>     +                               broxton_dais[i].id = 0;
>     +                               broxton_dais[i].name = "SSP0-Codec";
>     +                               broxton_dais[i].cpus->dai_name =
>     "SSP0 Pin";
>     +                       }
>     +               }
>              }
> 
> Would it be possible to keep the ID's unchanged? Its quite confusing 
> with so many platforms reusing the machine driver so it would help if 
> the changes are minimal.
> I understand why you want to change the ID's but it would be simpler to 
> just use the existing ID's in topology I think.

Ranjani, just to avoid confusion here, what 'ID' are you referring to?

I can see that in the existing GLK code (copied below) the .id field is 
not touched, only the name and dai_name are changed, is this what you 
were hinting at?

	if (soc_intel_is_glk()) {
		unsigned int i;

		broxton_audio_card.name = "glkda7219max";
		/* Fixup the SSP entries for geminilake */
		for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
			/* MAXIM_CODEC is connected to SSP1. */
			if (!strcmp(broxton_dais[i].codecs->dai_name,
				    BXT_MAXIM_CODEC_DAI)) {
				broxton_dais[i].name = "SSP1-Codec";
				broxton_dais[i].cpus->dai_name = "SSP1 Pin";
			}
			/* DIALOG_CODE is connected to SSP2 */
			else if (!strcmp(broxton_dais[i].codecs->dai_name,
					 BXT_DIALOG_CODEC_DAI)) {
				broxton_dais[i].name = "SSP2-Codec";
				broxton_dais[i].cpus->dai_name = "SSP2 Pin";
			}
		}
	}
Sridharan, Ranjani Aug. 8, 2019, 7:22 p.m. UTC | #5
On Thu, Aug 8, 2019 at 12:15 PM Pierre-Louis Bossart <
pierre-louis.bossart@linux.intel.com> wrote:

>
> >     +       } else if (soc_intel_is_cml()) {
> >     +               unsigned int i;
> >     +
> >     + broxton_audio_card.name <http://broxton_audio_card.name> =
> >     "cmlda7219max";
> >     +
> >     +               for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
> >     +                       /* MAXIM_CODEC is connected to SSP1. */
> >     +                       if (!strcmp(broxton_dais[i].codecs->dai_name,
> >     +                                       BXT_MAXIM_CODEC_DAI)) {
> >     +                               broxton_dais[i].id = 1;
> >     +                               broxton_dais[i].name = "SSP1-Codec";
> >     +                               broxton_dais[i].cpus->dai_name =
> >     "SSP1 Pin";
> >     +                       }
> >     +                       /* DIALOG_CODEC is connected to SSP0 */
> >     +                       else if
> >     (!strcmp(broxton_dais[i].codecs->dai_name,
> >     +                                       BXT_DIALOG_CODEC_DAI)) {
> >     +                               broxton_dais[i].id = 0;
> >     +                               broxton_dais[i].name = "SSP0-Codec";
> >     +                               broxton_dais[i].cpus->dai_name =
> >     "SSP0 Pin";
> >     +                       }
> >     +               }
> >              }
> >
> > Would it be possible to keep the ID's unchanged? Its quite confusing
> > with so many platforms reusing the machine driver so it would help if
> > the changes are minimal.
> > I understand why you want to change the ID's but it would be simpler to
> > just use the existing ID's in topology I think.
>
> Ranjani, just to avoid confusion here, what 'ID' are you referring to?


> I can see that in the existing GLK code (copied below) the .id field is
> not touched, only the name and dai_name are changed, is this what you
> were hinting at?
>
Yes, Pierre. The DAI link ID's as defined in broxton_dais[]. I guess Mac's
intention was to keep them ordered for by SSP port numbers but it is not
really necessary to do that. The ID in the topology can be changed to match
the ID in the machine driver.

Thanks,
Ranjani

>
>         if (soc_intel_is_glk()) {
>                 unsigned int i;
>
>                 broxton_audio_card.name = "glkda7219max";
>                 /* Fixup the SSP entries for geminilake */
>                 for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
>                         /* MAXIM_CODEC is connected to SSP1. */
>                         if (!strcmp(broxton_dais[i].codecs->dai_name,
>                                     BXT_MAXIM_CODEC_DAI)) {
>                                 broxton_dais[i].name = "SSP1-Codec";
>                                 broxton_dais[i].cpus->dai_name = "SSP1
> Pin";
>                         }
>                         /* DIALOG_CODE is connected to SSP2 */
>                         else if (!strcmp(broxton_dais[i].codecs->dai_name,
>                                          BXT_DIALOG_CODEC_DAI)) {
>                                 broxton_dais[i].name = "SSP2-Codec";
>                                 broxton_dais[i].cpus->dai_name = "SSP2
> Pin";
>                         }
>                 }
>         }
>
>
diff mbox series

Patch

diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig
index 50bf149..617d63c 100644
--- a/sound/soc/intel/boards/Kconfig
+++ b/sound/soc/intel/boards/Kconfig
@@ -256,6 +256,21 @@  config SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH
 
 endif ## SND_SOC_INTEL_SKL
 
+config SND_SOC_INTEL_DA7219_MAX98357A_GENERIC
+	tristate
+	select SND_SOC_DA7219
+	select SND_SOC_MAX98357A
+	select SND_SOC_DMIC
+	select SND_SOC_HDAC_HDMI
+
+if SND_SOC_SOF_COMETLAKE_LP
+config SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH
+	tristate "CML_LP with DA7219 and MAX98357A in I2S Mode"
+	depends on I2C && ACPI
+	depends on MFD_INTEL_LPSS || COMPILE_TEST
+	select SND_SOC_INTEL_DA7219_MAX98357A_GENERIC
+endif
+
 if SND_SOC_INTEL_APL
 
 config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH
diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c b/sound/soc/intel/boards/bxt_da7219_max98357a.c
index c0d865a..e5941ff 100644
--- a/sound/soc/intel/boards/bxt_da7219_max98357a.c
+++ b/sound/soc/intel/boards/bxt_da7219_max98357a.c
@@ -24,6 +24,8 @@ 
 
 #define BXT_DIALOG_CODEC_DAI	"da7219-hifi"
 #define BXT_MAXIM_CODEC_DAI	"HiFi"
+#define MCLK_19M	19200000
+#define MCLK_24M	24576000
 #define DUAL_CHANNEL		2
 #define QUAD_CHANNEL		4
 
@@ -181,8 +183,13 @@  static int broxton_da7219_codec_init(struct snd_soc_pcm_runtime *rtd)
 	struct snd_soc_component *component = rtd->codec_dai->component;
 
 	/* Configure sysclk for codec */
-	ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, 19200000,
+#if !IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
+	ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, MCLK_19M,
 				     SND_SOC_CLOCK_IN);
+#else
+	ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, MCLK_24M,
+				     SND_SOC_CLOCK_IN);
+#endif
 	if (ret) {
 		dev_err(rtd->dev, "can't set codec sysclk configuration\n");
 		return ret;
@@ -224,7 +231,11 @@  static int broxton_hdmi_init(struct snd_soc_pcm_runtime *rtd)
 	if (!pcm)
 		return -ENOMEM;
 
+#if !IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
 	pcm->device = BXT_DPCM_AUDIO_HDMI1_PB + dai->id;
+#else
+	pcm->device = dai->id;
+#endif
 	pcm->codec_dai = dai;
 
 	list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
@@ -683,6 +694,27 @@  static int broxton_audio_probe(struct platform_device *pdev)
 				broxton_dais[i].cpus->dai_name = "SSP2 Pin";
 			}
 		}
+	} else if (soc_intel_is_cml()) {
+		unsigned int i;
+
+		broxton_audio_card.name = "cmlda7219max";
+
+		for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
+			/* MAXIM_CODEC is connected to SSP1. */
+			if (!strcmp(broxton_dais[i].codecs->dai_name,
+					BXT_MAXIM_CODEC_DAI)) {
+				broxton_dais[i].id = 1;
+				broxton_dais[i].name = "SSP1-Codec";
+				broxton_dais[i].cpus->dai_name = "SSP1 Pin";
+			}
+			/* DIALOG_CODEC is connected to SSP0 */
+			else if (!strcmp(broxton_dais[i].codecs->dai_name,
+					BXT_DIALOG_CODEC_DAI)) {
+				broxton_dais[i].id = 0;
+				broxton_dais[i].name = "SSP0-Codec";
+				broxton_dais[i].cpus->dai_name = "SSP0 Pin";
+			}
+		}
 	}
 
 	/* override plaform name, if required */
@@ -700,6 +732,7 @@  static int broxton_audio_probe(struct platform_device *pdev)
 static const struct platform_device_id bxt_board_ids[] = {
 	{ .name = "bxt_da7219_max98357a" },
 	{ .name = "glk_da7219_max98357a" },
+	{ .name = "cml_da7219_max98357a" },
 	{ }
 };
 
@@ -720,6 +753,8 @@  MODULE_AUTHOR("Rohit Ainapure <rohit.m.ainapure@intel.com>");
 MODULE_AUTHOR("Harsha Priya <harshapriya.n@intel.com>");
 MODULE_AUTHOR("Conrad Cooke <conrad.cooke@intel.com>");
 MODULE_AUTHOR("Naveen Manohar <naveen.m@intel.com>");
+MODULE_AUTHOR("Mac Chiang <mac.chiang@intel.com>");
 MODULE_LICENSE("GPL v2");
 MODULE_ALIAS("platform:bxt_da7219_max98357a");
 MODULE_ALIAS("platform:glk_da7219_max98357a");
+MODULE_ALIAS("platform:cml_da7219_max98357a");
diff --git a/sound/soc/intel/common/soc-acpi-intel-cnl-match.c b/sound/soc/intel/common/soc-acpi-intel-cnl-match.c
index c36c0aa..4ea32b2 100644
--- a/sound/soc/intel/common/soc-acpi-intel-cnl-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-cnl-match.c
@@ -19,6 +19,11 @@  static struct snd_soc_acpi_codecs cml_codecs = {
 	.codecs = {"10EC5682"}
 };
 
+static struct snd_soc_acpi_codecs cml_spk_codecs = {
+	.num_codecs = 1,
+	.codecs = {"MX98357A"}
+};
+
 struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[] = {
 	{
 		.id = "INT34C2",
@@ -29,6 +34,13 @@  struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[] = {
 		.sof_tplg_filename = "sof-cnl-rt274.tplg",
 	},
 	{
+		.id = "DLGS7219",
+		.drv_name = "cml_da7219_max98357a",
+		.quirk_data = &cml_spk_codecs,
+		.sof_fw_filename = "sof-cnl.ri",
+		.sof_tplg_filename = "sof-cml-da7219-max98357a.tplg",
+	},
+	{
 		.id = "MX98357A",
 		.drv_name = "sof_rt5682",
 		.quirk_data = &cml_codecs,
diff --git a/sound/soc/intel/common/soc-intel-quirks.h b/sound/soc/intel/common/soc-intel-quirks.h
index 4718fd3..e6357d3 100644
--- a/sound/soc/intel/common/soc-intel-quirks.h
+++ b/sound/soc/intel/common/soc-intel-quirks.h
@@ -36,6 +36,7 @@  SOC_INTEL_IS_CPU(byt, INTEL_FAM6_ATOM_SILVERMONT);
 SOC_INTEL_IS_CPU(cht, INTEL_FAM6_ATOM_AIRMONT);
 SOC_INTEL_IS_CPU(apl, INTEL_FAM6_ATOM_GOLDMONT);
 SOC_INTEL_IS_CPU(glk, INTEL_FAM6_ATOM_GOLDMONT_PLUS);
+SOC_INTEL_IS_CPU(cml, INTEL_FAM6_KABYLAKE_MOBILE);
 
 static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)
 {
@@ -110,6 +111,10 @@  static inline bool soc_intel_is_glk(void)
 	return false;
 }
 
+static inline bool soc_intel_is_cml(void)
+{
+	return false;
+}
 #endif
 
  #endif /* _SND_SOC_INTEL_QUIRKS_H */