Blame view
sound/arm/pxa2xx-pcm.c
3.12 KB
2c484df0d
|
1 2 3 4 5 6 7 8 9 10 11 |
/* * linux/sound/arm/pxa2xx-pcm.c -- ALSA PCM interface for the Intel PXA2xx chip * * Author: Nicolas Pitre * Created: Nov 30, 2004 * Copyright: (C) 2004 MontaVista Software, Inc. * * 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. */ |
2c484df0d
|
12 |
#include <sound/core.h> |
a6d773176
|
13 |
#include <sound/pxa2xx-lib.h> |
2c484df0d
|
14 15 |
#include "pxa2xx-pcm.h" |
d18f83764
|
16 |
static int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream) |
2c484df0d
|
17 |
{ |
d18f83764
|
18 |
struct pxa2xx_pcm_client *client = substream->private_data; |
2c484df0d
|
19 |
|
a6d773176
|
20 |
__pxa2xx_pcm_prepare(substream); |
2c484df0d
|
21 22 23 |
return client->prepare(substream); } |
d18f83764
|
24 |
static int pxa2xx_pcm_open(struct snd_pcm_substream *substream) |
2c484df0d
|
25 |
{ |
d18f83764
|
26 27 |
struct pxa2xx_pcm_client *client = substream->private_data; struct snd_pcm_runtime *runtime = substream->runtime; |
2c484df0d
|
28 29 |
struct pxa2xx_runtime_data *rtd; int ret; |
a6d773176
|
30 |
ret = __pxa2xx_pcm_open(substream); |
2c484df0d
|
31 32 |
if (ret) goto out; |
a6d773176
|
33 |
rtd = runtime->private_data; |
2c484df0d
|
34 35 36 37 38 39 40 41 |
rtd->params = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? client->playback_params : client->capture_params; ret = pxa_request_dma(rtd->params->name, DMA_PRIO_LOW, pxa2xx_pcm_dma_irq, substream); if (ret < 0) goto err2; rtd->dma_ch = ret; |
2c484df0d
|
42 43 44 45 46 47 |
ret = client->startup(substream); if (!ret) goto out; pxa_free_dma(rtd->dma_ch); err2: |
a6d773176
|
48 |
__pxa2xx_pcm_close(substream); |
2c484df0d
|
49 50 51 |
out: return ret; } |
d18f83764
|
52 |
static int pxa2xx_pcm_close(struct snd_pcm_substream *substream) |
2c484df0d
|
53 |
{ |
d18f83764
|
54 |
struct pxa2xx_pcm_client *client = substream->private_data; |
2c484df0d
|
55 56 57 58 |
struct pxa2xx_runtime_data *rtd = substream->runtime->private_data; pxa_free_dma(rtd->dma_ch); client->shutdown(substream); |
2c484df0d
|
59 |
|
a6d773176
|
60 |
return __pxa2xx_pcm_close(substream); |
2c484df0d
|
61 |
} |
d18f83764
|
62 |
static struct snd_pcm_ops pxa2xx_pcm_ops = { |
2c484df0d
|
63 64 65 |
.open = pxa2xx_pcm_open, .close = pxa2xx_pcm_close, .ioctl = snd_pcm_lib_ioctl, |
a6d773176
|
66 67 |
.hw_params = __pxa2xx_pcm_hw_params, .hw_free = __pxa2xx_pcm_hw_free, |
2c484df0d
|
68 69 70 71 72 |
.prepare = pxa2xx_pcm_prepare, .trigger = pxa2xx_pcm_trigger, .pointer = pxa2xx_pcm_pointer, .mmap = pxa2xx_pcm_mmap, }; |
2c484df0d
|
73 |
static u64 pxa2xx_pcm_dmamask = 0xffffffff; |
d18f83764
|
74 75 |
int pxa2xx_pcm_new(struct snd_card *card, struct pxa2xx_pcm_client *client, struct snd_pcm **rpcm) |
2c484df0d
|
76 |
{ |
d18f83764
|
77 |
struct snd_pcm *pcm; |
2c484df0d
|
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
int play = client->playback_params ? 1 : 0; int capt = client->capture_params ? 1 : 0; int ret; ret = snd_pcm_new(card, "PXA2xx-PCM", 0, play, capt, &pcm); if (ret) goto out; pcm->private_data = client; pcm->private_free = pxa2xx_pcm_free_dma_buffers; if (!card->dev->dma_mask) card->dev->dma_mask = &pxa2xx_pcm_dmamask; if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = 0xffffffff; if (play) { int stream = SNDRV_PCM_STREAM_PLAYBACK; snd_pcm_set_ops(pcm, stream, &pxa2xx_pcm_ops); ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, stream); if (ret) goto out; } if (capt) { int stream = SNDRV_PCM_STREAM_CAPTURE; snd_pcm_set_ops(pcm, stream, &pxa2xx_pcm_ops); ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, stream); if (ret) goto out; } if (rpcm) *rpcm = pcm; ret = 0; out: return ret; } EXPORT_SYMBOL(pxa2xx_pcm_new); MODULE_AUTHOR("Nicolas Pitre"); MODULE_DESCRIPTION("Intel PXA2xx PCM DMA module"); MODULE_LICENSE("GPL"); |