tegra20_spdif.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * tegra20_spdif.h - Definitions for Tegra20 SPDIF driver
  4. *
  5. * Author: Stephen Warren <[email protected]>
  6. * Copyright (C) 2011 - NVIDIA, Inc.
  7. *
  8. * Based on code copyright/by:
  9. * Copyright (c) 2008-2009, NVIDIA Corporation
  10. */
  11. #ifndef __TEGRA20_SPDIF_H__
  12. #define __TEGRA20_SPDIF_H__
  13. #include "tegra_pcm.h"
  14. /* Offsets from TEGRA20_SPDIF_BASE */
  15. #define TEGRA20_SPDIF_CTRL 0x0
  16. #define TEGRA20_SPDIF_STATUS 0x4
  17. #define TEGRA20_SPDIF_STROBE_CTRL 0x8
  18. #define TEGRA20_SPDIF_DATA_FIFO_CSR 0x0C
  19. #define TEGRA20_SPDIF_DATA_OUT 0x40
  20. #define TEGRA20_SPDIF_DATA_IN 0x80
  21. #define TEGRA20_SPDIF_CH_STA_RX_A 0x100
  22. #define TEGRA20_SPDIF_CH_STA_RX_B 0x104
  23. #define TEGRA20_SPDIF_CH_STA_RX_C 0x108
  24. #define TEGRA20_SPDIF_CH_STA_RX_D 0x10C
  25. #define TEGRA20_SPDIF_CH_STA_RX_E 0x110
  26. #define TEGRA20_SPDIF_CH_STA_RX_F 0x114
  27. #define TEGRA20_SPDIF_CH_STA_TX_A 0x140
  28. #define TEGRA20_SPDIF_CH_STA_TX_B 0x144
  29. #define TEGRA20_SPDIF_CH_STA_TX_C 0x148
  30. #define TEGRA20_SPDIF_CH_STA_TX_D 0x14C
  31. #define TEGRA20_SPDIF_CH_STA_TX_E 0x150
  32. #define TEGRA20_SPDIF_CH_STA_TX_F 0x154
  33. #define TEGRA20_SPDIF_USR_STA_RX_A 0x180
  34. #define TEGRA20_SPDIF_USR_DAT_TX_A 0x1C0
  35. /* Fields in TEGRA20_SPDIF_CTRL */
  36. /* Start capturing from 0=right, 1=left channel */
  37. #define TEGRA20_SPDIF_CTRL_CAP_LC (1 << 30)
  38. /* SPDIF receiver(RX) enable */
  39. #define TEGRA20_SPDIF_CTRL_RX_EN (1 << 29)
  40. /* SPDIF Transmitter(TX) enable */
  41. #define TEGRA20_SPDIF_CTRL_TX_EN (1 << 28)
  42. /* Transmit Channel status */
  43. #define TEGRA20_SPDIF_CTRL_TC_EN (1 << 27)
  44. /* Transmit user Data */
  45. #define TEGRA20_SPDIF_CTRL_TU_EN (1 << 26)
  46. /* Interrupt on transmit error */
  47. #define TEGRA20_SPDIF_CTRL_IE_TXE (1 << 25)
  48. /* Interrupt on receive error */
  49. #define TEGRA20_SPDIF_CTRL_IE_RXE (1 << 24)
  50. /* Interrupt on invalid preamble */
  51. #define TEGRA20_SPDIF_CTRL_IE_P (1 << 23)
  52. /* Interrupt on "B" preamble */
  53. #define TEGRA20_SPDIF_CTRL_IE_B (1 << 22)
  54. /* Interrupt when block of channel status received */
  55. #define TEGRA20_SPDIF_CTRL_IE_C (1 << 21)
  56. /* Interrupt when a valid information unit (IU) is received */
  57. #define TEGRA20_SPDIF_CTRL_IE_U (1 << 20)
  58. /* Interrupt when RX user FIFO attention level is reached */
  59. #define TEGRA20_SPDIF_CTRL_QE_RU (1 << 19)
  60. /* Interrupt when TX user FIFO attention level is reached */
  61. #define TEGRA20_SPDIF_CTRL_QE_TU (1 << 18)
  62. /* Interrupt when RX data FIFO attention level is reached */
  63. #define TEGRA20_SPDIF_CTRL_QE_RX (1 << 17)
  64. /* Interrupt when TX data FIFO attention level is reached */
  65. #define TEGRA20_SPDIF_CTRL_QE_TX (1 << 16)
  66. /* Loopback test mode enable */
  67. #define TEGRA20_SPDIF_CTRL_LBK_EN (1 << 15)
  68. /*
  69. * Pack data mode:
  70. * 0 = Single data (16 bit needs to be padded to match the
  71. * interface data bit size).
  72. * 1 = Packeted left/right channel data into a single word.
  73. */
  74. #define TEGRA20_SPDIF_CTRL_PACK (1 << 14)
  75. /*
  76. * 00 = 16bit data
  77. * 01 = 20bit data
  78. * 10 = 24bit data
  79. * 11 = raw data
  80. */
  81. #define TEGRA20_SPDIF_BIT_MODE_16BIT 0
  82. #define TEGRA20_SPDIF_BIT_MODE_20BIT 1
  83. #define TEGRA20_SPDIF_BIT_MODE_24BIT 2
  84. #define TEGRA20_SPDIF_BIT_MODE_RAW 3
  85. #define TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT 12
  86. #define TEGRA20_SPDIF_CTRL_BIT_MODE_MASK (3 << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
  87. #define TEGRA20_SPDIF_CTRL_BIT_MODE_16BIT (TEGRA20_SPDIF_BIT_MODE_16BIT << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
  88. #define TEGRA20_SPDIF_CTRL_BIT_MODE_20BIT (TEGRA20_SPDIF_BIT_MODE_20BIT << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
  89. #define TEGRA20_SPDIF_CTRL_BIT_MODE_24BIT (TEGRA20_SPDIF_BIT_MODE_24BIT << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
  90. #define TEGRA20_SPDIF_CTRL_BIT_MODE_RAW (TEGRA20_SPDIF_BIT_MODE_RAW << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
  91. /* Fields in TEGRA20_SPDIF_STATUS */
  92. /*
  93. * Note: IS_P, IS_B, IS_C, and IS_U are sticky bits. Software must
  94. * write a 1 to the corresponding bit location to clear the status.
  95. */
  96. /*
  97. * Receiver(RX) shifter is busy receiving data.
  98. * This bit is asserted when the receiver first locked onto the
  99. * preamble of the data stream after RX_EN is asserted. This bit is
  100. * deasserted when either,
  101. * (a) the end of a frame is reached after RX_EN is deeasserted, or
  102. * (b) the SPDIF data stream becomes inactive.
  103. */
  104. #define TEGRA20_SPDIF_STATUS_RX_BSY (1 << 29)
  105. /*
  106. * Transmitter(TX) shifter is busy transmitting data.
  107. * This bit is asserted when TX_EN is asserted.
  108. * This bit is deasserted when the end of a frame is reached after
  109. * TX_EN is deasserted.
  110. */
  111. #define TEGRA20_SPDIF_STATUS_TX_BSY (1 << 28)
  112. /*
  113. * TX is busy shifting out channel status.
  114. * This bit is asserted when both TX_EN and TC_EN are asserted and
  115. * data from CH_STA_TX_A register is loaded into the internal shifter.
  116. * This bit is deasserted when either,
  117. * (a) the end of a frame is reached after TX_EN is deasserted, or
  118. * (b) CH_STA_TX_F register is loaded into the internal shifter.
  119. */
  120. #define TEGRA20_SPDIF_STATUS_TC_BSY (1 << 27)
  121. /*
  122. * TX User data FIFO busy.
  123. * This bit is asserted when TX_EN and TXU_EN are asserted and
  124. * there's data in the TX user FIFO. This bit is deassert when either,
  125. * (a) the end of a frame is reached after TX_EN is deasserted, or
  126. * (b) there's no data left in the TX user FIFO.
  127. */
  128. #define TEGRA20_SPDIF_STATUS_TU_BSY (1 << 26)
  129. /* TX FIFO Underrun error status */
  130. #define TEGRA20_SPDIF_STATUS_TX_ERR (1 << 25)
  131. /* RX FIFO Overrun error status */
  132. #define TEGRA20_SPDIF_STATUS_RX_ERR (1 << 24)
  133. /* Preamble status: 0=Preamble OK, 1=bad/missing preamble */
  134. #define TEGRA20_SPDIF_STATUS_IS_P (1 << 23)
  135. /* B-preamble detection status: 0=not detected, 1=B-preamble detected */
  136. #define TEGRA20_SPDIF_STATUS_IS_B (1 << 22)
  137. /*
  138. * RX channel block data receive status:
  139. * 0=entire block not recieved yet.
  140. * 1=received entire block of channel status,
  141. */
  142. #define TEGRA20_SPDIF_STATUS_IS_C (1 << 21)
  143. /* RX User Data Valid flag: 1=valid IU detected, 0 = no IU detected. */
  144. #define TEGRA20_SPDIF_STATUS_IS_U (1 << 20)
  145. /*
  146. * RX User FIFO Status:
  147. * 1=attention level reached, 0=attention level not reached.
  148. */
  149. #define TEGRA20_SPDIF_STATUS_QS_RU (1 << 19)
  150. /*
  151. * TX User FIFO Status:
  152. * 1=attention level reached, 0=attention level not reached.
  153. */
  154. #define TEGRA20_SPDIF_STATUS_QS_TU (1 << 18)
  155. /*
  156. * RX Data FIFO Status:
  157. * 1=attention level reached, 0=attention level not reached.
  158. */
  159. #define TEGRA20_SPDIF_STATUS_QS_RX (1 << 17)
  160. /*
  161. * TX Data FIFO Status:
  162. * 1=attention level reached, 0=attention level not reached.
  163. */
  164. #define TEGRA20_SPDIF_STATUS_QS_TX (1 << 16)
  165. /* Fields in TEGRA20_SPDIF_STROBE_CTRL */
  166. /*
  167. * Indicates the approximate number of detected SPDIFIN clocks within a
  168. * bi-phase period.
  169. */
  170. #define TEGRA20_SPDIF_STROBE_CTRL_PERIOD_SHIFT 16
  171. #define TEGRA20_SPDIF_STROBE_CTRL_PERIOD_MASK (0xff << TEGRA20_SPDIF_STROBE_CTRL_PERIOD_SHIFT)
  172. /* Data strobe mode: 0=Auto-locked 1=Manual locked */
  173. #define TEGRA20_SPDIF_STROBE_CTRL_STROBE (1 << 15)
  174. /*
  175. * Manual data strobe time within the bi-phase clock period (in terms of
  176. * the number of over-sampling clocks).
  177. */
  178. #define TEGRA20_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT 8
  179. #define TEGRA20_SPDIF_STROBE_CTRL_DATA_STROBES_MASK (0x1f << TEGRA20_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT)
  180. /*
  181. * Manual SPDIFIN bi-phase clock period (in terms of the number of
  182. * over-sampling clocks).
  183. */
  184. #define TEGRA20_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT 0
  185. #define TEGRA20_SPDIF_STROBE_CTRL_CLOCK_PERIOD_MASK (0x3f << TEGRA20_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT)
  186. /* Fields in SPDIF_DATA_FIFO_CSR */
  187. /* Clear Receiver User FIFO (RX USR.FIFO) */
  188. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_CLR (1 << 31)
  189. #define TEGRA20_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT 0
  190. #define TEGRA20_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS 1
  191. #define TEGRA20_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS 2
  192. #define TEGRA20_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS 3
  193. /* RU FIFO attention level */
  194. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT 29
  195. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_MASK \
  196. (0x3 << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
  197. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU1_WORD_FULL \
  198. (TEGRA20_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
  199. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU2_WORD_FULL \
  200. (TEGRA20_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
  201. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU3_WORD_FULL \
  202. (TEGRA20_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
  203. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU4_WORD_FULL \
  204. (TEGRA20_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
  205. /* Number of RX USR.FIFO levels with valid data. */
  206. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_SHIFT 24
  207. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_MASK (0x1f << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_SHIFT)
  208. /* Clear Transmitter User FIFO (TX USR.FIFO) */
  209. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_CLR (1 << 23)
  210. /* TU FIFO attention level */
  211. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT 21
  212. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_MASK \
  213. (0x3 << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
  214. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU1_WORD_FULL \
  215. (TEGRA20_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
  216. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU2_WORD_FULL \
  217. (TEGRA20_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
  218. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU3_WORD_FULL \
  219. (TEGRA20_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
  220. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU4_WORD_FULL \
  221. (TEGRA20_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
  222. /* Number of TX USR.FIFO levels that could be filled. */
  223. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_SHIFT 16
  224. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_MASK (0x1f << SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_SHIFT)
  225. /* Clear Receiver Data FIFO (RX DATA.FIFO) */
  226. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_CLR (1 << 15)
  227. #define TEGRA20_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT 0
  228. #define TEGRA20_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS 1
  229. #define TEGRA20_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS 2
  230. #define TEGRA20_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS 3
  231. /* RU FIFO attention level */
  232. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT 13
  233. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_MASK \
  234. (0x3 << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
  235. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU1_WORD_FULL \
  236. (TEGRA20_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
  237. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU4_WORD_FULL \
  238. (TEGRA20_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
  239. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU8_WORD_FULL \
  240. (TEGRA20_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
  241. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU12_WORD_FULL \
  242. (TEGRA20_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
  243. /* Number of RX DATA.FIFO levels with valid data. */
  244. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_SHIFT 8
  245. #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_MASK (0x1f << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_SHIFT)
  246. /* Clear Transmitter Data FIFO (TX DATA.FIFO) */
  247. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_CLR (1 << 7)
  248. /* TU FIFO attention level */
  249. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT 5
  250. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_MASK \
  251. (0x3 << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
  252. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU1_WORD_FULL \
  253. (TEGRA20_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
  254. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU4_WORD_FULL \
  255. (TEGRA20_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
  256. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU8_WORD_FULL \
  257. (TEGRA20_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
  258. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU12_WORD_FULL \
  259. (TEGRA20_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
  260. /* Number of TX DATA.FIFO levels that could be filled. */
  261. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_SHIFT 0
  262. #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_MASK (0x1f << SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_SHIFT)
  263. /* Fields in TEGRA20_SPDIF_DATA_OUT */
  264. /*
  265. * This register has 5 different formats:
  266. * 16-bit (BIT_MODE=00, PACK=0)
  267. * 20-bit (BIT_MODE=01, PACK=0)
  268. * 24-bit (BIT_MODE=10, PACK=0)
  269. * raw (BIT_MODE=11, PACK=0)
  270. * 16-bit packed (BIT_MODE=00, PACK=1)
  271. */
  272. #define TEGRA20_SPDIF_DATA_OUT_DATA_16_SHIFT 0
  273. #define TEGRA20_SPDIF_DATA_OUT_DATA_16_MASK (0xffff << TEGRA20_SPDIF_DATA_OUT_DATA_16_SHIFT)
  274. #define TEGRA20_SPDIF_DATA_OUT_DATA_20_SHIFT 0
  275. #define TEGRA20_SPDIF_DATA_OUT_DATA_20_MASK (0xfffff << TEGRA20_SPDIF_DATA_OUT_DATA_20_SHIFT)
  276. #define TEGRA20_SPDIF_DATA_OUT_DATA_24_SHIFT 0
  277. #define TEGRA20_SPDIF_DATA_OUT_DATA_24_MASK (0xffffff << TEGRA20_SPDIF_DATA_OUT_DATA_24_SHIFT)
  278. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_P (1 << 31)
  279. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_C (1 << 30)
  280. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_U (1 << 29)
  281. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_V (1 << 28)
  282. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_DATA_SHIFT 8
  283. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_DATA_MASK (0xfffff << TEGRA20_SPDIF_DATA_OUT_DATA_RAW_DATA_SHIFT)
  284. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_AUX_SHIFT 4
  285. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_AUX_MASK (0xf << TEGRA20_SPDIF_DATA_OUT_DATA_RAW_AUX_SHIFT)
  286. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_SHIFT 0
  287. #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_MASK (0xf << TEGRA20_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_SHIFT)
  288. #define TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_SHIFT 16
  289. #define TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_MASK (0xffff << TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_SHIFT)
  290. #define TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_SHIFT 0
  291. #define TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_MASK (0xffff << TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_SHIFT)
  292. /* Fields in TEGRA20_SPDIF_DATA_IN */
  293. /*
  294. * This register has 5 different formats:
  295. * 16-bit (BIT_MODE=00, PACK=0)
  296. * 20-bit (BIT_MODE=01, PACK=0)
  297. * 24-bit (BIT_MODE=10, PACK=0)
  298. * raw (BIT_MODE=11, PACK=0)
  299. * 16-bit packed (BIT_MODE=00, PACK=1)
  300. *
  301. * Bits 31:24 are common to all modes except 16-bit packed
  302. */
  303. #define TEGRA20_SPDIF_DATA_IN_DATA_P (1 << 31)
  304. #define TEGRA20_SPDIF_DATA_IN_DATA_C (1 << 30)
  305. #define TEGRA20_SPDIF_DATA_IN_DATA_U (1 << 29)
  306. #define TEGRA20_SPDIF_DATA_IN_DATA_V (1 << 28)
  307. #define TEGRA20_SPDIF_DATA_IN_DATA_PREAMBLE_SHIFT 24
  308. #define TEGRA20_SPDIF_DATA_IN_DATA_PREAMBLE_MASK (0xf << TEGRA20_SPDIF_DATA_IN_DATA_PREAMBLE_SHIFT)
  309. #define TEGRA20_SPDIF_DATA_IN_DATA_16_SHIFT 0
  310. #define TEGRA20_SPDIF_DATA_IN_DATA_16_MASK (0xffff << TEGRA20_SPDIF_DATA_IN_DATA_16_SHIFT)
  311. #define TEGRA20_SPDIF_DATA_IN_DATA_20_SHIFT 0
  312. #define TEGRA20_SPDIF_DATA_IN_DATA_20_MASK (0xfffff << TEGRA20_SPDIF_DATA_IN_DATA_20_SHIFT)
  313. #define TEGRA20_SPDIF_DATA_IN_DATA_24_SHIFT 0
  314. #define TEGRA20_SPDIF_DATA_IN_DATA_24_MASK (0xffffff << TEGRA20_SPDIF_DATA_IN_DATA_24_SHIFT)
  315. #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_DATA_SHIFT 8
  316. #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_DATA_MASK (0xfffff << TEGRA20_SPDIF_DATA_IN_DATA_RAW_DATA_SHIFT)
  317. #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_AUX_SHIFT 4
  318. #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_AUX_MASK (0xf << TEGRA20_SPDIF_DATA_IN_DATA_RAW_AUX_SHIFT)
  319. #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_SHIFT 0
  320. #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_MASK (0xf << TEGRA20_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_SHIFT)
  321. #define TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_SHIFT 16
  322. #define TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_MASK (0xffff << TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_SHIFT)
  323. #define TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_SHIFT 0
  324. #define TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_MASK (0xffff << TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_SHIFT)
  325. /* Fields in TEGRA20_SPDIF_CH_STA_RX_A */
  326. /* Fields in TEGRA20_SPDIF_CH_STA_RX_B */
  327. /* Fields in TEGRA20_SPDIF_CH_STA_RX_C */
  328. /* Fields in TEGRA20_SPDIF_CH_STA_RX_D */
  329. /* Fields in TEGRA20_SPDIF_CH_STA_RX_E */
  330. /* Fields in TEGRA20_SPDIF_CH_STA_RX_F */
  331. /*
  332. * The 6-word receive channel data page buffer holds a block (192 frames) of
  333. * channel status information. The order of receive is from LSB to MSB
  334. * bit, and from CH_STA_RX_A to CH_STA_RX_F then back to CH_STA_RX_A.
  335. */
  336. /* Fields in TEGRA20_SPDIF_CH_STA_TX_A */
  337. /* Fields in TEGRA20_SPDIF_CH_STA_TX_B */
  338. /* Fields in TEGRA20_SPDIF_CH_STA_TX_C */
  339. /* Fields in TEGRA20_SPDIF_CH_STA_TX_D */
  340. /* Fields in TEGRA20_SPDIF_CH_STA_TX_E */
  341. /* Fields in TEGRA20_SPDIF_CH_STA_TX_F */
  342. /*
  343. * The 6-word transmit channel data page buffer holds a block (192 frames) of
  344. * channel status information. The order of transmission is from LSB to MSB
  345. * bit, and from CH_STA_TX_A to CH_STA_TX_F then back to CH_STA_TX_A.
  346. */
  347. /* Fields in TEGRA20_SPDIF_USR_STA_RX_A */
  348. /*
  349. * This 4-word deep FIFO receives user FIFO field information. The order of
  350. * receive is from LSB to MSB bit.
  351. */
  352. /* Fields in TEGRA20_SPDIF_USR_DAT_TX_A */
  353. /*
  354. * This 4-word deep FIFO transmits user FIFO field information. The order of
  355. * transmission is from LSB to MSB bit.
  356. */
  357. struct tegra20_spdif {
  358. struct clk *clk_spdif_out;
  359. struct snd_dmaengine_dai_dma_data capture_dma_data;
  360. struct snd_dmaengine_dai_dma_data playback_dma_data;
  361. struct regmap *regmap;
  362. struct reset_control *reset;
  363. };
  364. #endif