2012-10-04 10:15:20

by Matt Porter

[permalink] [raw]
Subject: [PATCH 0/2] Convert davinci ASoC to genalloc SRAM

This series converts davinci ASoC to use genalloc and enables
that support on DA850. It applies on top of the uio_pruss/genalloc
series [1] which allows DaVinci to provide a gen_pool via pdata
for driver use.

I've tested this on the AM180x EVM. Note that prior to this,
the SRAM paths in the driver were completely unused. I've only
enabled ping-pong buffering on the platform I can test as it's
best to allow those with DM644x and similar platforms to set the
playback/capture sram size to something that's known to work
for them.

[1] http://www.spinics.net/lists/arm-kernel/msg198854.html

Matt Porter (2):
ASoC: davinci: replace private sram api with genalloc
ARM: davinci: enable SRAM ping ping buffering on DA850

arch/arm/mach-davinci/board-da850-evm.c | 24 ++++++++++++++----------
include/linux/platform_data/davinci_asp.h | 3 +++
sound/soc/davinci/davinci-mcasp.c | 2 ++
sound/soc/davinci/davinci-pcm.c | 18 ++++++++++++------
sound/soc/davinci/davinci-pcm.h | 2 ++
5 files changed, 33 insertions(+), 16 deletions(-)

--
1.7.9.5


2012-10-04 10:15:24

by Matt Porter

[permalink] [raw]
Subject: [PATCH 2/2] ARM: davinci: enable SRAM ping ping buffering on DA850

Passes the DA850 shared SRAM gen_pool to the McASP driver
and enables the ping-pong buffer DMA support.

Signed-off-by: Matt Porter <[email protected]>
---
arch/arm/mach-davinci/board-da850-evm.c | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
index acc6e84..c14ca9d 100644
--- a/arch/arm/mach-davinci/board-da850-evm.c
+++ b/arch/arm/mach-davinci/board-da850-evm.c
@@ -750,16 +750,19 @@ static u8 da850_iis_serializer_direction[] = {
};

static struct snd_platform_data da850_evm_snd_data = {
- .tx_dma_offset = 0x2000,
- .rx_dma_offset = 0x2000,
- .op_mode = DAVINCI_MCASP_IIS_MODE,
- .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
- .tdm_slots = 2,
- .serial_dir = da850_iis_serializer_direction,
- .asp_chan_q = EVENTQ_0,
- .version = MCASP_VERSION_2,
- .txnumevt = 1,
- .rxnumevt = 1,
+ .tx_dma_offset = 0x2000,
+ .rx_dma_offset = 0x2000,
+ .op_mode = DAVINCI_MCASP_IIS_MODE,
+ .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
+ .tdm_slots = 2,
+ .serial_dir = da850_iis_serializer_direction,
+ .asp_chan_q = EVENTQ_0,
+ .ram_chan_q = EVENTQ_1,
+ .version = MCASP_VERSION_2,
+ .txnumevt = 1,
+ .rxnumevt = 1,
+ .sram_size_playback = SZ_8K,
+ .sram_size_capture = SZ_8K,
};

