Blame view
sound/pci/emu10k1/p16v.c
29.1 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 |
/* * Copyright (c) by James Courtier-Dutton <James@superbug.demon.co.uk> * Driver p16v chips |
22bc30c84 [ALSA] Increase c... |
4 |
* Version: 0.25 |
1da177e4c Linux-2.6.12-rc2 |
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
* * FEATURES currently supported: * Output fixed at S32_LE, 2 channel to hw:0,0 * Rates: 44.1, 48, 96, 192. * * Changelog: * 0.8 * Use separate card based buffer for periods table. * 0.9 * Use 2 channel output streams instead of 8 channel. * (8 channel output streams might be good for ASIO type output) * Corrected speaker output, so Front -> Front etc. * 0.10 * Fixed missed interrupts. * 0.11 * Add Sound card model number and names. * Add Analog volume controls. * 0.12 * Corrected playback interrupts. Now interrupt per period, instead of half period. * 0.13 * Use single trigger for multichannel. * 0.14 * Mic capture now works at fixed: S32_LE, 96000Hz, Stereo. * 0.15 * Force buffer_size / period_size == INTEGER. * 0.16 * Update p16v.c to work with changed alsa api. * 0.17 * Update p16v.c to work with changed alsa api. Removed boot_devs. * 0.18 * Merging with snd-emu10k1 driver. * 0.19 * One stereo channel at 24bit now works. * 0.20 * Added better register defines. * 0.21 * Integrated with snd-emu10k1 driver. * 0.22 * Removed #if 0 ... #endif |
f927c8fc6 [ALSA] Implement ... |
44 45 46 47 48 49 50 |
* 0.23 * Implement different capture rates. * 0.24 * Implement different capture source channels. * e.g. When HD Capture source is set to SPDIF, * setting HD Capture channel to 0 captures from CDROM digital input. * setting HD Capture channel to 1 captures from SPDIF in. |
22bc30c84 [ALSA] Increase c... |
51 52 |
* 0.25 * Include capture buffer sizes. |
1da177e4c Linux-2.6.12-rc2 |
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
* * BUGS: * Some stability problems when unloading the snd-p16v kernel module. * -- * * TODO: * SPDIF out. * Find out how to change capture sample rates. E.g. To record SPDIF at 48000Hz. * Currently capture fixed at 48000Hz. * * -- * GENERAL INFO: * Model: SB0240 * P16V Chip: CA0151-DBS * Audigy 2 Chip: CA0102-IAT * AC97 Codec: STAC 9721 * ADC: Philips 1361T (Stereo 24bit) * DAC: CS4382-K (8-channel, 24bit, 192Khz) * |
25985edce Fix common misspe... |
72 |
* This code was initially based on code from ALSA's emu10k1x.c which is: |
1da177e4c Linux-2.6.12-rc2 |
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
* Copyright (c) by Francisco Moraes <fmoraes@nc.rr.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ |
1da177e4c Linux-2.6.12-rc2 |
90 91 92 93 94 |
#include <linux/delay.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/pci.h> #include <linux/slab.h> |
bd01e7bc9 [ALSA] emu10k1 - ... |
95 |
#include <linux/vmalloc.h> |
1da177e4c Linux-2.6.12-rc2 |
96 97 98 99 100 101 |
#include <linux/moduleparam.h> #include <sound/core.h> #include <sound/initval.h> #include <sound/pcm.h> #include <sound/ac97_codec.h> #include <sound/info.h> |
31508f83f [ALSA] snd-emu10k... |
102 |
#include <sound/tlv.h> |
1da177e4c Linux-2.6.12-rc2 |
103 104 105 106 107 108 109 |
#include <sound/emu10k1.h> #include "p16v.h" #define SET_CHANNEL 0 /* Testing channel outputs 0=Front, 1=Center/LFE, 2=Unknown, 3=Rear */ #define PCM_FRONT_CHANNEL 0 #define PCM_REAR_CHANNEL 1 #define PCM_CENTER_LFE_CHANNEL 2 |
eff49137d [ALSA] emu10k1 - ... |
110 |
#define PCM_SIDE_CHANNEL 3 |
1da177e4c Linux-2.6.12-rc2 |
111 112 113 |
#define CONTROL_FRONT_CHANNEL 0 #define CONTROL_REAR_CHANNEL 3 #define CONTROL_CENTER_LFE_CHANNEL 1 |
eff49137d [ALSA] emu10k1 - ... |
114 |
#define CONTROL_SIDE_CHANNEL 2 |
1da177e4c Linux-2.6.12-rc2 |
115 116 117 118 119 120 121 122 123 124 |
/* Card IDs: * Class 0401: 1102:0004 (rev 04) Subsystem: 1102:2002 -> Audigy2 ZS 7.1 Model:SB0350 * Class 0401: 1102:0004 (rev 04) Subsystem: 1102:1007 -> Audigy2 6.1 Model:SB0240 * Class 0401: 1102:0004 (rev 04) Subsystem: 1102:1002 -> Audigy2 Platinum Model:SB msb0240230009266 * Class 0401: 1102:0004 (rev 04) Subsystem: 1102:2007 -> Audigy4 Pro Model:SB0380 M1SB0380472001901E * */ /* hardware definition */ |
eb4698f34 [ALSA] Remove xxx... |
125 |
static struct snd_pcm_hardware snd_p16v_playback_hw = { |
b83f346bc [ALSA] remove inc... |
126 127 128 129 130 131 |
.info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_SYNC_START, |
1da177e4c Linux-2.6.12-rc2 |
132 |
.formats = SNDRV_PCM_FMTBIT_S32_LE, /* Only supports 24-bit samples padded to 32 bits. */ |
001f75899 [ALSA] Improve SP... |
133 134 |
.rates = SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_44100, .rate_min = 44100, |
1da177e4c Linux-2.6.12-rc2 |
135 136 137 |
.rate_max = 192000, .channels_min = 8, .channels_max = 8, |
310bacd29 [ALSA] Improve pl... |
138 |
.buffer_bytes_max = ((65536 - 64) * 8), |
1da177e4c Linux-2.6.12-rc2 |
139 |
.period_bytes_min = 64, |
310bacd29 [ALSA] Improve pl... |
140 |
.period_bytes_max = (65536 - 64), |
1da177e4c Linux-2.6.12-rc2 |
141 142 143 144 |
.periods_min = 2, .periods_max = 8, .fifo_size = 0, }; |
eb4698f34 [ALSA] Remove xxx... |
145 |
static struct snd_pcm_hardware snd_p16v_capture_hw = { |
c70256370 [ALSA] Support mu... |
146 147 148 |
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | |
09668b441 [ALSA] emu10k1 - ... |
149 |
SNDRV_PCM_INFO_RESUME | |
c70256370 [ALSA] Support mu... |
150 151 152 153 154 155 156 |
SNDRV_PCM_INFO_MMAP_VALID), .formats = SNDRV_PCM_FMTBIT_S32_LE, .rates = SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_44100, .rate_min = 44100, .rate_max = 192000, .channels_min = 2, .channels_max = 2, |
22bc30c84 [ALSA] Increase c... |
157 |
.buffer_bytes_max = (65536 - 64), |
c70256370 [ALSA] Support mu... |
158 |
.period_bytes_min = 64, |
22bc30c84 [ALSA] Increase c... |
159 |
.period_bytes_max = (65536 - 128) >> 1, /* size has to be N*64 bytes */ |
c70256370 [ALSA] Support mu... |
160 161 162 |
.periods_min = 2, .periods_max = 2, .fifo_size = 0, |
6e4abc40f [ALSA] Adds Captu... |
163 |
}; |
eb4698f34 [ALSA] Remove xxx... |
164 |
static void snd_p16v_pcm_free_substream(struct snd_pcm_runtime *runtime) |
1da177e4c Linux-2.6.12-rc2 |
165 |
{ |
eb4698f34 [ALSA] Remove xxx... |
166 |
struct snd_emu10k1_pcm *epcm = runtime->private_data; |
1da177e4c Linux-2.6.12-rc2 |
167 168 |
if (epcm) { |
28a97c194 ALSA: emu10k1 - A... |
169 170 |
/* snd_printk(KERN_DEBUG "epcm free: %p ", epcm); */ |
1da177e4c Linux-2.6.12-rc2 |
171 172 173 174 175 |
kfree(epcm); } } /* open_playback callback */ |
eb4698f34 [ALSA] Remove xxx... |
176 |
static int snd_p16v_pcm_open_playback_channel(struct snd_pcm_substream *substream, int channel_id) |
1da177e4c Linux-2.6.12-rc2 |
177 |
{ |
eb4698f34 [ALSA] Remove xxx... |
178 179 180 181 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_emu10k1_voice *channel = &(emu->p16v_voices[channel_id]); struct snd_emu10k1_pcm *epcm; struct snd_pcm_runtime *runtime = substream->runtime; |
1da177e4c Linux-2.6.12-rc2 |
182 |
int err; |
e560d8d83 [ALSA] Replace wi... |
183 |
epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); |
28a97c194 ALSA: emu10k1 - A... |
184 185 |
/* snd_printk(KERN_DEBUG "epcm kcalloc: %p ", epcm); */ |
1da177e4c Linux-2.6.12-rc2 |
186 187 188 189 190 |
if (epcm == NULL) return -ENOMEM; epcm->emu = emu; epcm->substream = substream; |
28a97c194 ALSA: emu10k1 - A... |
191 192 193 194 195 |
/* snd_printk(KERN_DEBUG "epcm device=%d, channel_id=%d ", substream->pcm->device, channel_id); */ |
1da177e4c Linux-2.6.12-rc2 |
196 197 198 199 200 201 202 203 204 |
runtime->private_data = epcm; runtime->private_free = snd_p16v_pcm_free_substream; runtime->hw = snd_p16v_playback_hw; channel->emu = emu; channel->number = channel_id; channel->use=1; |
28a97c194 ALSA: emu10k1 - A... |
205 206 207 208 209 210 211 212 213 214 215 |
#if 0 /* debug */ snd_printk(KERN_DEBUG "p16v: open channel_id=%d, channel=%p, use=0x%x ", channel_id, channel, channel->use); printk(KERN_DEBUG "open:channel_id=%d, chip=%p, channel=%p ", channel_id, chip, channel); #endif /* debug */ /* channel->interrupt = snd_p16v_pcm_channel_interrupt; */ channel->epcm = epcm; |
1da177e4c Linux-2.6.12-rc2 |
216 217 |
if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) return err; |
b83f346bc [ALSA] remove inc... |
218 219 220 221 |
runtime->sync.id32[0] = substream->pcm->card->number; runtime->sync.id32[1] = 'P'; runtime->sync.id32[2] = 16; runtime->sync.id32[3] = 'V'; |
1da177e4c Linux-2.6.12-rc2 |
222 223 |
return 0; } |
6e4abc40f [ALSA] Adds Captu... |
224 |
/* open_capture callback */ |
eb4698f34 [ALSA] Remove xxx... |
225 |
static int snd_p16v_pcm_open_capture_channel(struct snd_pcm_substream *substream, int channel_id) |
6e4abc40f [ALSA] Adds Captu... |
226 |
{ |
eb4698f34 [ALSA] Remove xxx... |
227 228 229 230 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_emu10k1_voice *channel = &(emu->p16v_capture_voice); struct snd_emu10k1_pcm *epcm; struct snd_pcm_runtime *runtime = substream->runtime; |
6e4abc40f [ALSA] Adds Captu... |
231 |
int err; |
e560d8d83 [ALSA] Replace wi... |
232 |
epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); |
28a97c194 ALSA: emu10k1 - A... |
233 234 |
/* snd_printk(KERN_DEBUG "epcm kcalloc: %p ", epcm); */ |
6e4abc40f [ALSA] Adds Captu... |
235 236 237 238 239 |
if (epcm == NULL) return -ENOMEM; epcm->emu = emu; epcm->substream = substream; |
28a97c194 ALSA: emu10k1 - A... |
240 241 242 243 244 |
/* snd_printk(KERN_DEBUG "epcm device=%d, channel_id=%d ", substream->pcm->device, channel_id); */ |
6e4abc40f [ALSA] Adds Captu... |
245 246 247 248 249 250 251 252 253 |
runtime->private_data = epcm; runtime->private_free = snd_p16v_pcm_free_substream; runtime->hw = snd_p16v_capture_hw; channel->emu = emu; channel->number = channel_id; channel->use=1; |
28a97c194 ALSA: emu10k1 - A... |
254 255 256 257 258 259 260 261 262 263 264 |
#if 0 /* debug */ snd_printk(KERN_DEBUG "p16v: open channel_id=%d, channel=%p, use=0x%x ", channel_id, channel, channel->use); printk(KERN_DEBUG "open:channel_id=%d, chip=%p, channel=%p ", channel_id, chip, channel); #endif /* debug */ /* channel->interrupt = snd_p16v_pcm_channel_interrupt; */ channel->epcm = epcm; |
6e4abc40f [ALSA] Adds Captu... |
265 266 267 268 269 |
if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) return err; return 0; } |
1da177e4c Linux-2.6.12-rc2 |
270 271 |
/* close callback */ |
eb4698f34 [ALSA] Remove xxx... |
272 |
static int snd_p16v_pcm_close_playback(struct snd_pcm_substream *substream) |
1da177e4c Linux-2.6.12-rc2 |
273 |
{ |
eb4698f34 [ALSA] Remove xxx... |
274 275 276 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); //struct snd_pcm_runtime *runtime = substream->runtime; //struct snd_emu10k1_pcm *epcm = runtime->private_data; |
9f4bd5dde [ALSA] snd-emu10k... |
277 |
emu->p16v_voices[substream->pcm->device - emu->p16v_device_offset].use = 0; |
6e4abc40f [ALSA] Adds Captu... |
278 279 280 281 282 |
/* FIXME: maybe zero others */ return 0; } /* close callback */ |
eb4698f34 [ALSA] Remove xxx... |
283 |
static int snd_p16v_pcm_close_capture(struct snd_pcm_substream *substream) |
6e4abc40f [ALSA] Adds Captu... |
284 |
{ |
eb4698f34 [ALSA] Remove xxx... |
285 286 287 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); //struct snd_pcm_runtime *runtime = substream->runtime; //struct snd_emu10k1_pcm *epcm = runtime->private_data; |
9f4bd5dde [ALSA] snd-emu10k... |
288 |
emu->p16v_capture_voice.use = 0; |
6e4abc40f [ALSA] Adds Captu... |
289 |
/* FIXME: maybe zero others */ |
1da177e4c Linux-2.6.12-rc2 |
290 291 |
return 0; } |
eb4698f34 [ALSA] Remove xxx... |
292 |
static int snd_p16v_pcm_open_playback_front(struct snd_pcm_substream *substream) |
1da177e4c Linux-2.6.12-rc2 |
293 294 295 |
{ return snd_p16v_pcm_open_playback_channel(substream, PCM_FRONT_CHANNEL); } |
eb4698f34 [ALSA] Remove xxx... |
296 |
static int snd_p16v_pcm_open_capture(struct snd_pcm_substream *substream) |
6e4abc40f [ALSA] Adds Captu... |
297 298 299 300 |
{ // Only using channel 0 for now, but the card has 2 channels. return snd_p16v_pcm_open_capture_channel(substream, 0); } |
1da177e4c Linux-2.6.12-rc2 |
301 |
/* hw_params callback */ |
eb4698f34 [ALSA] Remove xxx... |
302 303 |
static int snd_p16v_pcm_hw_params_playback(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) |
1da177e4c Linux-2.6.12-rc2 |
304 305 |
{ int result; |
1da177e4c Linux-2.6.12-rc2 |
306 307 |
result = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); |
1da177e4c Linux-2.6.12-rc2 |
308 309 |
return result; } |
6e4abc40f [ALSA] Adds Captu... |
310 |
/* hw_params callback */ |
eb4698f34 [ALSA] Remove xxx... |
311 312 |
static int snd_p16v_pcm_hw_params_capture(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) |
6e4abc40f [ALSA] Adds Captu... |
313 314 315 316 317 318 |
{ int result; result = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); return result; } |
1da177e4c Linux-2.6.12-rc2 |
319 |
/* hw_free callback */ |
eb4698f34 [ALSA] Remove xxx... |
320 |
static int snd_p16v_pcm_hw_free_playback(struct snd_pcm_substream *substream) |
1da177e4c Linux-2.6.12-rc2 |
321 322 |
{ int result; |
1da177e4c Linux-2.6.12-rc2 |
323 |
result = snd_pcm_lib_free_pages(substream); |
1da177e4c Linux-2.6.12-rc2 |
324 325 |
return result; } |
6e4abc40f [ALSA] Adds Captu... |
326 |
/* hw_free callback */ |
eb4698f34 [ALSA] Remove xxx... |
327 |
static int snd_p16v_pcm_hw_free_capture(struct snd_pcm_substream *substream) |
6e4abc40f [ALSA] Adds Captu... |
328 329 330 331 332 |
{ int result; result = snd_pcm_lib_free_pages(substream); return result; } |
1da177e4c Linux-2.6.12-rc2 |
333 |
/* prepare playback callback */ |
eb4698f34 [ALSA] Remove xxx... |
334 |
static int snd_p16v_pcm_prepare_playback(struct snd_pcm_substream *substream) |
1da177e4c Linux-2.6.12-rc2 |
335 |
{ |
eb4698f34 [ALSA] Remove xxx... |
336 337 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; |
1da177e4c Linux-2.6.12-rc2 |
338 339 340 341 342 343 |
int channel = substream->pcm->device - emu->p16v_device_offset; u32 *table_base = (u32 *)(emu->p16v_buffer.area+(8*16*channel)); u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); int i; u32 tmp; |
28a97c194 ALSA: emu10k1 - A... |
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 |
#if 0 /* debug */ snd_printk(KERN_DEBUG "prepare:channel_number=%d, rate=%d, " "format=0x%x, channels=%d, buffer_size=%ld, " "period_size=%ld, periods=%u, frames_to_bytes=%d ", channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, runtime->periods, frames_to_bytes(runtime, 1)); snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, table_base=%p ", runtime->dma_addr, runtime->dma_area, table_base); snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x ", emu->p16v_buffer.addr, emu->p16v_buffer.area, emu->p16v_buffer.bytes); #endif /* debug */ |
1da177e4c Linux-2.6.12-rc2 |
360 361 362 |
tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel); switch (runtime->rate) { case 44100: |
001f75899 [ALSA] Improve SP... |
363 |
snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe0e0) | 0x8080); |
1da177e4c Linux-2.6.12-rc2 |
364 365 |
break; case 96000: |
001f75899 [ALSA] Improve SP... |
366 |
snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe0e0) | 0x4040); |
1da177e4c Linux-2.6.12-rc2 |
367 368 |
break; case 192000: |
001f75899 [ALSA] Improve SP... |
369 |
snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe0e0) | 0x2020); |
1da177e4c Linux-2.6.12-rc2 |
370 |
break; |
001f75899 [ALSA] Improve SP... |
371 |
case 48000: |
1da177e4c Linux-2.6.12-rc2 |
372 |
default: |
001f75899 [ALSA] Improve SP... |
373 |
snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe0e0) | 0x0000); |
1da177e4c Linux-2.6.12-rc2 |
374 375 376 |
break; } /* FIXME: Check emu->buffer.size before actually writing to it. */ |
9f4bd5dde [ALSA] snd-emu10k... |
377 |
for(i = 0; i < runtime->periods; i++) { |
1da177e4c Linux-2.6.12-rc2 |
378 379 380 381 382 383 384 385 |
table_base[i*2]=runtime->dma_addr+(i*period_size_bytes); table_base[(i*2)+1]=period_size_bytes<<16; } snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_ADDR, channel, emu->p16v_buffer.addr+(8*16*channel)); snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_SIZE, channel, (runtime->periods - 1) << 19); snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_PTR, channel, 0); snd_emu10k1_ptr20_write(emu, PLAYBACK_DMA_ADDR, channel, runtime->dma_addr); |
310bacd29 [ALSA] Improve pl... |
386 387 |
//snd_emu10k1_ptr20_write(emu, PLAYBACK_PERIOD_SIZE, channel, frames_to_bytes(runtime, runtime->period_size)<<16); // buffer size in bytes snd_emu10k1_ptr20_write(emu, PLAYBACK_PERIOD_SIZE, channel, 0); // buffer size in bytes |
1da177e4c Linux-2.6.12-rc2 |
388 389 390 391 392 393 |
snd_emu10k1_ptr20_write(emu, PLAYBACK_POINTER, channel, 0); snd_emu10k1_ptr20_write(emu, 0x07, channel, 0x0); snd_emu10k1_ptr20_write(emu, 0x08, channel, 0); return 0; } |
6e4abc40f [ALSA] Adds Captu... |
394 |
/* prepare capture callback */ |
eb4698f34 [ALSA] Remove xxx... |
395 |
static int snd_p16v_pcm_prepare_capture(struct snd_pcm_substream *substream) |
6e4abc40f [ALSA] Adds Captu... |
396 |
{ |
eb4698f34 [ALSA] Remove xxx... |
397 398 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; |
6e4abc40f [ALSA] Adds Captu... |
399 |
int channel = substream->pcm->device - emu->p16v_device_offset; |
c70256370 [ALSA] Support mu... |
400 |
u32 tmp; |
28a97c194 ALSA: emu10k1 - A... |
401 402 403 404 405 406 407 408 409 410 |
/* printk(KERN_DEBUG "prepare capture:channel_number=%d, rate=%d, " "format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, " "frames_to_bytes=%d ", channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, frames_to_bytes(runtime, 1)); */ |
c70256370 [ALSA] Support mu... |
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 |
tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel); switch (runtime->rate) { case 44100: snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0x0e00) | 0x0800); break; case 96000: snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0x0e00) | 0x0400); break; case 192000: snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0x0e00) | 0x0200); break; case 48000: default: snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0x0e00) | 0x0000); break; } /* FIXME: Check emu->buffer.size before actually writing to it. */ |
6e4abc40f [ALSA] Adds Captu... |
428 429 |
snd_emu10k1_ptr20_write(emu, 0x13, channel, 0); snd_emu10k1_ptr20_write(emu, CAPTURE_DMA_ADDR, channel, runtime->dma_addr); |
9f4bd5dde [ALSA] snd-emu10k... |
430 |
snd_emu10k1_ptr20_write(emu, CAPTURE_BUFFER_SIZE, channel, frames_to_bytes(runtime, runtime->buffer_size) << 16); // buffer size in bytes |
6e4abc40f [ALSA] Adds Captu... |
431 432 433 434 435 436 |
snd_emu10k1_ptr20_write(emu, CAPTURE_POINTER, channel, 0); //snd_emu10k1_ptr20_write(emu, CAPTURE_SOURCE, 0x0, 0x333300e4); /* Select MIC or Line in */ //snd_emu10k1_ptr20_write(emu, EXTENDED_INT_MASK, 0, snd_emu10k1_ptr20_read(emu, EXTENDED_INT_MASK, 0) | (0x110000<<channel)); return 0; } |
eb4698f34 [ALSA] Remove xxx... |
437 |
static void snd_p16v_intr_enable(struct snd_emu10k1 *emu, unsigned int intrenb) |
1da177e4c Linux-2.6.12-rc2 |
438 439 440 441 442 443 444 445 446 |
{ unsigned long flags; unsigned int enable; spin_lock_irqsave(&emu->emu_lock, flags); enable = inl(emu->port + INTE2) | intrenb; outl(enable, emu->port + INTE2); spin_unlock_irqrestore(&emu->emu_lock, flags); } |
eb4698f34 [ALSA] Remove xxx... |
447 |
static void snd_p16v_intr_disable(struct snd_emu10k1 *emu, unsigned int intrenb) |
1da177e4c Linux-2.6.12-rc2 |
448 449 450 451 452 453 454 455 456 457 458 |
{ unsigned long flags; unsigned int disable; spin_lock_irqsave(&emu->emu_lock, flags); disable = inl(emu->port + INTE2) & (~intrenb); outl(disable, emu->port + INTE2); spin_unlock_irqrestore(&emu->emu_lock, flags); } /* trigger_playback callback */ |
eb4698f34 [ALSA] Remove xxx... |
459 |
static int snd_p16v_pcm_trigger_playback(struct snd_pcm_substream *substream, |
1da177e4c Linux-2.6.12-rc2 |
460 461 |
int cmd) { |
eb4698f34 [ALSA] Remove xxx... |
462 463 464 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime; struct snd_emu10k1_pcm *epcm; |
1da177e4c Linux-2.6.12-rc2 |
465 466 |
int channel; int result = 0; |
eb4698f34 [ALSA] Remove xxx... |
467 |
struct snd_pcm_substream *s; |
1da177e4c Linux-2.6.12-rc2 |
468 469 |
u32 basic = 0; u32 inte = 0; |
9f4bd5dde [ALSA] snd-emu10k... |
470 |
int running = 0; |
1da177e4c Linux-2.6.12-rc2 |
471 472 473 474 475 476 477 |
switch (cmd) { case SNDRV_PCM_TRIGGER_START: running=1; break; case SNDRV_PCM_TRIGGER_STOP: default: |
9f4bd5dde [ALSA] snd-emu10k... |
478 |
running = 0; |
1da177e4c Linux-2.6.12-rc2 |
479 480 |
break; } |
ef991b95a [ALSA] Add snd_pc... |
481 |
snd_pcm_group_for_each_entry(s, substream) { |
29998d24a [ALSA] check for ... |
482 483 484 |
if (snd_pcm_substream_chip(s) != emu || s->stream != SNDRV_PCM_STREAM_PLAYBACK) continue; |
1da177e4c Linux-2.6.12-rc2 |
485 486 487 |
runtime = s->runtime; epcm = runtime->private_data; channel = substream->pcm->device-emu->p16v_device_offset; |
28a97c194 ALSA: emu10k1 - A... |
488 489 |
/* snd_printk(KERN_DEBUG "p16v channel=%d ", channel); */ |
1da177e4c Linux-2.6.12-rc2 |
490 491 492 493 494 |
epcm->running = running; basic |= (0x1<<channel); inte |= (INTE2_PLAYBACK_CH_0_LOOP<<channel); snd_pcm_trigger_done(s, substream); } |
28a97c194 ALSA: emu10k1 - A... |
495 496 |
/* snd_printk(KERN_DEBUG "basic=0x%x, inte=0x%x ", basic, inte); */ |
1da177e4c Linux-2.6.12-rc2 |
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 |
switch (cmd) { case SNDRV_PCM_TRIGGER_START: snd_p16v_intr_enable(emu, inte); snd_emu10k1_ptr20_write(emu, BASIC_INTERRUPT, 0, snd_emu10k1_ptr20_read(emu, BASIC_INTERRUPT, 0)| (basic)); break; case SNDRV_PCM_TRIGGER_STOP: snd_emu10k1_ptr20_write(emu, BASIC_INTERRUPT, 0, snd_emu10k1_ptr20_read(emu, BASIC_INTERRUPT, 0) & ~(basic)); snd_p16v_intr_disable(emu, inte); break; default: result = -EINVAL; break; } return result; } |
6e4abc40f [ALSA] Adds Captu... |
513 |
/* trigger_capture callback */ |
eb4698f34 [ALSA] Remove xxx... |
514 |
static int snd_p16v_pcm_trigger_capture(struct snd_pcm_substream *substream, |
6e4abc40f [ALSA] Adds Captu... |
515 516 |
int cmd) { |
eb4698f34 [ALSA] Remove xxx... |
517 518 519 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; struct snd_emu10k1_pcm *epcm = runtime->private_data; |
6e4abc40f [ALSA] Adds Captu... |
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 |
int channel = 0; int result = 0; u32 inte = INTE2_CAPTURE_CH_0_LOOP | INTE2_CAPTURE_CH_0_HALF_LOOP; switch (cmd) { case SNDRV_PCM_TRIGGER_START: snd_p16v_intr_enable(emu, inte); snd_emu10k1_ptr20_write(emu, BASIC_INTERRUPT, 0, snd_emu10k1_ptr20_read(emu, BASIC_INTERRUPT, 0)|(0x100<<channel)); epcm->running = 1; break; case SNDRV_PCM_TRIGGER_STOP: snd_emu10k1_ptr20_write(emu, BASIC_INTERRUPT, 0, snd_emu10k1_ptr20_read(emu, BASIC_INTERRUPT, 0) & ~(0x100<<channel)); snd_p16v_intr_disable(emu, inte); //snd_emu10k1_ptr20_write(emu, EXTENDED_INT_MASK, 0, snd_emu10k1_ptr20_read(emu, EXTENDED_INT_MASK, 0) & ~(0x110000<<channel)); epcm->running = 0; break; default: result = -EINVAL; break; } return result; } |
1da177e4c Linux-2.6.12-rc2 |
542 543 |
/* pointer_playback callback */ static snd_pcm_uframes_t |
eb4698f34 [ALSA] Remove xxx... |
544 |
snd_p16v_pcm_pointer_playback(struct snd_pcm_substream *substream) |
1da177e4c Linux-2.6.12-rc2 |
545 |
{ |
eb4698f34 [ALSA] Remove xxx... |
546 547 548 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; struct snd_emu10k1_pcm *epcm = runtime->private_data; |
1da177e4c Linux-2.6.12-rc2 |
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 |
snd_pcm_uframes_t ptr, ptr1, ptr2,ptr3,ptr4 = 0; int channel = substream->pcm->device - emu->p16v_device_offset; if (!epcm->running) return 0; ptr3 = snd_emu10k1_ptr20_read(emu, PLAYBACK_LIST_PTR, channel); ptr1 = snd_emu10k1_ptr20_read(emu, PLAYBACK_POINTER, channel); ptr4 = snd_emu10k1_ptr20_read(emu, PLAYBACK_LIST_PTR, channel); if (ptr3 != ptr4) ptr1 = snd_emu10k1_ptr20_read(emu, PLAYBACK_POINTER, channel); ptr2 = bytes_to_frames(runtime, ptr1); ptr2+= (ptr4 >> 3) * runtime->period_size; ptr=ptr2; if (ptr >= runtime->buffer_size) ptr -= runtime->buffer_size; return ptr; } |
6e4abc40f [ALSA] Adds Captu... |
566 567 |
/* pointer_capture callback */ static snd_pcm_uframes_t |
eb4698f34 [ALSA] Remove xxx... |
568 |
snd_p16v_pcm_pointer_capture(struct snd_pcm_substream *substream) |
6e4abc40f [ALSA] Adds Captu... |
569 |
{ |
eb4698f34 [ALSA] Remove xxx... |
570 571 572 |
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; struct snd_emu10k1_pcm *epcm = runtime->private_data; |
6e4abc40f [ALSA] Adds Captu... |
573 574 575 576 577 578 579 580 581 582 583 |
snd_pcm_uframes_t ptr, ptr1, ptr2 = 0; int channel = 0; if (!epcm->running) return 0; ptr1 = snd_emu10k1_ptr20_read(emu, CAPTURE_POINTER, channel); ptr2 = bytes_to_frames(runtime, ptr1); ptr=ptr2; if (ptr >= runtime->buffer_size) { ptr -= runtime->buffer_size; |
99b359ba1 [ALSA] Add missin... |
584 585 |
printk(KERN_WARNING "buffer capture limited! "); |
6e4abc40f [ALSA] Adds Captu... |
586 |
} |
28a97c194 ALSA: emu10k1 - A... |
587 588 589 590 591 592 593 594 |
/* printk(KERN_DEBUG "ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, " "buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d ", ptr1, ptr2, ptr, (int)runtime->buffer_size, (int)runtime->period_size, (int)runtime->frame_bits, (int)runtime->rate); */ |
6e4abc40f [ALSA] Adds Captu... |
595 596 |
return ptr; } |
1da177e4c Linux-2.6.12-rc2 |
597 |
/* operators */ |
eb4698f34 [ALSA] Remove xxx... |
598 |
static struct snd_pcm_ops snd_p16v_playback_front_ops = { |
1da177e4c Linux-2.6.12-rc2 |
599 600 601 602 603 604 605 606 607 |
.open = snd_p16v_pcm_open_playback_front, .close = snd_p16v_pcm_close_playback, .ioctl = snd_pcm_lib_ioctl, .hw_params = snd_p16v_pcm_hw_params_playback, .hw_free = snd_p16v_pcm_hw_free_playback, .prepare = snd_p16v_pcm_prepare_playback, .trigger = snd_p16v_pcm_trigger_playback, .pointer = snd_p16v_pcm_pointer_playback, }; |
eb4698f34 [ALSA] Remove xxx... |
608 |
static struct snd_pcm_ops snd_p16v_capture_ops = { |
6e4abc40f [ALSA] Adds Captu... |
609 610 611 612 613 614 615 616 617 |
.open = snd_p16v_pcm_open_capture, .close = snd_p16v_pcm_close_capture, .ioctl = snd_pcm_lib_ioctl, .hw_params = snd_p16v_pcm_hw_params_capture, .hw_free = snd_p16v_pcm_hw_free_capture, .prepare = snd_p16v_pcm_prepare_capture, .trigger = snd_p16v_pcm_trigger_capture, .pointer = snd_p16v_pcm_pointer_capture, }; |
eb4698f34 [ALSA] Remove xxx... |
618 |
int snd_p16v_free(struct snd_emu10k1 *chip) |
1da177e4c Linux-2.6.12-rc2 |
619 620 621 622 |
{ // release the data if (chip->p16v_buffer.area) { snd_dma_free_pages(&chip->p16v_buffer); |
28a97c194 ALSA: emu10k1 - A... |
623 624 625 626 627 |
/* snd_printk(KERN_DEBUG "period lables free: %p ", &chip->p16v_buffer); */ |
1da177e4c Linux-2.6.12-rc2 |
628 629 630 |
} return 0; } |
e23e7a143 ALSA: pci: remove... |
631 |
int snd_p16v_pcm(struct snd_emu10k1 *emu, int device, struct snd_pcm **rpcm) |
1da177e4c Linux-2.6.12-rc2 |
632 |
{ |
eb4698f34 [ALSA] Remove xxx... |
633 634 |
struct snd_pcm *pcm; struct snd_pcm_substream *substream; |
1da177e4c Linux-2.6.12-rc2 |
635 |
int err; |
6e4abc40f [ALSA] Adds Captu... |
636 |
int capture=1; |
1da177e4c Linux-2.6.12-rc2 |
637 |
|
ad361c988 Remove multiple K... |
638 639 |
/* snd_printk(KERN_DEBUG "snd_p16v_pcm called. device=%d ", device); */ |
1da177e4c Linux-2.6.12-rc2 |
640 641 642 |
emu->p16v_device_offset = device; if (rpcm) *rpcm = NULL; |
6e4abc40f [ALSA] Adds Captu... |
643 |
|
1da177e4c Linux-2.6.12-rc2 |
644 645 646 647 |
if ((err = snd_pcm_new(emu->card, "p16v", device, 1, capture, &pcm)) < 0) return err; pcm->private_data = emu; |
6e4abc40f [ALSA] Adds Captu... |
648 649 |
// Single playback 8 channel device. // Single capture 2 channel device. |
1da177e4c Linux-2.6.12-rc2 |
650 |
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_p16v_playback_front_ops); |
6e4abc40f [ALSA] Adds Captu... |
651 |
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_p16v_capture_ops); |
1da177e4c Linux-2.6.12-rc2 |
652 653 654 655 |
pcm->info_flags = 0; pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX; strcpy(pcm->name, "p16v"); |
09668b441 [ALSA] emu10k1 - ... |
656 |
emu->pcm_p16v = pcm; |
1da177e4c Linux-2.6.12-rc2 |
657 658 659 660 661 662 663 |
for(substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; substream; substream = substream->next) { if ((err = snd_pcm_lib_preallocate_pages(substream, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci), |
310bacd29 [ALSA] Improve pl... |
664 |
((65536 - 64) * 8), ((65536 - 64) * 8))) < 0) |
1da177e4c Linux-2.6.12-rc2 |
665 |
return err; |
28a97c194 ALSA: emu10k1 - A... |
666 667 668 669 670 |
/* snd_printk(KERN_DEBUG "preallocate playback substream: err=%d ", err); */ |
1da177e4c Linux-2.6.12-rc2 |
671 672 673 674 675 676 677 678 |
} for (substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; substream; substream = substream->next) { if ((err = snd_pcm_lib_preallocate_pages(substream, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci), |
22bc30c84 [ALSA] Increase c... |
679 |
65536 - 64, 65536 - 64)) < 0) |
1da177e4c Linux-2.6.12-rc2 |
680 |
return err; |
28a97c194 ALSA: emu10k1 - A... |
681 682 683 684 685 |
/* snd_printk(KERN_DEBUG "preallocate capture substream: err=%d ", err); */ |
1da177e4c Linux-2.6.12-rc2 |
686 687 688 689 690 691 692 |
} if (rpcm) *rpcm = pcm; return 0; } |
eff49137d [ALSA] emu10k1 - ... |
693 694 |
static int snd_p16v_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
1da177e4c Linux-2.6.12-rc2 |
695 696 697 698 699 700 701 |
{ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; uinfo->count = 2; uinfo->value.integer.min = 0; uinfo->value.integer.max = 255; return 0; } |
eb4698f34 [ALSA] Remove xxx... |
702 |
static int snd_p16v_volume_get(struct snd_kcontrol *kcontrol, |
eff49137d [ALSA] emu10k1 - ... |
703 |
struct snd_ctl_elem_value *ucontrol) |
1da177e4c Linux-2.6.12-rc2 |
704 |
{ |
eb4698f34 [ALSA] Remove xxx... |
705 |
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); |
eff49137d [ALSA] emu10k1 - ... |
706 707 708 709 710 711 712 713 |
int high_low = (kcontrol->private_value >> 8) & 0xff; int reg = kcontrol->private_value & 0xff; u32 value; value = snd_emu10k1_ptr20_read(emu, reg, high_low); if (high_low) { ucontrol->value.integer.value[0] = 0xff - ((value >> 24) & 0xff); /* Left */ ucontrol->value.integer.value[1] = 0xff - ((value >> 16) & 0xff); /* Right */ |
1da177e4c Linux-2.6.12-rc2 |
714 |
} else { |
eff49137d [ALSA] emu10k1 - ... |
715 716 |
ucontrol->value.integer.value[0] = 0xff - ((value >> 8) & 0xff); /* Left */ ucontrol->value.integer.value[1] = 0xff - ((value >> 0) & 0xff); /* Right */ |
1da177e4c Linux-2.6.12-rc2 |
717 |
} |
eff49137d [ALSA] emu10k1 - ... |
718 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
719 |
} |
eb4698f34 [ALSA] Remove xxx... |
720 |
static int snd_p16v_volume_put(struct snd_kcontrol *kcontrol, |
eff49137d [ALSA] emu10k1 - ... |
721 |
struct snd_ctl_elem_value *ucontrol) |
1da177e4c Linux-2.6.12-rc2 |
722 |
{ |
eb4698f34 [ALSA] Remove xxx... |
723 |
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); |
eff49137d [ALSA] emu10k1 - ... |
724 725 726 727 728 |
int high_low = (kcontrol->private_value >> 8) & 0xff; int reg = kcontrol->private_value & 0xff; u32 value, oval; oval = value = snd_emu10k1_ptr20_read(emu, reg, 0); |
1da177e4c Linux-2.6.12-rc2 |
729 730 |
if (high_low == 1) { value &= 0xffff; |
eff49137d [ALSA] emu10k1 - ... |
731 732 |
value |= ((0xff - ucontrol->value.integer.value[0]) << 24) | ((0xff - ucontrol->value.integer.value[1]) << 16); |
1da177e4c Linux-2.6.12-rc2 |
733 734 |
} else { value &= 0xffff0000; |
eff49137d [ALSA] emu10k1 - ... |
735 736 |
value |= ((0xff - ucontrol->value.integer.value[0]) << 8) | ((0xff - ucontrol->value.integer.value[1]) ); |
1da177e4c Linux-2.6.12-rc2 |
737 |
} |
eff49137d [ALSA] emu10k1 - ... |
738 739 740 741 742 |
if (value != oval) { snd_emu10k1_ptr20_write(emu, reg, 0, value); return 1; } return 0; |
1da177e4c Linux-2.6.12-rc2 |
743 |
} |
eff49137d [ALSA] emu10k1 - ... |
744 745 |
static int snd_p16v_capture_source_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
1da177e4c Linux-2.6.12-rc2 |
746 |
{ |
eff49137d [ALSA] emu10k1 - ... |
747 748 749 750 |
static char *texts[8] = { "SPDIF", "I2S", "SRC48", "SRCMulti_SPDIF", "SRCMulti_I2S", "CDIF", "FX", "AC97" }; |
6e4abc40f [ALSA] Adds Captu... |
751 752 753 754 755 756 757 758 759 |
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->count = 1; uinfo->value.enumerated.items = 8; if (uinfo->value.enumerated.item > 7) uinfo->value.enumerated.item = 7; strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); return 0; } |
eb4698f34 [ALSA] Remove xxx... |
760 761 |
static int snd_p16v_capture_source_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
6e4abc40f [ALSA] Adds Captu... |
762 |
{ |
eb4698f34 [ALSA] Remove xxx... |
763 |
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); |
6e4abc40f [ALSA] Adds Captu... |
764 765 766 767 |
ucontrol->value.enumerated.item[0] = emu->p16v_capture_source; return 0; } |
eb4698f34 [ALSA] Remove xxx... |
768 769 |
static int snd_p16v_capture_source_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
6e4abc40f [ALSA] Adds Captu... |
770 |
{ |
eb4698f34 [ALSA] Remove xxx... |
771 |
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); |
6e4abc40f [ALSA] Adds Captu... |
772 773 774 775 776 777 |
unsigned int val; int change = 0; u32 mask; u32 source; val = ucontrol->value.enumerated.item[0] ; |
aa299d01f [ALSA] emu10k1 - ... |
778 779 |
if (val > 7) return -EINVAL; |
6e4abc40f [ALSA] Adds Captu... |
780 781 782 783 784 785 786 787 788 |
change = (emu->p16v_capture_source != val); if (change) { emu->p16v_capture_source = val; source = (val << 28) | (val << 24) | (val << 20) | (val << 16); mask = snd_emu10k1_ptr20_read(emu, BASIC_INTERRUPT, 0) & 0xffff; snd_emu10k1_ptr20_write(emu, BASIC_INTERRUPT, 0, source | mask); } return change; } |
eff49137d [ALSA] emu10k1 - ... |
789 790 |
static int snd_p16v_capture_channel_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
f927c8fc6 [ALSA] Implement ... |
791 792 793 794 795 796 797 798 799 800 801 |
{ static char *texts[4] = { "0", "1", "2", "3", }; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->count = 1; uinfo->value.enumerated.items = 4; if (uinfo->value.enumerated.item > 3) uinfo->value.enumerated.item = 3; strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); return 0; } |
eb4698f34 [ALSA] Remove xxx... |
802 803 |
static int snd_p16v_capture_channel_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
f927c8fc6 [ALSA] Implement ... |
804 |
{ |
eb4698f34 [ALSA] Remove xxx... |
805 |
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); |
f927c8fc6 [ALSA] Implement ... |
806 807 808 809 |
ucontrol->value.enumerated.item[0] = emu->p16v_capture_channel; return 0; } |
eb4698f34 [ALSA] Remove xxx... |
810 811 |
static int snd_p16v_capture_channel_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
f927c8fc6 [ALSA] Implement ... |
812 |
{ |
eb4698f34 [ALSA] Remove xxx... |
813 |
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); |
f927c8fc6 [ALSA] Implement ... |
814 815 816 817 818 |
unsigned int val; int change = 0; u32 tmp; val = ucontrol->value.enumerated.item[0] ; |
aa299d01f [ALSA] emu10k1 - ... |
819 820 |
if (val > 3) return -EINVAL; |
f927c8fc6 [ALSA] Implement ... |
821 822 823 824 825 826 827 828 |
change = (emu->p16v_capture_channel != val); if (change) { emu->p16v_capture_channel = val; tmp = snd_emu10k1_ptr20_read(emu, CAPTURE_P16V_SOURCE, 0) & 0xfffc; snd_emu10k1_ptr20_write(emu, CAPTURE_P16V_SOURCE, 0, tmp | val); } return change; } |
0cb29ea0d [ALSA] Add even m... |
829 |
static const DECLARE_TLV_DB_SCALE(snd_p16v_db_scale1, -5175, 25, 1); |
f927c8fc6 [ALSA] Implement ... |
830 |
|
eff49137d [ALSA] emu10k1 - ... |
831 832 |
#define P16V_VOL(xname,xreg,xhl) { \ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ |
31508f83f [ALSA] snd-emu10k... |
833 834 |
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \ SNDRV_CTL_ELEM_ACCESS_TLV_READ, \ |
eff49137d [ALSA] emu10k1 - ... |
835 836 837 |
.info = snd_p16v_volume_info, \ .get = snd_p16v_volume_get, \ .put = snd_p16v_volume_put, \ |
7cf0a9531 [ALSA] Fix compil... |
838 |
.tlv = { .p = snd_p16v_db_scale1 }, \ |
eff49137d [ALSA] emu10k1 - ... |
839 840 |
.private_value = ((xreg) | ((xhl) << 8)) \ } |
e23e7a143 ALSA: pci: remove... |
841 |
static struct snd_kcontrol_new p16v_mixer_controls[] = { |
eff49137d [ALSA] emu10k1 - ... |
842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 |
P16V_VOL("HD Analog Front Playback Volume", PLAYBACK_VOLUME_MIXER9, 0), P16V_VOL("HD Analog Rear Playback Volume", PLAYBACK_VOLUME_MIXER10, 1), P16V_VOL("HD Analog Center/LFE Playback Volume", PLAYBACK_VOLUME_MIXER9, 1), P16V_VOL("HD Analog Side Playback Volume", PLAYBACK_VOLUME_MIXER10, 0), P16V_VOL("HD SPDIF Front Playback Volume", PLAYBACK_VOLUME_MIXER7, 0), P16V_VOL("HD SPDIF Rear Playback Volume", PLAYBACK_VOLUME_MIXER8, 1), P16V_VOL("HD SPDIF Center/LFE Playback Volume", PLAYBACK_VOLUME_MIXER7, 1), P16V_VOL("HD SPDIF Side Playback Volume", PLAYBACK_VOLUME_MIXER8, 0), { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "HD source Capture", .info = snd_p16v_capture_source_info, .get = snd_p16v_capture_source_get, .put = snd_p16v_capture_source_put }, { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "HD channel Capture", .info = snd_p16v_capture_channel_info, .get = snd_p16v_capture_channel_get, .put = snd_p16v_capture_channel_put }, |
f927c8fc6 [ALSA] Implement ... |
864 |
}; |
eff49137d [ALSA] emu10k1 - ... |
865 |
|
e23e7a143 ALSA: pci: remove... |
866 |
int snd_p16v_mixer(struct snd_emu10k1 *emu) |
1da177e4c Linux-2.6.12-rc2 |
867 |
{ |
eff49137d [ALSA] emu10k1 - ... |
868 |
int i, err; |
eb4698f34 [ALSA] Remove xxx... |
869 |
struct snd_card *card = emu->card; |
eff49137d [ALSA] emu10k1 - ... |
870 871 872 873 874 875 |
for (i = 0; i < ARRAY_SIZE(p16v_mixer_controls); i++) { if ((err = snd_ctl_add(card, snd_ctl_new1(&p16v_mixer_controls[i], emu))) < 0) return err; } |
1da177e4c Linux-2.6.12-rc2 |
876 877 |
return 0; } |
c7561cd80 ALSA: PCI: Replac... |
878 |
#ifdef CONFIG_PM_SLEEP |
09668b441 [ALSA] emu10k1 - ... |
879 880 |
#define NUM_CHS 1 /* up to 4, but only first channel is used */ |
e23e7a143 ALSA: pci: remove... |
881 |
int snd_p16v_alloc_pm_buffer(struct snd_emu10k1 *emu) |
09668b441 [ALSA] emu10k1 - ... |
882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 |
{ emu->p16v_saved = vmalloc(NUM_CHS * 4 * 0x80); if (! emu->p16v_saved) return -ENOMEM; return 0; } void snd_p16v_free_pm_buffer(struct snd_emu10k1 *emu) { vfree(emu->p16v_saved); } void snd_p16v_suspend(struct snd_emu10k1 *emu) { int i, ch; unsigned int *val; val = emu->p16v_saved; for (ch = 0; ch < NUM_CHS; ch++) for (i = 0; i < 0x80; i++, val++) *val = snd_emu10k1_ptr20_read(emu, i, ch); } void snd_p16v_resume(struct snd_emu10k1 *emu) { int i, ch; unsigned int *val; val = emu->p16v_saved; for (ch = 0; ch < NUM_CHS; ch++) for (i = 0; i < 0x80; i++, val++) snd_emu10k1_ptr20_write(emu, i, ch, *val); } #endif |