blob: c246fb514930b718a509bbf699b2914feefd956e [file] [log] [blame]
Sascha Hauer83802222009-11-25 16:41:04 +01001/*
2 * imx-pcm-dma-mx2.c -- ALSA Soc Audio Layer
3 *
4 * Copyright 2009 Sascha Hauer <s.hauer@pengutronix.de>
5 *
6 * This code is based on code copyrighted by Freescale,
7 * Liam Girdwood, Javier Martin and probably others.
8 *
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation; either version 2 of the License, or (at your
12 * option) any later version.
13 */
Sascha Hauer83802222009-11-25 16:41:04 +010014#include <linux/platform_device.h>
Sascha Hauerbf974a02010-11-04 17:05:43 +010015#include <linux/dmaengine.h>
Viresh Kumar258aea72012-02-01 16:12:19 +053016#include <linux/types.h>
Sascha Hauer83802222009-11-25 16:41:04 +010017
18#include <sound/core.h>
Sascha Hauer83802222009-11-25 16:41:04 +010019#include <sound/pcm.h>
Sascha Hauer83802222009-11-25 16:41:04 +010020#include <sound/soc.h>
Lars-Peter Clausenc307e8e2012-02-22 10:49:09 +010021#include <sound/dmaengine_pcm.h>
Sascha Hauer83802222009-11-25 16:41:04 +010022
Shawn Guo4762fba2012-03-05 22:30:55 +080023#include "imx-pcm.h"
Sascha Hauer83802222009-11-25 16:41:04 +010024
Sascha Hauerbf974a02010-11-04 17:05:43 +010025static bool filter(struct dma_chan *chan, void *param)
Sascha Hauer83802222009-11-25 16:41:04 +010026{
Lars-Peter Clausena8909c92013-04-03 11:06:04 +020027 struct snd_dmaengine_dai_dma_data *dma_data = param;
28
Sascha Hauerbf974a02010-11-04 17:05:43 +010029 if (!imx_dma_is_general_purpose(chan))
30 return false;
31
Lars-Peter Clausena8909c92013-04-03 11:06:04 +020032 chan->private = dma_data->filter_data;
Sascha Hauerbf974a02010-11-04 17:05:43 +010033
Lars-Peter Clausenc307e8e2012-02-22 10:49:09 +010034 return true;
Lars-Peter Clausen4564d102012-02-22 10:49:06 +010035}
36
Lars-Peter Clausenadaa3222013-04-15 19:19:59 +020037static const struct snd_pcm_hardware imx_pcm_hardware = {
Sascha Hauer83802222009-11-25 16:41:04 +010038 .info = SNDRV_PCM_INFO_INTERLEAVED |
39 SNDRV_PCM_INFO_BLOCK_TRANSFER |
40 SNDRV_PCM_INFO_MMAP |
41 SNDRV_PCM_INFO_MMAP_VALID |
42 SNDRV_PCM_INFO_PAUSE |
43 SNDRV_PCM_INFO_RESUME,
44 .formats = SNDRV_PCM_FMTBIT_S16_LE,
45 .rate_min = 8000,
46 .channels_min = 2,
47 .channels_max = 2,
48 .buffer_bytes_max = IMX_SSI_DMABUF_SIZE,
49 .period_bytes_min = 128,
Sascha Hauerbf974a02010-11-04 17:05:43 +010050 .period_bytes_max = 65535, /* Limited by SDMA engine */
Sascha Hauer83802222009-11-25 16:41:04 +010051 .periods_min = 2,
52 .periods_max = 255,
53 .fifo_size = 0,
54};
55
Lars-Peter Clausenadaa3222013-04-15 19:19:59 +020056static const struct snd_dmaengine_pcm_config imx_dmaengine_pcm_config = {
57 .pcm_hardware = &imx_pcm_hardware,
58 .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
59 .compat_filter_fn = filter,
60 .prealloc_buffer_size = IMX_SSI_DMABUF_SIZE,
Sascha Hauer83802222009-11-25 16:41:04 +010061};
62
Shawn Guo19276612013-01-28 14:25:43 +080063int imx_pcm_dma_init(struct platform_device *pdev)
Sascha Hauer83802222009-11-25 16:41:04 +010064{
Lars-Peter Clausenadaa3222013-04-15 19:19:59 +020065 return snd_dmaengine_pcm_register(&pdev->dev, &imx_dmaengine_pcm_config,
66 SND_DMAENGINE_PCM_FLAG_NO_RESIDUE |
67 SND_DMAENGINE_PCM_FLAG_NO_DT |
68 SND_DMAENGINE_PCM_FLAG_COMPAT);
69}
70
71void imx_pcm_dma_exit(struct platform_device *pdev)
72{
73 snd_dmaengine_pcm_unregister(&pdev->dev);
Sascha Hauer83802222009-11-25 16:41:04 +010074}