cs46xx_dsp_spos.h 5.1 KB

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