Blame view

sound/arm/pxa2xx-pcm.c 3.14 KB
2c484df0d   Takashi Iwai   [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   Paul Gortmaker   sound: Add module...
12
  #include <linux/module.h>
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
13
  #include <sound/core.h>
a6d773176   Dmitry Eremin-Solenikov   ALSA: Separate co...
14
  #include <sound/pxa2xx-lib.h>
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
15
16
  
  #include "pxa2xx-pcm.h"
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
17
  static int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream)
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
18
  {
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
19
  	struct pxa2xx_pcm_client *client = substream->private_data;
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
20

a6d773176   Dmitry Eremin-Solenikov   ALSA: Separate co...
21
  	__pxa2xx_pcm_prepare(substream);
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
22
23
24
  
  	return client->prepare(substream);
  }
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
25
  static int pxa2xx_pcm_open(struct snd_pcm_substream *substream)
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
26
  {
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
27
28
  	struct pxa2xx_pcm_client *client = substream->private_data;
  	struct snd_pcm_runtime *runtime = substream->runtime;
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
29
30
  	struct pxa2xx_runtime_data *rtd;
  	int ret;
a6d773176   Dmitry Eremin-Solenikov   ALSA: Separate co...
31
  	ret = __pxa2xx_pcm_open(substream);
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
32
33
  	if (ret)
  		goto out;
a6d773176   Dmitry Eremin-Solenikov   ALSA: Separate co...
34
  	rtd = runtime->private_data;
2c484df0d   Takashi Iwai   [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   Takashi Iwai   [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   Dmitry Eremin-Solenikov   ALSA: Separate co...
49
  	__pxa2xx_pcm_close(substream);
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
50
51
52
   out:
  	return ret;
  }
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
53
  static int pxa2xx_pcm_close(struct snd_pcm_substream *substream)
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
54
  {
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
55
  	struct pxa2xx_pcm_client *client = substream->private_data;
2c484df0d   Takashi Iwai   [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   Takashi Iwai   [ALSA] Add ARM PX...
60

a6d773176   Dmitry Eremin-Solenikov   ALSA: Separate co...
61
  	return __pxa2xx_pcm_close(substream);
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
62
  }
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
63
  static struct snd_pcm_ops pxa2xx_pcm_ops = {
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
64
65
66
  	.open		= pxa2xx_pcm_open,
  	.close		= pxa2xx_pcm_close,
  	.ioctl		= snd_pcm_lib_ioctl,
a6d773176   Dmitry Eremin-Solenikov   ALSA: Separate co...
67
68
  	.hw_params	= __pxa2xx_pcm_hw_params,
  	.hw_free	= __pxa2xx_pcm_hw_free,
2c484df0d   Takashi Iwai   [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   Takashi Iwai   [ALSA] Add ARM PX...
74
  static u64 pxa2xx_pcm_dmamask = 0xffffffff;
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
75
76
  int pxa2xx_pcm_new(struct snd_card *card, struct pxa2xx_pcm_client *client,
  		   struct snd_pcm **rpcm)
2c484df0d   Takashi Iwai   [ALSA] Add ARM PX...
77
  {
d18f83764   Takashi Iwai   [ALSA] Remove xxx...
78
  	struct snd_pcm *pcm;
2c484df0d   Takashi Iwai   [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");