cs46xx_dsp_spos.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /*
  2. * The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
  3. * Copyright (c) by Jaroslav Kysela <perex@suse.cz>
  4. *
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. *
  20. */
  21. #ifndef __CS46XX_DSP_SPOS_H__
  22. #define __CS46XX_DSP_SPOS_H__
  23. #include "cs46xx_dsp_scb_types.h"
  24. #include "cs46xx_dsp_task_types.h"
  25. #define SYMBOL_CONSTANT 0x0
  26. #define SYMBOL_SAMPLE 0x1
  27. #define SYMBOL_PARAMETER 0x2
  28. #define SYMBOL_CODE 0x3
  29. #define SEGTYPE_SP_PROGRAM 0x00000001
  30. #define SEGTYPE_SP_PARAMETER 0x00000002
  31. #define SEGTYPE_SP_SAMPLE 0x00000003
  32. #define SEGTYPE_SP_COEFFICIENT 0x00000004
  33. #define DSP_SPOS_UU 0x0deadul /* unused */
  34. #define DSP_SPOS_DC 0x0badul /* don't care */
  35. #define DSP_SPOS_DC_DC 0x0bad0badul /* don't care */
  36. #define DSP_SPOS_UUUU 0xdeadc0edul /* unused */
  37. #define DSP_SPOS_UUHI 0xdeadul
  38. #define DSP_SPOS_UULO 0xc0edul
  39. #define DSP_SPOS_DCDC 0x0badf1d0ul /* don't care */
  40. #define DSP_SPOS_DCDCHI 0x0badul
  41. #define DSP_SPOS_DCDCLO 0xf1d0ul
  42. #define DSP_MAX_TASK_NAME 60
  43. #define DSP_MAX_SYMBOL_NAME 100
  44. #define DSP_MAX_SCB_NAME 60
  45. #define DSP_MAX_SCB_DESC 200
  46. #define DSP_MAX_TASK_DESC 50
  47. #define DSP_MAX_PCM_CHANNELS 32
  48. #define DSP_MAX_SRC_NR 14
  49. #define DSP_PCM_MAIN_CHANNEL 1
  50. #define DSP_PCM_REAR_CHANNEL 2
  51. #define DSP_PCM_CENTER_LFE_CHANNEL 3
  52. #define DSP_PCM_S71_CHANNEL 4 /* surround 7.1 */
  53. #define DSP_IEC958_CHANNEL 5
  54. #define DSP_SPDIF_STATUS_OUTPUT_ENABLED 1
  55. #define DSP_SPDIF_STATUS_PLAYBACK_OPEN 2
  56. #define DSP_SPDIF_STATUS_HW_ENABLED 4
  57. #define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED 8
  58. struct _dsp_module_desc_t;
  59. typedef struct _symbol_entry_t {
  60. u32 address;
  61. char symbol_name[DSP_MAX_SYMBOL_NAME];
  62. int symbol_type;
  63. /* initialized by driver */
  64. struct _dsp_module_desc_t * module;
  65. int deleted;
  66. } symbol_entry_t;
  67. typedef struct _symbol_desc_t {
  68. int nsymbols;
  69. symbol_entry_t * symbols;
  70. /* initialized by driver */
  71. int highest_frag_index;
  72. } symbol_desc_t;
  73. typedef struct _segment_desc_t {
  74. int segment_type;
  75. u32 offset;
  76. u32 size;
  77. u32 * data;
  78. } segment_desc_t;
  79. typedef struct _dsp_module_desc_t {
  80. char * module_name;
  81. symbol_desc_t symbol_table;
  82. int nsegments;
  83. segment_desc_t * segments;
  84. /* initialized by driver */
  85. u32 overlay_begin_address;
  86. u32 load_address;
  87. int nfixups;
  88. } dsp_module_desc_t;
  89. typedef struct _dsp_scb_descriptor_t {
  90. char scb_name[DSP_MAX_SCB_NAME];
  91. u32 address;
  92. int index;
  93. struct _dsp_scb_descriptor_t * sub_list_ptr;
  94. struct _dsp_scb_descriptor_t * next_scb_ptr;
  95. struct _dsp_scb_descriptor_t * parent_scb_ptr;
  96. symbol_entry_t * task_entry;
  97. symbol_entry_t * scb_symbol;
  98. snd_info_entry_t *proc_info;
  99. int ref_count;
  100. spinlock_t lock;
  101. int deleted;
  102. } dsp_scb_descriptor_t;
  103. typedef struct _dsp_task_descriptor_t {
  104. char task_name[DSP_MAX_TASK_NAME];
  105. int size;
  106. u32 address;
  107. int index;
  108. } dsp_task_descriptor_t;
  109. typedef struct _pcm_channel_descriptor_t {
  110. int active;
  111. int src_slot;
  112. int pcm_slot;
  113. u32 sample_rate;
  114. u32 unlinked;
  115. dsp_scb_descriptor_t * pcm_reader_scb;
  116. dsp_scb_descriptor_t * src_scb;
  117. dsp_scb_descriptor_t * mixer_scb;
  118. void * private_data;
  119. } pcm_channel_descriptor_t;
  120. typedef struct _dsp_spos_instance_t {
  121. symbol_desc_t symbol_table; /* currently availble loaded symbols in SP */
  122. int nmodules;
  123. dsp_module_desc_t * modules; /* modules loaded into SP */
  124. segment_desc_t code;
  125. /* Main PCM playback mixer */
  126. dsp_scb_descriptor_t * master_mix_scb;
  127. u16 dac_volume_right;
  128. u16 dac_volume_left;
  129. /* Rear/surround PCM playback mixer */
  130. dsp_scb_descriptor_t * rear_mix_scb;
  131. /* Center/LFE mixer */
  132. dsp_scb_descriptor_t * center_lfe_mix_scb;
  133. int npcm_channels;
  134. int nsrc_scb;
  135. pcm_channel_descriptor_t pcm_channels[DSP_MAX_PCM_CHANNELS];
  136. int src_scb_slots[DSP_MAX_SRC_NR];
  137. /* cache this symbols */
  138. symbol_entry_t * null_algorithm; /* used by PCMreaderSCB's */
  139. symbol_entry_t * s16_up; /* used by SRCtaskSCB's */
  140. /* proc fs */
  141. snd_card_t * snd_card;
  142. snd_info_entry_t * proc_dsp_dir;
  143. snd_info_entry_t * proc_sym_info_entry;
  144. snd_info_entry_t * proc_modules_info_entry;
  145. snd_info_entry_t * proc_parameter_dump_info_entry;
  146. snd_info_entry_t * proc_sample_dump_info_entry;
  147. /* SCB's descriptors */
  148. int nscb;
  149. int scb_highest_frag_index;
  150. dsp_scb_descriptor_t scbs[DSP_MAX_SCB_DESC];
  151. snd_info_entry_t * proc_scb_info_entry;
  152. dsp_scb_descriptor_t * the_null_scb;
  153. /* Task's descriptors */
  154. int ntask;
  155. dsp_task_descriptor_t tasks[DSP_MAX_TASK_DESC];
  156. snd_info_entry_t * proc_task_info_entry;
  157. /* SPDIF status */
  158. int spdif_status_out;
  159. int spdif_status_in;
  160. u16 spdif_input_volume_right;
  161. u16 spdif_input_volume_left;
  162. /* spdif channel status,
  163. left right and user validity bits */
  164. unsigned int spdif_csuv_default;
  165. unsigned int spdif_csuv_stream;
  166. /* SPDIF input sample rate converter */
  167. dsp_scb_descriptor_t * spdif_in_src;
  168. /* SPDIF input asynch. receiver */
  169. dsp_scb_descriptor_t * asynch_rx_scb;
  170. /* Capture record mixer SCB */
  171. dsp_scb_descriptor_t * record_mixer_scb;
  172. /* CODEC input SCB */
  173. dsp_scb_descriptor_t * codec_in_scb;
  174. /* reference snooper */
  175. dsp_scb_descriptor_t * ref_snoop_scb;
  176. /* SPDIF output PCM reference */
  177. dsp_scb_descriptor_t * spdif_pcm_input_scb;
  178. /* asynch TX task */
  179. dsp_scb_descriptor_t * asynch_tx_scb;
  180. /* record sources */
  181. dsp_scb_descriptor_t * pcm_input;
  182. dsp_scb_descriptor_t * adc_input;
  183. int spdif_in_sample_rate;
  184. } dsp_spos_instance_t;
  185. #endif /* __DSP_SPOS_H__ */