[1/3] ASoC: SOF: Add OF DSP device support
diff mbox series

Message ID 20190815154500.29090-2-pierre-louis.bossart@linux.intel.com
State New
Headers show
Series
  • ASoC: SOF: initial support for i.MX8
Related show

Commit Message

Pierre-Louis Bossart Aug. 15, 2019, 3:44 p.m. UTC
From: Daniel Baluta <daniel.baluta@nxp.com>

Add support for device tree based SOF DSP devices.

Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
---
 sound/soc/sof/Kconfig      |  10 +++
 sound/soc/sof/Makefile     |   3 +
 sound/soc/sof/sof-of-dev.c | 143 +++++++++++++++++++++++++++++++++++++
 3 files changed, 156 insertions(+)
 create mode 100644 sound/soc/sof/sof-of-dev.c

Comments

Mark Brown Aug. 15, 2019, 4:49 p.m. UTC | #1
On Thu, Aug 15, 2019 at 10:44:58AM -0500, Pierre-Louis Bossart wrote:
> From: Daniel Baluta <daniel.baluta@nxp.com>
> 
> Add support for device tree based SOF DSP devices.

I'm not seeing any binding documentation here.  Binding documentation is
required for any new device tree bindings supported in code.
Daniel Baluta Aug. 16, 2019, 8:43 a.m. UTC | #2
Hi Mark,

On Thu, Aug 15, 2019 at 7:50 PM Mark Brown <broonie@kernel.org> wrote:
>
> On Thu, Aug 15, 2019 at 10:44:58AM -0500, Pierre-Louis Bossart wrote:
> > From: Daniel Baluta <daniel.baluta@nxp.com>
> >
> > Add support for device tree based SOF DSP devices.
>
> I'm not seeing any binding documentation here.  Binding documentation is
> required for any new device tree bindings supported in code.

Binding documentation together with the actual dts nodes were sent
to Shawn.

https://lkml.org/lkml/2019/8/7/682

Shawn,

Can you pick 4/5 and 5/5 patches from series above? 1-3 are sent to
Mark to go through to alsa tree.

thanks,
Daniel.
Shawn Guo Aug. 19, 2019, 1:46 p.m. UTC | #3
On Fri, Aug 16, 2019 at 11:43:13AM +0300, Daniel Baluta wrote:
> Hi Mark,
> 
> On Thu, Aug 15, 2019 at 7:50 PM Mark Brown <broonie@kernel.org> wrote:
> >
> > On Thu, Aug 15, 2019 at 10:44:58AM -0500, Pierre-Louis Bossart wrote:
> > > From: Daniel Baluta <daniel.baluta@nxp.com>
> > >
> > > Add support for device tree based SOF DSP devices.
> >
> > I'm not seeing any binding documentation here.  Binding documentation is
> > required for any new device tree bindings supported in code.
> 
> Binding documentation together with the actual dts nodes were sent
> to Shawn.
> 
> https://lkml.org/lkml/2019/8/7/682
> 
> Shawn,
> 
> Can you pick 4/5 and 5/5 patches from series above? 1-3 are sent to
> Mark to go through to alsa tree.

I just picked up DTS patch (4/5), but DT bindings should generally go
through driver/subsystem tree as preference.

Shawn
Mark Brown Aug. 19, 2019, 7:24 p.m. UTC | #4
On Mon, Aug 19, 2019 at 03:46:17PM +0200, Shawn Guo wrote:
> On Fri, Aug 16, 2019 at 11:43:13AM +0300, Daniel Baluta wrote:

> > Binding documentation together with the actual dts nodes were sent
> > to Shawn.

> > https://lkml.org/lkml/2019/8/7/682

> > Can you pick 4/5 and 5/5 patches from series above? 1-3 are sent to
> > Mark to go through to alsa tree.

> I just picked up DTS patch (4/5), but DT bindings should generally go
> through driver/subsystem tree as preference.

