Commit b5182020 authored by Mark Brown's avatar Mark Brown

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

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

Small patchset to harden the SoundWire machine driver, change bad
HIDs, update PLL settings and avoid memory leaks. Given that the
SoundWire core parts are not upstream it's probably not necessary to
provide the patches to stable branches.

Bard Liao (1):
  ASoC: Intel: sof_sdw_rt711: remove hard-coded codec name

Kai Vehmanen (2):
  ASoC: Intel: sof_sdw: add support for systems without i915 audio
  ASoC: Intel: sof_sdw: avoid crash if invalid DSP topology loaded

Libin Yang (1):
  ASoC: Intel: common: change match table ehl-rt5660

Pierre-Louis Bossart (1):
  ASoC: Intel: sof_sdw_rt711: remove properties in card remove

Yong Zhi (1):
  ASoC: intel: board: sof_rt5682: Update rt1015 pll input clk freq

 sound/soc/intel/boards/sof_rt5682.c           |  9 +++++-
 sound/soc/intel/boards/sof_sdw.c              | 31 +++++++++++++------
 sound/soc/intel/boards/sof_sdw_common.h       |  2 ++
 sound/soc/intel/boards/sof_sdw_hdmi.c         |  6 ++++
 sound/soc/intel/boards/sof_sdw_rt711.c        | 17 +++++++++-
 .../intel/common/soc-acpi-intel-ehl-match.c   |  2 +-
 6 files changed, 54 insertions(+), 13 deletions(-)

