1 /* 2 * The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards 3 * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 4 * 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * 20 */ 21 22 #ifndef __CS46XX_DSP_SPOS_H__ 23 #define __CS46XX_DSP_SPOS_H__ 24 25 #include "cs46xx_dsp_scb_types.h" 26 #include "cs46xx_dsp_task_types.h" 27 28 #define SYMBOL_CONSTANT 0x0 29 #define SYMBOL_SAMPLE 0x1 30 #define SYMBOL_PARAMETER 0x2 31 #define SYMBOL_CODE 0x3 32 33 #define SEGTYPE_SP_PROGRAM 0x00000001 34 #define SEGTYPE_SP_PARAMETER 0x00000002 35 #define SEGTYPE_SP_SAMPLE 0x00000003 36 #define SEGTYPE_SP_COEFFICIENT 0x00000004 37 38 #define DSP_SPOS_UU 0x0deadul /* unused */ 39 #define DSP_SPOS_DC 0x0badul /* don't care */ 40 #define DSP_SPOS_DC_DC 0x0bad0badul /* don't care */ 41 #define DSP_SPOS_UUUU 0xdeadc0edul /* unused */ 42 #define DSP_SPOS_UUHI 0xdeadul 43 #define DSP_SPOS_UULO 0xc0edul 44 #define DSP_SPOS_DCDC 0x0badf1d0ul /* don't care */ 45 #define DSP_SPOS_DCDCHI 0x0badul 46 #define DSP_SPOS_DCDCLO 0xf1d0ul 47 48 #define DSP_MAX_TASK_NAME 60 49 #define DSP_MAX_SYMBOL_NAME 100 50 #define DSP_MAX_SCB_NAME 60 51 #define DSP_MAX_SCB_DESC 200 52 #define DSP_MAX_TASK_DESC 50 53 54 #define DSP_MAX_PCM_CHANNELS 32 55 #define DSP_MAX_SRC_NR 14 56 57 #define DSP_PCM_MAIN_CHANNEL 1 58 #define DSP_PCM_REAR_CHANNEL 2 59 #define DSP_PCM_CENTER_LFE_CHANNEL 3 60 #define DSP_PCM_S71_CHANNEL 4 /* surround 7.1 */ 61 #define DSP_IEC958_CHANNEL 5 62 63 #define DSP_SPDIF_STATUS_OUTPUT_ENABLED 1 64 #define DSP_SPDIF_STATUS_PLAYBACK_OPEN 2 65 #define DSP_SPDIF_STATUS_HW_ENABLED 4 66 #define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED 8 67 68 struct dsp_symbol_entry { 69 u32 address; 70 char symbol_name[DSP_MAX_SYMBOL_NAME]; 71 int symbol_type; 72 73 /* initialized by driver */ 74 struct dsp_module_desc * module; 75 int deleted; 76 }; 77 78 struct dsp_symbol_desc { 79 int nsymbols; 80 81 struct dsp_symbol_entry *symbols; 82 83 /* initialized by driver */ 84 int highest_frag_index; 85 }; 86 87 struct dsp_segment_desc { 88 int segment_type; 89 u32 offset; 90 u32 size; 91 u32 * data; 92 }; 93 94 struct dsp_module_desc { 95 char * module_name; 96 struct dsp_symbol_desc symbol_table; 97 int nsegments; 98 struct dsp_segment_desc * segments; 99 100 /* initialized by driver */ 101 u32 overlay_begin_address; 102 u32 load_address; 103 int nfixups; 104 }; 105 106 struct dsp_scb_descriptor { 107 char scb_name[DSP_MAX_SCB_NAME]; 108 u32 address; 109 int index; 110 u32 *data; 111 112 struct dsp_scb_descriptor * sub_list_ptr; 113 struct dsp_scb_descriptor * next_scb_ptr; 114 struct dsp_scb_descriptor * parent_scb_ptr; 115 116 struct dsp_symbol_entry * task_entry; 117 struct dsp_symbol_entry * scb_symbol; 118 119 struct snd_info_entry *proc_info; 120 int ref_count; 121 122 u16 volume[2]; 123 unsigned int deleted :1; 124 unsigned int updated :1; 125 unsigned int volume_set :1; 126 }; 127 128 struct dsp_task_descriptor { 129 char task_name[DSP_MAX_TASK_NAME]; 130 int size; 131 u32 address; 132 int index; 133 u32 *data; 134 }; 135 136 struct dsp_pcm_channel_descriptor { 137 int active; 138 int src_slot; 139 int pcm_slot; 140 u32 sample_rate; 141 u32 unlinked; 142 struct dsp_scb_descriptor * pcm_reader_scb; 143 struct dsp_scb_descriptor * src_scb; 144 struct dsp_scb_descriptor * mixer_scb; 145 146 void * private_data; 147 }; 148 149 struct dsp_spos_instance { 150 struct dsp_symbol_desc symbol_table; /* currently available loaded symbols in SP */ 151 152 int nmodules; 153 struct dsp_module_desc * modules; /* modules loaded into SP */ 154 155 struct dsp_segment_desc code; 156 157 /* Main PCM playback mixer */ 158 struct dsp_scb_descriptor * master_mix_scb; 159 u16 dac_volume_right; 160 u16 dac_volume_left; 161 162 /* Rear/surround PCM playback mixer */ 163 struct dsp_scb_descriptor * rear_mix_scb; 164 165 /* Center/LFE mixer */ 166 struct dsp_scb_descriptor * center_lfe_mix_scb; 167 168 int npcm_channels; 169 int nsrc_scb; 170 struct dsp_pcm_channel_descriptor pcm_channels[DSP_MAX_PCM_CHANNELS]; 171 int src_scb_slots[DSP_MAX_SRC_NR]; 172 173 /* cache this symbols */ 174 struct dsp_symbol_entry * null_algorithm; /* used by PCMreaderSCB's */ 175 struct dsp_symbol_entry * s16_up; /* used by SRCtaskSCB's */ 176 177 /* proc fs */ 178 struct snd_card *snd_card; 179 struct snd_info_entry * proc_dsp_dir; 180 struct snd_info_entry * proc_sym_info_entry; 181 struct snd_info_entry * proc_modules_info_entry; 182 struct snd_info_entry * proc_parameter_dump_info_entry; 183 struct snd_info_entry * proc_sample_dump_info_entry; 184 185 /* SCB's descriptors */ 186 int nscb; 187 int scb_highest_frag_index; 188 struct dsp_scb_descriptor scbs[DSP_MAX_SCB_DESC]; 189 struct snd_info_entry * proc_scb_info_entry; 190 struct dsp_scb_descriptor * the_null_scb; 191 192 /* Task's descriptors */ 193 int ntask; 194 struct dsp_task_descriptor tasks[DSP_MAX_TASK_DESC]; 195 struct snd_info_entry * proc_task_info_entry; 196 197 /* SPDIF status */ 198 int spdif_status_out; 199 int spdif_status_in; 200 u16 spdif_input_volume_right; 201 u16 spdif_input_volume_left; 202 /* spdif channel status, 203 left right and user validity bits */ 204 unsigned int spdif_csuv_default; 205 unsigned int spdif_csuv_stream; 206 207 /* SPDIF input sample rate converter */ 208 struct dsp_scb_descriptor * spdif_in_src; 209 /* SPDIF input asynch. receiver */ 210 struct dsp_scb_descriptor * asynch_rx_scb; 211 212 /* Capture record mixer SCB */ 213 struct dsp_scb_descriptor * record_mixer_scb; 214 215 /* CODEC input SCB */ 216 struct dsp_scb_descriptor * codec_in_scb; 217 218 /* reference snooper */ 219 struct dsp_scb_descriptor * ref_snoop_scb; 220 221 /* SPDIF output PCM reference */ 222 struct dsp_scb_descriptor * spdif_pcm_input_scb; 223 224 /* asynch TX task */ 225 struct dsp_scb_descriptor * asynch_tx_scb; 226 227 /* record sources */ 228 struct dsp_scb_descriptor * pcm_input; 229 struct dsp_scb_descriptor * adc_input; 230 231 int spdif_in_sample_rate; 232 }; 233 234 #endif /* __DSP_SPOS_H__ */ 235