Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * tegra20_spdif.h - Definitions for Tegra20 SPDIF driver
0004  *
0005  * Author: Stephen Warren <swarren@nvidia.com>
0006  * Copyright (C) 2011 - NVIDIA, Inc.
0007  *
0008  * Based on code copyright/by:
0009  * Copyright (c) 2008-2009, NVIDIA Corporation
0010  */
0011 
0012 #ifndef __TEGRA20_SPDIF_H__
0013 #define __TEGRA20_SPDIF_H__
0014 
0015 #include "tegra_pcm.h"
0016 
0017 /* Offsets from TEGRA20_SPDIF_BASE */
0018 
0019 #define TEGRA20_SPDIF_CTRL                  0x0
0020 #define TEGRA20_SPDIF_STATUS                    0x4
0021 #define TEGRA20_SPDIF_STROBE_CTRL               0x8
0022 #define TEGRA20_SPDIF_DATA_FIFO_CSR             0x0C
0023 #define TEGRA20_SPDIF_DATA_OUT                  0x40
0024 #define TEGRA20_SPDIF_DATA_IN                   0x80
0025 #define TEGRA20_SPDIF_CH_STA_RX_A               0x100
0026 #define TEGRA20_SPDIF_CH_STA_RX_B               0x104
0027 #define TEGRA20_SPDIF_CH_STA_RX_C               0x108
0028 #define TEGRA20_SPDIF_CH_STA_RX_D               0x10C
0029 #define TEGRA20_SPDIF_CH_STA_RX_E               0x110
0030 #define TEGRA20_SPDIF_CH_STA_RX_F               0x114
0031 #define TEGRA20_SPDIF_CH_STA_TX_A               0x140
0032 #define TEGRA20_SPDIF_CH_STA_TX_B               0x144
0033 #define TEGRA20_SPDIF_CH_STA_TX_C               0x148
0034 #define TEGRA20_SPDIF_CH_STA_TX_D               0x14C
0035 #define TEGRA20_SPDIF_CH_STA_TX_E               0x150
0036 #define TEGRA20_SPDIF_CH_STA_TX_F               0x154
0037 #define TEGRA20_SPDIF_USR_STA_RX_A              0x180
0038 #define TEGRA20_SPDIF_USR_DAT_TX_A              0x1C0
0039 
0040 /* Fields in TEGRA20_SPDIF_CTRL */
0041 
0042 /* Start capturing from 0=right, 1=left channel */
0043 #define TEGRA20_SPDIF_CTRL_CAP_LC               (1 << 30)
0044 
0045 /* SPDIF receiver(RX) enable */
0046 #define TEGRA20_SPDIF_CTRL_RX_EN                (1 << 29)
0047 
0048 /* SPDIF Transmitter(TX) enable */
0049 #define TEGRA20_SPDIF_CTRL_TX_EN                (1 << 28)
0050 
0051 /* Transmit Channel status */
0052 #define TEGRA20_SPDIF_CTRL_TC_EN                (1 << 27)
0053 
0054 /* Transmit user Data */
0055 #define TEGRA20_SPDIF_CTRL_TU_EN                (1 << 26)
0056 
0057 /* Interrupt on transmit error */
0058 #define TEGRA20_SPDIF_CTRL_IE_TXE               (1 << 25)
0059 
0060 /* Interrupt on receive error */
0061 #define TEGRA20_SPDIF_CTRL_IE_RXE               (1 << 24)
0062 
0063 /* Interrupt on invalid preamble */
0064 #define TEGRA20_SPDIF_CTRL_IE_P                 (1 << 23)
0065 
0066 /* Interrupt on "B" preamble */
0067 #define TEGRA20_SPDIF_CTRL_IE_B                 (1 << 22)
0068 
0069 /* Interrupt when block of channel status received */
0070 #define TEGRA20_SPDIF_CTRL_IE_C                 (1 << 21)
0071 
0072 /* Interrupt when a valid information unit (IU) is received */
0073 #define TEGRA20_SPDIF_CTRL_IE_U                 (1 << 20)
0074 
0075 /* Interrupt when RX user FIFO attention level is reached */
0076 #define TEGRA20_SPDIF_CTRL_QE_RU                (1 << 19)
0077 
0078 /* Interrupt when TX user FIFO attention level is reached */
0079 #define TEGRA20_SPDIF_CTRL_QE_TU                (1 << 18)
0080 
0081 /* Interrupt when RX data FIFO attention level is reached */
0082 #define TEGRA20_SPDIF_CTRL_QE_RX                (1 << 17)
0083 
0084 /* Interrupt when TX data FIFO attention level is reached */
0085 #define TEGRA20_SPDIF_CTRL_QE_TX                (1 << 16)
0086 
0087 /* Loopback test mode enable */
0088 #define TEGRA20_SPDIF_CTRL_LBK_EN               (1 << 15)
0089 
0090 /*
0091  * Pack data mode:
0092  * 0 = Single data (16 bit needs to be  padded to match the
0093  *     interface data bit size).
0094  * 1 = Packeted left/right channel data into a single word.
0095  */
0096 #define TEGRA20_SPDIF_CTRL_PACK                 (1 << 14)
0097 
0098 /*
0099  * 00 = 16bit data
0100  * 01 = 20bit data
0101  * 10 = 24bit data
0102  * 11 = raw data
0103  */
0104 #define TEGRA20_SPDIF_BIT_MODE_16BIT                0
0105 #define TEGRA20_SPDIF_BIT_MODE_20BIT                1
0106 #define TEGRA20_SPDIF_BIT_MODE_24BIT                2
0107 #define TEGRA20_SPDIF_BIT_MODE_RAW              3
0108 
0109 #define TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT           12
0110 #define TEGRA20_SPDIF_CTRL_BIT_MODE_MASK            (3                            << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
0111 #define TEGRA20_SPDIF_CTRL_BIT_MODE_16BIT           (TEGRA20_SPDIF_BIT_MODE_16BIT << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
0112 #define TEGRA20_SPDIF_CTRL_BIT_MODE_20BIT           (TEGRA20_SPDIF_BIT_MODE_20BIT << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
0113 #define TEGRA20_SPDIF_CTRL_BIT_MODE_24BIT           (TEGRA20_SPDIF_BIT_MODE_24BIT << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
0114 #define TEGRA20_SPDIF_CTRL_BIT_MODE_RAW             (TEGRA20_SPDIF_BIT_MODE_RAW   << TEGRA20_SPDIF_CTRL_BIT_MODE_SHIFT)
0115 
0116 /* Fields in TEGRA20_SPDIF_STATUS */
0117 
0118 /*
0119  * Note: IS_P, IS_B, IS_C, and IS_U are sticky bits. Software must
0120  * write a 1 to the corresponding bit location to clear the status.
0121  */
0122 
0123 /*
0124  * Receiver(RX) shifter is busy receiving data.
0125  * This bit is asserted when the receiver first locked onto the
0126  * preamble of the data stream after RX_EN is asserted. This bit is
0127  * deasserted when either,
0128  * (a) the end of a frame is reached after RX_EN is deeasserted, or
0129  * (b) the SPDIF data stream becomes inactive.
0130  */
0131 #define TEGRA20_SPDIF_STATUS_RX_BSY             (1 << 29)
0132 
0133 /*
0134  * Transmitter(TX) shifter is busy transmitting data.
0135  * This bit is asserted when TX_EN is asserted.
0136  * This bit is deasserted when the end of a frame is reached after
0137  * TX_EN is deasserted.
0138  */
0139 #define TEGRA20_SPDIF_STATUS_TX_BSY             (1 << 28)
0140 
0141 /*
0142  * TX is busy shifting out channel status.
0143  * This bit is asserted when both TX_EN and TC_EN are asserted and
0144  * data from CH_STA_TX_A register is loaded into the internal shifter.
0145  * This bit is deasserted when either,
0146  * (a) the end of a frame is reached after TX_EN is deasserted, or
0147  * (b) CH_STA_TX_F register is loaded into the internal shifter.
0148  */
0149 #define TEGRA20_SPDIF_STATUS_TC_BSY             (1 << 27)
0150 
0151 /*
0152  * TX User data FIFO busy.
0153  * This bit is asserted when TX_EN and TXU_EN are asserted and
0154  * there's data in the TX user FIFO.  This bit is deassert when either,
0155  * (a) the end of a frame is reached after TX_EN is deasserted, or
0156  * (b) there's no data left in the TX user FIFO.
0157  */
0158 #define TEGRA20_SPDIF_STATUS_TU_BSY             (1 << 26)
0159 
0160 /* TX FIFO Underrun error status */
0161 #define TEGRA20_SPDIF_STATUS_TX_ERR             (1 << 25)
0162 
0163 /* RX FIFO Overrun error status */
0164 #define TEGRA20_SPDIF_STATUS_RX_ERR             (1 << 24)
0165 
0166 /* Preamble status: 0=Preamble OK, 1=bad/missing preamble */
0167 #define TEGRA20_SPDIF_STATUS_IS_P               (1 << 23)
0168 
0169 /* B-preamble detection status: 0=not detected, 1=B-preamble detected */
0170 #define TEGRA20_SPDIF_STATUS_IS_B               (1 << 22)
0171 
0172 /*
0173  * RX channel block data receive status:
0174  * 0=entire block not recieved yet.
0175  * 1=received entire block of channel status,
0176  */
0177 #define TEGRA20_SPDIF_STATUS_IS_C               (1 << 21)
0178 
0179 /* RX User Data Valid flag:  1=valid IU detected, 0 = no IU detected. */
0180 #define TEGRA20_SPDIF_STATUS_IS_U               (1 << 20)
0181 
0182 /*
0183  * RX User FIFO Status:
0184  * 1=attention level reached, 0=attention level not reached.
0185  */
0186 #define TEGRA20_SPDIF_STATUS_QS_RU              (1 << 19)
0187 
0188 /*
0189  * TX User FIFO Status:
0190  * 1=attention level reached, 0=attention level not reached.
0191  */
0192 #define TEGRA20_SPDIF_STATUS_QS_TU              (1 << 18)
0193 
0194 /*
0195  * RX Data FIFO Status:
0196  * 1=attention level reached, 0=attention level not reached.
0197  */
0198 #define TEGRA20_SPDIF_STATUS_QS_RX              (1 << 17)
0199 
0200 /*
0201  * TX Data FIFO Status:
0202  * 1=attention level reached, 0=attention level not reached.
0203  */
0204 #define TEGRA20_SPDIF_STATUS_QS_TX              (1 << 16)
0205 
0206 /* Fields in TEGRA20_SPDIF_STROBE_CTRL */
0207 
0208 /*
0209  * Indicates the approximate number of detected SPDIFIN clocks within a
0210  * bi-phase period.
0211  */
0212 #define TEGRA20_SPDIF_STROBE_CTRL_PERIOD_SHIFT          16
0213 #define TEGRA20_SPDIF_STROBE_CTRL_PERIOD_MASK           (0xff << TEGRA20_SPDIF_STROBE_CTRL_PERIOD_SHIFT)
0214 
0215 /* Data strobe mode: 0=Auto-locked 1=Manual locked */
0216 #define TEGRA20_SPDIF_STROBE_CTRL_STROBE            (1 << 15)
0217 
0218 /*
0219  * Manual data strobe time within the bi-phase clock period (in terms of
0220  * the number of over-sampling clocks).
0221  */
0222 #define TEGRA20_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT        8
0223 #define TEGRA20_SPDIF_STROBE_CTRL_DATA_STROBES_MASK     (0x1f << TEGRA20_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT)
0224 
0225 /*
0226  * Manual SPDIFIN bi-phase clock period (in terms of the number of
0227  * over-sampling clocks).
0228  */
0229 #define TEGRA20_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT        0
0230 #define TEGRA20_SPDIF_STROBE_CTRL_CLOCK_PERIOD_MASK     (0x3f << TEGRA20_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT)
0231 
0232 /* Fields in SPDIF_DATA_FIFO_CSR */
0233 
0234 /* Clear Receiver User FIFO (RX USR.FIFO) */
0235 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_CLR          (1 << 31)
0236 
0237 #define TEGRA20_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT           0
0238 #define TEGRA20_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS          1
0239 #define TEGRA20_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS        2
0240 #define TEGRA20_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS         3
0241 
0242 /* RU FIFO attention level */
0243 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT        29
0244 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_MASK     \
0245         (0x3                                      << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
0246 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU1_WORD_FULL    \
0247         (TEGRA20_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT    << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
0248 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU2_WORD_FULL    \
0249         (TEGRA20_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS   << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
0250 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU3_WORD_FULL    \
0251         (TEGRA20_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
0252 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_RU4_WORD_FULL    \
0253         (TEGRA20_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS  << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_ATN_LVL_SHIFT)
0254 
0255 /* Number of RX USR.FIFO levels with valid data. */
0256 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_SHIFT     24
0257 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_MASK      (0x1f << TEGRA20_SPDIF_DATA_FIFO_CSR_RU_FULL_COUNT_SHIFT)
0258 
0259 /* Clear Transmitter User FIFO (TX USR.FIFO) */
0260 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_CLR          (1 << 23)
0261 
0262 /* TU FIFO attention level */
0263 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT        21
0264 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_MASK     \
0265         (0x3                                      << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
0266 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU1_WORD_FULL    \
0267         (TEGRA20_SPDIF_FIFO_ATN_LVL_U_ONE_SLOT    << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
0268 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU2_WORD_FULL    \
0269         (TEGRA20_SPDIF_FIFO_ATN_LVL_U_TWO_SLOTS   << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
0270 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU3_WORD_FULL    \
0271         (TEGRA20_SPDIF_FIFO_ATN_LVL_U_THREE_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
0272 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_TU4_WORD_FULL    \
0273         (TEGRA20_SPDIF_FIFO_ATN_LVL_U_FOUR_SLOTS  << TEGRA20_SPDIF_DATA_FIFO_CSR_TU_ATN_LVL_SHIFT)
0274 
0275 /* Number of TX USR.FIFO levels that could be filled. */
0276 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_SHIFT    16
0277 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_MASK     (0x1f << SPDIF_DATA_FIFO_CSR_TU_EMPTY_COUNT_SHIFT)
0278 
0279 /* Clear Receiver Data FIFO (RX DATA.FIFO) */
0280 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_CLR          (1 << 15)
0281 
0282 #define TEGRA20_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT           0
0283 #define TEGRA20_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS         1
0284 #define TEGRA20_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS        2
0285 #define TEGRA20_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS       3
0286 
0287 /* RU FIFO attention level */
0288 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT        13
0289 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_MASK     \
0290         (0x3                                       << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
0291 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU1_WORD_FULL    \
0292         (TEGRA20_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT     << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
0293 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU4_WORD_FULL    \
0294         (TEGRA20_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS   << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
0295 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU8_WORD_FULL    \
0296         (TEGRA20_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS  << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
0297 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_RU12_WORD_FULL   \
0298         (TEGRA20_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_ATN_LVL_SHIFT)
0299 
0300 /* Number of RX DATA.FIFO levels with valid data. */
0301 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_SHIFT     8
0302 #define TEGRA20_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_MASK      (0x1f << TEGRA20_SPDIF_DATA_FIFO_CSR_RX_FULL_COUNT_SHIFT)
0303 
0304 /* Clear Transmitter Data FIFO (TX DATA.FIFO) */
0305 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_CLR          (1 << 7)
0306 
0307 /* TU FIFO attention level */
0308 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT        5
0309 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_MASK     \
0310         (0x3                                       << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
0311 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU1_WORD_FULL    \
0312         (TEGRA20_SPDIF_FIFO_ATN_LVL_D_ONE_SLOT     << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
0313 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU4_WORD_FULL    \
0314         (TEGRA20_SPDIF_FIFO_ATN_LVL_D_FOUR_SLOTS   << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
0315 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU8_WORD_FULL    \
0316         (TEGRA20_SPDIF_FIFO_ATN_LVL_D_EIGHT_SLOTS  << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
0317 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU12_WORD_FULL   \
0318         (TEGRA20_SPDIF_FIFO_ATN_LVL_D_TWELVE_SLOTS << TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_SHIFT)
0319 
0320 /* Number of TX DATA.FIFO levels that could be filled. */
0321 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_SHIFT    0
0322 #define TEGRA20_SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_MASK     (0x1f << SPDIF_DATA_FIFO_CSR_TX_EMPTY_COUNT_SHIFT)
0323 
0324 /* Fields in TEGRA20_SPDIF_DATA_OUT */
0325 
0326 /*
0327  * This register has 5 different formats:
0328  * 16-bit        (BIT_MODE=00, PACK=0)
0329  * 20-bit        (BIT_MODE=01, PACK=0)
0330  * 24-bit        (BIT_MODE=10, PACK=0)
0331  * raw           (BIT_MODE=11, PACK=0)
0332  * 16-bit packed (BIT_MODE=00, PACK=1)
0333  */
0334 
0335 #define TEGRA20_SPDIF_DATA_OUT_DATA_16_SHIFT            0
0336 #define TEGRA20_SPDIF_DATA_OUT_DATA_16_MASK         (0xffff << TEGRA20_SPDIF_DATA_OUT_DATA_16_SHIFT)
0337 
0338 #define TEGRA20_SPDIF_DATA_OUT_DATA_20_SHIFT            0
0339 #define TEGRA20_SPDIF_DATA_OUT_DATA_20_MASK         (0xfffff << TEGRA20_SPDIF_DATA_OUT_DATA_20_SHIFT)
0340 
0341 #define TEGRA20_SPDIF_DATA_OUT_DATA_24_SHIFT            0
0342 #define TEGRA20_SPDIF_DATA_OUT_DATA_24_MASK         (0xffffff << TEGRA20_SPDIF_DATA_OUT_DATA_24_SHIFT)
0343 
0344 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_P           (1 << 31)
0345 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_C           (1 << 30)
0346 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_U           (1 << 29)
0347 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_V           (1 << 28)
0348 
0349 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_DATA_SHIFT      8
0350 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_DATA_MASK       (0xfffff << TEGRA20_SPDIF_DATA_OUT_DATA_RAW_DATA_SHIFT)
0351 
0352 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_AUX_SHIFT       4
0353 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_AUX_MASK        (0xf << TEGRA20_SPDIF_DATA_OUT_DATA_RAW_AUX_SHIFT)
0354 
0355 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_SHIFT      0
0356 #define TEGRA20_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_MASK       (0xf << TEGRA20_SPDIF_DATA_OUT_DATA_RAW_PREAMBLE_SHIFT)
0357 
0358 #define TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_SHIFT   16
0359 #define TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_MASK    (0xffff << TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_RIGHT_SHIFT)
0360 
0361 #define TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_SHIFT    0
0362 #define TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_MASK     (0xffff << TEGRA20_SPDIF_DATA_OUT_DATA_16_PACKED_LEFT_SHIFT)
0363 
0364 /* Fields in TEGRA20_SPDIF_DATA_IN */
0365 
0366 /*
0367  * This register has 5 different formats:
0368  * 16-bit        (BIT_MODE=00, PACK=0)
0369  * 20-bit        (BIT_MODE=01, PACK=0)
0370  * 24-bit        (BIT_MODE=10, PACK=0)
0371  * raw           (BIT_MODE=11, PACK=0)
0372  * 16-bit packed (BIT_MODE=00, PACK=1)
0373  *
0374  * Bits 31:24 are common to all modes except 16-bit packed
0375  */
0376 
0377 #define TEGRA20_SPDIF_DATA_IN_DATA_P                (1 << 31)
0378 #define TEGRA20_SPDIF_DATA_IN_DATA_C                (1 << 30)
0379 #define TEGRA20_SPDIF_DATA_IN_DATA_U                (1 << 29)
0380 #define TEGRA20_SPDIF_DATA_IN_DATA_V                (1 << 28)
0381 
0382 #define TEGRA20_SPDIF_DATA_IN_DATA_PREAMBLE_SHIFT       24
0383 #define TEGRA20_SPDIF_DATA_IN_DATA_PREAMBLE_MASK        (0xf << TEGRA20_SPDIF_DATA_IN_DATA_PREAMBLE_SHIFT)
0384 
0385 #define TEGRA20_SPDIF_DATA_IN_DATA_16_SHIFT         0
0386 #define TEGRA20_SPDIF_DATA_IN_DATA_16_MASK          (0xffff << TEGRA20_SPDIF_DATA_IN_DATA_16_SHIFT)
0387 
0388 #define TEGRA20_SPDIF_DATA_IN_DATA_20_SHIFT         0
0389 #define TEGRA20_SPDIF_DATA_IN_DATA_20_MASK          (0xfffff << TEGRA20_SPDIF_DATA_IN_DATA_20_SHIFT)
0390 
0391 #define TEGRA20_SPDIF_DATA_IN_DATA_24_SHIFT         0
0392 #define TEGRA20_SPDIF_DATA_IN_DATA_24_MASK          (0xffffff << TEGRA20_SPDIF_DATA_IN_DATA_24_SHIFT)
0393 
0394 #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_DATA_SHIFT       8
0395 #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_DATA_MASK        (0xfffff << TEGRA20_SPDIF_DATA_IN_DATA_RAW_DATA_SHIFT)
0396 
0397 #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_AUX_SHIFT        4
0398 #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_AUX_MASK         (0xf << TEGRA20_SPDIF_DATA_IN_DATA_RAW_AUX_SHIFT)
0399 
0400 #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_SHIFT       0
0401 #define TEGRA20_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_MASK        (0xf << TEGRA20_SPDIF_DATA_IN_DATA_RAW_PREAMBLE_SHIFT)
0402 
0403 #define TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_SHIFT    16
0404 #define TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_MASK     (0xffff << TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_RIGHT_SHIFT)
0405 
0406 #define TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_SHIFT     0
0407 #define TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_MASK      (0xffff << TEGRA20_SPDIF_DATA_IN_DATA_16_PACKED_LEFT_SHIFT)
0408 
0409 /* Fields in TEGRA20_SPDIF_CH_STA_RX_A */
0410 /* Fields in TEGRA20_SPDIF_CH_STA_RX_B */
0411 /* Fields in TEGRA20_SPDIF_CH_STA_RX_C */
0412 /* Fields in TEGRA20_SPDIF_CH_STA_RX_D */
0413 /* Fields in TEGRA20_SPDIF_CH_STA_RX_E */
0414 /* Fields in TEGRA20_SPDIF_CH_STA_RX_F */
0415 
0416 /*
0417  * The 6-word receive channel data page buffer holds a block (192 frames) of
0418  * channel status information. The order of receive is from LSB to MSB
0419  * bit, and from CH_STA_RX_A to CH_STA_RX_F then back to CH_STA_RX_A.
0420  */
0421 
0422 /* Fields in TEGRA20_SPDIF_CH_STA_TX_A */
0423 /* Fields in TEGRA20_SPDIF_CH_STA_TX_B */
0424 /* Fields in TEGRA20_SPDIF_CH_STA_TX_C */
0425 /* Fields in TEGRA20_SPDIF_CH_STA_TX_D */
0426 /* Fields in TEGRA20_SPDIF_CH_STA_TX_E */
0427 /* Fields in TEGRA20_SPDIF_CH_STA_TX_F */
0428 
0429 /*
0430  * The 6-word transmit channel data page buffer holds a block (192 frames) of
0431  * channel status information. The order of transmission is from LSB to MSB
0432  * bit, and from CH_STA_TX_A to CH_STA_TX_F then back to CH_STA_TX_A.
0433  */
0434 
0435 /* Fields in TEGRA20_SPDIF_USR_STA_RX_A */
0436 
0437 /*
0438  * This 4-word deep FIFO receives user FIFO field information. The order of
0439  * receive is from LSB to MSB bit.
0440  */
0441 
0442 /* Fields in TEGRA20_SPDIF_USR_DAT_TX_A */
0443 
0444 /*
0445  * This 4-word deep FIFO transmits user FIFO field information. The order of
0446  * transmission is from LSB to MSB bit.
0447  */
0448 
0449 struct tegra20_spdif {
0450     struct clk *clk_spdif_out;
0451     struct snd_dmaengine_dai_dma_data capture_dma_data;
0452     struct snd_dmaengine_dai_dma_data playback_dma_data;
0453     struct regmap *regmap;
0454     struct reset_control *reset;
0455 };
0456 
0457 #endif