base-commit: 22e9b543
--
2.25.1
parents 6b174a49 0d95d06a
...@@ -284,8 +284,15 @@ static int sof_rt1015_hw_params(struct snd_pcm_substream *substream, ...@@ -284,8 +284,15 @@ static int sof_rt1015_hw_params(struct snd_pcm_substream *substream,
return 0; return 0;
for_each_rtd_codec_dais(rtd, i, codec_dai) { 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);
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, ret = snd_soc_dai_set_pll(codec_dai, 0, RT1015_PLL_S_BCLK,
params_rate(params) * 50, params_rate(params) * 64,
params_rate(params) * 256); params_rate(params) * 256);
if (ret < 0) { if (ret < 0) {
dev_err(card->dev, "failed to set pll\n"); dev_err(card->dev, "failed to set pll\n");
......
...@@ -217,6 +217,7 @@ static struct sof_sdw_codec_info codec_info_list[] = { ...@@ -217,6 +217,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.direction = {true, true}, .direction = {true, true},
.dai_name = "rt711-aif1", .dai_name = "rt711-aif1",
.init = sof_sdw_rt711_init, .init = sof_sdw_rt711_init,
.exit = sof_sdw_rt711_exit,
}, },
{ {
.id = 0x1308, .id = 0x1308,
...@@ -698,11 +699,14 @@ static inline int get_next_be_id(struct snd_soc_dai_link *links, ...@@ -698,11 +699,14 @@ static inline int get_next_be_id(struct snd_soc_dai_link *links,
return links[be_id - 1].id + 1; return links[be_id - 1].id + 1;
} }
#define IDISP_CODEC_MASK 0x4
static int sof_card_dai_links_create(struct device *dev, static int sof_card_dai_links_create(struct device *dev,
struct snd_soc_acpi_mach *mach, struct snd_soc_acpi_mach *mach,
struct snd_soc_card *card) struct snd_soc_card *card)
{ {
int ssp_num, sdw_be_num = 0, hdmi_num = 0, dmic_num; int ssp_num, sdw_be_num = 0, hdmi_num = 0, dmic_num;
struct mc_private *ctx = snd_soc_card_get_drvdata(card);
struct snd_soc_dai_link_component *idisp_components; struct snd_soc_dai_link_component *idisp_components;
struct snd_soc_dai_link_component *ssp_components; struct snd_soc_dai_link_component *ssp_components;
struct snd_soc_acpi_mach_params *mach_params; struct snd_soc_acpi_mach_params *mach_params;
...@@ -746,12 +750,15 @@ static int sof_card_dai_links_create(struct device *dev, ...@@ -746,12 +750,15 @@ static int sof_card_dai_links_create(struct device *dev,
return ret; return ret;
} }
if (mach_params->codec_mask & IDISP_CODEC_MASK)
ctx->idisp_codec = true;
/* enable dmic01 & dmic16k */ /* enable dmic01 & dmic16k */
dmic_num = (sof_sdw_quirk & SOF_SDW_PCH_DMIC) ? 2 : 0; dmic_num = (sof_sdw_quirk & SOF_SDW_PCH_DMIC) ? 2 : 0;
comp_num += dmic_num; comp_num += dmic_num;
dev_dbg(dev, "sdw %d, ssp %d, dmic %d, hdmi %d", sdw_be_num, ssp_num, dev_dbg(dev, "sdw %d, ssp %d, dmic %d, hdmi %d", sdw_be_num, ssp_num,
dmic_num, hdmi_num); dmic_num, ctx->idisp_codec ? hdmi_num : 0);
/* allocate BE dailinks */ /* allocate BE dailinks */
num_links = comp_num + sdw_be_num; num_links = comp_num + sdw_be_num;
...@@ -900,13 +907,18 @@ static int sof_card_dai_links_create(struct device *dev, ...@@ -900,13 +907,18 @@ static int sof_card_dai_links_create(struct device *dev,
if (!name) if (!name)
return -ENOMEM; return -ENOMEM;
idisp_components[i].name = "ehdaudio0D2"; if (ctx->idisp_codec) {
idisp_components[i].dai_name = devm_kasprintf(dev, idisp_components[i].name = "ehdaudio0D2";
GFP_KERNEL, idisp_components[i].dai_name = devm_kasprintf(dev,
"intel-hdmi-hifi%d", GFP_KERNEL,
i + 1); "intel-hdmi-hifi%d",
if (!idisp_components[i].dai_name) i + 1);
return -ENOMEM; if (!idisp_components[i].dai_name)
return -ENOMEM;
} else {
idisp_components[i].name = "snd-soc-dummy";
idisp_components[i].dai_name = "snd-soc-dummy-dai";
}
cpu_name = devm_kasprintf(dev, GFP_KERNEL, cpu_name = devm_kasprintf(dev, GFP_KERNEL,
"iDisp%d Pin", i + 1); "iDisp%d Pin", i + 1);
...@@ -981,6 +993,7 @@ static int mc_probe(struct platform_device *pdev) ...@@ -981,6 +993,7 @@ static int mc_probe(struct platform_device *pdev)
INIT_LIST_HEAD(&ctx->hdmi_pcm_list); INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
card->dev = &pdev->dev; card->dev = &pdev->dev;
snd_soc_card_set_drvdata(card, ctx);
mach = pdev->dev.platform_data; mach = pdev->dev.platform_data;
ret = sof_card_dai_links_create(&pdev->dev, mach, ret = sof_card_dai_links_create(&pdev->dev, mach,
...@@ -990,8 +1003,6 @@ static int mc_probe(struct platform_device *pdev) ...@@ -990,8 +1003,6 @@ static int mc_probe(struct platform_device *pdev)
ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv; ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv;
snd_soc_card_set_drvdata(card, ctx);
/* /*
* the default amp_num is zero for each codec and * the default amp_num is zero for each codec and
* amp_num will only be increased for active amp * amp_num will only be increased for active amp
......
...@@ -70,6 +70,7 @@ struct sof_sdw_codec_info { ...@@ -70,6 +70,7 @@ struct sof_sdw_codec_info {
struct mc_private { struct mc_private {
struct list_head hdmi_pcm_list; struct list_head hdmi_pcm_list;
bool common_hdmi_codec_drv; bool common_hdmi_codec_drv;
bool idisp_codec;
struct snd_soc_jack sdw_headset; struct snd_soc_jack sdw_headset;
}; };
...@@ -91,6 +92,7 @@ int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link, ...@@ -91,6 +92,7 @@ int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link,
struct snd_soc_dai_link *dai_links, struct snd_soc_dai_link *dai_links,
struct sof_sdw_codec_info *info, struct sof_sdw_codec_info *info,
bool playback); bool playback);
int sof_sdw_rt711_exit(struct device *dev, struct snd_soc_dai_link *dai_link);
/* RT700 support */ /* RT700 support */
int sof_sdw_rt700_init(const struct snd_soc_acpi_link_adr *link, int sof_sdw_rt700_init(const struct snd_soc_acpi_link_adr *link,
......
...@@ -52,6 +52,12 @@ int sof_sdw_hdmi_card_late_probe(struct snd_soc_card *card) ...@@ -52,6 +52,12 @@ int sof_sdw_hdmi_card_late_probe(struct snd_soc_card *card)
int err, i = 0; int err, i = 0;
char jack_name[NAME_SIZE]; char jack_name[NAME_SIZE];
if (!ctx->idisp_codec)
return 0;
if (list_empty(&ctx->hdmi_pcm_list))
return -EINVAL;
pcm = list_first_entry(&ctx->hdmi_pcm_list, struct hdmi_pcm, pcm = list_first_entry(&ctx->hdmi_pcm_list, struct hdmi_pcm,
head); head);
component = pcm->codec_dai->component; component = pcm->codec_dai->component;
......
...@@ -133,6 +133,21 @@ static int rt711_rtd_init(struct snd_soc_pcm_runtime *rtd) ...@@ -133,6 +133,21 @@ static int rt711_rtd_init(struct snd_soc_pcm_runtime *rtd)
return ret; return ret;
} }
int sof_sdw_rt711_exit(struct device *dev, struct snd_soc_dai_link *dai_link)
{
struct device *sdw_dev;
sdw_dev = bus_find_device_by_name(&sdw_bus_type, NULL,
dai_link->codecs[0].name);
if (!sdw_dev)
return -EINVAL;
device_remove_properties(sdw_dev);
put_device(sdw_dev);
return 0;
}
int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link, int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link,
struct snd_soc_dai_link *dai_links, struct snd_soc_dai_link *dai_links,
struct sof_sdw_codec_info *info, struct sof_sdw_codec_info *info,
...@@ -147,7 +162,7 @@ int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link, ...@@ -147,7 +162,7 @@ int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link,
if (!playback) if (!playback)
return 0; return 0;
ret = rt711_add_codec_device_props("sdw:0:25d:711:0"); ret = rt711_add_codec_device_props(dai_links->codecs[0].name);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
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