Commit ccab2c7d authored by Mark Brown's avatar Mark Brown

Merge series "ASoC: Intel: machine driver updates for 5.7" from Pierre-Louis...

Merge series "ASoC: Intel: machine driver updates for 5.7" from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>:

Fix HDaudio/HDMI Kconfig dependencies, cleanup code, and add support
for 2 new configs (DA7219+Maxim 98360A and RT5692+RT1015)

Note that the last patch is the first case where we added the
Reviewed-by tags automagically from the list of GitHub
approvers. Feedback/comments welcome on the format, and thanks to
Ranjani for the nice script!

Changes since v1:
Change base to broonie/for-5.7
Rebase and fix for_each_codec_dais() macro in Patch 9.
Add new patch to remove GFP_ATOMIC

Guennadi Liakhovetski (3):
  ASoC: codecs: hdac_hdmi: (cosmetic) remove redundant variable
    initialisations
  ASoC: Intel: skylake: (cosmetic) remove redundant variable
    initialisations
  ASoC: Intel: (cosmetic) simplify structure member access

Kai Vehmanen (4):
  ASoC: Intel: boards: drop reverse deps for SND_HDA_CODEC_HDMI
  ASoC: Intel: sof_pcm512x: drop reverse deps for SND_HDA_CODEC_HDMI
  ASoC: Intel: sof_pcm512x: make HDMI optional for all platforms
  ASoC: SOF: Intel: hda: remove SND_SOC_SOF_HDA_COMMON_HDMI_CODEC

Pierre-Louis Bossart (1):
  ASoC: Intel: don't use GFP_ATOMIC for machine driver contexts

Yong Zhi (2):
  ASoC: Intel: sof_da7219_max98373: Add support for max98360a speaker
    amp
  ASoC: Intel: sof_rt5682: Add rt1015 speaker amp support

 sound/soc/codecs/hdac_hdmi.c                  |   6 +-
 sound/soc/intel/boards/Kconfig                |  20 ++--
 sound/soc/intel/boards/bdw-rt5650.c           |   2 +-
 sound/soc/intel/boards/bdw-rt5677.c           |   2 +-
 sound/soc/intel/boards/broadwell.c            |   2 +-
 sound/soc/intel/boards/bxt_da7219_max98357a.c |   2 +-
 sound/soc/intel/boards/bxt_rt298.c            |   2 +-
 sound/soc/intel/boards/bytcht_da7213.c        |   2 +-
 sound/soc/intel/boards/cht_bsw_max98090_ti.c  |   2 +-
 sound/soc/intel/boards/cht_bsw_nau8824.c      |   2 +-
 sound/soc/intel/boards/cht_bsw_rt5645.c       |   2 +-
 sound/soc/intel/boards/cml_rt1011_rt5682.c    |   4 +-
 sound/soc/intel/boards/glk_rt5682_max98357a.c |   2 +-
 sound/soc/intel/boards/haswell.c              |   2 +-
 sound/soc/intel/boards/kbl_rt5663_max98927.c  |   2 +-
 .../intel/boards/kbl_rt5663_rt5514_max98927.c |   2 +-
 sound/soc/intel/boards/skl_hda_dsp_generic.c  |   2 +-
 .../soc/intel/boards/skl_nau88l25_max98357a.c |   2 +-
 sound/soc/intel/boards/skl_nau88l25_ssm4567.c |   2 +-
 sound/soc/intel/boards/sof_da7219_max98373.c  |  78 +++++++++++--
 sound/soc/intel/boards/sof_pcm512x.c          |  38 ++++--
 sound/soc/intel/boards/sof_rt5682.c           | 110 +++++++++++++++++-
 .../intel/common/soc-acpi-intel-jsl-match.c   |  34 +++++-
 sound/soc/intel/skylake/skl.c                 |   4 +-
 sound/soc/sof/intel/Kconfig                   |  11 --
 sound/soc/sof/intel/hda.c                     |   3 +-
 26 files changed, 269 insertions(+), 71 deletions(-)