Right, especially so we get domain experts looking at things before they
are merged.
Daniel Baluta Aug. 19, 2019, 7:32 p.m. UTC | #5
On Mon, Aug 19, 2019 at 10:24 PM Mark Brown <broonie@kernel.org> wrote:
>
> On Mon, Aug 19, 2019 at 03:46:17PM +0200, Shawn Guo wrote:
> > On Fri, Aug 16, 2019 at 11:43:13AM +0300, Daniel Baluta wrote:
>
> > > Binding documentation together with the actual dts nodes were sent
> > > to Shawn.
>
> > > https://lkml.org/lkml/2019/8/7/682
>
> > > Can you pick 4/5 and 5/5 patches from series above? 1-3 are sent to
> > > Mark to go through to alsa tree.
>
> > I just picked up DTS patch (4/5), but DT bindings should generally go
> > through driver/subsystem tree as preference.
>
> Right, especially so we get domain experts looking at things before they
> are merged.

Mark/Shawn,

So the binding documentation should go through Mark tree right? We
will update the
patchseries and Pierre will sent v2, if I understood it correctly.

Daniel.
Mark Brown Aug. 19, 2019, 8:23 p.m. UTC | #6
On Mon, Aug 19, 2019 at 10:32:58PM +0300, Daniel Baluta wrote:
> On Mon, Aug 19, 2019 at 10:24 PM Mark Brown <broonie@kernel.org> wrote:

> > Right, especially so we get domain experts looking at things before they
> > are merged.

> So the binding documentation should go through Mark tree right? We
> will update the
> patchseries and Pierre will sent v2, if I understood it correctly.

Yes, please!

Patch
diff mbox series

diff --git a/sound/soc/sof/Kconfig b/sound/soc/sof/Kconfig
index fb01f0ca6027..01acb580b817 100644
--- a/sound/soc/sof/Kconfig
+++ b/sound/soc/sof/Kconfig
@@ -36,6 +36,16 @@  config SND_SOC_SOF_ACPI
 	  Say Y if you need this option
 	  If unsure select "N".
 
+config SND_SOC_SOF_OF
+	tristate "SOF OF enumeration support"
+	depends on OF || COMPILE_TEST
+	select SND_SOC_SOF
+	select SND_SOC_SOF_OPTIONS
+	help
+	  This adds support for Device Tree enumeration. This option is
+	  required to enable i.MX8 devices.
+	  Say Y if you need this option. If unsure select "N".
+
 config SND_SOC_SOF_OPTIONS
 	tristate
 	help
diff --git a/sound/soc/sof/Makefile b/sound/soc/sof/Makefile
index 585fb6917489..772c452d1ae2 100644
--- a/sound/soc/sof/Makefile
+++ b/sound/soc/sof/Makefile
@@ -5,6 +5,8 @@  snd-sof-objs := core.o ops.o loader.o ipc.o pcm.o pm.o debug.o topology.o\
 
 snd-sof-pci-objs := sof-pci-dev.o
 snd-sof-acpi-objs := sof-acpi-dev.o
+snd-sof-of-objs := sof-of-dev.o
+
 snd-sof-nocodec-objs := nocodec.o
 
 obj-$(CONFIG_SND_SOC_SOF) += snd-sof.o
@@ -12,6 +14,7 @@  obj-$(CONFIG_SND_SOC_SOF_NOCODEC) += snd-sof-nocodec.o
 
 
 obj-$(CONFIG_SND_SOC_SOF_ACPI) += snd-sof-acpi.o
+obj-$(CONFIG_SND_SOC_SOF_OF) += snd-sof-of.o
 obj-$(CONFIG_SND_SOC_SOF_PCI) += snd-sof-pci.o
 
 obj-$(CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL) += intel/
