Commit 6fede18b authored by Mark Brown's avatar Mark Brown

Merge series "ASoC: SOF: simplify nocodec mode" from Ranjani Sridharan...

Merge series "ASoC: SOF: simplify nocodec mode" from Ranjani Sridharan <ranjani.sridharan@linux.intel.com>:

This set of patches simplify the implementation
of nocodec mode in SOF.

Pierre-Louis Bossart (6):
  ASoC: SOF: add Kconfig option for probe workqueues
  ASoC: soc-acpi: add new fields for mach_params
  ASoC: SOF: change signature of set_mach_params() callback
  ASoC: SOF: Intel: update set_mach_params()
  ASoC: SOF: pcm: export snd_pcm_dai_link_fixup
  ASOC: SOF: simplify nocodec mode

 include/sound/soc-acpi.h  |  4 ++++
 include/sound/sof.h       |  3 ---
 sound/soc/sof/Kconfig     | 11 +++++++++++
 sound/soc/sof/intel/bdw.c |  8 ++++++--
 sound/soc/sof/intel/byt.c | 22 +++++++++++++---------
 sound/soc/sof/intel/hda.c |  8 ++++++--
 sound/soc/sof/intel/hda.h |  2 +-
 sound/soc/sof/nocodec.c   | 39 +++++++++++++++++++++------------------
 sound/soc/sof/ops.h       |  6 ++----
 sound/soc/sof/pcm.c       |  1 +
 sound/soc/sof/sof-audio.c | 34 +++++++++++++++-------------------
 sound/soc/sof/sof-priv.h  |  2 +-
 12 files changed, 81 insertions(+), 59 deletions(-)

