Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp8573263ybi; Tue, 23 Jul 2019 11:01:05 -0700 (PDT) X-Google-Smtp-Source: APXvYqw7Dg8CxKBZeZ9ZnNwh3w/8cg4U55FfqpKNkYl1pM56CVXchwuObMz0hZ0F++/Xr3E84K/5 X-Received: by 2002:a63:1f1f:: with SMTP id f31mr76677080pgf.353.1563904864981; Tue, 23 Jul 2019 11:01:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563904864; cv=none; d=google.com; s=arc-20160816; b=WjdHx2KtUoXDzSVzrQbH9gLpQa63HmXl0qxxWHimbdkwafjGE+0JyizZhwGIyOsYD1 oCwdlsTo4StN7+TJPQuNEBUoA+N+a5i04wEFHmAkkLwfkgfi+yc4/tWFDoORttkoxs6R B7jt3y6LWlPLjWA5dXU+ghH/CSRWqs64Dau3XTlyT2Wh5u0hUteDPYDlEJhmOm2p48Jz DTQD+lheopiFCTkXX3JCScxX/oYWCj/wyTGuQ+1WbP8fBJes+HqM8+Z2QhAVqhqHVVNR Kye+FqqTYJpabYAVLj8ZMNo7c1Y9F/lsDt62zyIGkdWJgPdIxW/ERE0DlWMoyI5ucRZ1 Egxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=ajWKYyUljk64Yc4Q/C/zBg+Cmi1Oya6NfWuJqcsW930=; b=ZcLP/4l2dpVfNqX9t7Nma1ZmSdqRjdc6eYArqRPOxBEd57iRqcp2FdO0y1asLWfdHv Fm4DnCKF/9oYvHq8AgbffTKBsY3uZ5WOXGaTx6X8epNK34MQ3KtYk7nj3bOFMOLaCqYp c6G0LrQhC0H9KkvJ+LUf8jwdEax2/1GV0fBmiia68R9ot9DO9mBxoHQP55/C7iDf6J3C 19A9iTNaoHv+LYxxqIhFgUsxEmgS8apk25PhH5t2Pc1qs6rPi+XGxYsEhwmG7IdANBQC eSGppzINshGSFmZ+WT0uWLZylOVSvafv/1IdRmXUVBjm7aeMABIlteSHzvzlF/Z+49S1 w7ig== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l186si14245827pgd.455.2019.07.23.11.00.48; Tue, 23 Jul 2019 11:01:04 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388657AbfGWIlT (ORCPT + 99 others); Tue, 23 Jul 2019 04:41:19 -0400 Received: from inva020.nxp.com ([92.121.34.13]:56064 "EHLO inva020.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727801AbfGWIlO (ORCPT ); Tue, 23 Jul 2019 04:41:14 -0400 Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id EE5801A00F9; Tue, 23 Jul 2019 10:41:11 +0200 (CEST) Received: from inva024.eu-rdc02.nxp.com (inva024.eu-rdc02.nxp.com [134.27.226.22]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id EA9401A0024; Tue, 23 Jul 2019 10:41:11 +0200 (CEST) Received: from fsr-ub1864-103.ea.freescale.net (fsr-ub1864-103.ea.freescale.net [10.171.82.17]) by inva024.eu-rdc02.nxp.com (Postfix) with ESMTP id E8753205DD; Tue, 23 Jul 2019 10:41:10 +0200 (CEST) From: Daniel Baluta To: m.felsch@pengutronix.de, shawnguo@kernel.org Cc: mark.rutland@arm.com, aisheng.dong@nxp.com, peng.fan@nxp.com, anson.huang@nxp.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-imx@nxp.com, shengjiu.wang@nxp.com, paul.olaru@nxp.com, robh+dt@kernel.org, kernel@pengutronix.de, leonard.crestez@nxp.com, festevam@gmail.com, linux-arm-kernel@lists.infradead.org, sound-open-firmware@alsa-project.org, Daniel Baluta Subject: [PATCH v2 3/5] ASoC: SOF: Add DT DSP device support Date: Tue, 23 Jul 2019 11:41:02 +0300 Message-Id: <20190723084104.12639-4-daniel.baluta@nxp.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190723084104.12639-1-daniel.baluta@nxp.com> References: <20190723084104.12639-1-daniel.baluta@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for device tree based SOF DSP devices. Signed-off-by: Daniel Baluta --- This is also on review with SOF community here: https://github.com/thesofproject/linux/pull/1048 sound/soc/sof/Kconfig | 9 +++ sound/soc/sof/Makefile | 3 + sound/soc/sof/imx/Kconfig | 1 + sound/soc/sof/sof-dt-dev.c | 159 +++++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 sound/soc/sof/sof-dt-dev.c diff --git a/sound/soc/sof/Kconfig b/sound/soc/sof/Kconfig index 61b97fc55bb2..2aa3a1cdf60c 100644 --- a/sound/soc/sof/Kconfig +++ b/sound/soc/sof/Kconfig @@ -36,6 +36,15 @@ config SND_SOC_SOF_ACPI Say Y if you need this option If unsure select "N". +config SND_SOC_SOF_DT + tristate "SOF DT enumeration support" + 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 6e43d411ffef..8025d9cec4fb 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-dt-objs := sof-dt-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) += sof-acpi-dev.o +obj-$(CONFIG_SND_SOC_SOF_DT) += sof-dt-dev.o obj-$(CONFIG_SND_SOC_SOF_PCI) += sof-pci-dev.o obj-$(CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL) += intel/ diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig index fff64a9970f0..fa35994a79c4 100644 --- a/sound/soc/sof/imx/Kconfig +++ b/sound/soc/sof/imx/Kconfig @@ -12,6 +12,7 @@ if SND_SOC_SOF_IMX_TOPLEVEL config SND_SOC_SOF_IMX8 tristate "SOF support for i.MX8" + select SND_SOC_SOF_DT help This adds support for Sound Open Firmware for NXP i.MX8 platforms Say Y if you have such a device. diff --git a/sound/soc/sof/sof-dt-dev.c b/sound/soc/sof/sof-dt-dev.c new file mode 100644 index 000000000000..31429bbb5c7e --- /dev/null +++ b/sound/soc/sof/sof-dt-dev.c @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) +// +// Copyright 2019 NXP +// +// Author: Daniel Baluta +// + +#include +#include +#include +#include + +#include "ops.h" + +extern struct snd_sof_dsp_ops sof_imx8_ops; + +static char *fw_path; +module_param(fw_path, charp, 0444); +MODULE_PARM_DESC(fw_path, "alternate path for SOF firmware."); + +static char *tplg_path; +module_param(tplg_path, charp, 0444); +MODULE_PARM_DESC(tplg_path, "alternate path for SOF topology."); + +/* platform specific devices */ +#if IS_ENABLED(CONFIG_SND_SOC_SOF_IMX8) +static struct sof_dev_desc sof_dt_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_dt_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_dt_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_dt_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); + + /* alternate fw and tplg filenames */ + if (fw_path) + sof_pdata->fw_filename_prefix = fw_path; + else + sof_pdata->fw_filename_prefix = + sof_pdata->desc->default_fw_path; + if (tplg_path) + sof_pdata->tplg_filename_prefix = tplg_path; + else + 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_dt_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_dt_probe_complete(dev); +#endif + + return ret; +} + +static int sof_dt_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_dt_ids[] = { +#if IS_ENABLED(CONFIG_SND_SOC_SOF_IMX8) + { .compatible = "fsl,imx8qxp-dsp", .data = &sof_dt_imx8qxp_desc}, +#endif + { } +}; +MODULE_DEVICE_TABLE(of, sof_dt_ids); + +/* DT driver definition */ +static struct platform_driver snd_sof_dt_driver = { + .probe = sof_dt_probe, + .remove = sof_dt_remove, + .driver = { + .name = "sof-audio-dt", + .pm = &sof_dt_pm, + .of_match_table = sof_dt_ids + }, +}; +module_platform_driver(snd_sof_dt_driver); + +MODULE_LICENSE("Dual BSD/GPL"); -- 2.17.1