update rccd2 for end-system integraton
[tas2555sw-android/tas2555-util-stereo.git] / rccd2 / include / aic3xxx_cfw.h
1 /**
2 * \file Codec Firmware Declarations
3 */
4 #ifndef CFW_FIRMWARE_H_
5 #define CFW_FIRMWARE_H_
7 /** \defgroup bt Basic Types */
8 /* @{ */
9 #ifndef AIC3XXX_CFW_HOST_BLD
10 #include <asm-generic/int-ll64.h>
11 #else
12 //typedef unsigned char u8;
13 //typedef unsigned short int u16;
14 //typedef unsigned long  int u32;
15 //typedef unsigned int u32;
16 #endif
17 //typedef signed char i8;
18 //typedef signed short int i16;
19 //typedef signed long  int i32;
21 #define CFW_FW_MAGIC 0xC0D1F1ED
22 /** \defgroup pd Arbitrary Limitations */
23 /* @{ */
24 #ifndef CFW_MAX_ID
25 # define CFW_MAX_ID (64) /**<Max length of string identifies*/
26 # define CFW_MAX_VARS (256) /**<Number of "variables" alive at the*/
27 /**<same time in an acx file*/
28 #endif
29 /* @} */
30 /** \defgroup st Enums, Flags, Macros and Supporting Types */
31 /* @{ */
32 /**
33 * Device Family Identifier
34 *
35 */
36 enum __attribute__((__packed__)) cfw_dfamily{
37     CFW_DFM_TYPE_A,
38     CFW_DFM_TYPE_B,
39     CFW_DFM_TYPE_C
40 };
41 /**
42 * Device Identifier
43 *
44 */
45 enum __attribute__((__packed__)) cfw_device{
46     CFW_DEV_DAC3120,
47     CFW_DEV_DAC3100,
48     CFW_DEV_AIC3120,
49     CFW_DEV_AIC3100,
50     CFW_DEV_AIC3110,
51     CFW_DEV_AIC3111,
52     CFW_DEV_AIC36,
53     CFW_DEV_AIC3206,
54     CFW_DEV_AIC3204,
55     CFW_DEV_AIC3254,
56     CFW_DEV_AIC3256,
57     CFW_DEV_AIC3253,
58     CFW_DEV_AIC3212,
59     CFW_DEV_AIC3262,
60     CFW_DEV_AIC3017,
61     CFW_DEV_AIC3008,
62     CFW_DEV_AIC3266,
63     CFW_DEV_AIC3285,
64 };
65 /**
66 * Transition Sequence Identifier
67 *
68 */
69 enum cfw_transition_t {
70     CFW_TRN_INIT,
71     CFW_TRN_RESUME,
72     CFW_TRN_NEUTRAL,
73     CFW_TRN_A_MUTE,
74     CFW_TRN_D_MUTE,
75     CFW_TRN_AD_MUTE,
76     CFW_TRN_A_UNMUTE,
77     CFW_TRN_D_UNMUTE,
78     CFW_TRN_AD_UNMUTE,
79     CFW_TRN_SUSPEND,
80     CFW_TRN_EXIT,
81     CFW_TRN_N
82 };
83 #ifndef __cplusplus
84 static const char *const cfw_transition_id[] = {
85     [CFW_TRN_INIT] = "INIT",
86     [CFW_TRN_RESUME] = "RESUME",
87     [CFW_TRN_NEUTRAL] = "NEUTRAL",
88     [CFW_TRN_A_MUTE] = "A_MUTE",
89     [CFW_TRN_D_MUTE] = "D_MUTE",
90     [CFW_TRN_AD_MUTE] = "AD_MUTE",
91     [CFW_TRN_A_UNMUTE] = "A_UNMUTE",
92     [CFW_TRN_D_UNMUTE] = "D_UNMUTE",
93     [CFW_TRN_AD_UNMUTE] = "AD_UNMUTE",
94     [CFW_TRN_SUSPEND] = "SUSPEND",
95     [CFW_TRN_EXIT] = "EXIT",
96 };
97 #endif
98 /* @} */
99 /** \defgroup ds Data Structures */
100 /* @{ */
101 /**
102 * CFW Command
103 * These commands do not appear in the register
104 * set of the device.
105 */
106 enum __attribute__((__packed__)) cfw_cmd_id{
107     CFW_CMD_NOP = 0x80,
108     CFW_CMD_DELAY,
109     CFW_CMD_UPDTBITS,
110     CFW_CMD_WAITBITS,
111     CFW_CMD_LOCK,
112     CFW_CMD_BURST,
113     CFW_CMD_RBURST,
114     CFW_CMD_LOAD_VAR_IM,
115     CFW_CMD_LOAD_VAR_ID,
116     CFW_CMD_STORE_VAR,
117     CFW_CMD_COND,
118     CFW_CMD_BRANCH,
119     CFW_CMD_BRANCH_IM,
120     CFW_CMD_BRANCH_ID,
121     CFW_CMD_PRINT,
122     CFW_CMD_OP_ADD = 0xC0,
123     CFW_CMD_OP_SUB,
124     CFW_CMD_OP_MUL,
125     CFW_CMD_OP_DIV,
126     CFW_CMD_OP_AND,
127     CFW_CMD_OP_OR,
128     CFW_CMD_OP_SHL,
129     CFW_CMD_OP_SHR,
130     CFW_CMD_OP_RR,
131     CFW_CMD_OP_XOR,
132     CFW_CMD_OP_NOT,
133     CFW_CMD_OP_LNOT,
134 };
135 /**
136 * CFW Delay
137 * Used for the cmd command delay
138 * Has one parameter of delay time in ms
139 */
140 struct cfw_cmd_delay {
141     u16 delay;
142     u8 cid;
143     //enum cfw_cmd_id cid;
144     u8 delay_fine;
145 };
146 /**
147 * CFW Lock
148 * Take codec mutex to avoid clashing with DAPM operations
149 */
150 struct cfw_cmd_lock {
151     u16 lock;
152     u8 cid;
153     //enum cfw_cmd_id cid;
154     u8 unused;
155 };
156 /**
157 * CFW UPDTBITS, WAITBITS, CHKBITS
158 * Both these cmd commands have same arguments
159 * cid will be used to specify which command it is
160 * has parameters of book, page, offset and mask
161 */
162 struct cfw_cmd_bitop {
163     u16 unused1;
164     u8 cid;
165     //enum cfw_cmd_id cid;
166     u8 mask;
167 };
168 /**
169 * CFW CMD Burst header
170 * Burst writes inside command array
171 * Followed by burst address, first byte
172 */
173 struct cfw_cmd_bhdr {
174     u16 len;
175     u8 cid;
176     //enum cfw_cmd_id cid;
177     u8 unused;
178 };
179 /**
180 * CFW CMD Burst
181 * Burst writes inside command array
182 * Followed by data to the extent indicated in previous len
183 * Can be safely cast to cfw_burst
184 */
185 struct cfw_cmd_burst {
186 //      u8 slave_id;
187     u8 book;
188     u8 page;
189     u8 offset;
190     u8 data[1];
191 };
192 #define CFW_CMD_BURST_LEN(n) (2 + ((n) - 1 + 3)/4)
193 /**
194 * CFW CMD Scratch register
195 * For load
196 * if (svar != dvar)
197 * dvar = setbits(svar, mask) // Ignore reg
198 * else
199 * dvar = setbits(reg, mask)
200 * For store
201 * if (svar != dvar)
202 * reg = setbits(svar, dvar)
203 * else
204 * reg = setbits(svar, mask)
206 */
207 struct cfw_cmd_ldst {
208     u8 dvar;
209     u8 svar;
210     u8 cid;
211     //enum cfw_cmd_id cid;
212     u8 mask;
213 };
214 /**
215 * CFW CMD Conditional
216 * May only precede branch. Followed by nmatch+1 jump
217 * instructions
218 * cond = svar&mask
219 * At each of the following nmatch+1 branch command
220 * if (cond == match)
221 * take the branch
222 */
223 struct cfw_cmd_cond {
224     u8 svar;
225     u8 nmatch;
226     u8 cid;
227     //enum cfw_cmd_id cid;
228     u8 mask;
229 };
230 #define CFW_CMD_COND_LEN(nm) (1 + ((nm)+1))
231 /**
232 * CFW CMD Goto
233 * For branch, break, continue and stop
234 */
235 struct cfw_cmd_branch {
236     u16 address;
237     u8 cid;
238     //enum cfw_cmd_id cid;
239     u8 match;
240 };
241 /**
242 * CFW Debug print
243 * For diagnostics
244 */
245 struct cfw_cmd_print {
246     u8 fmtlen;
247     u8 nargs;
248     u8 cid;
249     //enum cfw_cmd_id cid;
250     char fmt[1];
251 };
252 #define CFW_CMD_PRINT_LEN(p) (1 + ((p).fmtlen/4) + (((p).nargs + 3)/4))
253 #define CFW_CMD_PRINT_ARG(p) (1 + ((p).fmtlen/4))
254 /**
255 * CFW Arithmetic and logical operations
256 * Bit 5 indicates if op1 is indirect
257 * Bit 6 indicates if op2 is indirect
258 */
259 struct cfw_cmd_op {
260     u8 op1;
261     u8 op2;
262     u8 cid;
263     //enum cfw_cmd_id cid;
264     u8 dst;
265 };
266 #define CFW_CMD_OP1_ID (1u<<5)
267 #define CFW_CMD_OP2_ID (1u<<4)
268 #define CFW_CMD_OP_START CFW_CMD_OP_ADD
269 #define CFW_CMD_OP_END (CFW_CMD_OP_LNOT|CFW_CMD_OP1_ID|CFW_CMD_OP2_ID)
270 #define CFW_CMD_OP_IS_UNARY(x) \
271     (((x) == CFW_CMD_OP_NOT) || ((x) == CFW_CMD_OP_LNOT))
272 /**
273 * CFW Register
275 * A single reg write
277 */
278 union cfw_register {
279     struct {
280         //      u8 slave_id;
281         u8 book;
282         u8 page;
283         u8 offset;
284         u8 data;
285     };
286     u32 bpod;
287 };
288 /**
289 * CFW Command
291 * Can be a either a
292 * -# single register write, or
293 * -# command
295 */
296 union cfw_cmd {
297     struct {
298         u16 unused1;
299         u8 cid;
300         //enum cfw_cmd_id cid;
301         u8 unused2;
302     };
303     union cfw_register reg;
304     struct cfw_cmd_delay delay;
305     struct cfw_cmd_lock lock;
306     struct cfw_cmd_bitop bitop;
307     struct cfw_cmd_bhdr bhdr;
308     struct cfw_cmd_burst burst;
309     struct cfw_cmd_ldst ldst;
310     struct cfw_cmd_cond cond;
311     struct cfw_cmd_branch branch;
312     struct cfw_cmd_print print;
313     u8 print_arg[4];
314     struct cfw_cmd_op op;
315 };
316 #define CFW_REG_IS_CMD(x) ((x).cid >= CFW_CMD_DELAY)
317 /**
318 * CFW Block Type
320 * Block identifier
322 */
323 enum __attribute__((__packed__)) cfw_block_t{
324     CFW_BLOCK_SYSTEM_PRE,
325     CFW_BLOCK_A_INST,
326     CFW_BLOCK_A_A_COEF,
327     CFW_BLOCK_A_B_COEF,
328     CFW_BLOCK_A_F_COEF,
329     CFW_BLOCK_D_INST,
330     CFW_BLOCK_D_A1_COEF,
331     CFW_BLOCK_D_B1_COEF,
332     CFW_BLOCK_D_A2_COEF,
333     CFW_BLOCK_D_B2_COEF,
334     CFW_BLOCK_D_F_COEF,
335     CFW_BLOCK_SYSTEM_POST,
336     CFW_BLOCK_N,
337     CFW_BLOCK_INVALID,
338 };
339 #define CFW_BLOCK_D_A_COEF CFW_BLOCK_D_A1_COEF
340 #define CFW_BLOCK_D_B_COEF CFW_BLOCK_D_B1_COEF
342 /**
343  * CFW Register
344  *
345  * A single reg write
346  *
347  */
348 union aic_register {
349         struct {
350                 u8 book;
351                 u8 page;
352                 u8 offset;
353                 u8 data;
354         };
355         u32 bpod;
356 };
358 /**
359 * CFW Block
361 * A block of logically grouped sequences/commands/cmd-commands
363 */
364 struct cfw_block {
365     u8 type;
366     //enum cfw_block_t type;
367     int ncmds;
368     union cfw_cmd cmd[];
369 };
370 #define CFW_BLOCK_SIZE(ncmds) (sizeof(struct cfw_block) + \
371     ((ncmds)*sizeof(union cfw_cmd)))
372 /**
373 * CFW Image
375 * A downloadable image
376 */
377 struct cfw_image {
378     char name[CFW_MAX_ID]; /**< Name of the pfw/overlay/configuration*/
379     char *desc; /**< User string*/
380     int mute_flags;
381     struct cfw_block *block[CFW_BLOCK_N];
382 };
383 /**
384 * CFW PLL
386 * PLL configuration sequence and match critirea
387 */
388 struct cfw_pll {
389     char name[CFW_MAX_ID]; /**< Name of the PLL sequence*/
390     char *desc; /**< User string*/
391     struct cfw_block *seq;
392 };
393 /**
394 * CFW Control
396 * Run-time control for a process flow
397 */
398 struct cfw_control {
399     char name[CFW_MAX_ID]; /**< Control identifier*/
400     char *desc; /**< User string*/
401     int mute_flags;
402     int min; /**< Min value of control (*100)*/
403     int max; /**< Max value of control (*100)*/
404     int step; /**< Control step size (*100)*/
405     int imax; /**< Max index into controls array*/
406     int ireset; /**< Reset control to defaults*/
407     int icur; /**< Last value set*/
408     struct cfw_block **output; /**< Array of sequences to send*/
409 };
410 /**
411 * Process flow
413 * Complete description of a process flow
414 */
415 struct cfw_pfw {
416     char name[CFW_MAX_ID]; /**< Name of the process flow*/
417     char *desc; /**< User string*/
418     u32 version;
419     u8 prb_a;
420     u8 prb_d;
421     int novly; /**< Number of overlays (1 or more)*/
422     int ncfg; /**< Number of configurations (0 or more)*/
423     int nctrl; /**< Number of run-time controls*/
424     struct cfw_image *base; /**< Base sequence*/
425     struct cfw_image **ovly_cfg; /**< Overlay and cfg*/
426     /**< patches (if any)*/
427     struct cfw_control **ctrl; /**< Array of run-time controls*/
428 };
429 #define CFW_OCFG_NDX(p, o, c) (((o)*(p)->ncfg)+(c))
430 /**
431 * Process transition
433 * Sequence for specific state transisitions within the driver
435 */
436 struct cfw_transition {
437     char name[CFW_MAX_ID]; /**< Name of the transition*/
438     char *desc; /**< User string*/
439     struct cfw_block *block;
440 };
441 /**
442 * Device audio mode
444 * Link operating modes to process flows,
445 * configurations and sequences
447 */
448 struct cfw_mode {
449     char name[CFW_MAX_ID];
450     char *desc; /**< User string*/
451     u32 flags;
452     u8 pfw;
453     u8 ovly;
454     u8 cfg;
455     u8 pll;
456     struct cfw_block *entry;
457     struct cfw_block *exit;
458 };
459 struct cfw_asoc_toc_entry {
460     char etext[CFW_MAX_ID];
461     int mode;
462     int cfg;
463 };
464 struct cfw_asoc_toc {
465     int nentries;
466     struct cfw_asoc_toc_entry entry[];
467 };
468 /**
469 * CFW Project
471 * Top level structure describing the CFW project
472 */
473 struct cfw_project {
474     u32 magic; /**< magic number for identifying F/W file*/
475     u32 if_id; /**< Interface match code */
476     u32 size; /**< Total size of the firmware (including this header)*/
477     u32 cksum; /**< CRC32 of the pickled firmware */
478     u32 version; /**< Firmware version (from CFD file)*/
479     u32 tstamp; /**< Time stamp of firmware build (epoch seconds)*/
480     char name[CFW_MAX_ID]; /**< Project name*/
481     char *desc; /**< User string*/
482     enum cfw_dfamily dfamily; /**< Device family*/
483     enum cfw_device device; /**< Device identifier*/
484     u32 flags; /**< CFW flags*/
485     struct cfw_transition **transition; /**< Transition sequences*/
486     u16 npll; /**< Number of PLL settings*/
487     struct cfw_pll **pll; /**< PLL settings*/
488     u16 npfw; /**< Number of process flows*/
489     struct cfw_pfw **pfw; /**< Process flows*/
490     u16 nmode; /**< Number of operating modes*/
491     struct cfw_mode **mode; /**< Modes*/
492     struct cfw_asoc_toc *asoc_toc; /**< list of amixer controls*/
493 };
494 void run_block(struct cfw_block *pb, u8 *var);
495 /* @} */
496 /* **CFW_INTERFACE_ID=0x3FA6D547** */
497 #endif /* CFW_FIRMWARE_H_ */