Date: | 2013-04-03 11:06:04 (10 years 11 months ago) |
---|---|
Author: | Lars C. |
Commit: | 559dd5b62032c7874ac477bf116a21a6771d2d87 |
Message: | ASoC: fsl: Use common DAI DMA data struct Use the common DAI DMA data struct for fsl/imx, this allows us to use the common helper function to configure the DMA slave config based on the DAI DMA data. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Tested-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> |
Files: |
sound/soc/fsl/fsl_ssi.c (4 diffs) sound/soc/fsl/imx-pcm-dma.c (3 diffs) sound/soc/fsl/imx-pcm-fiq.c (1 diff) sound/soc/fsl/imx-pcm.h (1 diff) sound/soc/fsl/imx-ssi.c (3 diffs) sound/soc/fsl/imx-ssi.h (2 diffs) |
Change Details
sound/soc/fsl/fsl_ssi.c | ||
---|---|---|
27 | 27 | #include <sound/pcm_params.h> |
28 | 28 | #include <sound/initval.h> |
29 | 29 | #include <sound/soc.h> |
30 | #include <sound/dmaengine_pcm.h> | |
30 | 31 | |
31 | 32 | #include "fsl_ssi.h" |
32 | 33 | #include "imx-pcm.h" |
... | ... | |
122 | 123 | bool ssi_on_imx; |
123 | 124 | struct clk *clk; |
124 | 125 | struct platform_device *imx_pcm_pdev; |
125 | struct imx_pcm_dma_params dma_params_tx; | |
126 | struct imx_pcm_dma_params dma_params_rx; | |
126 | struct snd_dmaengine_dai_dma_data dma_params_tx; | |
127 | struct snd_dmaengine_dai_dma_data dma_params_rx; | |
128 | struct imx_dma_data filter_data_tx; | |
129 | struct imx_dma_data filter_data_rx; | |
127 | 130 | |
128 | 131 | struct { |
129 | 132 | unsigned int rfrc; |
... | ... | |
738 | 741 | * We have burstsize be "fifo_depth - 2" to match the SSI |
739 | 742 | * watermark setting in fsl_ssi_startup(). |
740 | 743 | */ |
741 | ssi_private->dma_params_tx.burstsize = | |
744 | ssi_private->dma_params_tx.maxburst = | |
742 | 745 | ssi_private->fifo_depth - 2; |
743 | ssi_private->dma_params_rx.burstsize = | |
746 | ssi_private->dma_params_rx.maxburst = | |
744 | 747 | ssi_private->fifo_depth - 2; |
745 | ssi_private->dma_params_tx.dma_addr = | |
748 | ssi_private->dma_params_tx.addr = | |
746 | 749 | ssi_private->ssi_phys + offsetof(struct ccsr_ssi, stx0); |
747 | ssi_private->dma_params_rx.dma_addr = | |
750 | ssi_private->dma_params_rx.addr = | |
748 | 751 | ssi_private->ssi_phys + offsetof(struct ccsr_ssi, srx0); |
752 | ssi_private->dma_params_tx.filter_data = | |
753 | &ssi_private->filter_data_tx; | |
754 | ssi_private->dma_params_rx.filter_data = | |
755 | &ssi_private->filter_data_rx; | |
749 | 756 | /* |
750 | 757 | * TODO: This is a temporary solution and should be changed |
751 | 758 | * to use generic DMA binding later when the helplers get in. |
... | ... | |
760 | 767 | shared = of_device_is_compatible(of_get_parent(np), |
761 | 768 | "fsl,spba-bus"); |
762 | 769 | |
763 | imx_pcm_dma_params_init_data(&ssi_private->dma_params_tx, | |
770 | imx_pcm_dma_params_init_data(&ssi_private->filter_data_tx, | |
764 | 771 | dma_events[0], shared); |
765 | imx_pcm_dma_params_init_data(&ssi_private->dma_params_rx, | |
772 | imx_pcm_dma_params_init_data(&ssi_private->filter_data_rx, | |
766 | 773 | dma_events[1], shared); |
767 | 774 | } |
768 | 775 |
sound/soc/fsl/imx-pcm-dma.c | ||
---|---|---|
34 | 34 | |
35 | 35 | static bool filter(struct dma_chan *chan, void *param) |
36 | 36 | { |
37 | struct snd_dmaengine_dai_dma_data *dma_data = param; | |
38 | ||
37 | 39 | if (!imx_dma_is_general_purpose(chan)) |
38 | 40 | return false; |
39 | 41 | |
40 | chan->private = param; | |
42 | chan->private = dma_data->filter_data; | |
41 | 43 | |
42 | 44 | return true; |
43 | 45 | } |
... | ... | |
47 | 49 | { |
48 | 50 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
49 | 51 | struct dma_chan *chan = snd_dmaengine_pcm_get_chan(substream); |
50 | struct imx_pcm_dma_params *dma_params; | |
51 | 52 | struct dma_slave_config slave_config; |
52 | 53 | int ret; |
53 | 54 | |
54 | dma_params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); | |
55 | ||
56 | 55 | ret = snd_hwparams_to_dma_slave_config(substream, params, &slave_config); |
57 | 56 | if (ret) |
58 | 57 | return ret; |
59 | 58 | |
60 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | |
61 | slave_config.dst_addr = dma_params->dma_addr; | |
62 | slave_config.dst_maxburst = dma_params->burstsize; | |
63 | } else { | |
64 | slave_config.src_addr = dma_params->dma_addr; | |
65 | slave_config.src_maxburst = dma_params->burstsize; | |
66 | } | |
59 | snd_dmaengine_pcm_set_config_from_dai_data(substream, | |
60 | snd_soc_dai_get_dma_data(rtd->cpu_dai, substream), | |
61 | &slave_config); | |
67 | 62 | |
68 | 63 | ret = dmaengine_slave_config(chan, &slave_config); |
69 | 64 | if (ret) |
... | ... | |
96 | 91 | static int snd_imx_open(struct snd_pcm_substream *substream) |
97 | 92 | { |
98 | 93 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
99 | struct imx_pcm_dma_params *dma_params; | |
100 | 94 | |
101 | 95 | snd_soc_set_runtime_hwparams(substream, &snd_imx_hardware); |
102 | 96 | |
103 | dma_params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); | |
104 | ||
105 | return snd_dmaengine_pcm_open(substream, filter, &dma_params->dma_data); | |
97 | return snd_dmaengine_pcm_open(substream, filter, | |
98 | snd_soc_dai_get_dma_data(rtd->cpu_dai, substream)); | |
106 | 99 | } |
107 | 100 | |
108 | 101 | static struct snd_pcm_ops imx_pcm_ops = { |
sound/soc/fsl/imx-pcm-fiq.c | ||
---|---|---|
299 | 299 | |
300 | 300 | imx_ssi_fiq_base = (unsigned long)ssi->base; |
301 | 301 | |
302 | ssi->dma_params_tx.burstsize = 4; | |
303 | ssi->dma_params_rx.burstsize = 6; | |
302 | ssi->dma_params_tx.maxburst = 4; | |
303 | ssi->dma_params_rx.maxburst = 6; | |
304 | 304 | |
305 | 305 | ret = snd_soc_register_platform(&pdev->dev, &imx_soc_platform_fiq); |
306 | 306 | if (ret) |
sound/soc/fsl/imx-pcm.h | ||
---|---|---|
20 | 20 | */ |
21 | 21 | #define IMX_SSI_DMABUF_SIZE (64 * 1024) |
22 | 22 | |
23 | struct imx_pcm_dma_params { | |
24 | unsigned long dma_addr; | |
25 | int burstsize; | |
26 | struct imx_dma_data dma_data; | |
27 | }; | |
28 | ||
29 | 23 | static inline void |
30 | imx_pcm_dma_params_init_data(struct imx_pcm_dma_params *params, | |
24 | imx_pcm_dma_params_init_data(struct imx_dma_data *dma_data, | |
31 | 25 | int dma, bool shared) |
32 | 26 | { |
33 | params->dma_data.dma_request = dma; | |
34 | params->dma_data.priority = DMA_PRIO_HIGH; | |
27 | dma_data->dma_request = dma; | |
28 | dma_data->priority = DMA_PRIO_HIGH; | |
35 | 29 | if (shared) |
36 | params->dma_data.peripheral_type = IMX_DMATYPE_SSI_SP; | |
30 | dma_data->peripheral_type = IMX_DMATYPE_SSI_SP; | |
37 | 31 | else |
38 | params->dma_data.peripheral_type = IMX_DMATYPE_SSI; | |
32 | dma_data->peripheral_type = IMX_DMATYPE_SSI; | |
39 | 33 | } |
40 | 34 | |
41 | 35 | int snd_imx_pcm_mmap(struct snd_pcm_substream *substream, |
sound/soc/fsl/imx-ssi.c | ||
---|---|---|
236 | 236 | struct snd_soc_dai *cpu_dai) |
237 | 237 | { |
238 | 238 | struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai); |
239 | struct imx_pcm_dma_params *dma_data; | |
239 | struct snd_dmaengine_dai_dma_data *dma_data; | |
240 | 240 | |
241 | 241 | /* Tx/Rx config */ |
242 | 242 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
... | ... | |
369 | 369 | |
370 | 370 | snd_soc_dai_set_drvdata(dai, ssi); |
371 | 371 | |
372 | val = SSI_SFCSR_TFWM0(ssi->dma_params_tx.burstsize) | | |
373 | SSI_SFCSR_RFWM0(ssi->dma_params_rx.burstsize); | |
372 | val = SSI_SFCSR_TFWM0(ssi->dma_params_tx.maxburst) | | |
373 | SSI_SFCSR_RFWM0(ssi->dma_params_rx.maxburst); | |
374 | 374 | writel(val, ssi->base + SSI_SFCSR); |
375 | 375 | |
376 | 376 | return 0; |
... | ... | |
575 | 575 | |
576 | 576 | writel(0x0, ssi->base + SSI_SIER); |
577 | 577 | |
578 | ssi->dma_params_rx.dma_addr = res->start + SSI_SRX0; | |
579 | ssi->dma_params_tx.dma_addr = res->start + SSI_STX0; | |
578 | ssi->dma_params_rx.addr = res->start + SSI_SRX0; | |
579 | ssi->dma_params_tx.addr = res->start + SSI_STX0; | |
580 | 580 | |
581 | ssi->dma_params_tx.burstsize = 6; | |
582 | ssi->dma_params_rx.burstsize = 4; | |
581 | ssi->dma_params_tx.maxburst = 6; | |
582 | ssi->dma_params_rx.maxburst = 4; | |
583 | ||
584 | ssi->dma_params_tx.filter_data = &ssi->filter_data_tx; | |
585 | ssi->dma_params_rx.filter_data = &ssi->filter_data_rx; | |
583 | 586 | |
584 | 587 | res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx0"); |
585 | 588 | if (res) { |
586 | imx_pcm_dma_params_init_data(&ssi->dma_params_tx, res->start, | |
589 | imx_pcm_dma_params_init_data(&ssi->filter_data_tx, res->start, | |
587 | 590 | false); |
588 | 591 | } |
589 | 592 | |
590 | 593 | res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx0"); |
591 | 594 | if (res) { |
592 | imx_pcm_dma_params_init_data(&ssi->dma_params_rx, res->start, | |
595 | imx_pcm_dma_params_init_data(&ssi->filter_data_rx, res->start, | |
593 | 596 | false); |
594 | 597 | } |
595 | 598 |
sound/soc/fsl/imx-ssi.h | ||
---|---|---|
187 | 187 | |
188 | 188 | #include <linux/dmaengine.h> |
189 | 189 | #include <linux/platform_data/dma-imx.h> |
190 | #include <sound/dmaengine_pcm.h> | |
190 | 191 | #include "imx-pcm.h" |
191 | 192 | |
192 | 193 | struct imx_ssi { |
... | ... | |
204 | 205 | void (*ac97_reset) (struct snd_ac97 *ac97); |
205 | 206 | void (*ac97_warm_reset)(struct snd_ac97 *ac97); |
206 | 207 | |
207 | struct imx_pcm_dma_params dma_params_rx; | |
208 | struct imx_pcm_dma_params dma_params_tx; | |
208 | struct snd_dmaengine_dai_dma_data dma_params_rx; | |
209 | struct snd_dmaengine_dai_dma_data dma_params_tx; | |
210 | struct imx_dma_data filter_data_tx; | |
211 | struct imx_dma_data filter_data_rx; | |
209 | 212 | |
210 | 213 | int enabled; |
211 | 214 |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9