Blame view
sound/arm/pxa2xx-pcm.c
3.14 KB
2c484df0d [ALSA] Add ARM PX... |
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. */ |
da155d5b4 sound: Add module... |
12 |
#include <linux/module.h> |
2c484df0d [ALSA] Add ARM PX... |
13 |
#include <sound/core.h> |
a6d773176 ALSA: Separate co... |
14 |
#include <sound/pxa2xx-lib.h> |
2c484df0d [ALSA] Add ARM PX... |
15 16 |
#include "pxa2xx-pcm.h" |
d18f83764 [ALSA] Remove xxx... |
17 |
static int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream) |
2c484df0d [ALSA] Add ARM PX... |
18 |
{ |
d18f83764 [ALSA] Remove xxx... |
19 |
struct pxa2xx_pcm_client *client = substream->private_data; |
2c484df0d [ALSA] Add ARM PX... |
20 |
|
a6d773176 ALSA: Separate co... |
21 |
__pxa2xx_pcm_prepare(substream); |
2c484df0d [ALSA] Add ARM PX... |
22 23 24 |
return client->prepare(substream); } |
d18f83764 [ALSA] Remove xxx... |
25 |
static int pxa2xx_pcm_open(struct snd_pcm_substream *substream) |
2c484df0d [ALSA] Add ARM PX... |
26 |
{ |
d18f83764 [ALSA] Remove xxx... |
27 28 |
struct pxa2xx_pcm_client *client = substream->private_data; struct snd_pcm_runtime *runtime = substream->runtime; |
2c484df0d [ALSA] Add ARM PX... |
29 30 |
struct pxa2xx_runtime_data *rtd; int ret; |
a6d773176 ALSA: Separate co... |
31 |
ret = __pxa2xx_pcm_open(substream); |
2c484df0d [ALSA] Add ARM PX... |
32 33 |
if (ret) goto out; |
a6d773176 ALSA: Separate co... |
34 |
rtd = runtime->private_data; |
2c484df0d [ALSA] Add ARM PX... |
35 36 37 38 39 40 41 42 |
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 [ALSA] Add ARM PX... |
43 44 45 46 47 48 |
ret = client->startup(substream); if (!ret) goto out; pxa_free_dma(rtd->dma_ch); err2: |
a6d773176 ALSA: Separate co... |
49 |
__pxa2xx_pcm_close(substream); |
2c484df0d [ALSA] Add ARM PX... |
50 51 52 |
out: return ret; } |
d18f83764 [ALSA] Remove xxx... |
53 |
static int pxa2xx_pcm_close(struct snd_pcm_substream *substream) |
2c484df0d [ALSA] Add ARM PX... |
54 |
{ |
d18f83764 [ALSA] Remove xxx... |
55 |
struct pxa2xx_pcm_client *client = substream->private_data; |
2c484df0d [ALSA] Add ARM PX... |
56 57 58 59 |
struct pxa2xx_runtime_data *rtd = substream->runtime->private_data; pxa_free_dma(rtd->dma_ch); client->shutdown(substream); |
2c484df0d [ALSA] Add ARM PX... |
60 |
|
a6d773176 ALSA: Separate co... |
61 |
return __pxa2xx_pcm_close(substream); |
2c484df0d [ALSA] Add ARM PX... |
62 |
} |
d18f83764 [ALSA] Remove xxx... |
63 |
static struct snd_pcm_ops pxa2xx_pcm_ops = { |
2c484df0d [ALSA] Add ARM PX... |
64 65 66 |
.open = pxa2xx_pcm_open, .close = pxa2xx_pcm_close, .ioctl = snd_pcm_lib_ioctl, |
a6d773176 ALSA: Separate co... |
67 68 |
.hw_params = __pxa2xx_pcm_hw_params, .hw_free = __pxa2xx_pcm_hw_free, |
2c484df0d [ALSA] Add ARM PX... |
69 70 71 72 73 |
.prepare = pxa2xx_pcm_prepare, .trigger = pxa2xx_pcm_trigger, .pointer = pxa2xx_pcm_pointer, .mmap = pxa2xx_pcm_mmap, }; |
2c484df0d [ALSA] Add ARM PX... |
74 |
static u64 pxa2xx_pcm_dmamask = 0xffffffff; |
d18f83764 [ALSA] Remove xxx... |
75 76 |
int pxa2xx_pcm_new(struct snd_card *card, struct pxa2xx_pcm_client *client, struct snd_pcm **rpcm) |
2c484df0d [ALSA] Add ARM PX... |
77 |
{ |
d18f83764 [ALSA] Remove xxx... |
78 |
struct snd_pcm *pcm; |
2c484df0d [ALSA] Add ARM PX... |
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 122 |
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"); |