diff --git a/sound/soc/sof/sof-of-dev.c b/sound/soc/sof/sof-of-dev.c
new file mode 100644
index 000000000000..28a9692974e5
--- /dev/null
+++ b/sound/soc/sof/sof-of-dev.c
@@ -0,0 +1,143 @@ 
+// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
+//
+// Copyright 2019 NXP
+//
+// Author: Daniel Baluta <daniel.baluta@nxp.com>
+//
+
+#include <linux/firmware.h>
+#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <sound/sof.h>
+
+#include "ops.h"
+
+extern struct snd_sof_dsp_ops sof_imx8_ops;
+
+/* platform specific devices */
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_IMX8)
+static struct sof_dev_desc sof_of_imx8qxp_desc = {
+	.default_fw_path = "imx/sof",
+	.default_tplg_path = "imx/sof-tplg",
+	.nocodec_fw_filename = "sof-imx8.ri",
+	.nocodec_tplg_filename = "sof-imx8-nocodec.tplg",
+	.ops = &sof_imx8_ops,
+};
+#endif
+
+static const struct dev_pm_ops sof_of_pm = {
+	SET_SYSTEM_SLEEP_PM_OPS(snd_sof_suspend, snd_sof_resume)
+	SET_RUNTIME_PM_OPS(snd_sof_runtime_suspend, snd_sof_runtime_resume,
+			   NULL)
+};
+
+static void sof_of_probe_complete(struct device *dev)
+{
+	/* allow runtime_pm */
+	pm_runtime_set_autosuspend_delay(dev, SND_SOF_SUSPEND_DELAY_MS);
+	pm_runtime_use_autosuspend(dev);
+	pm_runtime_enable(dev);
+}
+
+static int sof_of_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	const struct sof_dev_desc *desc;
+	/*TODO: create a generic snd_soc_xxx_mach */
+	struct snd_soc_acpi_mach *mach;
+	struct snd_sof_pdata *sof_pdata;
+	const struct snd_sof_dsp_ops *ops;
+	int ret;
+
+	dev_info(&pdev->dev, "DT DSP detected");
+
+	sof_pdata = devm_kzalloc(dev, sizeof(*sof_pdata), GFP_KERNEL);
+	if (!sof_pdata)
+		return -ENOMEM;
+
+	desc = device_get_match_data(dev);
+	if (!desc)
+		return -ENODEV;
+
+	/* get ops for platform */
+	ops = desc->ops;
+	if (!ops) {
+		dev_err(dev, "error: no matching DT descriptor ops\n");
+		return -ENODEV;
+	}
+
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_FORCE_NOCODEC_MODE)
+	/* force nocodec mode */
+	dev_warn(dev, "Force to use nocodec mode\n");
+	mach = devm_kzalloc(dev, sizeof(*mach), GFP_KERNEL);
+	if (!mach)
+		return -ENOMEM;
+	ret = sof_nocodec_setup(dev, sof_pdata, mach, desc, ops);
+	if (ret < 0)
+		return ret;
+#else
+	/* TODO: implement case where we actually have a codec */
+	return -ENODEV;
+#endif
+
+	if (mach)
+		mach->mach_params.platform = dev_name(dev);
+
+	sof_pdata->machine = mach;
+	sof_pdata->desc = desc;
+	sof_pdata->dev = &pdev->dev;
+	sof_pdata->platform = dev_name(dev);
+
+	/* TODO: read alternate fw and tplg filenames from DT */
+	sof_pdata->fw_filename_prefix = sof_pdata->desc->default_fw_path;
+	sof_pdata->tplg_filename_prefix = sof_pdata->desc->default_tplg_path;
+
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)
+	/* set callback to enable runtime_pm */
+	sof_pdata->sof_probe_complete = sof_of_probe_complete;
+#endif
+	 /* call sof helper for DSP hardware probe */
+	ret = snd_sof_device_probe(dev, sof_pdata);
+	if (ret) {
+		dev_err(dev, "error: failed to probe DSP hardware\n");
+		return ret;
+	}
+
+#if !IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)
+	sof_of_probe_complete(dev);
+#endif
+
+	return ret;
+}
+
+static int sof_of_remove(struct platform_device *pdev)
+{
+	pm_runtime_disable(&pdev->dev);
+
+	/* call sof helper for DSP hardware remove */
+	snd_sof_device_remove(&pdev->dev);
+
+	return 0;
+}
+
+static const struct of_device_id sof_of_ids[] = {
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_IMX8)
+	{ .compatible = "fsl,imx8qxp-dsp", .data = &sof_of_imx8qxp_desc},
+#endif
+	{ }
+};
+MODULE_DEVICE_TABLE(of, sof_of_ids);
+
+/* DT driver definition */
+static struct platform_driver snd_sof_of_driver = {
+	.probe = sof_of_probe,
+	.remove = sof_of_remove,
+	.driver = {
+		.name = "sof-audio-of",
+		.pm = &sof_of_pm,
+		.of_match_table = sof_of_ids,
+	},
+};
+module_platform_driver(snd_sof_of_driver);
+
+MODULE_LICENSE("Dual BSD/GPL");