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