Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
0004  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
0005  */
0006 
0007 #ifndef __CS46XX_DSP_SPOS_H__
0008 #define __CS46XX_DSP_SPOS_H__
0009 
0010 #include "cs46xx_dsp_scb_types.h"
0011 #include "cs46xx_dsp_task_types.h"
0012 
0013 #define SYMBOL_CONSTANT  0x0
0014 #define SYMBOL_SAMPLE    0x1
0015 #define SYMBOL_PARAMETER 0x2
0016 #define SYMBOL_CODE      0x3
0017 
0018 #define SEGTYPE_SP_PROGRAM              0x00000001
0019 #define SEGTYPE_SP_PARAMETER            0x00000002
0020 #define SEGTYPE_SP_SAMPLE               0x00000003
0021 #define SEGTYPE_SP_COEFFICIENT          0x00000004
0022 
0023 #define DSP_SPOS_UU      0x0deadul     /* unused */
0024 #define DSP_SPOS_DC      0x0badul      /* don't care */
0025 #define DSP_SPOS_DC_DC   0x0bad0badul  /* don't care */
0026 #define DSP_SPOS_UUUU    0xdeadc0edul  /* unused */
0027 #define DSP_SPOS_UUHI    0xdeadul
0028 #define DSP_SPOS_UULO    0xc0edul
0029 #define DSP_SPOS_DCDC    0x0badf1d0ul  /* don't care */
0030 #define DSP_SPOS_DCDCHI  0x0badul
0031 #define DSP_SPOS_DCDCLO  0xf1d0ul
0032 
0033 #define DSP_MAX_TASK_NAME   60
0034 #define DSP_MAX_SYMBOL_NAME 100
0035 #define DSP_MAX_SCB_NAME    60
0036 #define DSP_MAX_SCB_DESC    200
0037 #define DSP_MAX_TASK_DESC   50
0038 
0039 #define DSP_MAX_PCM_CHANNELS 32
0040 #define DSP_MAX_SRC_NR       14
0041 
0042 #define DSP_PCM_MAIN_CHANNEL        1
0043 #define DSP_PCM_REAR_CHANNEL        2
0044 #define DSP_PCM_CENTER_LFE_CHANNEL  3
0045 #define DSP_PCM_S71_CHANNEL         4 /* surround 7.1 */
0046 #define DSP_IEC958_CHANNEL          5
0047 
0048 #define DSP_SPDIF_STATUS_OUTPUT_ENABLED       1
0049 #define DSP_SPDIF_STATUS_PLAYBACK_OPEN        2
0050 #define DSP_SPDIF_STATUS_HW_ENABLED           4
0051 #define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED   8
0052 
0053 struct dsp_symbol_entry {
0054     u32 address;
0055     char symbol_name[DSP_MAX_SYMBOL_NAME];
0056     int symbol_type;
0057 
0058     /* initialized by driver */
0059     struct dsp_module_desc * module;
0060     int deleted;
0061 };
0062 
0063 struct dsp_symbol_desc {
0064     int nsymbols;
0065 
0066     struct dsp_symbol_entry *symbols;
0067 
0068     /* initialized by driver */
0069     int highest_frag_index;
0070 };
0071 
0072 struct dsp_segment_desc {
0073     int segment_type;
0074     u32 offset;
0075     u32 size;
0076     u32 * data;
0077 };
0078 
0079 struct dsp_module_desc {
0080     char * module_name;
0081     struct dsp_symbol_desc symbol_table;
0082     int nsegments;
0083     struct dsp_segment_desc * segments;
0084 
0085     /* initialized by driver */
0086     u32 overlay_begin_address;
0087     u32 load_address;
0088     int nfixups;
0089 };
0090 
0091 struct dsp_scb_descriptor {
0092     char scb_name[DSP_MAX_SCB_NAME];
0093     u32 address;
0094     int index;
0095     u32 *data;
0096 
0097     struct dsp_scb_descriptor * sub_list_ptr;
0098     struct dsp_scb_descriptor * next_scb_ptr;
0099     struct dsp_scb_descriptor * parent_scb_ptr;
0100 
0101     struct dsp_symbol_entry * task_entry;
0102     struct dsp_symbol_entry * scb_symbol;
0103 
0104     struct snd_info_entry *proc_info;
0105     int ref_count;
0106 
0107     u16 volume[2];
0108     unsigned int deleted :1;
0109     unsigned int updated :1;
0110     unsigned int volume_set :1;
0111 };
0112 
0113 struct dsp_task_descriptor {
0114     char task_name[DSP_MAX_TASK_NAME];
0115     int size;
0116     u32 address;
0117     int index;
0118     u32 *data;
0119 };
0120 
0121 struct dsp_pcm_channel_descriptor {
0122     int active;
0123     int src_slot;
0124     int pcm_slot;
0125     u32 sample_rate;
0126     u32 unlinked;
0127     struct dsp_scb_descriptor * pcm_reader_scb;
0128     struct dsp_scb_descriptor * src_scb;
0129     struct dsp_scb_descriptor * mixer_scb;
0130 
0131     void * private_data;
0132 };
0133 
0134 struct dsp_spos_instance {
0135     struct dsp_symbol_desc symbol_table; /* currently available loaded symbols in SP */
0136 
0137     int nmodules;
0138     struct dsp_module_desc * modules; /* modules loaded into SP */
0139 
0140     struct dsp_segment_desc code;
0141 
0142     /* Main PCM playback mixer */
0143     struct dsp_scb_descriptor * master_mix_scb;
0144     u16 dac_volume_right;
0145     u16 dac_volume_left;
0146 
0147     /* Rear/surround PCM playback mixer */
0148     struct dsp_scb_descriptor * rear_mix_scb;
0149 
0150     /* Center/LFE mixer */
0151     struct dsp_scb_descriptor * center_lfe_mix_scb;
0152 
0153     int npcm_channels;
0154     int nsrc_scb;
0155     struct dsp_pcm_channel_descriptor pcm_channels[DSP_MAX_PCM_CHANNELS];
0156     int src_scb_slots[DSP_MAX_SRC_NR];
0157 
0158     /* cache this symbols */
0159     struct dsp_symbol_entry * null_algorithm; /* used by PCMreaderSCB's */
0160     struct dsp_symbol_entry * s16_up;         /* used by SRCtaskSCB's */
0161 
0162     /* proc fs */  
0163     struct snd_card *snd_card;
0164     struct snd_info_entry * proc_dsp_dir;
0165 
0166     /* SCB's descriptors */
0167     int nscb;
0168     int scb_highest_frag_index;
0169     struct dsp_scb_descriptor scbs[DSP_MAX_SCB_DESC];
0170     struct dsp_scb_descriptor * the_null_scb;
0171 
0172     /* Task's descriptors */
0173     int ntask;
0174     struct dsp_task_descriptor tasks[DSP_MAX_TASK_DESC];
0175 
0176     /* SPDIF status */
0177     int spdif_status_out;
0178     int spdif_status_in;
0179     u16 spdif_input_volume_right;
0180     u16 spdif_input_volume_left;
0181     /* spdif channel status,
0182        left right and user validity bits */
0183     unsigned int spdif_csuv_default;
0184     unsigned int spdif_csuv_stream;
0185 
0186     /* SPDIF input sample rate converter */
0187     struct dsp_scb_descriptor * spdif_in_src;
0188     /* SPDIF input asynch. receiver */
0189     struct dsp_scb_descriptor * asynch_rx_scb;
0190 
0191     /* Capture record mixer SCB */
0192     struct dsp_scb_descriptor * record_mixer_scb;
0193     
0194     /* CODEC input SCB */
0195     struct dsp_scb_descriptor * codec_in_scb;
0196 
0197     /* reference snooper */
0198     struct dsp_scb_descriptor * ref_snoop_scb;
0199 
0200     /* SPDIF output  PCM reference  */
0201     struct dsp_scb_descriptor * spdif_pcm_input_scb;
0202 
0203     /* asynch TX task */
0204     struct dsp_scb_descriptor * asynch_tx_scb;
0205 
0206     /* record sources */
0207     struct dsp_scb_descriptor * pcm_input;
0208     struct dsp_scb_descriptor * adc_input;
0209 
0210     int spdif_in_sample_rate;
0211 };
0212 
0213 #endif /* __DSP_SPOS_H__ */