dsp_spos.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. /*
  7. * 2002-07 Benny Sjostrand [email protected]
  8. */
  9. #ifdef CONFIG_SND_CS46XX_NEW_DSP /* hack ... */
  10. #ifndef __DSP_SPOS_H__
  11. #define __DSP_SPOS_H__
  12. #define DSP_MAX_SYMBOLS 1024
  13. #define DSP_MAX_MODULES 64
  14. #define DSP_CODE_BYTE_SIZE 0x00007000UL
  15. #define DSP_PARAMETER_BYTE_SIZE 0x00003000UL
  16. #define DSP_SAMPLE_BYTE_SIZE 0x00003800UL
  17. #define DSP_PARAMETER_BYTE_OFFSET 0x00000000UL
  18. #define DSP_SAMPLE_BYTE_OFFSET 0x00010000UL
  19. #define DSP_CODE_BYTE_OFFSET 0x00020000UL
  20. #define WIDE_INSTR_MASK 0x0040
  21. #define WIDE_LADD_INSTR_MASK 0x0380
  22. /* this instruction types
  23. needs to be reallocated when load
  24. code into DSP */
  25. enum wide_opcode {
  26. WIDE_FOR_BEGIN_LOOP = 0x20,
  27. WIDE_FOR_BEGIN_LOOP2,
  28. WIDE_COND_GOTO_ADDR = 0x30,
  29. WIDE_COND_GOTO_CALL,
  30. WIDE_TBEQ_COND_GOTO_ADDR = 0x70,
  31. WIDE_TBEQ_COND_CALL_ADDR,
  32. WIDE_TBEQ_NCOND_GOTO_ADDR,
  33. WIDE_TBEQ_NCOND_CALL_ADDR,
  34. WIDE_TBEQ_COND_GOTO1_ADDR,
  35. WIDE_TBEQ_COND_CALL1_ADDR,
  36. WIDE_TBEQ_NCOND_GOTOI_ADDR,
  37. WIDE_TBEQ_NCOND_CALL1_ADDR,
  38. };
  39. /* SAMPLE segment */
  40. #define VARI_DECIMATE_BUF1 0x0000
  41. #define WRITE_BACK_BUF1 0x0400
  42. #define CODEC_INPUT_BUF1 0x0500
  43. #define PCM_READER_BUF1 0x0600
  44. #define SRC_DELAY_BUF1 0x0680
  45. #define VARI_DECIMATE_BUF0 0x0780
  46. #define SRC_OUTPUT_BUF1 0x07A0
  47. #define ASYNC_IP_OUTPUT_BUFFER1 0x0A00
  48. #define OUTPUT_SNOOP_BUFFER 0x0B00
  49. #define SPDIFI_IP_OUTPUT_BUFFER1 0x0E00
  50. #define SPDIFO_IP_OUTPUT_BUFFER1 0x1000
  51. #define MIX_SAMPLE_BUF1 0x1400
  52. #define MIX_SAMPLE_BUF2 0x2E80
  53. #define MIX_SAMPLE_BUF3 0x2F00
  54. #define MIX_SAMPLE_BUF4 0x2F80
  55. #define MIX_SAMPLE_BUF5 0x3000
  56. /* Task stack address */
  57. #define HFG_STACK 0x066A
  58. #define FG_STACK 0x066E
  59. #define BG_STACK 0x068E
  60. /* SCB's addresses */
  61. #define SPOSCB_ADDR 0x070
  62. #define BG_TREE_SCB_ADDR 0x635
  63. #define NULL_SCB_ADDR 0x000
  64. #define TIMINGMASTER_SCB_ADDR 0x010
  65. #define CODECOUT_SCB_ADDR 0x020
  66. #define PCMREADER_SCB_ADDR 0x030
  67. #define WRITEBACK_SCB_ADDR 0x040
  68. #define CODECIN_SCB_ADDR 0x080
  69. #define MASTERMIX_SCB_ADDR 0x090
  70. #define SRCTASK_SCB_ADDR 0x0A0
  71. #define VARIDECIMATE_SCB_ADDR 0x0B0
  72. #define PCMSERIALIN_SCB_ADDR 0x0C0
  73. #define FG_TASK_HEADER_ADDR 0x600
  74. #define ASYNCTX_SCB_ADDR 0x0E0
  75. #define ASYNCRX_SCB_ADDR 0x0F0
  76. #define SRCTASKII_SCB_ADDR 0x100
  77. #define OUTPUTSNOOP_SCB_ADDR 0x110
  78. #define PCMSERIALINII_SCB_ADDR 0x120
  79. #define SPIOWRITE_SCB_ADDR 0x130
  80. #define REAR_CODECOUT_SCB_ADDR 0x140
  81. #define OUTPUTSNOOPII_SCB_ADDR 0x150
  82. #define PCMSERIALIN_PCM_SCB_ADDR 0x160
  83. #define RECORD_MIXER_SCB_ADDR 0x170
  84. #define REAR_MIXER_SCB_ADDR 0x180
  85. #define CLFE_MIXER_SCB_ADDR 0x190
  86. #define CLFE_CODEC_SCB_ADDR 0x1A0
  87. /* hyperforground SCB's*/
  88. #define HFG_TREE_SCB 0xBA0
  89. #define SPDIFI_SCB_INST 0xBB0
  90. #define SPDIFO_SCB_INST 0xBC0
  91. #define WRITE_BACK_SPB 0x0D0
  92. /* offsets */
  93. #define AsyncCIOFIFOPointer 0xd
  94. #define SPDIFOFIFOPointer 0xd
  95. #define SPDIFIFIFOPointer 0xd
  96. #define TCBData 0xb
  97. #define HFGFlags 0xa
  98. #define TCBContextBlk 0x10
  99. #define AFGTxAccumPhi 0x4
  100. #define SCBsubListPtr 0x9
  101. #define SCBfuncEntryPtr 0xA
  102. #define SRCCorPerGof 0x2
  103. #define SRCPhiIncr6Int26Frac 0xd
  104. #define SCBVolumeCtrl 0xe
  105. /* conf */
  106. #define UseASER1Input 1
  107. /*
  108. * The following defines are for the flags in the rsConfig01/23 registers of
  109. * the SP.
  110. */
  111. #define RSCONFIG_MODULO_SIZE_MASK 0x0000000FL
  112. #define RSCONFIG_MODULO_16 0x00000001L
  113. #define RSCONFIG_MODULO_32 0x00000002L
  114. #define RSCONFIG_MODULO_64 0x00000003L
  115. #define RSCONFIG_MODULO_128 0x00000004L
  116. #define RSCONFIG_MODULO_256 0x00000005L
  117. #define RSCONFIG_MODULO_512 0x00000006L
  118. #define RSCONFIG_MODULO_1024 0x00000007L
  119. #define RSCONFIG_MODULO_4 0x00000008L
  120. #define RSCONFIG_MODULO_8 0x00000009L
  121. #define RSCONFIG_SAMPLE_SIZE_MASK 0x000000C0L
  122. #define RSCONFIG_SAMPLE_8MONO 0x00000000L
  123. #define RSCONFIG_SAMPLE_8STEREO 0x00000040L
  124. #define RSCONFIG_SAMPLE_16MONO 0x00000080L
  125. #define RSCONFIG_SAMPLE_16STEREO 0x000000C0L
  126. #define RSCONFIG_UNDERRUN_ZERO 0x00004000L
  127. #define RSCONFIG_DMA_TO_HOST 0x00008000L
  128. #define RSCONFIG_STREAM_NUM_MASK 0x00FF0000L
  129. #define RSCONFIG_MAX_DMA_SIZE_MASK 0x1F000000L
  130. #define RSCONFIG_DMA_ENABLE 0x20000000L
  131. #define RSCONFIG_PRIORITY_MASK 0xC0000000L
  132. #define RSCONFIG_PRIORITY_HIGH 0x00000000L
  133. #define RSCONFIG_PRIORITY_MEDIUM_HIGH 0x40000000L
  134. #define RSCONFIG_PRIORITY_MEDIUM_LOW 0x80000000L
  135. #define RSCONFIG_PRIORITY_LOW 0xC0000000L
  136. #define RSCONFIG_STREAM_NUM_SHIFT 16L
  137. #define RSCONFIG_MAX_DMA_SIZE_SHIFT 24L
  138. /* SP constants */
  139. #define FG_INTERVAL_TIMER_PERIOD 0x0051
  140. #define BG_INTERVAL_TIMER_PERIOD 0x0100
  141. /* Only SP accessible registers */
  142. #define SP_ASER_COUNTDOWN 0x8040
  143. #define SP_SPDOUT_FIFO 0x0108
  144. #define SP_SPDIN_MI_FIFO 0x01E0
  145. #define SP_SPDIN_D_FIFO 0x01F0
  146. #define SP_SPDIN_STATUS 0x8048
  147. #define SP_SPDIN_CONTROL 0x8049
  148. #define SP_SPDIN_FIFOPTR 0x804A
  149. #define SP_SPDOUT_STATUS 0x804C
  150. #define SP_SPDOUT_CONTROL 0x804D
  151. #define SP_SPDOUT_CSUV 0x808E
  152. static inline u8 _wrap_all_bits (u8 val)
  153. {
  154. u8 wrapped;
  155. /* wrap all 8 bits */
  156. wrapped =
  157. ((val & 0x1 ) << 7) |
  158. ((val & 0x2 ) << 5) |
  159. ((val & 0x4 ) << 3) |
  160. ((val & 0x8 ) << 1) |
  161. ((val & 0x10) >> 1) |
  162. ((val & 0x20) >> 3) |
  163. ((val & 0x40) >> 5) |
  164. ((val & 0x80) >> 7);
  165. return wrapped;
  166. }
  167. static inline void cs46xx_dsp_spos_update_scb (struct snd_cs46xx * chip,
  168. struct dsp_scb_descriptor * scb)
  169. {
  170. /* update nextSCB and subListPtr in SCB */
  171. snd_cs46xx_poke(chip,
  172. (scb->address + SCBsubListPtr) << 2,
  173. (scb->sub_list_ptr->address << 0x10) |
  174. (scb->next_scb_ptr->address));
  175. scb->updated = 1;
  176. }
  177. static inline void cs46xx_dsp_scb_set_volume (struct snd_cs46xx * chip,
  178. struct dsp_scb_descriptor * scb,
  179. u16 left, u16 right)
  180. {
  181. unsigned int val = ((0xffff - left) << 16 | (0xffff - right));
  182. snd_cs46xx_poke(chip, (scb->address + SCBVolumeCtrl) << 2, val);
  183. snd_cs46xx_poke(chip, (scb->address + SCBVolumeCtrl + 1) << 2, val);
  184. scb->volume_set = 1;
  185. scb->volume[0] = left;
  186. scb->volume[1] = right;
  187. }
  188. #endif /* __DSP_SPOS_H__ */
  189. #endif /* CONFIG_SND_CS46XX_NEW_DSP */