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 2/6] ASoC: Davinci: McBSP: add device tree support for McBSP
Date: Thu, 7 Apr 2016 15:42:38 +0300 [thread overview]
Message-ID: <570655BE.7030109@ti.com> (raw)
In-Reply-To: <1459948893-4206-3-git-send-email-petr@barix.com>
On 04/06/16 16:21, 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>
> ---
> sound/soc/davinci/Kconfig | 6 ++-
> sound/soc/davinci/davinci-i2s.c | 106 ++++++++++++++++++++++++++++++++++------
> 2 files changed, 96 insertions(+), 16 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..2ebfe86dd584 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
The BFIFO looks identical to AFIFO for McASP...
> */
>
> #include <linux/init.h>
> @@ -648,15 +654,82 @@ 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)
> +{
> + struct snd_platform_data *pdata = NULL;
> + struct device_node *np;
> + struct of_phandle_args dma_spec;
> + int ret;
> +
> + 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;
> +
> + ret = of_property_match_string(np, "dma-names", "tx");
> + if (ret >= 0) {
> + ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
> + &dma_spec);
> + if (ret >= 0)
> + pdata->tx_dma_channel = dma_spec.args[0];
> + }
> +
> + ret = of_property_match_string(np, "dma-names", "rx");
> + if (ret >= 0) {
> + ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
> + &dma_spec);
> + if (ret >= 0)
> + pdata->rx_dma_channel = dma_spec.args[0];
> + }
Why would you do this? If we booted with DT the only thing needed by the
edma-pcm (dmaengine) is the name of the DMA channel...
> +
> + /* optional parameters */
> +
> + pdata->enable_channel_combine =
> + of_property_read_bool(np, "channel-combine");
This can only be done when the McBSP is used in DSP_x mode since this will
make the McBSP to transmit the stereo audio as mono on the bus.
After a quick look at the relevant parts in the driver, I think most of the
things are pretty much broken or at least they are not totally correct. McBSP
do support real I2S (SRGR:FWID), and the phase setup is wrong in the code. IMO.
I don't have HW to test the daVinci-MCBSP or the ASP so I can not comment on
how well things are working.
> +
> + /*
> + * 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!
> + */
Interesting. As a whole the clock selection part is mostly broken in the driver...
It would be better to add davinci_i2s_set_sysclk() to deal with the system
clock configuration.
> +
> + return pdata;
> +}
> +
> static int davinci_i2s_probe(struct platform_device *pdev)
> {
> + 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);
> + }
> +
> + 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);
> @@ -680,25 +753,21 @@ static int davinci_i2s_probe(struct platform_device *pdev)
> (dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_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;
> - }
> dma = &dev->dma_request[SNDRV_PCM_STREAM_PLAYBACK];
> - *dma = res->start;
> dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = dma;
> + res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
> + if (res)
> + *dma = res->start;
> + else
> + *dma = pdata->tx_dma_channel;
Please follow the way davinci-mcasp does it right now:
dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
...
dma = &mcasp->dma_request[SNDRV_PCM_STREAM_PLAYBACK];
res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
if (res)
*dma = res->start;
else
*dma = pdata->tx_dma_channel;
/* dmaengine filter data for DT and non-DT boot */
if (pdev->dev.of_node)
dma_data->filter_data = "tx";
else
dma_data->filter_data = dma;
while we are here, I think the tx/rx_dma_channel is something we should just
get rid of. It is not used as far as I can tell.
Something like this would do I think:
dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
...
res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
if (res) {
dma = &mcasp->dma_request[SNDRV_PCM_STREAM_PLAYBACK];
*dma = res->start;
dma_data->filter_data = dma;
} else if (pdev->dev.of_node) {
dma_data->filter_data = "tx";
} else {
dev_err(&pdev->dev, "Missing DMA tx resource\n");
return -ENODEV;
}
>
> - res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
> - if (!res) {
> - dev_err(&pdev->dev, "no DMA resource\n");
> - ret = -ENXIO;
> - goto err_release_clk;
> - }
> dma = &dev->dma_request[SNDRV_PCM_STREAM_CAPTURE];
> - *dma = res->start;
> dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = dma;
> + res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
> + if (res)
> + *dma = res->start;
> + else
> + *dma = pdata->rx_dma_channel;
same comment as for the TX dma part.
>
> dev->dev = &pdev->dev;
> dev_set_drvdata(&pdev->dev, dev);
> @@ -737,11 +806,18 @@ static int davinci_i2s_remove(struct platform_device *pdev)
> return 0;
> }
>
> +static const struct of_device_id davinci_mcbsp_match[] = {
> + { .compatible = "ti,da850-mcbsp-audio" },
I would drop the "-audio" for the binding...
> + {},
> +};
> +MODULE_DEVICE_TABLE(of, davinci_mcbsp_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_mcbsp_match),
The driver calls itself davinci-i2s.c and the prefixes internally used are
davinci_i2s_*.
The driver name is "davinci-mcbsp".
And it is basically a driver for daVinci ASP (the McBSP additions are not
configured at all).
I still think we should keep the davinci_i2s_* when adding new code, or rename
the whole driver and it's prefixes to something more sensible?
> },
> };
>
>
--
Péter
next prev parent reply other threads:[~2016-04-07 12:42 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-06 13:21 [PATCH 0/6] ASoC: davinci-mcbsp: add binding for McBSP Petr Kulhavy
[not found] ` <1459948893-4206-1-git-send-email-petr-Qh/3xLP0EvwAvxtiuMwx3w@public.gmane.org>
2016-04-06 13:21 ` [PATCH 1/6] " Petr Kulhavy
2016-04-07 13:33 ` Peter Ujfalusi
[not found] ` <570661A6.6020804-l0cyMroinI0@public.gmane.org>
2016-04-07 15:37 ` [alsa-devel] " Petr Kulhavy
2016-04-08 9:24 ` Petr Kulhavy
2016-04-11 8:11 ` Peter Ujfalusi
[not found] ` <570B5C26.9080402-l0cyMroinI0@public.gmane.org>
2016-04-11 8:20 ` [alsa-devel] " Petr Kulhavy
2016-04-06 13:21 ` [PATCH 2/6] ASoC: Davinci: McBSP: add device tree support " Petr Kulhavy
2016-04-07 12:42 ` Peter Ujfalusi [this message]
[not found] ` <570655BE.7030109-l0cyMroinI0@public.gmane.org>
2016-04-07 13:32 ` [alsa-devel] " Petr Kulhavy
2016-04-07 13:45 ` Peter Ujfalusi
2016-04-06 13:21 ` [PATCH 3/6] ARM: davinci: da850: add clocks for mcbsp0 and 1 Petr Kulhavy
2016-04-06 13:21 ` [PATCH 4/6] ARM: davinci: da8xx-dt: add OF_DEV_AUXDATA entries for mcbsp0 and mcbsp1 Petr Kulhavy
2016-04-06 13:21 ` [PATCH 5/6] ARM: DTS: da850: Fix wrong number of interrupts Petr Kulhavy
2016-04-06 13:21 ` [PATCH 6/6] ARM: DTS: da850: Add McBSP0 and McBSP1 Petr Kulhavy
2016-04-07 11:34 ` Peter Ujfalusi
[not found] ` <570645B4.6060606-l0cyMroinI0@public.gmane.org>
2016-04-07 12:16 ` [alsa-devel] " Petr Kulhavy
[not found] ` <57064F8B.3020501-Qh/3xLP0EvwAvxtiuMwx3w@public.gmane.org>
2016-04-07 12:45 ` Peter Ujfalusi
[not found] ` <5706567B.5000501-l0cyMroinI0@public.gmane.org>
2016-04-07 12:55 ` Petr Kulhavy
2016-04-07 13:04 ` Peter Ujfalusi
2016-04-07 13:05 ` [alsa-devel] " Sekhar Nori
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=570655BE.7030109@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.