1*a2328d02SGiuliano Pochini /* 2*a2328d02SGiuliano Pochini * ALSA driver for Echoaudio soundcards. 3*a2328d02SGiuliano Pochini * Copyright (C) 2009 Giuliano Pochini <pochini@shiny.it> 4*a2328d02SGiuliano Pochini * 5*a2328d02SGiuliano Pochini * This program is free software; you can redistribute it and/or modify 6*a2328d02SGiuliano Pochini * it under the terms of the GNU General Public License as published by 7*a2328d02SGiuliano Pochini * the Free Software Foundation; version 2 of the License. 8*a2328d02SGiuliano Pochini * 9*a2328d02SGiuliano Pochini * This program is distributed in the hope that it will be useful, 10*a2328d02SGiuliano Pochini * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*a2328d02SGiuliano Pochini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*a2328d02SGiuliano Pochini * GNU General Public License for more details. 13*a2328d02SGiuliano Pochini * 14*a2328d02SGiuliano Pochini * You should have received a copy of the GNU General Public License 15*a2328d02SGiuliano Pochini * along with this program; if not, write to the Free Software 16*a2328d02SGiuliano Pochini * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17*a2328d02SGiuliano Pochini */ 18*a2328d02SGiuliano Pochini 19*a2328d02SGiuliano Pochini #define INDIGO_FAMILY 20*a2328d02SGiuliano Pochini #define ECHOCARD_INDIGO_IOX 21*a2328d02SGiuliano Pochini #define ECHOCARD_NAME "Indigo IOx" 22*a2328d02SGiuliano Pochini #define ECHOCARD_HAS_MONITOR 23*a2328d02SGiuliano Pochini #define ECHOCARD_HAS_SUPER_INTERLEAVE 24*a2328d02SGiuliano Pochini #define ECHOCARD_HAS_VMIXER 25*a2328d02SGiuliano Pochini #define ECHOCARD_HAS_STEREO_BIG_ENDIAN32 26*a2328d02SGiuliano Pochini 27*a2328d02SGiuliano Pochini /* Pipe indexes */ 28*a2328d02SGiuliano Pochini #define PX_ANALOG_OUT 0 /* 8 */ 29*a2328d02SGiuliano Pochini #define PX_DIGITAL_OUT 8 /* 0 */ 30*a2328d02SGiuliano Pochini #define PX_ANALOG_IN 8 /* 2 */ 31*a2328d02SGiuliano Pochini #define PX_DIGITAL_IN 10 /* 0 */ 32*a2328d02SGiuliano Pochini #define PX_NUM 10 33*a2328d02SGiuliano Pochini 34*a2328d02SGiuliano Pochini /* Bus indexes */ 35*a2328d02SGiuliano Pochini #define BX_ANALOG_OUT 0 /* 2 */ 36*a2328d02SGiuliano Pochini #define BX_DIGITAL_OUT 2 /* 0 */ 37*a2328d02SGiuliano Pochini #define BX_ANALOG_IN 2 /* 2 */ 38*a2328d02SGiuliano Pochini #define BX_DIGITAL_IN 4 /* 0 */ 39*a2328d02SGiuliano Pochini #define BX_NUM 4 40*a2328d02SGiuliano Pochini 41*a2328d02SGiuliano Pochini 42*a2328d02SGiuliano Pochini #include <linux/delay.h> 43*a2328d02SGiuliano Pochini #include <linux/init.h> 44*a2328d02SGiuliano Pochini #include <linux/interrupt.h> 45*a2328d02SGiuliano Pochini #include <linux/pci.h> 46*a2328d02SGiuliano Pochini #include <linux/slab.h> 47*a2328d02SGiuliano Pochini #include <linux/moduleparam.h> 48*a2328d02SGiuliano Pochini #include <linux/firmware.h> 49*a2328d02SGiuliano Pochini #include <linux/io.h> 50*a2328d02SGiuliano Pochini #include <sound/core.h> 51*a2328d02SGiuliano Pochini #include <sound/info.h> 52*a2328d02SGiuliano Pochini #include <sound/control.h> 53*a2328d02SGiuliano Pochini #include <sound/tlv.h> 54*a2328d02SGiuliano Pochini #include <sound/pcm.h> 55*a2328d02SGiuliano Pochini #include <sound/pcm_params.h> 56*a2328d02SGiuliano Pochini #include <sound/asoundef.h> 57*a2328d02SGiuliano Pochini #include <sound/initval.h> 58*a2328d02SGiuliano Pochini #include <asm/atomic.h> 59*a2328d02SGiuliano Pochini #include "echoaudio.h" 60*a2328d02SGiuliano Pochini 61*a2328d02SGiuliano Pochini MODULE_FIRMWARE("ea/loader_dsp.fw"); 62*a2328d02SGiuliano Pochini MODULE_FIRMWARE("ea/indigo_iox_dsp.fw"); 63*a2328d02SGiuliano Pochini 64*a2328d02SGiuliano Pochini #define FW_361_LOADER 0 65*a2328d02SGiuliano Pochini #define FW_INDIGO_IOX_DSP 1 66*a2328d02SGiuliano Pochini 67*a2328d02SGiuliano Pochini static const struct firmware card_fw[] = { 68*a2328d02SGiuliano Pochini {0, "loader_dsp.fw"}, 69*a2328d02SGiuliano Pochini {0, "indigo_iox_dsp.fw"} 70*a2328d02SGiuliano Pochini }; 71*a2328d02SGiuliano Pochini 72*a2328d02SGiuliano Pochini static struct pci_device_id snd_echo_ids[] = { 73*a2328d02SGiuliano Pochini {0x1057, 0x3410, 0xECC0, 0x00D0, 0, 0, 0}, /* Indigo IOx */ 74*a2328d02SGiuliano Pochini {0,} 75*a2328d02SGiuliano Pochini }; 76*a2328d02SGiuliano Pochini 77*a2328d02SGiuliano Pochini static struct snd_pcm_hardware pcm_hardware_skel = { 78*a2328d02SGiuliano Pochini .info = SNDRV_PCM_INFO_MMAP | 79*a2328d02SGiuliano Pochini SNDRV_PCM_INFO_INTERLEAVED | 80*a2328d02SGiuliano Pochini SNDRV_PCM_INFO_BLOCK_TRANSFER | 81*a2328d02SGiuliano Pochini SNDRV_PCM_INFO_MMAP_VALID | 82*a2328d02SGiuliano Pochini SNDRV_PCM_INFO_PAUSE | 83*a2328d02SGiuliano Pochini SNDRV_PCM_INFO_SYNC_START, 84*a2328d02SGiuliano Pochini .formats = SNDRV_PCM_FMTBIT_U8 | 85*a2328d02SGiuliano Pochini SNDRV_PCM_FMTBIT_S16_LE | 86*a2328d02SGiuliano Pochini SNDRV_PCM_FMTBIT_S24_3LE | 87*a2328d02SGiuliano Pochini SNDRV_PCM_FMTBIT_S32_LE | 88*a2328d02SGiuliano Pochini SNDRV_PCM_FMTBIT_S32_BE, 89*a2328d02SGiuliano Pochini .rates = SNDRV_PCM_RATE_32000 | 90*a2328d02SGiuliano Pochini SNDRV_PCM_RATE_44100 | 91*a2328d02SGiuliano Pochini SNDRV_PCM_RATE_48000 | 92*a2328d02SGiuliano Pochini SNDRV_PCM_RATE_88200 | 93*a2328d02SGiuliano Pochini SNDRV_PCM_RATE_96000, 94*a2328d02SGiuliano Pochini .rate_min = 32000, 95*a2328d02SGiuliano Pochini .rate_max = 96000, 96*a2328d02SGiuliano Pochini .channels_min = 1, 97*a2328d02SGiuliano Pochini .channels_max = 8, 98*a2328d02SGiuliano Pochini .buffer_bytes_max = 262144, 99*a2328d02SGiuliano Pochini .period_bytes_min = 32, 100*a2328d02SGiuliano Pochini .period_bytes_max = 131072, 101*a2328d02SGiuliano Pochini .periods_min = 2, 102*a2328d02SGiuliano Pochini .periods_max = 220, 103*a2328d02SGiuliano Pochini }; 104*a2328d02SGiuliano Pochini 105*a2328d02SGiuliano Pochini #include "indigoiox_dsp.c" 106*a2328d02SGiuliano Pochini #include "indigo_express_dsp.c" 107*a2328d02SGiuliano Pochini #include "echoaudio_dsp.c" 108*a2328d02SGiuliano Pochini #include "echoaudio.c" 109*a2328d02SGiuliano Pochini 110