2005-04-17 02:20:36 +04:00
/*
* The driver for the Cirrus Logic ' s Sound Fusion CS46XX based soundcards
2007-10-15 11:50:19 +04:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz >
2005-04-17 02:20:36 +04:00
*
*
* 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
*
*/
# ifndef __CS46XX_DSP_SPOS_H__
# define __CS46XX_DSP_SPOS_H__
# include "cs46xx_dsp_scb_types.h"
# include "cs46xx_dsp_task_types.h"
# define SYMBOL_CONSTANT 0x0
# define SYMBOL_SAMPLE 0x1
# define SYMBOL_PARAMETER 0x2
# define SYMBOL_CODE 0x3
# define SEGTYPE_SP_PROGRAM 0x00000001
# define SEGTYPE_SP_PARAMETER 0x00000002
# define SEGTYPE_SP_SAMPLE 0x00000003
# define SEGTYPE_SP_COEFFICIENT 0x00000004
# define DSP_SPOS_UU 0x0deadul /* unused */
# define DSP_SPOS_DC 0x0badul /* don't care */
# define DSP_SPOS_DC_DC 0x0bad0badul /* don't care */
# define DSP_SPOS_UUUU 0xdeadc0edul /* unused */
# define DSP_SPOS_UUHI 0xdeadul
# define DSP_SPOS_UULO 0xc0edul
# define DSP_SPOS_DCDC 0x0badf1d0ul /* don't care */
# define DSP_SPOS_DCDCHI 0x0badul
# define DSP_SPOS_DCDCLO 0xf1d0ul
# define DSP_MAX_TASK_NAME 60
# define DSP_MAX_SYMBOL_NAME 100
# define DSP_MAX_SCB_NAME 60
# define DSP_MAX_SCB_DESC 200
# define DSP_MAX_TASK_DESC 50
# define DSP_MAX_PCM_CHANNELS 32
# define DSP_MAX_SRC_NR 14
# define DSP_PCM_MAIN_CHANNEL 1
# define DSP_PCM_REAR_CHANNEL 2
# define DSP_PCM_CENTER_LFE_CHANNEL 3
# define DSP_PCM_S71_CHANNEL 4 /* surround 7.1 */
# define DSP_IEC958_CHANNEL 5
# define DSP_SPDIF_STATUS_OUTPUT_ENABLED 1
# define DSP_SPDIF_STATUS_PLAYBACK_OPEN 2
# define DSP_SPDIF_STATUS_HW_ENABLED 4
# define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED 8
2005-11-17 16:48:14 +03:00
struct dsp_symbol_entry {
2005-04-17 02:20:36 +04:00
u32 address ;
char symbol_name [ DSP_MAX_SYMBOL_NAME ] ;
int symbol_type ;
/* initialized by driver */
2005-11-17 16:48:14 +03:00
struct dsp_module_desc * module ;
2005-04-17 02:20:36 +04:00
int deleted ;
2005-11-17 16:48:14 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_symbol_desc {
2005-04-17 02:20:36 +04:00
int nsymbols ;
2005-11-17 16:48:14 +03:00
struct dsp_symbol_entry * symbols ;
2005-04-17 02:20:36 +04:00
/* initialized by driver */
int highest_frag_index ;
2005-11-17 16:48:14 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_segment_desc {
2005-04-17 02:20:36 +04:00
int segment_type ;
u32 offset ;
u32 size ;
u32 * data ;
2005-11-17 16:48:14 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_module_desc {
2005-04-17 02:20:36 +04:00
char * module_name ;
2005-11-17 16:48:14 +03:00
struct dsp_symbol_desc symbol_table ;
2005-04-17 02:20:36 +04:00
int nsegments ;
2005-11-17 16:48:14 +03:00
struct dsp_segment_desc * segments ;
2005-04-17 02:20:36 +04:00
/* initialized by driver */
u32 overlay_begin_address ;
u32 load_address ;
int nfixups ;
2005-11-17 16:48:14 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor {
2005-04-17 02:20:36 +04:00
char scb_name [ DSP_MAX_SCB_NAME ] ;
u32 address ;
int index ;
2007-07-19 13:23:21 +04:00
u32 * data ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * sub_list_ptr ;
struct dsp_scb_descriptor * next_scb_ptr ;
struct dsp_scb_descriptor * parent_scb_ptr ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_symbol_entry * task_entry ;
struct dsp_symbol_entry * scb_symbol ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct snd_info_entry * proc_info ;
2005-04-17 02:20:36 +04:00
int ref_count ;
spinlock_t lock ;
int deleted ;
2005-11-17 16:48:14 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_task_descriptor {
2005-04-17 02:20:36 +04:00
char task_name [ DSP_MAX_TASK_NAME ] ;
int size ;
u32 address ;
int index ;
2007-07-19 13:23:21 +04:00
u32 * data ;
2005-11-17 16:48:14 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_pcm_channel_descriptor {
2005-04-17 02:20:36 +04:00
int active ;
int src_slot ;
int pcm_slot ;
u32 sample_rate ;
u32 unlinked ;
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * pcm_reader_scb ;
struct dsp_scb_descriptor * src_scb ;
struct dsp_scb_descriptor * mixer_scb ;
2005-04-17 02:20:36 +04:00
void * private_data ;
2005-11-17 16:48:14 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_spos_instance {
struct dsp_symbol_desc symbol_table ; /* currently availble loaded symbols in SP */
2005-04-17 02:20:36 +04:00
int nmodules ;
2005-11-17 16:48:14 +03:00
struct dsp_module_desc * modules ; /* modules loaded into SP */
2005-04-17 02:20:36 +04:00
2005-11-17 16:48:14 +03:00
struct dsp_segment_desc code ;
2005-04-17 02:20:36 +04:00
/* Main PCM playback mixer */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * master_mix_scb ;
2005-04-17 02:20:36 +04:00
u16 dac_volume_right ;
u16 dac_volume_left ;
/* Rear/surround PCM playback mixer */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * rear_mix_scb ;
2005-04-17 02:20:36 +04:00
/* Center/LFE mixer */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * center_lfe_mix_scb ;
2005-04-17 02:20:36 +04:00
int npcm_channels ;
int nsrc_scb ;
2005-11-17 16:48:14 +03:00
struct dsp_pcm_channel_descriptor pcm_channels [ DSP_MAX_PCM_CHANNELS ] ;
2005-04-17 02:20:36 +04:00
int src_scb_slots [ DSP_MAX_SRC_NR ] ;
/* cache this symbols */
2005-11-17 16:48:14 +03:00
struct dsp_symbol_entry * null_algorithm ; /* used by PCMreaderSCB's */
struct dsp_symbol_entry * s16_up ; /* used by SRCtaskSCB's */
2005-04-17 02:20:36 +04:00
/* proc fs */
2005-11-17 16:48:14 +03:00
struct snd_card * snd_card ;
struct snd_info_entry * proc_dsp_dir ;
struct snd_info_entry * proc_sym_info_entry ;
struct snd_info_entry * proc_modules_info_entry ;
struct snd_info_entry * proc_parameter_dump_info_entry ;
struct snd_info_entry * proc_sample_dump_info_entry ;
2005-04-17 02:20:36 +04:00
/* SCB's descriptors */
int nscb ;
int scb_highest_frag_index ;
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor scbs [ DSP_MAX_SCB_DESC ] ;
struct snd_info_entry * proc_scb_info_entry ;
struct dsp_scb_descriptor * the_null_scb ;
2005-04-17 02:20:36 +04:00
/* Task's descriptors */
int ntask ;
2005-11-17 16:48:14 +03:00
struct dsp_task_descriptor tasks [ DSP_MAX_TASK_DESC ] ;
struct snd_info_entry * proc_task_info_entry ;
2005-04-17 02:20:36 +04:00
/* SPDIF status */
int spdif_status_out ;
int spdif_status_in ;
u16 spdif_input_volume_right ;
u16 spdif_input_volume_left ;
/* spdif channel status,
left right and user validity bits */
unsigned int spdif_csuv_default ;
unsigned int spdif_csuv_stream ;
/* SPDIF input sample rate converter */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * spdif_in_src ;
2005-04-17 02:20:36 +04:00
/* SPDIF input asynch. receiver */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * asynch_rx_scb ;
2005-04-17 02:20:36 +04:00
/* Capture record mixer SCB */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * record_mixer_scb ;
2005-04-17 02:20:36 +04:00
/* CODEC input SCB */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * codec_in_scb ;
2005-04-17 02:20:36 +04:00
/* reference snooper */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * ref_snoop_scb ;
2005-04-17 02:20:36 +04:00
/* SPDIF output PCM reference */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * spdif_pcm_input_scb ;
2005-04-17 02:20:36 +04:00
/* asynch TX task */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * asynch_tx_scb ;
2005-04-17 02:20:36 +04:00
/* record sources */
2005-11-17 16:48:14 +03:00
struct dsp_scb_descriptor * pcm_input ;
struct dsp_scb_descriptor * adc_input ;
2005-04-17 02:20:36 +04:00
int spdif_in_sample_rate ;
2005-11-17 16:48:14 +03:00
} ;
2005-04-17 02:20:36 +04:00
# endif /* __DSP_SPOS_H__ */