Home | History | Annotate | Download | only in sound
      1 /*
      2  *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
      3  *  Copyright (c) by Jaroslav Kysela <perex (at) 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 	spinlock_t lock;
    122 
    123 	int deleted;
    124 };
    125 
    126 struct dsp_task_descriptor {
    127 	char task_name[DSP_MAX_TASK_NAME];
    128 	int size;
    129 	u32 address;
    130 	int index;
    131 	u32 *data;
    132 };
    133 
    134 struct dsp_pcm_channel_descriptor {
    135 	int active;
    136 	int src_slot;
    137 	int pcm_slot;
    138 	u32 sample_rate;
    139 	u32 unlinked;
    140 	struct dsp_scb_descriptor * pcm_reader_scb;
    141 	struct dsp_scb_descriptor * src_scb;
    142 	struct dsp_scb_descriptor * mixer_scb;
    143 
    144 	void * private_data;
    145 };
    146 
    147 struct dsp_spos_instance {
    148 	struct dsp_symbol_desc symbol_table; /* currently availble loaded symbols in SP */
    149 
    150 	int nmodules;
    151 	struct dsp_module_desc * modules; /* modules loaded into SP */
    152 
    153 	struct dsp_segment_desc code;
    154 
    155 	/* Main PCM playback mixer */
    156 	struct dsp_scb_descriptor * master_mix_scb;
    157 	u16 dac_volume_right;
    158 	u16 dac_volume_left;
    159 
    160 	/* Rear/surround PCM playback mixer */
    161 	struct dsp_scb_descriptor * rear_mix_scb;
    162 
    163 	/* Center/LFE mixer */
    164 	struct dsp_scb_descriptor * center_lfe_mix_scb;
    165 
    166 	int npcm_channels;
    167 	int nsrc_scb;
    168 	struct dsp_pcm_channel_descriptor pcm_channels[DSP_MAX_PCM_CHANNELS];
    169 	int src_scb_slots[DSP_MAX_SRC_NR];
    170 
    171 	/* cache this symbols */
    172 	struct dsp_symbol_entry * null_algorithm; /* used by PCMreaderSCB's */
    173 	struct dsp_symbol_entry * s16_up;         /* used by SRCtaskSCB's */
    174 
    175 	/* proc fs */
    176 	struct snd_card *snd_card;
    177 	struct snd_info_entry * proc_dsp_dir;
    178 	struct snd_info_entry * proc_sym_info_entry;
    179 	struct snd_info_entry * proc_modules_info_entry;
    180 	struct snd_info_entry * proc_parameter_dump_info_entry;
    181 	struct snd_info_entry * proc_sample_dump_info_entry;
    182 
    183 	/* SCB's descriptors */
    184 	int nscb;
    185 	int scb_highest_frag_index;
    186 	struct dsp_scb_descriptor scbs[DSP_MAX_SCB_DESC];
    187 	struct snd_info_entry * proc_scb_info_entry;
    188 	struct dsp_scb_descriptor * the_null_scb;
    189 
    190 	/* Task's descriptors */
    191 	int ntask;
    192 	struct dsp_task_descriptor tasks[DSP_MAX_TASK_DESC];
    193 	struct snd_info_entry * proc_task_info_entry;
    194 
    195 	/* SPDIF status */
    196 	int spdif_status_out;
    197 	int spdif_status_in;
    198 	u16 spdif_input_volume_right;
    199 	u16 spdif_input_volume_left;
    200 	/* spdif channel status,
    201 	   left right and user validity bits */
    202 	unsigned int spdif_csuv_default;
    203 	unsigned int spdif_csuv_stream;
    204 
    205 	/* SPDIF input sample rate converter */
    206 	struct dsp_scb_descriptor * spdif_in_src;
    207 	/* SPDIF input asynch. receiver */
    208 	struct dsp_scb_descriptor * asynch_rx_scb;
    209 
    210 	/* Capture record mixer SCB */
    211 	struct dsp_scb_descriptor * record_mixer_scb;
    212 
    213 	/* CODEC input SCB */
    214 	struct dsp_scb_descriptor * codec_in_scb;
    215 
    216 	/* reference snooper */
    217 	struct dsp_scb_descriptor * ref_snoop_scb;
    218 
    219 	/* SPDIF output  PCM reference  */
    220 	struct dsp_scb_descriptor * spdif_pcm_input_scb;
    221 
    222 	/* asynch TX task */
    223 	struct dsp_scb_descriptor * asynch_tx_scb;
    224 
    225 	/* record sources */
    226 	struct dsp_scb_descriptor * pcm_input;
    227 	struct dsp_scb_descriptor * adc_input;
    228 
    229 	int spdif_in_sample_rate;
    230 };
    231 
    232 #endif /* __DSP_SPOS_H__ */
    233