base-commit: 101247a3
--
2.20.1
parents a9bb153d 2e6529a5
...@@ -1998,11 +1998,11 @@ static struct hdac_hdmi_drv_data intel_drv_data = { ...@@ -1998,11 +1998,11 @@ static struct hdac_hdmi_drv_data intel_drv_data = {
static int hdac_hdmi_dev_probe(struct hdac_device *hdev) static int hdac_hdmi_dev_probe(struct hdac_device *hdev)
{ {
struct hdac_hdmi_priv *hdmi_priv = NULL; struct hdac_hdmi_priv *hdmi_priv;
struct snd_soc_dai_driver *hdmi_dais = NULL; struct snd_soc_dai_driver *hdmi_dais = NULL;
struct hdac_ext_link *hlink = NULL; struct hdac_ext_link *hlink;
int num_dais = 0; int num_dais = 0;
int ret = 0; int ret;
struct hdac_driver *hdrv = drv_to_hdac_driver(hdev->dev.driver); struct hdac_driver *hdrv = drv_to_hdac_driver(hdev->dev.driver);
const struct hda_device_id *hdac_id = hdac_get_device_id(hdev, hdrv); const struct hda_device_id *hdac_id = hdac_get_device_id(hdev, hdrv);
......
...@@ -289,7 +289,6 @@ config SND_SOC_INTEL_DA7219_MAX98357A_GENERIC ...@@ -289,7 +289,6 @@ config SND_SOC_INTEL_DA7219_MAX98357A_GENERIC
select SND_SOC_DA7219 select SND_SOC_DA7219
select SND_SOC_MAX98357A select SND_SOC_MAX98357A
select SND_SOC_DMIC select SND_SOC_DMIC
select SND_HDA_CODEC_HDMI if SND_SOC_SOF_HDA_AUDIO_CODEC
select SND_SOC_HDAC_HDMI select SND_SOC_HDAC_HDMI
config SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON config SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON
...@@ -302,6 +301,7 @@ config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH ...@@ -302,6 +301,7 @@ config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH
tristate "Broxton with DA7219 and MAX98357A in I2S Mode" tristate "Broxton with DA7219 and MAX98357A in I2S Mode"
depends on I2C && ACPI depends on I2C && ACPI
depends on MFD_INTEL_LPSS || COMPILE_TEST depends on MFD_INTEL_LPSS || COMPILE_TEST
depends on SND_HDA_CODEC_HDMI
select SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON select SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON
help help
This adds support for ASoC machine driver for Broxton-P platforms This adds support for ASoC machine driver for Broxton-P platforms
...@@ -402,6 +402,7 @@ config SND_SOC_INTEL_GLK_DA7219_MAX98357A_MACH ...@@ -402,6 +402,7 @@ config SND_SOC_INTEL_GLK_DA7219_MAX98357A_MACH
tristate "GLK with DA7219 and MAX98357A in I2S Mode" tristate "GLK with DA7219 and MAX98357A in I2S Mode"
depends on I2C && ACPI depends on I2C && ACPI
depends on MFD_INTEL_LPSS || COMPILE_TEST depends on MFD_INTEL_LPSS || COMPILE_TEST
depends on SND_HDA_CODEC_HDMI
select SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON select SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON
help help
This adds support for ASoC machine driver for Geminilake platforms This adds support for ASoC machine driver for Geminilake platforms
...@@ -413,10 +414,10 @@ config SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH ...@@ -413,10 +414,10 @@ config SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH
tristate "GLK with RT5682 and MAX98357A in I2S Mode" tristate "GLK with RT5682 and MAX98357A in I2S Mode"
depends on I2C && ACPI depends on I2C && ACPI
depends on MFD_INTEL_LPSS || COMPILE_TEST depends on MFD_INTEL_LPSS || COMPILE_TEST
depends on SND_HDA_CODEC_HDMI
select SND_SOC_RT5682 select SND_SOC_RT5682
select SND_SOC_MAX98357A select SND_SOC_MAX98357A
select SND_SOC_DMIC select SND_SOC_DMIC
select SND_HDA_CODEC_HDMI if SND_SOC_SOF_HDA_AUDIO_CODEC
select SND_SOC_HDAC_HDMI select SND_SOC_HDAC_HDMI
help help
This adds support for ASoC machine driver for Geminilake platforms This adds support for ASoC machine driver for Geminilake platforms
...@@ -430,7 +431,7 @@ if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC || SND_SOC_SOF_HDA_AUDIO_CODEC ...@@ -430,7 +431,7 @@ if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC || SND_SOC_SOF_HDA_AUDIO_CODEC
config SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH config SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH
tristate "SKL/KBL/BXT/APL with HDA Codecs" tristate "SKL/KBL/BXT/APL with HDA Codecs"
select SND_HDA_CODEC_HDMI if SND_SOC_SOF_HDA_AUDIO_CODEC depends on SND_HDA_CODEC_HDMI
select SND_SOC_HDAC_HDMI select SND_SOC_HDAC_HDMI
select SND_SOC_DMIC select SND_SOC_DMIC
# SND_SOC_HDAC_HDA is already selected # SND_SOC_HDAC_HDA is already selected
...@@ -448,9 +449,10 @@ config SND_SOC_INTEL_SOF_RT5682_MACH ...@@ -448,9 +449,10 @@ config SND_SOC_INTEL_SOF_RT5682_MACH
depends on I2C && ACPI depends on I2C && ACPI
depends on (SND_SOC_SOF_HDA_LINK && (MFD_INTEL_LPSS || COMPILE_TEST)) ||\ depends on (SND_SOC_SOF_HDA_LINK && (MFD_INTEL_LPSS || COMPILE_TEST)) ||\
(SND_SOC_SOF_BAYTRAIL && (X86_INTEL_LPSS || COMPILE_TEST)) (SND_SOC_SOF_BAYTRAIL && (X86_INTEL_LPSS || COMPILE_TEST))
depends on SND_HDA_CODEC_HDMI
select SND_SOC_RT1015
select SND_SOC_RT5682 select SND_SOC_RT5682
select SND_SOC_DMIC select SND_SOC_DMIC
select SND_HDA_CODEC_HDMI if SND_SOC_SOF_HDA_AUDIO_CODEC
select SND_SOC_HDAC_HDMI select SND_SOC_HDAC_HDMI
help help
This adds support for ASoC machine driver for SOF platforms This adds support for ASoC machine driver for SOF platforms
...@@ -463,8 +465,8 @@ config SND_SOC_INTEL_SOF_PCM512x_MACH ...@@ -463,8 +465,8 @@ config SND_SOC_INTEL_SOF_PCM512x_MACH
depends on I2C && ACPI depends on I2C && ACPI
depends on (SND_SOC_SOF_HDA_AUDIO_CODEC && (MFD_INTEL_LPSS || COMPILE_TEST)) ||\ depends on (SND_SOC_SOF_HDA_AUDIO_CODEC && (MFD_INTEL_LPSS || COMPILE_TEST)) ||\
(SND_SOC_SOF_BAYTRAIL && (X86_INTEL_LPSS || COMPILE_TEST)) (SND_SOC_SOF_BAYTRAIL && (X86_INTEL_LPSS || COMPILE_TEST))
depends on SND_HDA_CODEC_HDMI
select SND_SOC_PCM512x_I2C select SND_SOC_PCM512x_I2C
select SND_HDA_CODEC_HDMI if SND_SOC_SOF_HDA_AUDIO_CODEC
help help
This adds support for ASoC machine driver for SOF platforms This adds support for ASoC machine driver for SOF platforms
with TI PCM512x I2S audio codec. with TI PCM512x I2S audio codec.
...@@ -490,11 +492,11 @@ config SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH ...@@ -490,11 +492,11 @@ config SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH
tristate "CML with RT1011 and RT5682 in I2S Mode" tristate "CML with RT1011 and RT5682 in I2S Mode"
depends on I2C && ACPI depends on I2C && ACPI
depends on MFD_INTEL_LPSS || COMPILE_TEST depends on MFD_INTEL_LPSS || COMPILE_TEST
depends on SND_HDA_CODEC_HDMI
select SND_SOC_RT1011 select SND_SOC_RT1011
select SND_SOC_RT5682 select SND_SOC_RT5682
select SND_SOC_DMIC select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI select SND_SOC_HDAC_HDMI
select SND_HDA_CODEC_HDMI if SND_SOC_SOF_HDA_AUDIO_CODEC
help help
This adds support for ASoC machine driver for SOF platform with This adds support for ASoC machine driver for SOF platform with
RT1011 + RT5682 I2S codec. RT1011 + RT5682 I2S codec.
...@@ -506,16 +508,16 @@ endif ## SND_SOC_SOF_COMETLAKE_LP && SND_SOC_SOF_HDA_LINK ...@@ -506,16 +508,16 @@ endif ## SND_SOC_SOF_COMETLAKE_LP && SND_SOC_SOF_HDA_LINK
if SND_SOC_SOF_JASPERLAKE if SND_SOC_SOF_JASPERLAKE
config SND_SOC_INTEL_SOF_DA7219_MAX98373_MACH config SND_SOC_INTEL_SOF_DA7219_MAX98373_MACH
tristate "SOF with DA7219 and MAX98373 in I2S Mode" tristate "SOF with DA7219 and MAX98373/MAX98360A in I2S Mode"
depends on I2C && ACPI depends on I2C && ACPI
depends on MFD_INTEL_LPSS || COMPILE_TEST depends on MFD_INTEL_LPSS || COMPILE_TEST
depends on SND_HDA_CODEC_HDMI
select SND_SOC_DA7219 select SND_SOC_DA7219
select SND_SOC_MAX98373 select SND_SOC_MAX98373
select SND_SOC_DMIC select SND_SOC_DMIC
select SND_HDA_CODEC_HDMI if SND_SOC_SOF_HDA_AUDIO_CODEC
help help
This adds support for ASoC machine driver for SOF platforms This adds support for ASoC machine driver for SOF platforms
with DA7219 + MAX98373 I2S audio codec. with DA7219 + MAX98373/MAX98360A I2S audio codec.
Say Y if you have such a device. Say Y if you have such a device.
If unsure select "N". If unsure select "N".
......
...@@ -298,7 +298,7 @@ static int bdw_rt5650_probe(struct platform_device *pdev) ...@@ -298,7 +298,7 @@ static int bdw_rt5650_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
/* override plaform name, if required */ /* override plaform name, if required */
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
ret = snd_soc_fixup_dai_links_platform_name(&bdw_rt5650_card, ret = snd_soc_fixup_dai_links_platform_name(&bdw_rt5650_card,
mach->mach_params.platform); mach->mach_params.platform);
......
...@@ -412,7 +412,7 @@ static int bdw_rt5677_probe(struct platform_device *pdev) ...@@ -412,7 +412,7 @@ static int bdw_rt5677_probe(struct platform_device *pdev)
} }
/* override plaform name, if required */ /* override plaform name, if required */
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
ret = snd_soc_fixup_dai_links_platform_name(&bdw_rt5677_card, ret = snd_soc_fixup_dai_links_platform_name(&bdw_rt5677_card,
mach->mach_params.platform); mach->mach_params.platform);
if (ret) if (ret)
......
...@@ -283,7 +283,7 @@ static int broadwell_audio_probe(struct platform_device *pdev) ...@@ -283,7 +283,7 @@ static int broadwell_audio_probe(struct platform_device *pdev)
broadwell_rt286.dev = &pdev->dev; broadwell_rt286.dev = &pdev->dev;
/* override plaform name, if required */ /* override plaform name, if required */
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
ret = snd_soc_fixup_dai_links_platform_name(&broadwell_rt286, ret = snd_soc_fixup_dai_links_platform_name(&broadwell_rt286,
mach->mach_params.platform); mach->mach_params.platform);
if (ret) if (ret)
......
...@@ -721,7 +721,7 @@ static int broxton_audio_probe(struct platform_device *pdev) ...@@ -721,7 +721,7 @@ static int broxton_audio_probe(struct platform_device *pdev)
} }
/* override plaform name, if required */ /* override plaform name, if required */
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
platform_name = mach->mach_params.platform; platform_name = mach->mach_params.platform;
ret = snd_soc_fixup_dai_links_platform_name(&broxton_audio_card, ret = snd_soc_fixup_dai_links_platform_name(&broxton_audio_card,
......
...@@ -627,7 +627,7 @@ static int broxton_audio_probe(struct platform_device *pdev) ...@@ -627,7 +627,7 @@ static int broxton_audio_probe(struct platform_device *pdev)
snd_soc_card_set_drvdata(card, ctx); snd_soc_card_set_drvdata(card, ctx);
/* override plaform name, if required */ /* override plaform name, if required */
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
platform_name = mach->mach_params.platform; platform_name = mach->mach_params.platform;
ret = snd_soc_fixup_dai_links_platform_name(card, ret = snd_soc_fixup_dai_links_platform_name(card,
......
...@@ -231,7 +231,7 @@ static int bytcht_da7213_probe(struct platform_device *pdev) ...@@ -231,7 +231,7 @@ static int bytcht_da7213_probe(struct platform_device *pdev)
int ret_val = 0; int ret_val = 0;
int i; int i;
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
card = &bytcht_da7213_card; card = &bytcht_da7213_card;
card->dev = &pdev->dev; card->dev = &pdev->dev;
......
...@@ -553,7 +553,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev) ...@@ -553,7 +553,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
/* override plaform name, if required */ /* override plaform name, if required */
snd_soc_card_cht.dev = &pdev->dev; snd_soc_card_cht.dev = &pdev->dev;
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
platform_name = mach->mach_params.platform; platform_name = mach->mach_params.platform;
ret_val = snd_soc_fixup_dai_links_platform_name(&snd_soc_card_cht, ret_val = snd_soc_fixup_dai_links_platform_name(&snd_soc_card_cht,
......
...@@ -259,7 +259,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev) ...@@ -259,7 +259,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
/* override plaform name, if required */ /* override plaform name, if required */
snd_soc_card_cht.dev = &pdev->dev; snd_soc_card_cht.dev = &pdev->dev;
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
platform_name = mach->mach_params.platform; platform_name = mach->mach_params.platform;
ret_val = snd_soc_fixup_dai_links_platform_name(&snd_soc_card_cht, ret_val = snd_soc_fixup_dai_links_platform_name(&snd_soc_card_cht,
......
...@@ -539,7 +539,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev) ...@@ -539,7 +539,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
if (!drv) if (!drv)
return -ENOMEM; return -ENOMEM;
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
for (i = 0; i < ARRAY_SIZE(snd_soc_cards); i++) { for (i = 0; i < ARRAY_SIZE(snd_soc_cards); i++) {
if (acpi_dev_found(snd_soc_cards[i].codec_id) && if (acpi_dev_found(snd_soc_cards[i].codec_id) &&
......
...@@ -446,12 +446,12 @@ static int snd_cml_rt1011_probe(struct platform_device *pdev) ...@@ -446,12 +446,12 @@ static int snd_cml_rt1011_probe(struct platform_device *pdev)
const char *platform_name; const char *platform_name;
int ret; int ret;
ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC); ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
if (!ctx) if (!ctx)
return -ENOMEM; return -ENOMEM;
INIT_LIST_HEAD(&ctx->hdmi_pcm_list); INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
snd_soc_card_cml.dev = &pdev->dev; snd_soc_card_cml.dev = &pdev->dev;
platform_name = mach->mach_params.platform; platform_name = mach->mach_params.platform;
......
...@@ -604,7 +604,7 @@ static int geminilake_audio_probe(struct platform_device *pdev) ...@@ -604,7 +604,7 @@ static int geminilake_audio_probe(struct platform_device *pdev)
snd_soc_card_set_drvdata(card, ctx); snd_soc_card_set_drvdata(card, ctx);
/* override plaform name, if required */ /* override plaform name, if required */
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
platform_name = mach->mach_params.platform; platform_name = mach->mach_params.platform;
ret = snd_soc_fixup_dai_links_platform_name(card, platform_name); ret = snd_soc_fixup_dai_links_platform_name(card, platform_name);
......
...@@ -193,7 +193,7 @@ static int haswell_audio_probe(struct platform_device *pdev) ...@@ -193,7 +193,7 @@ static int haswell_audio_probe(struct platform_device *pdev)
haswell_rt5640.dev = &pdev->dev; haswell_rt5640.dev = &pdev->dev;
/* override plaform name, if required */ /* override plaform name, if required */
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
ret = snd_soc_fixup_dai_links_platform_name(&haswell_rt5640, ret = snd_soc_fixup_dai_links_platform_name(&haswell_rt5640,
mach->mach_params.platform); mach->mach_params.platform);
if (ret) if (ret)
......
...@@ -962,7 +962,7 @@ static int kabylake_audio_probe(struct platform_device *pdev) ...@@ -962,7 +962,7 @@ static int kabylake_audio_probe(struct platform_device *pdev)
kabylake_audio_card->dev = &pdev->dev; kabylake_audio_card->dev = &pdev->dev;
snd_soc_card_set_drvdata(kabylake_audio_card, ctx); snd_soc_card_set_drvdata(kabylake_audio_card, ctx);
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
if (mach) if (mach)
dmic_constraints = mach->mach_params.dmic_num == 2 ? dmic_constraints = mach->mach_params.dmic_num == 2 ?
&constraints_dmic_2ch : &constraints_dmic_channels; &constraints_dmic_2ch : &constraints_dmic_channels;
......
...@@ -772,7 +772,7 @@ static int kabylake_audio_probe(struct platform_device *pdev) ...@@ -772,7 +772,7 @@ static int kabylake_audio_probe(struct platform_device *pdev)
kabylake_audio_card.dev = &pdev->dev; kabylake_audio_card.dev = &pdev->dev;
snd_soc_card_set_drvdata(&kabylake_audio_card, ctx); snd_soc_card_set_drvdata(&kabylake_audio_card, ctx);
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
if (mach) if (mach)
dmic_constraints = mach->mach_params.dmic_num == 2 ? dmic_constraints = mach->mach_params.dmic_num == 2 ?
&constraints_dmic_2ch : &constraints_dmic_channels; &constraints_dmic_2ch : &constraints_dmic_channels;
......
...@@ -182,7 +182,7 @@ static int skl_hda_audio_probe(struct platform_device *pdev) ...@@ -182,7 +182,7 @@ static int skl_hda_audio_probe(struct platform_device *pdev)
INIT_LIST_HEAD(&ctx->hdmi_pcm_list); INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
if (!mach) if (!mach)
return -EINVAL; return -EINVAL;
......
...@@ -660,7 +660,7 @@ static int skylake_audio_probe(struct platform_device *pdev) ...@@ -660,7 +660,7 @@ static int skylake_audio_probe(struct platform_device *pdev)
skylake_audio_card.dev = &pdev->dev; skylake_audio_card.dev = &pdev->dev;
snd_soc_card_set_drvdata(&skylake_audio_card, ctx); snd_soc_card_set_drvdata(&skylake_audio_card, ctx);
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
if (mach) if (mach)
dmic_constraints = mach->mach_params.dmic_num == 2 ? dmic_constraints = mach->mach_params.dmic_num == 2 ?
&constraints_dmic_2ch : &constraints_dmic_channels; &constraints_dmic_2ch : &constraints_dmic_channels;
......
...@@ -703,7 +703,7 @@ static int skylake_audio_probe(struct platform_device *pdev) ...@@ -703,7 +703,7 @@ static int skylake_audio_probe(struct platform_device *pdev)
skylake_audio_card.dev = &pdev->dev; skylake_audio_card.dev = &pdev->dev;
snd_soc_card_set_drvdata(&skylake_audio_card, ctx); snd_soc_card_set_drvdata(&skylake_audio_card, ctx);
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
if (mach) if (mach)
dmic_constraints = mach->mach_params.dmic_num == 2 ? dmic_constraints = mach->mach_params.dmic_num == 2 ?
&constraints_dmic_2ch : &constraints_dmic_channels; &constraints_dmic_2ch : &constraints_dmic_channels;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Copyright(c) 2019 Intel Corporation. // Copyright(c) 2019 Intel Corporation.
/* /*
* Intel SOF Machine driver for DA7219 + MAX98373 codec * Intel SOF Machine driver for DA7219 + MAX98373/MAX98360A codec
*/ */
#include <linux/input.h> #include <linux/input.h>
...@@ -69,11 +69,14 @@ static const struct snd_kcontrol_new controls[] = { ...@@ -69,11 +69,14 @@ static const struct snd_kcontrol_new controls[] = {
SOC_DAPM_PIN_SWITCH("Right Spk"), SOC_DAPM_PIN_SWITCH("Right Spk"),
}; };
static const struct snd_kcontrol_new m98360a_controls[] = {
SOC_DAPM_PIN_SWITCH("Headphone Jack"),
SOC_DAPM_PIN_SWITCH("Headset Mic"),
};
static const struct snd_soc_dapm_widget widgets[] = { static const struct snd_soc_dapm_widget widgets[] = {
SND_SOC_DAPM_HP("Headphone Jack", NULL), SND_SOC_DAPM_HP("Headphone Jack", NULL),
SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL),
SND_SOC_DAPM_SPK("Left Spk", NULL),
SND_SOC_DAPM_SPK("Right Spk", NULL),
SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0, SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
platform_clock_control, SND_SOC_DAPM_POST_PMD | platform_clock_control, SND_SOC_DAPM_POST_PMD |
SND_SOC_DAPM_PRE_PMU), SND_SOC_DAPM_PRE_PMU),
...@@ -83,15 +86,23 @@ static const struct snd_soc_dapm_route audio_map[] = { ...@@ -83,15 +86,23 @@ static const struct snd_soc_dapm_route audio_map[] = {
{ "Headphone Jack", NULL, "HPL" }, { "Headphone Jack", NULL, "HPL" },
{ "Headphone Jack", NULL, "HPR" }, { "Headphone Jack", NULL, "HPR" },
{ "Left Spk", NULL, "Left BE_OUT" },
{ "Right Spk", NULL, "Right BE_OUT" },
{ "MIC", NULL, "Headset Mic" }, { "MIC", NULL, "Headset Mic" },
{ "Headphone Jack", NULL, "Platform Clock" }, { "Headphone Jack", NULL, "Platform Clock" },
{ "Headset Mic", NULL, "Platform Clock" }, { "Headset Mic", NULL, "Platform Clock" },
}; };
/* For MAX98373 amp */
static const struct snd_soc_dapm_widget max98373_widgets[] = {
SND_SOC_DAPM_SPK("Left Spk", NULL),
SND_SOC_DAPM_SPK("Right Spk", NULL),
};
static const struct snd_soc_dapm_route max98373_map[] = {
{ "Left Spk", NULL, "Left BE_OUT" },
{ "Right Spk", NULL, "Right BE_OUT" },
};
static struct snd_soc_jack headset; static struct snd_soc_jack headset;
static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd) static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd)
...@@ -133,6 +144,21 @@ static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd) ...@@ -133,6 +144,21 @@ static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd)
return ret; return ret;
} }
static int speaker_amp_init(struct snd_soc_pcm_runtime *rtd)
{
int ret;
/* Add widgets */
ret = snd_soc_dapm_new_controls(&rtd->card->dapm, max98373_widgets,
ARRAY_SIZE(max98373_widgets));
if (ret)
return ret;
/* Add routes */
return snd_soc_dapm_add_routes(&rtd->card->dapm, max98373_map,
ARRAY_SIZE(max98373_map));
}
static int ssp1_hw_params(struct snd_pcm_substream *substream, static int ssp1_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params) struct snd_pcm_hw_params *params)
{ {
...@@ -223,6 +249,8 @@ SND_SOC_DAILINK_DEF(ssp1_amps, ...@@ -223,6 +249,8 @@ SND_SOC_DAILINK_DEF(ssp1_amps,
DAILINK_COMP_ARRAY( DAILINK_COMP_ARRAY(
/* Left */ COMP_CODEC(MAXIM_DEV0_NAME, MAX98373_CODEC_DAI), /* Left */ COMP_CODEC(MAXIM_DEV0_NAME, MAX98373_CODEC_DAI),
/* Right */ COMP_CODEC(MAXIM_DEV1_NAME, MAX98373_CODEC_DAI))); /* Right */ COMP_CODEC(MAXIM_DEV1_NAME, MAX98373_CODEC_DAI)));
/* For the driver-less spk amp */
SND_SOC_DAILINK_DEF(dummy, DAILINK_COMP_ARRAY(COMP_DUMMY()));
SND_SOC_DAILINK_DEF(dmic_pin, SND_SOC_DAILINK_DEF(dmic_pin,
DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin"))); DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin")));
...@@ -254,6 +282,7 @@ static struct snd_soc_dai_link dais[] = { ...@@ -254,6 +282,7 @@ static struct snd_soc_dai_link dais[] = {
.id = 0, .id = 0,
.ignore_pmdown_time = 1, .ignore_pmdown_time = 1,
.no_pcm = 1, .no_pcm = 1,
.init = speaker_amp_init,
.dpcm_playback = 1, .dpcm_playback = 1,
.dpcm_capture = 1, /* IV feedback */ .dpcm_capture = 1, /* IV feedback */
.ops = &ssp1_ops, .ops = &ssp1_ops,
...@@ -320,6 +349,21 @@ static struct snd_soc_card card_da7219_m98373 = { ...@@ -320,6 +349,21 @@ static struct snd_soc_card card_da7219_m98373 = {
.late_probe = card_late_probe, .late_probe = card_late_probe,
}; };
static struct snd_soc_card card_da7219_m98360a = {
.name = "da7219max98360a",
.owner = THIS_MODULE,
.dai_link = dais,
.num_links = ARRAY_SIZE(dais),
.controls = m98360a_controls,
.num_controls = ARRAY_SIZE(m98360a_controls),
.dapm_widgets = widgets,
.num_dapm_widgets = ARRAY_SIZE(widgets),
.dapm_routes = audio_map,
.num_dapm_routes = ARRAY_SIZE(audio_map),
.fully_routed = true,
.late_probe = card_late_probe,
};
static int audio_probe(struct platform_device *pdev) static int audio_probe(struct platform_device *pdev)
{ {
static struct snd_soc_card *card; static struct snd_soc_card *card;
...@@ -327,15 +371,26 @@ static int audio_probe(struct platform_device *pdev) ...@@ -327,15 +371,26 @@ static int audio_probe(struct platform_device *pdev)
struct card_private *ctx; struct card_private *ctx;
int ret; int ret;
ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC); ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
if (!ctx) if (!ctx)
return -ENOMEM; return -ENOMEM;
/* By default dais[0] is configured for max98373 */
if (!strcmp(pdev->name, "sof_da7219_max98360a")) {
dais[0] = (struct snd_soc_dai_link) {
.name = "SSP1-Codec",
.id = 0,
.no_pcm = 1,
.dpcm_playback = 1,
.ignore_pmdown_time = 1,
SND_SOC_DAILINK_REG(ssp1_pin, dummy, platform) };
}
INIT_LIST_HEAD(&ctx->hdmi_pcm_list); INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
card = (struct snd_soc_card *)pdev->id_entry->driver_data; card = (struct snd_soc_card *)pdev->id_entry->driver_data;
card->dev = &pdev->dev; card->dev = &pdev->dev;
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
ret = snd_soc_fixup_dai_links_platform_name(card, ret = snd_soc_fixup_dai_links_platform_name(card,
mach->mach_params.platform); mach->mach_params.platform);
if (ret) if (ret)
...@@ -351,13 +406,17 @@ static const struct platform_device_id board_ids[] = { ...@@ -351,13 +406,17 @@ static const struct platform_device_id board_ids[] = {
.name = "sof_da7219_max98373", .name = "sof_da7219_max98373",
.driver_data = (kernel_ulong_t)&card_da7219_m98373, .driver_data = (kernel_ulong_t)&card_da7219_m98373,
}, },
{
.name = "sof_da7219_max98360a",
.driver_data = (kernel_ulong_t)&card_da7219_m98360a,
},
{ } { }
}; };
static struct platform_driver audio = { static struct platform_driver audio = {
.probe = audio_probe, .probe = audio_probe,
.driver = { .driver = {
.name = "sof_da7219_max98373", .name = "sof_da7219_max98_360a_373",
.pm = &snd_soc_pm_ops, .pm = &snd_soc_pm_ops,
}, },
.id_table = board_ids, .id_table = board_ids,
...@@ -368,4 +427,5 @@ module_platform_driver(audio) ...@@ -368,4 +427,5 @@ module_platform_driver(audio)
MODULE_DESCRIPTION("ASoC Intel(R) SOF Machine driver"); MODULE_DESCRIPTION("ASoC Intel(R) SOF Machine driver");
MODULE_AUTHOR("Yong Zhi <yong.zhi@intel.com>"); MODULE_AUTHOR("Yong Zhi <yong.zhi@intel.com>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:sof_da7219_max98360a");
MODULE_ALIAS("platform:sof_da7219_max98373"); MODULE_ALIAS("platform:sof_da7219_max98373");
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#define SOF_PCM512X_SSP_CODEC(quirk) ((quirk) & GENMASK(3, 0)) #define SOF_PCM512X_SSP_CODEC(quirk) ((quirk) & GENMASK(3, 0))
#define SOF_PCM512X_SSP_CODEC_MASK (GENMASK(3, 0)) #define SOF_PCM512X_SSP_CODEC_MASK (GENMASK(3, 0))
#define IDISP_CODEC_MASK 0x4
/* Default: SSP5 */ /* Default: SSP5 */
static unsigned long sof_pcm512x_quirk = SOF_PCM512X_SSP_CODEC(5); static unsigned long sof_pcm512x_quirk = SOF_PCM512X_SSP_CODEC(5);
...@@ -40,6 +42,7 @@ struct sof_hdmi_pcm { ...@@ -40,6 +42,7 @@ struct sof_hdmi_pcm {
struct sof_card_private { struct sof_card_private {
struct list_head hdmi_pcm_list; struct list_head hdmi_pcm_list;
bool idisp_codec;
}; };
static int sof_pcm512x_quirk_cb(const struct dmi_system_id *id) static int sof_pcm512x_quirk_cb(const struct dmi_system_id *id)
...@@ -136,6 +139,9 @@ static int sof_card_late_probe(struct snd_soc_card *card) ...@@ -136,6 +139,9 @@ static int sof_card_late_probe(struct snd_soc_card *card)
if (list_empty(&ctx->hdmi_pcm_list)) if (list_empty(&ctx->hdmi_pcm_list))
return -EINVAL; return -EINVAL;
if (!ctx->idisp_codec)
return 0;
pcm = list_first_entry(&ctx->hdmi_pcm_list, struct sof_hdmi_pcm, head); pcm = list_first_entry(&ctx->hdmi_pcm_list, struct sof_hdmi_pcm, head);
return hda_dsp_hdmi_build_controls(card, pcm->codec_dai->component); return hda_dsp_hdmi_build_controls(card, pcm->codec_dai->component);
...@@ -214,7 +220,8 @@ SND_SOC_DAILINK_DEF(dmic_component, ...@@ -214,7 +220,8 @@ SND_SOC_DAILINK_DEF(dmic_component,
static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev, static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev,
int ssp_codec, int ssp_codec,
int dmic_be_num, int dmic_be_num,
int hdmi_num) int hdmi_num,
bool idisp_codec)
{ {
struct snd_soc_dai_link_component *idisp_components; struct snd_soc_dai_link_component *idisp_components;
struct snd_soc_dai_link_component *cpus; struct snd_soc_dai_link_component *cpus;
...@@ -316,11 +323,19 @@ static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev, ...@@ -316,11 +323,19 @@ static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev,
if (!links[id].cpus->dai_name) if (!links[id].cpus->dai_name)
goto devm_err; goto devm_err;
idisp_components[i - 1].name = "ehdaudio0D2"; /*
idisp_components[i - 1].dai_name = devm_kasprintf(dev, * topology cannot be loaded if codec is missing, so
GFP_KERNEL, * use the dummy codec if needed
"intel-hdmi-hifi%d", */
i); if (idisp_codec) {
idisp_components[i - 1].name = "ehdaudio0D2";
idisp_components[i - 1].dai_name =
devm_kasprintf(dev, GFP_KERNEL,
"intel-hdmi-hifi%d", i);
} else {
idisp_components[i - 1].name = "snd-soc-dummy";
idisp_components[i - 1].dai_name = "snd-soc-dummy-dai";
}
if (!idisp_components[i - 1].dai_name) if (!idisp_components[i - 1].dai_name)
goto devm_err; goto devm_err;
...@@ -341,8 +356,8 @@ static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev, ...@@ -341,8 +356,8 @@ static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev,
static int sof_audio_probe(struct platform_device *pdev) static int sof_audio_probe(struct platform_device *pdev)
{ {
struct snd_soc_acpi_mach *mach = pdev->dev.platform_data;
struct snd_soc_dai_link *dai_links; struct snd_soc_dai_link *dai_links;
struct snd_soc_acpi_mach *mach;
struct sof_card_private *ctx; struct sof_card_private *ctx;
int dmic_be_num, hdmi_num; int dmic_be_num, hdmi_num;
int ret, ssp_codec; int ret, ssp_codec;
...@@ -360,6 +375,11 @@ static int sof_audio_probe(struct platform_device *pdev) ...@@ -360,6 +375,11 @@ static int sof_audio_probe(struct platform_device *pdev)
} else { } else {
dmic_be_num = 2; dmic_be_num = 2;
#if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) #if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI)
if (mach->mach_params.common_hdmi_codec_drv &&
(mach->mach_params.codec_mask & IDISP_CODEC_MASK))
ctx->idisp_codec = true;
/* links are always present in topology */
hdmi_num = 3; hdmi_num = 3;
#endif #endif
} }
...@@ -374,7 +394,8 @@ static int sof_audio_probe(struct platform_device *pdev) ...@@ -374,7 +394,8 @@ static int sof_audio_probe(struct platform_device *pdev)
sof_audio_card_pcm512x.num_links = 1 + dmic_be_num + hdmi_num; sof_audio_card_pcm512x.num_links = 1 + dmic_be_num + hdmi_num;
dai_links = sof_card_dai_links_create(&pdev->dev, ssp_codec, dai_links = sof_card_dai_links_create(&pdev->dev, ssp_codec,
dmic_be_num, hdmi_num); dmic_be_num, hdmi_num,
ctx->idisp_codec);
if (!dai_links) if (!dai_links)
return -ENOMEM; return -ENOMEM;
...@@ -383,7 +404,6 @@ static int sof_audio_probe(struct platform_device *pdev) ...@@ -383,7 +404,6 @@ static int sof_audio_probe(struct platform_device *pdev)
INIT_LIST_HEAD(&ctx->hdmi_pcm_list); INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
sof_audio_card_pcm512x.dev = &pdev->dev; sof_audio_card_pcm512x.dev = &pdev->dev;
mach = (&pdev->dev)->platform_data;
/* set platform name for each dailink */ /* set platform name for each dailink */
ret = snd_soc_fixup_dai_links_platform_name(&sof_audio_card_pcm512x, ret = snd_soc_fixup_dai_links_platform_name(&sof_audio_card_pcm512x,
......
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
// Copyright(c) 2019 Intel Corporation. // Copyright(c) 2019-2020 Intel Corporation.
/* /*
* Intel SOF Machine Driver with Realtek rt5682 Codec * Intel SOF Machine Driver with Realtek rt5682 Codec
* and speaker codec MAX98357A * and speaker codec MAX98357A or RT1015.
*/ */
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/input.h> #include <linux/input.h>
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <sound/soc.h> #include <sound/soc.h>
#include <sound/rt5682.h> #include <sound/rt5682.h>
#include <sound/soc-acpi.h> #include <sound/soc-acpi.h>
#include "../../codecs/rt1015.h"
#include "../../codecs/rt5682.h" #include "../../codecs/rt5682.h"
#include "../../codecs/hdac_hdmi.h" #include "../../codecs/hdac_hdmi.h"
#include "../common/soc-intel-quirks.h" #include "../common/soc-intel-quirks.h"
...@@ -39,6 +40,7 @@ ...@@ -39,6 +40,7 @@
#define SOF_RT5682_NUM_HDMIDEV_MASK (GENMASK(12, 10)) #define SOF_RT5682_NUM_HDMIDEV_MASK (GENMASK(12, 10))
#define SOF_RT5682_NUM_HDMIDEV(quirk) \ #define SOF_RT5682_NUM_HDMIDEV(quirk) \
((quirk << SOF_RT5682_NUM_HDMIDEV_SHIFT) & SOF_RT5682_NUM_HDMIDEV_MASK) ((quirk << SOF_RT5682_NUM_HDMIDEV_SHIFT) & SOF_RT5682_NUM_HDMIDEV_MASK)
#define SOF_RT1015_SPEAKER_AMP_PRESENT BIT(13)
/* Default: MCLK on, MCLK 19.2M, SSP0 */ /* Default: MCLK on, MCLK 19.2M, SSP0 */
static unsigned long sof_rt5682_quirk = SOF_RT5682_MCLK_EN | static unsigned long sof_rt5682_quirk = SOF_RT5682_MCLK_EN |
...@@ -260,6 +262,42 @@ static struct snd_soc_ops sof_rt5682_ops = { ...@@ -260,6 +262,42 @@ static struct snd_soc_ops sof_rt5682_ops = {
.hw_params = sof_rt5682_hw_params, .hw_params = sof_rt5682_hw_params,
}; };
static int sof_rt1015_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_card *card = rtd->card;
struct snd_soc_dai *codec_dai;
int i, ret;
if (!snd_soc_card_get_codec_dai(card, "rt1015-aif"))
return 0;
for_each_rtd_codec_dais(rtd, i, codec_dai) {
ret = snd_soc_dai_set_pll(codec_dai, 0, RT1015_PLL_S_BCLK,
params_rate(params) * 50,
params_rate(params) * 256);
if (ret < 0) {
dev_err(card->dev, "failed to set pll\n");
return ret;
}
/* Configure sysclk for codec */
ret = snd_soc_dai_set_sysclk(codec_dai, RT1015_SCLK_S_PLL,
params_rate(params) * 256,
SND_SOC_CLOCK_IN);
if (ret < 0) {
dev_err(card->dev, "failed to set sysclk\n");
return ret;
}
}
return 0;
}
static struct snd_soc_ops sof_rt1015_ops = {
.hw_params = sof_rt1015_hw_params,
};
static struct snd_soc_dai_link_component platform_component[] = { static struct snd_soc_dai_link_component platform_component[] = {
{ {
/* name might be overridden during probe */ /* name might be overridden during probe */
...@@ -316,12 +354,17 @@ static const struct snd_kcontrol_new sof_controls[] = { ...@@ -316,12 +354,17 @@ static const struct snd_kcontrol_new sof_controls[] = {
SOC_DAPM_PIN_SWITCH("Headphone Jack"), SOC_DAPM_PIN_SWITCH("Headphone Jack"),
SOC_DAPM_PIN_SWITCH("Headset Mic"), SOC_DAPM_PIN_SWITCH("Headset Mic"),
SOC_DAPM_PIN_SWITCH("Spk"), SOC_DAPM_PIN_SWITCH("Spk"),
SOC_DAPM_PIN_SWITCH("Left Spk"),
SOC_DAPM_PIN_SWITCH("Right Spk"),
}; };
static const struct snd_soc_dapm_widget sof_widgets[] = { static const struct snd_soc_dapm_widget sof_widgets[] = {
SND_SOC_DAPM_HP("Headphone Jack", NULL), SND_SOC_DAPM_HP("Headphone Jack", NULL),
SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL),
SND_SOC_DAPM_SPK("Spk", NULL), SND_SOC_DAPM_SPK("Spk", NULL),
SND_SOC_DAPM_SPK("Left Spk", NULL),
SND_SOC_DAPM_SPK("Right Spk", NULL),
}; };
static const struct snd_soc_dapm_widget dmic_widgets[] = { static const struct snd_soc_dapm_widget dmic_widgets[] = {
...@@ -342,11 +385,22 @@ static const struct snd_soc_dapm_route speaker_map[] = { ...@@ -342,11 +385,22 @@ static const struct snd_soc_dapm_route speaker_map[] = {
{ "Spk", NULL, "Speaker" }, { "Spk", NULL, "Speaker" },
}; };
static const struct snd_soc_dapm_route speaker_map_lr[] = {
{ "Left Spk", NULL, "Left SPO" },
{ "Right Spk", NULL, "Right SPO" },
};
static const struct snd_soc_dapm_route dmic_map[] = { static const struct snd_soc_dapm_route dmic_map[] = {
/* digital mics */ /* digital mics */
{"DMic", NULL, "SoC DMIC"}, {"DMic", NULL, "SoC DMIC"},
}; };
static int speaker_codec_init_lr(struct snd_soc_pcm_runtime *rtd)
{
return snd_soc_dapm_add_routes(&rtd->card->dapm, speaker_map_lr,
ARRAY_SIZE(speaker_map_lr));
}
static int speaker_codec_init(struct snd_soc_pcm_runtime *rtd) static int speaker_codec_init(struct snd_soc_pcm_runtime *rtd)
{ {
struct snd_soc_card *card = rtd->card; struct snd_soc_card *card = rtd->card;
...@@ -382,6 +436,17 @@ static int dmic_init(struct snd_soc_pcm_runtime *rtd) ...@@ -382,6 +436,17 @@ static int dmic_init(struct snd_soc_pcm_runtime *rtd)
return ret; return ret;
} }
static struct snd_soc_codec_conf rt1015_amp_conf[] = {
{
.dlc = COMP_CODEC_CONF("i2c-10EC1015:00"),
.name_prefix = "Left",
},
{
.dlc = COMP_CODEC_CONF("i2c-10EC1015:01"),
.name_prefix = "Right",
},
};
/* sof audio machine driver for rt5682 codec */ /* sof audio machine driver for rt5682 codec */
static struct snd_soc_card sof_audio_card_rt5682 = { static struct snd_soc_card sof_audio_card_rt5682 = {
.name = "rt5682", /* the sof- prefix is added by the core */ .name = "rt5682", /* the sof- prefix is added by the core */
...@@ -417,6 +482,17 @@ static struct snd_soc_dai_link_component max98357a_component[] = { ...@@ -417,6 +482,17 @@ static struct snd_soc_dai_link_component max98357a_component[] = {
} }
}; };
static struct snd_soc_dai_link_component rt1015_components[] = {
{
.name = "i2c-10EC1015:00",
.dai_name = "rt1015-aif",
},
{
.name = "i2c-10EC1015:01",
.dai_name = "rt1015-aif",
},
};
static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev, static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev,
int ssp_codec, int ssp_codec,
int ssp_amp, int ssp_amp,
...@@ -556,11 +632,18 @@ static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev, ...@@ -556,11 +632,18 @@ static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev,
goto devm_err; goto devm_err;
links[id].id = id; links[id].id = id;
links[id].codecs = max98357a_component; if (sof_rt5682_quirk & SOF_RT1015_SPEAKER_AMP_PRESENT) {
links[id].num_codecs = ARRAY_SIZE(max98357a_component); links[id].codecs = rt1015_components;
links[id].num_codecs = ARRAY_SIZE(rt1015_components);
links[id].init = speaker_codec_init_lr;
links[id].ops = &sof_rt1015_ops;
} else {
links[id].codecs = max98357a_component;
links[id].num_codecs = ARRAY_SIZE(max98357a_component);
links[id].init = speaker_codec_init;
}
links[id].platforms = platform_component; links[id].platforms = platform_component;
links[id].num_platforms = ARRAY_SIZE(platform_component); links[id].num_platforms = ARRAY_SIZE(platform_component);
links[id].init = speaker_codec_init,
links[id].nonatomic = true; links[id].nonatomic = true;
links[id].dpcm_playback = 1; links[id].dpcm_playback = 1;
links[id].no_pcm = 1; links[id].no_pcm = 1;
...@@ -604,7 +687,7 @@ static int sof_audio_probe(struct platform_device *pdev) ...@@ -604,7 +687,7 @@ static int sof_audio_probe(struct platform_device *pdev)
dmi_check_system(sof_rt5682_quirk_table); dmi_check_system(sof_rt5682_quirk_table);
mach = (&pdev->dev)->platform_data; mach = pdev->dev.platform_data;
/* A speaker amp might not be present when the quirk claims one is. /* A speaker amp might not be present when the quirk claims one is.
* Detect this via whether the machine driver match includes quirk_data. * Detect this via whether the machine driver match includes quirk_data.
...@@ -669,6 +752,11 @@ static int sof_audio_probe(struct platform_device *pdev) ...@@ -669,6 +752,11 @@ static int sof_audio_probe(struct platform_device *pdev)
sof_audio_card_rt5682.dai_link = dai_links; sof_audio_card_rt5682.dai_link = dai_links;
if (sof_rt5682_quirk & SOF_RT1015_SPEAKER_AMP_PRESENT) {
sof_audio_card_rt5682.codec_conf = rt1015_amp_conf;
sof_audio_card_rt5682.num_configs = ARRAY_SIZE(rt1015_amp_conf);
}
INIT_LIST_HEAD(&ctx->hdmi_pcm_list); INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
sof_audio_card_rt5682.dev = &pdev->dev; sof_audio_card_rt5682.dev = &pdev->dev;
...@@ -714,6 +802,15 @@ static const struct platform_device_id board_ids[] = { ...@@ -714,6 +802,15 @@ static const struct platform_device_id board_ids[] = {
SOF_RT5682_SSP_AMP(1) | SOF_RT5682_SSP_AMP(1) |
SOF_RT5682_NUM_HDMIDEV(4)), SOF_RT5682_NUM_HDMIDEV(4)),
}, },
{
.name = "jsl_rt5682_rt1015",
.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_RT5682_SSP_AMP(1)),
},
{ } { }
}; };
...@@ -735,3 +832,4 @@ MODULE_AUTHOR("Sathya Prakash M R <sathya.prakash.m.r@intel.com>"); ...@@ -735,3 +832,4 @@ MODULE_AUTHOR("Sathya Prakash M R <sathya.prakash.m.r@intel.com>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:sof_rt5682"); MODULE_ALIAS("platform:sof_rt5682");
MODULE_ALIAS("platform:tgl_max98357a_rt5682"); MODULE_ALIAS("platform:tgl_max98357a_rt5682");
MODULE_ALIAS("platform:jsl_rt5682_rt1015");
...@@ -2,20 +2,50 @@ ...@@ -2,20 +2,50 @@
/* /*
* soc-apci-intel-jsl-match.c - tables and support for JSL ACPI enumeration. * soc-apci-intel-jsl-match.c - tables and support for JSL ACPI enumeration.
* *
* Copyright (c) 2019, Intel Corporation. * Copyright (c) 2019-2020, Intel Corporation.
* *
*/ */
#include <sound/soc-acpi.h> #include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h> #include <sound/soc-acpi-intel-match.h>
static struct snd_soc_acpi_codecs jsl_7219_98373_codecs = {
.num_codecs = 1,
.codecs = {"MX98373"}
};
static struct snd_soc_acpi_codecs rt1015_spk = {
.num_codecs = 1,
.codecs = {"10EC1015"}
};
/*
* When adding new entry to the snd_soc_acpi_intel_jsl_machines array,
* use .quirk_data member to distinguish different machine driver,
* and keep ACPI .id field unchanged for the common codec.
*/
struct snd_soc_acpi_mach snd_soc_acpi_intel_jsl_machines[] = { struct snd_soc_acpi_mach snd_soc_acpi_intel_jsl_machines[] = {
{ {
.id = "DLGS7219", .id = "DLGS7219",
.drv_name = "sof_da7219_max98373", .drv_name = "sof_da7219_max98373",
.machine_quirk = snd_soc_acpi_codec_list,
.sof_fw_filename = "sof-jsl.ri", .sof_fw_filename = "sof-jsl.ri",
.sof_tplg_filename = "sof-jsl-da7219.tplg", .sof_tplg_filename = "sof-jsl-da7219.tplg",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &jsl_7219_98373_codecs,
},
{
.id = "DLGS7219",
.drv_name = "sof_da7219_max98360a",
.sof_fw_filename = "sof-jsl.ri",
.sof_tplg_filename = "sof-jsl-da7219-mx98360a.tplg",
},
{
.id = "10EC5682",
.drv_name = "jsl_rt5682_rt1015",
.sof_fw_filename = "sof-jsl.ri",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &rt1015_spk,
.sof_tplg_filename = "sof-jsl-rt5682-rt1015.tplg",
}, },
{}, {},
}; };
......
...@@ -359,7 +359,7 @@ static int skl_resume(struct device *dev) ...@@ -359,7 +359,7 @@ static int skl_resume(struct device *dev)
struct pci_dev *pci = to_pci_dev(dev); struct pci_dev *pci = to_pci_dev(dev);
struct hdac_bus *bus = pci_get_drvdata(pci); struct hdac_bus *bus = pci_get_drvdata(pci);
struct skl_dev *skl = bus_to_skl(bus); struct skl_dev *skl = bus_to_skl(bus);
struct hdac_ext_link *hlink = NULL; struct hdac_ext_link *hlink;
int ret; int ret;
/* /*
...@@ -794,7 +794,7 @@ static void skl_probe_work(struct work_struct *work) ...@@ -794,7 +794,7 @@ static void skl_probe_work(struct work_struct *work)
{ {
struct skl_dev *skl = container_of(work, struct skl_dev, probe_work); struct skl_dev *skl = container_of(work, struct skl_dev, probe_work);
struct hdac_bus *bus = skl_to_bus(skl); struct hdac_bus *bus = skl_to_bus(skl);
struct hdac_ext_link *hlink = NULL; struct hdac_ext_link *hlink;
int err; int err;
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) { if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) {
......
...@@ -324,17 +324,6 @@ config SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 ...@@ -324,17 +324,6 @@ config SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1
Say Y if you want to enable DMI Link L1 Say Y if you want to enable DMI Link L1
If unsure, select "N". If unsure, select "N".
config SND_SOC_SOF_HDA_COMMON_HDMI_CODEC
bool "SOF common HDA HDMI codec driver"
depends on SND_SOC_SOF_HDA_LINK
depends on SND_HDA_CODEC_HDMI
default SND_HDA_CODEC_HDMI
help
This adds support for HDMI audio by using the common HDA
HDMI/DisplayPort codec driver.
Say Y if you want to use the common codec driver with SOF.
If unsure select "Y".
endif ## SND_SOC_SOF_HDA_COMMON endif ## SND_SOC_SOF_HDA_COMMON
config SND_SOC_SOF_HDA_LINK_BASELINE config SND_SOC_SOF_HDA_LINK_BASELINE
......
...@@ -54,8 +54,7 @@ static int hda_dmic_num = -1; ...@@ -54,8 +54,7 @@ static int hda_dmic_num = -1;
module_param_named(dmic_num, hda_dmic_num, int, 0444); module_param_named(dmic_num, hda_dmic_num, int, 0444);
MODULE_PARM_DESC(dmic_num, "SOF HDA DMIC number"); MODULE_PARM_DESC(dmic_num, "SOF HDA DMIC number");
static bool hda_codec_use_common_hdmi = static bool hda_codec_use_common_hdmi = IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI);
IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_COMMON_HDMI_CODEC);
module_param_named(use_common_hdmi, hda_codec_use_common_hdmi, bool, 0444); module_param_named(use_common_hdmi, hda_codec_use_common_hdmi, bool, 0444);
MODULE_PARM_DESC(use_common_hdmi, "SOF HDA use common HDMI codec driver"); MODULE_PARM_DESC(use_common_hdmi, "SOF HDA use common HDMI codec driver");
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment