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