[alsa-devel] [RFC 00/10] ASoC: Introduce dmaengine pcm helper functions

Shawn Guo shawn.guo at linaro.org
Wed Feb 22 09:19:10 CET 2012


Nice consolidation ...

On Tue, Feb 21, 2012 at 05:47:54PM +0100, Lars-Peter Clausen wrote:
> This patch series introduces a new set of helper functions for dmaengine based
> PCM drivers. Currently we have 6 different dmaengine based PCM drivers which are
> all more or less similar in structure, but all have also individual requirements
> which can't easily be generalized. So that's why this series does not introduce
> a generic dmaengine PCM driver but rather a set of helper functions which can be
> used to implement the common bits between such dmaengine based PCM drivers.
> 
> The helper functions only provide infrastructure code for dmaengines which
> provide thed evice_prep_dma_cyclic. While it is possible to add support for
> dmaengine, which only provide device_prep_slave_sg, it is in my opinion a better
> idea to either implement the missing functionality in the dmaengine driver or
> provide a emulation layer for cyclic transfer within the dmaengine framework
> itself. This has the advantage that it is also available outside of ALSA.
> 
> This series converts the three PCM drivers which already use the circular
> dmaengine prepare function. Since I don't have access to hardware using the
> converted drivers the patches have only been compile tested. But the helper
> functions introduced in this series have been runtime tested with a platform
> which is not upstream yet.
> 
> The first three patches are just cleanup patches which remove unused functions
> and struct fields and can probably applied without waiting for the rest of the
> series. The next two patches restructure the iMX and MXS drivers to request
> their DMA channel in the PCM open callback instead of the hwparams callback.
> This is done to make their structure more similar to what it will be when using
> the helper functions and make the actual patch converting them to the new
> dmaengine PCM helper functions less intrusive. The next patch introduces the
> helper functions and the last three patches respectively convert the imx, mxs
> and ep39xx dmaengine based PCM drivers to use the new set of helper functions.
> 
> The set of helper functions consists of a open, a close, a trigger and a pointer
> callback and also a function to convert hwparams to a dma_slave_config. The
> trigger and pointer callbacks can usually be used directly for the pcm_ops
> callbacks. The open callback wants to be called from a driver specific open
> function which may do some driver specific setup tasks and provide the helper
> open callback with a dma filter function. If the driver specific open functions
> allocates resources they need to be freed in a driver specific close function
> which has to call the helper close callback. If not the helper close callback
> can be assigned directly to the pcm_ops struct.
> 
> If a driver needs to keep additional driver specific data around it can be done
> by using snd_dmaengine_pcm_{get,set}_data. Normally a driver should not require
> to keep additional data around, but all of the converted drivers need this,
> because of this horrible abusive pattern where the dma channels private field
> gets assigned configuration data in the filter callback. We should hopefully be
> able to get rid of this pattern with Guennadi Liakhovetski's patches[1], which
> add a slave configuration parameter to dma_request_channel, and with it the need
> for storing extra private data.
> 
> While the DMA helper functions only use generic ALSA functions and nothing ASoC
> specific I've placed the, under ASoC for now since the only users are ASoC
> driver.
> 
> - Lars
> 
> [1] https://lkml.org/lkml/2012/2/1/227
> 
> Lars-Peter Clausen (10):
>   ASoC: imx-pcm: Remove empty prepare callback
>   ASoC: imx-pcm: Remove unused fields from imx_pcm_runtime_data struct
>   ASoC: mxs-pcm: Remove unused fields from struct mxs_pcm_runtime_data
>   ASoC: imx-ssi: Set dma data early
>   ASoC: imx-pcm: Request DMA channel early
>   ASoC: mxs-pxm: Request DMA channel early

s/mxs-pxm/mxs-pcm

>   ASoC: Add dmaengine PCM helper functions
>   ASoC: imx-dma: Use dmaengine PCM helper functions

s/imx-dma/imx-pcm

>   ASoC: mxs-pcm: Use dmaengine PCM helper functions
>   ASoC: ep93xx-pcm: Use dmaengine PCM helper functions
> 
>  include/sound/dmaengine_pcm.h   |   49 +++++++
>  sound/soc/Kconfig               |    3 +
>  sound/soc/Makefile              |    3 +
>  sound/soc/ep93xx/Kconfig        |    1 +
>  sound/soc/ep93xx/ep93xx-pcm.c   |  148 +++-----------------
>  sound/soc/imx/Kconfig           |    1 +
>  sound/soc/imx/imx-pcm-dma-mx2.c |  216 ++++-------------------------
>  sound/soc/imx/imx-ssi.c         |   28 +++-
>  sound/soc/mxs/Kconfig           |    1 +
>  sound/soc/mxs/mxs-pcm.c         |  157 ++++------------------
>  sound/soc/mxs/mxs-pcm.h         |   16 --
>  sound/soc/soc-dmaengine-pcm.c   |  287 +++++++++++++++++++++++++++++++++++++++
>  12 files changed, 443 insertions(+), 467 deletions(-)
>  create mode 100644 include/sound/dmaengine_pcm.h
>  create mode 100644 sound/soc/soc-dmaengine-pcm.c
> 
I tested it on both MXS (i.MX28) and IMX (i.MX51), it works fine, so

Tested-by: Shawn Guo <shawn.guo at linaro.org>

However, when I play the series on today's linux-next, I found a patch
from Russell (Cc-ed) below doing something overlapping with the work
here.

commit 4c815a835e9b0231028e9cc303406b381bfff7a2
Author: Russell King <rmk+kernel at arm.linux.org.uk>
Date:   Wed Jan 18 13:01:26 2012 +0000

    ALSA: ASoC: add generic slave-only DMA engine support

    Add a generic DMA engine platform driver to ASoC.  This allows a range
    of DMA engines to be used to transfer data to a CPUs audio interface
    without having to rewrite this code many times.

    This driver only supports DMA_SLAVE channels, not DMA_CYCLIC channels.
    DMA_CYCLIC channels could be added at a later date.

    Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>

I did not notice this patch on any list yet, so am not sure about
Russell's plan about it.  But it seems this series does not reach
alsa-devel list either. (forgot?)

-- 
Regards,
Shawn


More information about the Alsa-devel mailing list