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