--
2.25.1
parents 7459f8b7 4c1cc83f
......@@ -63,6 +63,8 @@ static inline struct snd_soc_acpi_mach *snd_soc_acpi_codec_list(void *arg)
* @common_hdmi_codec_drv: use commom HDAudio HDMI codec driver
* @link_mask: links enabled on the board
* @links: array of link _ADR descriptors, null terminated
* @num_dai_drivers: number of elements in @dai_drivers
* @dai_drivers: pointer to dai_drivers, used e.g. in nocodec mode
*/
struct snd_soc_acpi_mach_params {
u32 acpi_ipc_irq_index;
......@@ -72,6 +74,8 @@ struct snd_soc_acpi_mach_params {
bool common_hdmi_codec_drv;
u32 link_mask;
const struct snd_soc_acpi_link_adr *links;
u32 num_dai_drivers;
struct snd_soc_dai_driver *dai_drivers;
};
/**
......
......@@ -100,9 +100,6 @@ struct sof_dev_desc {
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);
#endif
......@@ -68,6 +68,17 @@ config SND_SOC_SOF_DEVELOPER_SUPPORT
if SND_SOC_SOF_DEVELOPER_SUPPORT
config SND_SOC_SOF_FORCE_PROBE_WORKQUEUE
bool "SOF force probe workqueue"
select SND_SOC_SOF_PROBE_WORK_QUEUE
help
This option forces the use of a probe workqueue, which is only used
when HDaudio is enabled due to module dependencies. Forcing this
option is intended for debug only, but this should not add any
functional issues in nominal cases.
Say Y if you are involved in SOF development and need this option.
If not, select N.
config SND_SOC_SOF_NOCODEC
tristate
......
......@@ -559,12 +559,16 @@ static void bdw_machine_select(struct snd_sof_dev *sdev)
}
static void bdw_set_mach_params(const struct snd_soc_acpi_mach *mach,
struct device *dev)
struct snd_sof_dev *sdev)
{
struct snd_sof_pdata *pdata = sdev->pdata;
const struct sof_dev_desc *desc = pdata->desc;
struct snd_soc_acpi_mach_params *mach_params;
mach_params = (struct snd_soc_acpi_mach_params *)&mach->mach_params;
mach_params->platform = dev_name(dev);
mach_params->platform = dev_name(sdev->dev);
mach_params->num_dai_drivers = desc->ops->num_drv;
mach_params->dai_drivers = desc->ops->drv;
}
/* Broadwell DAIs */
......
......@@ -427,15 +427,6 @@ static void byt_machine_select(struct snd_sof_dev *sdev)
sof_pdata->machine = mach;
}
static void byt_set_mach_params(const struct snd_soc_acpi_mach *mach,
struct device *dev)
{
struct snd_soc_acpi_mach_params *mach_params;
mach_params = (struct snd_soc_acpi_mach_params *)&mach->mach_params;
mach_params->platform = dev_name(dev);
}
/* Baytrail DAIs */
static struct snd_soc_dai_driver byt_dai[] = {
{
......@@ -506,6 +497,19 @@ static struct snd_soc_dai_driver byt_dai[] = {
},
};
static void byt_set_mach_params(const struct snd_soc_acpi_mach *mach,
struct snd_sof_dev *sdev)
{
struct snd_sof_pdata *pdata = sdev->pdata;
const struct sof_dev_desc *desc = pdata->desc;
struct snd_soc_acpi_mach_params *mach_params;
mach_params = (struct snd_soc_acpi_mach_params *)&mach->mach_params;
mach_params->platform = dev_name(sdev->dev);
mach_params->num_dai_drivers = desc->ops->num_drv;
mach_params->dai_drivers = desc->ops->drv;
}
/*
* Probe and remove.
*/
......
......@@ -1213,12 +1213,16 @@ static int hda_sdw_machine_select(struct snd_sof_dev *sdev)
#endif
void hda_set_mach_params(const struct snd_soc_acpi_mach *mach,
struct device *dev)
struct snd_sof_dev *sdev)
{
struct snd_sof_pdata *pdata = sdev->pdata;
const struct sof_dev_desc *desc = pdata->desc;
struct snd_soc_acpi_mach_params *mach_params;
mach_params = (struct snd_soc_acpi_mach_params *)&mach->mach_params;
mach_params->platform = dev_name(dev);
mach_params->platform = dev_name(sdev->dev);
mach_params->num_dai_drivers = desc->ops->num_drv;
mach_params->dai_drivers = desc->ops->drv;
}
void hda_machine_select(struct snd_sof_dev *sdev)
......
......@@ -762,7 +762,7 @@ extern const struct sof_intel_dsp_desc adls_chip_info;
/* machine driver select */
void hda_machine_select(struct snd_sof_dev *sdev);
void hda_set_mach_params(const struct snd_soc_acpi_mach *mach,
struct device *dev);
struct snd_sof_dev *sdev);
/* PCI driver selection and probe */
int hda_pci_intel_probe(struct pci_dev *pci, const struct pci_device_id *pci_id);
......
......@@ -20,16 +20,14 @@ static struct snd_soc_card sof_nocodec_card = {
};
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,
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))
int link_num, struct snd_soc_card *card)
{
struct snd_soc_dai_link_component *dlc;
int i;
if (!ops || !links || !card)
if (!drv || !links || !card)
return -EINVAL;
/* set up BE dai_links */
......@@ -55,16 +53,16 @@ static int sof_nocodec_bes_setup(struct device *dev,
links[i].id = i;
links[i].no_pcm = 1;
links[i].cpus->dai_name = ops->drv[i].name;
links[i].platforms->name = dev_name(dev);
links[i].cpus->dai_name = drv[i].name;
links[i].platforms->name = dev_name(dev->parent);
links[i].codecs->dai_name = "snd-soc-dummy-dai";
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;
if (ops->drv[i].capture.channels_min)
if (drv[i].capture.channels_min)
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;
......@@ -73,29 +71,34 @@ static int sof_nocodec_bes_setup(struct device *dev,
return 0;
}
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))
static int sof_nocodec_setup(struct device *dev,
u32 num_dai_drivers,
struct snd_soc_dai_driver *dai_drivers)
{
struct snd_soc_dai_link *links;
/* create dummy BE dai_links */
links = devm_kzalloc(dev, sizeof(struct snd_soc_dai_link) *
ops->num_drv, GFP_KERNEL);
links = devm_kzalloc(dev, sizeof(struct snd_soc_dai_link) * num_dai_drivers, GFP_KERNEL);
if (!links)
return -ENOMEM;
return sof_nocodec_bes_setup(dev, ops, links, ops->num_drv,
&sof_nocodec_card, pcm_dai_link_fixup);
return sof_nocodec_bes_setup(dev, dai_drivers, links, num_dai_drivers, &sof_nocodec_card);
}
EXPORT_SYMBOL(sof_nocodec_setup);
static int sof_nocodec_probe(struct platform_device *pdev)
{
struct snd_soc_card *card = &sof_nocodec_card;
struct snd_soc_acpi_mach *mach;
int ret;
card->dev = &pdev->dev;
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);
}
......
......@@ -497,12 +497,10 @@ snd_sof_machine_select(struct snd_sof_dev *sdev)
static inline void
snd_sof_set_mach_params(const struct snd_soc_acpi_mach *mach,
struct device *dev)
struct snd_sof_dev *sdev)
{
struct snd_sof_dev *sdev = dev_get_drvdata(dev);
if (sof_ops(sdev) && sof_ops(sdev)->set_mach_params)
sof_ops(sdev)->set_mach_params(mach, dev);
sof_ops(sdev)->set_mach_params(mach, sdev);
}
static inline const struct snd_sof_dsp_ops
......
......@@ -775,6 +775,7 @@ int sof_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_pa
return 0;
}
EXPORT_SYMBOL(sof_pcm_dai_link_fixup);
static int sof_pcm_probe(struct snd_soc_component *component)
{
......
......@@ -468,24 +468,24 @@ int sof_machine_check(struct snd_sof_dev *sdev)
struct snd_sof_pdata *sof_pdata = sdev->pdata;
const struct sof_dev_desc *desc = sof_pdata->desc;
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 */
snd_sof_machine_select(sdev);
if (sof_pdata->machine) {
snd_sof_set_mach_params(sof_pdata->machine, sdev->dev);
return 0;
/* find machine */
snd_sof_machine_select(sdev);
if (sof_pdata->machine) {
snd_sof_set_mach_params(sof_pdata->machine, sdev);
return 0;
}
if (!IS_ENABLED(CONFIG_SND_SOC_SOF_NOCODEC)) {
dev_err(sdev->dev, "error: no matching ASoC machine driver found - aborting probe\n");
return -ENODEV;
}
} else {
dev_warn(sdev->dev, "Force to use nocodec mode\n");
}
#if !IS_ENABLED(CONFIG_SND_SOC_SOF_NOCODEC)
dev_err(sdev->dev, "error: no matching ASoC machine driver found - aborting probe\n");
return -ENODEV;
#endif
#else
dev_warn(sdev->dev, "Force to use nocodec mode\n");
#endif
/* select nocodec mode */
dev_warn(sdev->dev, "Using nocodec machine driver\n");
mach = devm_kzalloc(sdev->dev, sizeof(*mach), GFP_KERNEL);
......@@ -495,12 +495,8 @@ int sof_machine_check(struct snd_sof_dev *sdev)
mach->drv_name = "sof-nocodec";
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;
snd_sof_set_mach_params(sof_pdata->machine, sdev->dev);
snd_sof_set_mach_params(sof_pdata->machine, sdev);
return 0;
}
......
......@@ -259,7 +259,7 @@ struct snd_sof_dsp_ops {
void *pdata); /* optional */
void (*machine_select)(struct snd_sof_dev *sdev); /* optional */
void (*set_mach_params)(const struct snd_soc_acpi_mach *mach,
struct device *dev); /* optional */
struct snd_sof_dev *sdev); /* optional */
/* DAI ops */
struct snd_soc_dai_driver *drv;
......
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