From: Peter Ujfalusi <peter.ujfalusi@ti.com>
To: Petr Kulhavy <petr@barix.com>,
nsekhar@ti.com, khilman@kernel.org, lgirdwood@gmail.com,
broonie@kernel.org, devicetree@vger.kernel.org
Cc: mark.rutland@arm.com, alsa-devel@alsa-project.org,
pawel.moll@arm.com, ijc+devicetree@hellion.org.uk,
robh+dt@kernel.org, galak@codeaurora.org
Subject: Re: [PATCH v2 2/6] ASoC: Davinci: McBSP: add device tree support for McBSP
Date: Fri, 15 Apr 2016 12:32:06 +0300 [thread overview]
Message-ID: <5710B516.2000006@ti.com> (raw)
In-Reply-To: <1460375117-4311-3-git-send-email-petr@barix.com>
On 04/11/16 14:45, Petr Kulhavy wrote:
> This adds DT support for the TI DA8xx/OMAP-L1x/AM17xx/AM18xx McBSP driver.
>
> Signed-off-by: Petr Kulhavy <petr@barix.com>
> ---
> v1: initial
> v2: remove "-audio" postfix from the compatible string
> of_match_table renamed consistently with the rest of the file (davinci_i2s_match)
> "channel-combine" property removed
> devicetree DMA configuration in probe simplified
>
> sound/soc/davinci/Kconfig | 6 ++-
> sound/soc/davinci/davinci-i2s.c | 116 +++++++++++++++++++++++++++++++---------
> 2 files changed, 95 insertions(+), 27 deletions(-)
>
> diff --git a/sound/soc/davinci/Kconfig b/sound/soc/davinci/Kconfig
> index 50ca291cc225..6b732d8e5896 100644
> --- a/sound/soc/davinci/Kconfig
> +++ b/sound/soc/davinci/Kconfig
> @@ -16,7 +16,11 @@ config SND_EDMA_SOC
> - DRA7xx family
>
> config SND_DAVINCI_SOC_I2S
> - tristate
> + tristate "DaVinci Multichannel Buffered Serial Port (McBSP) support"
> + depends on SND_EDMA_SOC
> + help
> + Say Y or M here if you want to have support for McBSP IP found in
> + Texas Instruments DaVinci DA850 SoCs.
>
> config SND_DAVINCI_SOC_MCASP
> tristate "Multichannel Audio Serial Port (McASP) support"
> diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c
> index ec98548a5fc9..a3f82d1a73dc 100644
> --- a/sound/soc/davinci/davinci-i2s.c
> +++ b/sound/soc/davinci/davinci-i2s.c
> @@ -4,9 +4,15 @@
> * Author: Vladimir Barinov, <vbarinov@embeddedalley.com>
> * Copyright: (C) 2007 MontaVista Software, Inc., <source@mvista.com>
> *
> + * DT support (c) 2016 Petr Kulhavy, Barix AG <petr@barix.com>
> + * based on davinci-mcasp.c DT support
> + *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License version 2 as
> * published by the Free Software Foundation.
> + *
> + * TODO:
> + * on DA850 implement HW FIFOs instead of DMA into DXR and DRR registers
> */
>
> #include <linux/init.h>
> @@ -648,15 +654,62 @@ static const struct snd_soc_component_driver davinci_i2s_component = {
> .name = "davinci-i2s",
> };
>
> +static struct snd_platform_data*
> +davinci_i2s_set_pdata_from_of(struct platform_device *pdev)
It is a bit misleading function name, would be better to name it as
davinci_i2s_get_pdata()
as it will fetch the legacy pdata or craft one when booting with DT.
> +{
> + struct snd_platform_data *pdata = NULL;
> + struct device_node *np;
> +
> + if (!IS_ENABLED(CONFIG_OF) || !pdev->dev.of_node)
> + return dev_get_platdata(&pdev->dev);
> +
> + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
> + if (!pdata)
> + return ERR_PTR(-ENOMEM);
> +
> + np = pdev->dev.of_node;
???
> +
> + /* parse properties here */
> +
> + /*
> + * pdata->clk_input_pin is deliberately not exported to DT
> + * and the default value of the clk_input_pin is MCBSP_CLKR.
> + * The value MCBSP_CLKS makes no sense as it turns the CPU
> + * to a bit clock master in the SND_SOC_DAIFMT_CBM_CFS mode
> + * where it should be bit clock slave!
> + */
> +
> + return pdata;
> +}
> +
> static int davinci_i2s_probe(struct platform_device *pdev)
> {
> + struct snd_dmaengine_dai_dma_data *dma_data;
> + struct snd_platform_data *pdata;
> struct davinci_mcbsp_dev *dev;
> struct resource *mem, *res;
> void __iomem *io_base;
> int *dma;
> int ret;
>
> - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + pdata = davinci_i2s_set_pdata_from_of(pdev);
> + if (IS_ERR(pdata)) {
> + dev_err(&pdev->dev, "Error populating platform data, err %ld\n",
> + PTR_ERR(pdata));
> + return PTR_ERR(pdata);
> + }
The current driver does not use the pdata as far as I can see. Kind of
strange. So now in DT boot you will allocate memory for the pdata, which is
not used by the driver at all.
I think we should implement the pdata handling in the driver first for the
legacy mode, then probably having pdata allocated for DT case might make sense.
> +
> + mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
> + if (!mem) {
> + dev_warn(&pdev->dev,
> + "\"mpu\" mem resource not found, using index 0\n");
> + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!mem) {
> + dev_err(&pdev->dev, "no mem resource?\n");
> + return -ENODEV;
> + }
> + }
> +
> io_base = devm_ioremap_resource(&pdev->dev, mem);
> if (IS_ERR(io_base))
> return PTR_ERR(io_base);
> @@ -666,39 +719,43 @@ static int davinci_i2s_probe(struct platform_device *pdev)
> if (!dev)
> return -ENOMEM;
>
> - dev->clk = clk_get(&pdev->dev, NULL);
> - if (IS_ERR(dev->clk))
> - return -ENODEV;
> - clk_enable(dev->clk);
> -
> dev->base = io_base;
>
> - dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr =
> - (dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG);
> -
> - dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr =
> - (dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG);
> + /* setup DMA, first TX, then RX */
> + dma_data = &dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
> + dma_data->addr = (dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG);
>
> - /* first TX, then RX */
> res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
> - if (!res) {
> - dev_err(&pdev->dev, "no DMA resource\n");
> - ret = -ENXIO;
> - goto err_release_clk;
> + if (res) {
> + dma = &dev->dma_request[SNDRV_PCM_STREAM_PLAYBACK];
> + *dma = res->start;
> + dma_data->filter_data = dma;
> + } else if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) {
> + dma_data->filter_data = "tx";
> + } else {
> + dev_err(&pdev->dev, "Missing DMA tx resource\n");
> + return -ENODEV;
> }
> - dma = &dev->dma_request[SNDRV_PCM_STREAM_PLAYBACK];
> - *dma = res->start;
> - dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = dma;
> +
> + dma_data = &dev->dma_data[SNDRV_PCM_STREAM_CAPTURE];
> + dma_data->addr = (dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG);
>
> res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
> - if (!res) {
> - dev_err(&pdev->dev, "no DMA resource\n");
> - ret = -ENXIO;
> - goto err_release_clk;
> + if (res) {
> + dma = &dev->dma_request[SNDRV_PCM_STREAM_CAPTURE];
> + *dma = res->start;
> + dma_data->filter_data = dma;
> + } else if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) {
> + dma_data->filter_data = "rx";
> + } else {
> + dev_err(&pdev->dev, "Missing DMA rx resource\n");
> + return -ENODEV;
> }
> - dma = &dev->dma_request[SNDRV_PCM_STREAM_CAPTURE];
> - *dma = res->start;
> - dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = dma;
> +
> + dev->clk = clk_get(&pdev->dev, NULL);
> + if (IS_ERR(dev->clk))
> + return -ENODEV;
> + clk_enable(dev->clk);
>
> dev->dev = &pdev->dev;
> dev_set_drvdata(&pdev->dev, dev);
> @@ -737,11 +794,18 @@ static int davinci_i2s_remove(struct platform_device *pdev)
> return 0;
> }
>
> +static const struct of_device_id davinci_i2s_match[] = {
> + { .compatible = "ti,da850-mcbsp" },
> + {},
> +};
> +MODULE_DEVICE_TABLE(of, davinci_i2s_match);
> +
> static struct platform_driver davinci_mcbsp_driver = {
> .probe = davinci_i2s_probe,
> .remove = davinci_i2s_remove,
> .driver = {
> .name = "davinci-mcbsp",
> + .of_match_table = of_match_ptr(davinci_i2s_match),
> },
> };
The rest looks good to me.
--
Péter
next prev parent reply other threads:[~2016-04-15 9:32 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-11 11:45 [PATCH v2 0/6] ASoC: davinci-mcbsp: add binding for McBSP Petr Kulhavy
[not found] ` <1460375117-4311-1-git-send-email-petr-Qh/3xLP0EvwAvxtiuMwx3w@public.gmane.org>
2016-04-11 11:45 ` [PATCH v2 1/6] " Petr Kulhavy
[not found] ` <1460375117-4311-2-git-send-email-petr-Qh/3xLP0EvwAvxtiuMwx3w@public.gmane.org>
2016-04-13 14:30 ` Rob Herring
2016-04-15 8:48 ` Petr Kulhavy
2016-04-15 8:58 ` Sekhar Nori
[not found] ` <5710AACF.9070402-Qh/3xLP0EvwAvxtiuMwx3w@public.gmane.org>
2016-04-21 14:42 ` Rob Herring
2016-04-11 11:45 ` [PATCH v2 2/6] ASoC: Davinci: McBSP: add device tree support " Petr Kulhavy
2016-04-15 9:32 ` Peter Ujfalusi [this message]
[not found] ` <5710B516.2000006-l0cyMroinI0@public.gmane.org>
2016-04-18 9:27 ` [alsa-devel] " Petr Kulhavy
2016-04-18 10:18 ` Peter Ujfalusi
2016-04-18 10:24 ` Petr Kulhavy
2016-04-18 10:35 ` Peter Ujfalusi
2016-04-11 11:45 ` [PATCH v2 3/6] ARM: davinci: da850: add clocks for mcbsp0 and 1 Petr Kulhavy
2016-04-11 11:45 ` [PATCH v2 4/6] ARM: davinci: da8xx-dt: add OF_DEV_AUXDATA entries for mcbsp0 and mcbsp1 Petr Kulhavy
2016-04-11 11:45 ` [PATCH v2 5/6] ARM: DTS: da850: Fix wrong number of interrupts Petr Kulhavy
2016-04-11 11:45 ` [PATCH v2 6/6] ARM: DTS: da850: Add McBSP0 and McBSP1 Petr Kulhavy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5710B516.2000006@ti.com \
--to=peter.ujfalusi@ti.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=galak@codeaurora.org \
--cc=ijc+devicetree@hellion.org.uk \
--cc=khilman@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=mark.rutland@arm.com \
--cc=nsekhar@ti.com \
--cc=pawel.moll@arm.com \
--cc=petr@barix.com \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.