static const short da850_evm_mcasp_pins[] __initconst = {
@@ -1338,6 +1341,7 @@ static __init void da850_evm_init(void)
pr_warning("da850_evm_init: mcasp mux setup failed: %d\n",
ret);

+ da850_evm_snd_data.sram_pool = sram_get_gen_pool();
da8xx_register_mcasp(0, &da850_evm_snd_data);

ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
--
1.7.9.5

2012-10-04 10:15:26

by Matt Porter

[permalink] [raw]
Subject: [PATCH 1/2] ASoC: davinci: replace private sram api with genalloc

Removes the DaVinci private SRAM API and replaces it with
the genalloc API. The SRAM gen_pool is passed in pdata since
DaVinci is in the early stages of DT conversion.

Signed-off-by: Matt Porter <[email protected]>
---
include/linux/platform_data/davinci_asp.h | 3 +++
sound/soc/davinci/davinci-mcasp.c | 2 ++
sound/soc/davinci/davinci-pcm.c | 18 ++++++++++++------
sound/soc/davinci/davinci-pcm.h | 2 ++
4 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/include/linux/platform_data/davinci_asp.h b/include/linux/platform_data/davinci_asp.h
index d0c5825..f3d6e4f 100644
--- a/include/linux/platform_data/davinci_asp.h
+++ b/include/linux/platform_data/davinci_asp.h
@@ -16,6 +16,8 @@
#ifndef __DAVINCI_ASP_H
#define __DAVINCI_ASP_H

+#include <linux/genalloc.h>
+
struct snd_platform_data {
u32 tx_dma_offset;
u32 rx_dma_offset;
@@ -30,6 +32,7 @@ struct snd_platform_data {
unsigned enable_channel_combine:1;
unsigned sram_size_playback;
unsigned sram_size_capture;
+ struct gen_pool *sram_pool;

/*
* If McBSP peripheral gets the clock from an external pin,
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index 714e51e..52194bb 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -1098,6 +1098,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
dma_data->asp_chan_q = pdata->asp_chan_q;
dma_data->ram_chan_q = pdata->ram_chan_q;
+ dma_data->sram_pool = pdata->sram_pool;
dma_data->sram_size = pdata->sram_size_playback;
dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset +
mem->start);
@@ -1115,6 +1116,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
dma_data->asp_chan_q = pdata->asp_chan_q;
dma_data->ram_chan_q = pdata->ram_chan_q;
+ dma_data->sram_pool = pdata->sram_pool;
dma_data->sram_size = pdata->sram_size_capture;
dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset +
mem->start);
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c
index 93ea3bf..d2cc169 100644
--- a/sound/soc/davinci/davinci-pcm.c
+++ b/sound/soc/davinci/davinci-pcm.c
@@ -16,6 +16,7 @@
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/kernel.h>
+#include <linux/genalloc.h>

#include <sound/core.h>
#include <sound/pcm.h>
@@ -23,7 +24,6 @@
#include <sound/soc.h>

#include <asm/dma.h>
-#include <mach/sram.h>

#include "davinci-pcm.h"

@@ -259,7 +259,8 @@ static void davinci_pcm_dma_irq(unsigned link, u16 ch_status, void *data)
}
}

-static int allocate_sram(struct snd_pcm_substream *substream, unsigned size,
+static int allocate_sram(struct snd_pcm_substream *substream,
+ struct gen_pool *sram_pool, unsigned size,
struct snd_pcm_hardware *ppcm)
{
struct snd_dma_buffer *buf = &substream->dma_buffer;
@@ -271,9 +272,10 @@ static int allocate_sram(struct snd_pcm_substream *substream, unsigned size,
return 0;

ppcm->period_bytes_max = size;
- iram_virt = sram_alloc(size, &iram_phys);
+ iram_virt = (void *)gen_pool_alloc(sram_pool, size);
if (!iram_virt)
goto exit1;
+ iram_phys = gen_pool_virt_to_phys(sram_pool, (unsigned)iram_virt);
iram_dma = kzalloc(sizeof(*iram_dma), GFP_KERNEL);
if (!iram_dma)
goto exit2;
@@ -285,7 +287,7 @@ static int allocate_sram(struct snd_pcm_substream *substream, unsigned size,
return 0;
exit2:
if (iram_virt)
- sram_free(iram_virt, size);
+ gen_pool_free(sram_pool, (unsigned)iram_virt, size);
exit1:
return -ENOMEM;
}
@@ -676,7 +678,7 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream)

ppcm = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
&pcm_hardware_playback : &pcm_hardware_capture;
- allocate_sram(substream, params->sram_size, ppcm);
+ allocate_sram(substream, params->sram_pool, params->sram_size, ppcm);
snd_soc_set_runtime_hwparams(substream, ppcm);
/* ensure that buffer size is a multiple of period size */
ret = snd_pcm_hw_constraint_integer(runtime,
@@ -819,7 +821,11 @@ static void davinci_pcm_free(struct snd_pcm *pcm)
buf->area = NULL;
iram_dma = buf->private_data;
if (iram_dma) {
- sram_free(iram_dma->area, iram_dma->bytes);
+ struct davinci_runtime_data *prtd =
+ substream->runtime->private_data;
+ struct gen_pool *sram_pool = prtd->params->sram_pool;
+ gen_pool_free(sram_pool, (unsigned)iram_dma->area,
+ iram_dma->bytes);
kfree(iram_dma);
}
}
diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h
index fc4d01c..b6ef703 100644
--- a/sound/soc/davinci/davinci-pcm.h
+++ b/sound/soc/davinci/davinci-pcm.h
@@ -12,6 +12,7 @@
#ifndef _DAVINCI_PCM_H
#define _DAVINCI_PCM_H

+#include <linux/genalloc.h>
#include <linux/platform_data/davinci_asp.h>
#include <mach/edma.h>

@@ -20,6 +21,7 @@ struct davinci_pcm_dma_params {
unsigned short acnt;
dma_addr_t dma_addr; /* device physical address for DMA */
unsigned sram_size;
+ struct gen_pool *sram_pool; /* SRAM gen_pool for ping pong */
enum dma_event_q asp_chan_q; /* event queue number for ASP channel */
enum dma_event_q ram_chan_q; /* event queue number for RAM channel */
unsigned char data_type; /* xfer data type */
--
1.7.9.5

2012-10-05 21:34:24

by Matt Porter

[permalink] [raw]
Subject: Re: [PATCH 0/2] Convert davinci ASoC to genalloc SRAM

On Thu, Oct 04, 2012 at 06:15:43AM -0400, Matt Porter wrote:
> This series converts davinci ASoC to use genalloc and enables
> that support on DA850. It applies on top of the uio_pruss/genalloc
> series [1] which allows DaVinci to provide a gen_pool via pdata
> for driver use.
>
> I've tested this on the AM180x EVM. Note that prior to this,
> the SRAM paths in the driver were completely unused. I've only
> enabled ping-pong buffering on the platform I can test as it's
> best to allow those with DM644x and similar platforms to set the
> playback/capture sram size to something that's known to work
> for them.
>
> [1] http://www.spinics.net/lists/arm-kernel/msg198854.html

Tested again on top of v4 of the uio_pruss/genalloc series
http://www.spinics.net/lists/arm-kernel/msg199255.html
on next-20121005 since there's some conflicts falling out of
of arm-soc and asoc/sound header move patches on mainline
atm.

-Matt

2012-10-10 06:54:31

by Kumar, Anil

[permalink] [raw]
Subject: RE: [PATCH 0/2] Convert davinci ASoC to genalloc SRAM

On Thu, Oct 04, 2012 at 15:45:43, Porter, Matt wrote:
> This series converts davinci ASoC to use genalloc and enables
> that support on DA850. It applies on top of the uio_pruss/genalloc
> series [1] which allows DaVinci to provide a gen_pool via pdata
> for driver use.
>
> I've tested this on the AM180x EVM. Note that prior to this,
> the SRAM paths in the driver were completely unused. I've only
> enabled ping-pong buffering on the platform I can test as it's
> best to allow those with DM644x and similar platforms to set the
> playback/capture sram size to something that's known to work
> for them.
>
> [1] http://www.spinics.net/lists/arm-kernel/msg198854.html

Tested on DA850 EVM after applying patches from [1] above.
Tested on Linux-torvalds 3.6-rc6 master branch.
Tested ASoC module (aplay & arecord for various frequencies)

Acked-by: Kumar, Anil <[email protected]>

> Matt Porter (2):
> ASoC: davinci: replace private sram api with genalloc
> ARM: davinci: enable SRAM ping ping buffering on DA850
>
> arch/arm/mach-davinci/board-da850-evm.c | 24 ++++++++++++++----------
> include/linux/platform_data/davinci_asp.h | 3 +++
> sound/soc/davinci/davinci-mcasp.c | 2 ++
> sound/soc/davinci/davinci-pcm.c | 18 ++++++++++++------
> sound/soc/davinci/davinci-pcm.h | 2 ++
> 5 files changed, 33 insertions(+), 16 deletions(-)
>
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
>
>

2012-10-10 07:04:58

by Daniel Mack

[permalink] [raw]
Subject: Re: [PATCH 0/2] Convert davinci ASoC to genalloc SRAM

On 10.10.2012 08:54, Kumar, Anil wrote:
> On Thu, Oct 04, 2012 at 15:45:43, Porter, Matt wrote:
>> This series converts davinci ASoC to use genalloc and enables
>> that support on DA850. It applies on top of the uio_pruss/genalloc
>> series [1] which allows DaVinci to provide a gen_pool via pdata
>> for driver use.
>>
>> I've tested this on the AM180x EVM. Note that prior to this,
>> the SRAM paths in the driver were completely unused. I've only
>> enabled ping-pong buffering on the platform I can test as it's
>> best to allow those with DM644x and similar platforms to set the
>> playback/capture sram size to something that's known to work
>> for them.
>>
>> [1] http://www.spinics.net/lists/arm-kernel/msg198854.html
>
> Tested on DA850 EVM after applying patches from [1] above.
> Tested on Linux-torvalds 3.6-rc6 master branch.
> Tested ASoC module (aplay & arecord for various frequencies)
>
> Acked-by: Kumar, Anil <[email protected]>

As you're on it, could you also quickly merge this branch

git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
topic/davinci

And see if my recent patches for more McASP flexibility cause any
trouble on your hardware?


Daniel

2012-10-10 10:00:06

by Kumar, Anil

[permalink] [raw]
Subject: RE: [PATCH 0/2] Convert davinci ASoC to genalloc SRAM

On Wed, Oct 10, 2012 at 12:34:47, Daniel Mack wrote:
> On 10.10.2012 08:54, Kumar, Anil wrote:
> > On Thu, Oct 04, 2012 at 15:45:43, Porter, Matt wrote:
> >> This series converts davinci ASoC to use genalloc and enables
> >> that support on DA850. It applies on top of the uio_pruss/genalloc
> >> series [1] which allows DaVinci to provide a gen_pool via pdata
> >> for driver use.
> >>
> >> I've tested this on the AM180x EVM. Note that prior to this,
> >> the SRAM paths in the driver were completely unused. I've only
> >> enabled ping-pong buffering on the platform I can test as it's
> >> best to allow those with DM644x and similar platforms to set the
> >> playback/capture sram size to something that's known to work
> >> for them.
> >>
> >> [1] http://www.spinics.net/lists/arm-kernel/msg198854.html
> >
> > Tested on DA850 EVM after applying patches from [1] above.
> > Tested on Linux-torvalds 3.6-rc6 master branch.
> > Tested ASoC module (aplay & arecord for various frequencies)
> >
> > Acked-by: Kumar, Anil <[email protected]>
>
> As you're on it, could you also quickly merge this branch
>
> git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
> topic/davinci
>
> And see if my recent patches for more McASP flexibility cause any
> trouble on your hardware?
>
>
> Daniel
>
>

I have merged it with 3.6-rc6 and I have got error at compile time.
I have fixed this locally with the following patch [1].
Kindly confirm if the patch is correct?

With that
Tested on DA850 EVM
Tested on Linux-torvalds 3.6-rc6 master branch merged + [1]
Tested ASoC module (aplay & arecord for various frequencies)

Tested-By: Kumar, Anil <[email protected]>

[1]
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
topic/davinci.

[2] patch
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
index 09da4e5..9c02a45 100644
--- a/include/linux/dmaengine.h
+++ b/include/linux/dmaengine.h
@@ -591,7 +591,7 @@ struct dma_device {
struct dma_async_tx_descriptor *(*device_prep_dma_cyclic)(
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
size_t period_len, enum dma_transfer_direction direction,
- unsigned long flags, void *context);
+ void *context);
struct dma_async_tx_descriptor *(*device_prep_interleaved_dma)(
struct dma_chan *chan, struct dma_interleaved_template *xt,
unsigned long flags);
@@ -656,7 +656,7 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
size_t period_len, enum dma_transfer_direction dir)
{
return chan->device->device_prep_dma_cyclic(chan, buf_addr, buf_len,
- period_len, dir, flags, NULL);
+ period_len, dir, NULL);
}

2012-10-10 10:03:00

by Daniel Mack

[permalink] [raw]
Subject: Re: [PATCH 0/2] Convert davinci ASoC to genalloc SRAM

On 10.10.2012 11:59, Kumar, Anil wrote:
> On Wed, Oct 10, 2012 at 12:34:47, Daniel Mack wrote:
>> On 10.10.2012 08:54, Kumar, Anil wrote:
>>> On Thu, Oct 04, 2012 at 15:45:43, Porter, Matt wrote:
>>>> This series converts davinci ASoC to use genalloc and enables
>>>> that support on DA850. It applies on top of the uio_pruss/genalloc
>>>> series [1] which allows DaVinci to provide a gen_pool via pdata
>>>> for driver use.
>>>>
>>>> I've tested this on the AM180x EVM. Note that prior to this,
>>>> the SRAM paths in the driver were completely unused. I've only
>>>> enabled ping-pong buffering on the platform I can test as it's
>>>> best to allow those with DM644x and similar platforms to set the
>>>> playback/capture sram size to something that's known to work
>>>> for them.
>>>>
>>>> [1] http://www.spinics.net/lists/arm-kernel/msg198854.html
>>>
>>> Tested on DA850 EVM after applying patches from [1] above.
>>> Tested on Linux-torvalds 3.6-rc6 master branch.
>>> Tested ASoC module (aplay & arecord for various frequencies)
>>>
>>> Acked-by: Kumar, Anil <[email protected]>
>>
>> As you're on it, could you also quickly merge this branch
>>
>> git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
>> topic/davinci
>>
>> And see if my recent patches for more McASP flexibility cause any
>> trouble on your hardware?
>>
>>
>> Daniel
>>
>>
>
> I have merged it with 3.6-rc6 and I have got error at compile time.
> I have fixed this locally with the following patch [1].
> Kindly confirm if the patch is correct?

I did the same thing locally, but I considered this a merge conflict.

> With that
> Tested on DA850 EVM
> Tested on Linux-torvalds 3.6-rc6 master branch merged + [1]
> Tested ASoC module (aplay & arecord for various frequencies)
>
> Tested-By: Kumar, Anil <[email protected]>

Ok, that's good to hear. Thanks a lot :)


Daniel

> diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
> index 09da4e5..9c02a45 100644
> --- a/include/linux/dmaengine.h
> +++ b/include/linux/dmaengine.h
> @@ -591,7 +591,7 @@ struct dma_device {
> struct dma_async_tx_descriptor *(*device_prep_dma_cyclic)(
> struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
> size_t period_len, enum dma_transfer_direction direction,
> - unsigned long flags, void *context);
> + void *context);
> struct dma_async_tx_descriptor *(*device_prep_interleaved_dma)(
> struct dma_chan *chan, struct dma_interleaved_template *xt,
> unsigned long flags);
> @@ -656,7 +656,7 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
> size_t period_len, enum dma_transfer_direction dir)
> {
> return chan->device->device_prep_dma_cyclic(chan, buf_addr, buf_len,
> - period_len, dir, flags, NULL);
> + period_len, dir, NULL);
> }
>

2012-11-08 15:02:14

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH 2/2] ARM: davinci: enable SRAM ping ping buffering on DA850

On Thursday 04 October 2012, Matt Porter wrote:
> Passes the DA850 shared SRAM gen_pool to the McASP driver
> and enables the ping-pong buffer DMA support.
>
> Signed-off-by: Matt Porter <[email protected]>
> ---

It seems this is in linux-next now, but the patch it depends on
(ARM: davinci: add platform hook to fetch the SRAM pool) is not.

Arnd