/sound/pci/ca0106/ca0106_main.c
C | 1909 lines | 1337 code | 207 blank | 365 comment | 134 complexity | b4c0926c966e9af12b2af019a1705f56 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, GPL-2.0, LGPL-2.0, AGPL-1.0
Large files files are truncated, but you can click here to view the full file
- /*
- * Copyright (c) 2004 James Courtier-Dutton <James@superbug.demon.co.uk>
- * Driver CA0106 chips. e.g. Sound Blaster Audigy LS and Live 24bit
- * Version: 0.0.25
- *
- * FEATURES currently supported:
- * Front, Rear and Center/LFE.
- * Surround40 and Surround51.
- * Capture from MIC an LINE IN input.
- * SPDIF digital playback of PCM stereo and AC3/DTS works.
- * (One can use a standard mono mini-jack to one RCA plugs cable.
- * or one can use a standard stereo mini-jack to two RCA plugs cable.
- * Plug one of the RCA plugs into the Coax input of the external decoder/receiver.)
- * ( In theory one could output 3 different AC3 streams at once, to 3 different SPDIF outputs. )
- * Notes on how to capture sound:
- * The AC97 is used in the PLAYBACK direction.
- * The output from the AC97 chip, instead of reaching the speakers, is fed into the Philips 1361T ADC.
- * So, to record from the MIC, set the MIC Playback volume to max,
- * unmute the MIC and turn up the MASTER Playback volume.
- * So, to prevent feedback when capturing, minimise the "Capture feedback into Playback" volume.
- *
- * The only playback controls that currently do anything are: -
- * Analog Front
- * Analog Rear
- * Analog Center/LFE
- * SPDIF Front
- * SPDIF Rear
- * SPDIF Center/LFE
- *
- * For capture from Mic in or Line in.
- * Digital/Analog ( switch must be in Analog mode for CAPTURE. )
- *
- * CAPTURE feedback into PLAYBACK
- *
- * Changelog:
- * Support interrupts per period.
- * Removed noise from Center/LFE channel when in Analog mode.
- * Rename and remove mixer controls.
- * 0.0.6
- * Use separate card based DMA buffer for periods table list.
- * 0.0.7
- * Change remove and rename ctrls into lists.
- * 0.0.8
- * Try to fix capture sources.
- * 0.0.9
- * Fix AC3 output.
- * Enable S32_LE format support.
- * 0.0.10
- * Enable playback 48000 and 96000 rates. (Rates other that these do not work, even with "plug:front".)
- * 0.0.11
- * Add Model name recognition.
- * 0.0.12
- * Correct interrupt timing. interrupt at end of period, instead of in the middle of a playback period.
- * Remove redundent "voice" handling.
- * 0.0.13
- * Single trigger call for multi channels.
- * 0.0.14
- * Set limits based on what the sound card hardware can do.
- * playback periods_min=2, periods_max=8
- * capture hw constraints require period_size = n * 64 bytes.
- * playback hw constraints require period_size = n * 64 bytes.
- * 0.0.15
- * Minor updates.
- * 0.0.16
- * Implement 192000 sample rate.
- * 0.0.17
- * Add support for SB0410 and SB0413.
- * 0.0.18
- * Modified Copyright message.
- * 0.0.19
- * Finally fix support for SB Live 24 bit. SB0410 and SB0413.
- * The output codec needs resetting, otherwise all output is muted.
- * 0.0.20
- * Merge "pci_disable_device(pci);" fixes.
- * 0.0.21
- * Add 4 capture channels. (SPDIF only comes in on channel 0. )
- * Add SPDIF capture using optional digital I/O module for SB Live 24bit. (Analog capture does not yet work.)
- * 0.0.22
- * Add support for MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97. From kiksen, bug #901
- * 0.0.23
- * Implement support for Line-in capture on SB Live 24bit.
- * 0.0.24
- * Add support for mute control on SB Live 24bit (cards w/ SPI DAC)
- * 0.0.25
- * Powerdown SPI DAC channels when not in use
- *
- * BUGS:
- * Some stability problems when unloading the snd-ca0106 kernel module.
- * --
- *
- * TODO:
- * 4 Capture channels, only one implemented so far.
- * Other capture rates apart from 48khz not implemented.
- * MIDI
- * --
- * GENERAL INFO:
- * Model: SB0310
- * P17 Chip: CA0106-DAT
- * AC97 Codec: STAC 9721
- * ADC: Philips 1361T (Stereo 24bit)
- * DAC: WM8746EDS (6-channel, 24bit, 192Khz)
- *
- * GENERAL INFO:
- * Model: SB0410
- * P17 Chip: CA0106-DAT
- * AC97 Codec: None
- * ADC: WM8775EDS (4 Channel)
- * DAC: CS4382 (114 dB, 24-Bit, 192 kHz, 8-Channel D/A Converter with DSD Support)
- * SPDIF Out control switches between Mic in and SPDIF out.
- * No sound out or mic input working yet.
- *
- * GENERAL INFO:
- * Model: SB0413
- * P17 Chip: CA0106-DAT
- * AC97 Codec: None.
- * ADC: Unknown
- * DAC: Unknown
- * Trying to handle it like the SB0410.
- *
- * This code was initally based on code from ALSA's emu10k1x.c which is:
- * 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
- *
- */
- #include <linux/delay.h>
- #include <linux/init.h>
- #include <linux/interrupt.h>
- #include <linux/pci.h>
- #include <linux/slab.h>
- #include <linux/moduleparam.h>
- #include <linux/dma-mapping.h>
- #include <sound/core.h>
- #include <sound/initval.h>
- #include <sound/pcm.h>
- #include <sound/ac97_codec.h>
- #include <sound/info.h>
- MODULE_AUTHOR("James Courtier-Dutton <James@superbug.demon.co.uk>");
- MODULE_DESCRIPTION("CA0106");
- MODULE_LICENSE("GPL");
- MODULE_SUPPORTED_DEVICE("{{Creative,SB CA0106 chip}}");
- // module parameters (see "Module Parameters")
- static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
- static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
- static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
- static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
- module_param_array(index, int, NULL, 0444);
- MODULE_PARM_DESC(index, "Index value for the CA0106 soundcard.");
- module_param_array(id, charp, NULL, 0444);
- MODULE_PARM_DESC(id, "ID string for the CA0106 soundcard.");
- module_param_array(enable, bool, NULL, 0444);
- MODULE_PARM_DESC(enable, "Enable the CA0106 soundcard.");
- module_param_array(subsystem, uint, NULL, 0444);
- MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
- #include "ca0106.h"
- static struct snd_ca0106_details ca0106_chip_details[] = {
- /* Sound Blaster X-Fi Extreme Audio. This does not have an AC97. 53SB079000000 */
- /* It is really just a normal SB Live 24bit. */
- /* Tested:
- * See ALSA bug#3251
- */
- { .serial = 0x10131102,
- .name = "X-Fi Extreme Audio [SBxxxx]",
- .gpio_type = 1,
- .i2c_adc = 1 } ,
- /* Sound Blaster X-Fi Extreme Audio. This does not have an AC97. 53SB079000000 */
- /* It is really just a normal SB Live 24bit. */
- /*
- * CTRL:CA0111-WTLF
- * ADC: WM8775SEDS
- * DAC: CS4382-KQZ
- */
- /* Tested:
- * Playback on front, rear, center/lfe speakers
- * Capture from Mic in.
- * Not-Tested:
- * Capture from Line in.
- * Playback to digital out.
- */
- { .serial = 0x10121102,
- .name = "X-Fi Extreme Audio [SB0790]",
- .gpio_type = 1,
- .i2c_adc = 1 } ,
- /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */
- /* AudigyLS[SB0310] */
- { .serial = 0x10021102,
- .name = "AudigyLS [SB0310]",
- .ac97 = 1 } ,
- /* Unknown AudigyLS that also says SB0310 on it */
- { .serial = 0x10051102,
- .name = "AudigyLS [SB0310b]",
- .ac97 = 1 } ,
- /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */
- { .serial = 0x10061102,
- .name = "Live! 7.1 24bit [SB0410]",
- .gpio_type = 1,
- .i2c_adc = 1 } ,
- /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */
- { .serial = 0x10071102,
- .name = "Live! 7.1 24bit [SB0413]",
- .gpio_type = 1,
- .i2c_adc = 1 } ,
- /* New Audigy SE. Has a different DAC. */
- /* SB0570:
- * CTRL:CA0106-DAT
- * ADC: WM8775EDS
- * DAC: WM8768GEDS
- */
- { .serial = 0x100a1102,
- .name = "Audigy SE [SB0570]",
- .gpio_type = 1,
- .i2c_adc = 1,
- .spi_dac = 1 } ,
- /* New Audigy LS. Has a different DAC. */
- /* SB0570:
- * CTRL:CA0106-DAT
- * ADC: WM8775EDS
- * DAC: WM8768GEDS
- */
- { .serial = 0x10111102,
- .name = "Audigy SE OEM [SB0570a]",
- .gpio_type = 1,
- .i2c_adc = 1,
- .spi_dac = 1 } ,
- /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */
- /* SB0438
- * CTRL:CA0106-DAT
- * ADC: WM8775SEDS
- * DAC: CS4382-KQZ
- */
-