Commit 4c1cc83f authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Mark Brown

ASOC: SOF: simplify nocodec mode

Replace ugly #if (!IS_ENABLED) by if (!IS_ENABLED), remove
cross-module dependencies and use classic mechanism to pass
information to the machine driver.
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarDaniel Baluta <daniel.baluta@gmail.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20210409220121.1542362-7-ranjani.sridharan@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent f3f3af17
...@@ -100,9 +100,6 @@ struct sof_dev_desc { ...@@ -100,9 +100,6 @@ struct sof_dev_desc {
const struct snd_sof_dsp_ops *ops; const struct snd_sof_dsp_ops *ops;
}; };
int sof_nocodec_setup(struct device *dev, const struct snd_sof_dsp_ops *ops,
int (*pcm_dai_link_fixup)(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params));
int sof_dai_get_mclk(struct snd_soc_pcm_runtime *rtd); int sof_dai_get_mclk(struct snd_soc_pcm_runtime *rtd);
#endif #endif
...@@ -20,16 +20,14 @@ static struct snd_soc_card sof_nocodec_card = { ...@@ -20,16 +20,14 @@ static struct snd_soc_card sof_nocodec_card = {
}; };
static int sof_nocodec_bes_setup(struct device *dev, static int sof_nocodec_bes_setup(struct device *dev,
const struct snd_sof_dsp_ops *ops, struct snd_soc_dai_driver *drv,
struct snd_soc_dai_link *links, struct snd_soc_dai_link *links,
int link_num, struct snd_soc_card *card, int link_num, struct snd_soc_card *card)
int (*pcm_dai_link_fixup)(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params))
{ {
struct snd_soc_dai_link_component *dlc; struct snd_soc_dai_link_component *dlc;
int i; int i;
if (!ops || !links || !card) if (!drv || !links || !card)
return -EINVAL; return -EINVAL;
/* set up BE dai_links */ /* set up BE dai_links */
...@@ -55,16 +53,16 @@ static int sof_nocodec_bes_setup(struct device *dev, ...@@ -55,16 +53,16 @@ static int sof_nocodec_bes_setup(struct device *dev,
links[i].id = i; links[i].id = i;
links[i].no_pcm = 1; links[i].no_pcm = 1;
links[i].cpus->dai_name = ops->drv[i].name; links[i].cpus->dai_name = drv[i].name;
links[i].platforms->name = dev_name(dev); links[i].platforms->name = dev_name(dev->parent);
links[i].codecs->dai_name = "snd-soc-dummy-dai"; links[i].codecs->dai_name = "snd-soc-dummy-dai";
links[i].codecs->name = "snd-soc-dummy"; links[i].codecs->name = "snd-soc-dummy";
if (ops->drv[i].playback.channels_min) if (drv[i].playback.channels_min)
links[i].dpcm_playback = 1; links[i].dpcm_playback = 1;
if (ops->drv[i].capture.channels_min) if (drv[i].capture.channels_min)
links[i].dpcm_capture = 1; links[i].dpcm_capture = 1;
links[i].be_hw_params_fixup = pcm_dai_link_fixup; links[i].be_hw_params_fixup = sof_pcm_dai_link_fixup;
} }
card->dai_link = links; card->dai_link = links;
...@@ -73,29 +71,34 @@ static int sof_nocodec_bes_setup(struct device *dev, ...@@ -73,29 +71,34 @@ static int sof_nocodec_bes_setup(struct device *dev,
return 0; return 0;
} }
int sof_nocodec_setup(struct device *dev, const struct snd_sof_dsp_ops *ops, static int sof_nocodec_setup(struct device *dev,
int (*pcm_dai_link_fixup)(struct snd_soc_pcm_runtime *rtd, u32 num_dai_drivers,
struct snd_pcm_hw_params *params)) struct snd_soc_dai_driver *dai_drivers)
{ {
struct snd_soc_dai_link *links; struct snd_soc_dai_link *links;
/* create dummy BE dai_links */ /* create dummy BE dai_links */
links = devm_kzalloc(dev, sizeof(struct snd_soc_dai_link) * links = devm_kzalloc(dev, sizeof(struct snd_soc_dai_link) * num_dai_drivers, GFP_KERNEL);
ops->num_drv, GFP_KERNEL);
if (!links) if (!links)
return -ENOMEM; return -ENOMEM;
return sof_nocodec_bes_setup(dev, ops, links, ops->num_drv, return sof_nocodec_bes_setup(dev, dai_drivers, links, num_dai_drivers, &sof_nocodec_card);
&sof_nocodec_card, pcm_dai_link_fixup);
} }
EXPORT_SYMBOL(sof_nocodec_setup);
static int sof_nocodec_probe(struct platform_device *pdev) static int sof_nocodec_probe(struct platform_device *pdev)
{ {
struct snd_soc_card *card = &sof_nocodec_card; struct snd_soc_card *card = &sof_nocodec_card;
struct snd_soc_acpi_mach *mach;
int ret;
card->dev = &pdev->dev; card->dev = &pdev->dev;
card->topology_shortname_created = true; card->topology_shortname_created = true;
mach = pdev->dev.platform_data;
ret = sof_nocodec_setup(card->dev, mach->mach_params.num_dai_drivers,
mach->mach_params.dai_drivers);
if (ret < 0)
return ret;
return devm_snd_soc_register_card(&pdev->dev, card); return devm_snd_soc_register_card(&pdev->dev, card);
} }
......
...@@ -468,9 +468,8 @@ int sof_machine_check(struct snd_sof_dev *sdev) ...@@ -468,9 +468,8 @@ int sof_machine_check(struct snd_sof_dev *sdev)
struct snd_sof_pdata *sof_pdata = sdev->pdata; struct snd_sof_pdata *sof_pdata = sdev->pdata;
const struct sof_dev_desc *desc = sof_pdata->desc; const struct sof_dev_desc *desc = sof_pdata->desc;
struct snd_soc_acpi_mach *mach; struct snd_soc_acpi_mach *mach;
int ret;
#if !IS_ENABLED(CONFIG_SND_SOC_SOF_FORCE_NOCODEC_MODE) if (!IS_ENABLED(CONFIG_SND_SOC_SOF_FORCE_NOCODEC_MODE)) {
/* find machine */ /* find machine */
snd_sof_machine_select(sdev); snd_sof_machine_select(sdev);
...@@ -479,13 +478,14 @@ int sof_machine_check(struct snd_sof_dev *sdev) ...@@ -479,13 +478,14 @@ int sof_machine_check(struct snd_sof_dev *sdev)
return 0; return 0;
} }
#if !IS_ENABLED(CONFIG_SND_SOC_SOF_NOCODEC) if (!IS_ENABLED(CONFIG_SND_SOC_SOF_NOCODEC)) {
dev_err(sdev->dev, "error: no matching ASoC machine driver found - aborting probe\n"); dev_err(sdev->dev, "error: no matching ASoC machine driver found - aborting probe\n");
return -ENODEV; return -ENODEV;
#endif }
#else } else {
dev_warn(sdev->dev, "Force to use nocodec mode\n"); dev_warn(sdev->dev, "Force to use nocodec mode\n");
#endif }
/* select nocodec mode */ /* select nocodec mode */
dev_warn(sdev->dev, "Using nocodec machine driver\n"); dev_warn(sdev->dev, "Using nocodec machine driver\n");
mach = devm_kzalloc(sdev->dev, sizeof(*mach), GFP_KERNEL); mach = devm_kzalloc(sdev->dev, sizeof(*mach), GFP_KERNEL);
...@@ -495,10 +495,6 @@ int sof_machine_check(struct snd_sof_dev *sdev) ...@@ -495,10 +495,6 @@ int sof_machine_check(struct snd_sof_dev *sdev)
mach->drv_name = "sof-nocodec"; mach->drv_name = "sof-nocodec";
sof_pdata->tplg_filename = desc->nocodec_tplg_filename; sof_pdata->tplg_filename = desc->nocodec_tplg_filename;
ret = sof_nocodec_setup(sdev->dev, desc->ops, sof_pcm_dai_link_fixup);
if (ret < 0)
return ret;
sof_pdata->machine = mach; sof_pdata->machine = mach;
snd_sof_set_mach_params(sof_pdata->machine, sdev); snd_sof_set_mach_params(sof_pdata->machine, sdev);
......
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