256 lines
12 KiB
C
256 lines
12 KiB
C
/*
|
|
* tegra210_spdif.h - Definitions for Tegra210 SPDIF driver
|
|
*
|
|
* Copyright (c) 2014-2019, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __TEGRA210_SPDIF_ALT_H__
|
|
#define __TEGRA210_SPDIF_ALT_H__
|
|
|
|
/* Register offsets from TEGRA_SPDIF_BASE */
|
|
|
|
#define TEGRA210_SPDIF_CTRL 0x0
|
|
#define TEGRA210_SPDIF_STROBE_CTRL 0x4
|
|
#define TEGRA210_SPDIF_CIF_TXD_CTRL 0x08
|
|
#define TEGRA210_SPDIF_CIF_RXD_CTRL 0x0C
|
|
#define TEGRA210_SPDIF_CIF_TXU_CTRL 0x10
|
|
#define TEGRA210_SPDIF_CIF_RXU_CTRL 0x14
|
|
#define TEGRA210_SPDIF_CH_STA_RX_A 0x18
|
|
#define TEGRA210_SPDIF_CH_STA_RX_B 0x1C
|
|
#define TEGRA210_SPDIF_CH_STA_RX_C 0x20
|
|
#define TEGRA210_SPDIF_CH_STA_RX_D 0x24
|
|
#define TEGRA210_SPDIF_CH_STA_RX_E 0x28
|
|
#define TEGRA210_SPDIF_CH_STA_RX_F 0x2C
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A 0x30
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B 0x34
|
|
#define TEGRA210_SPDIF_CH_STA_TX_C 0x38
|
|
#define TEGRA210_SPDIF_CH_STA_TX_D 0x3C
|
|
#define TEGRA210_SPDIF_CH_STA_TX_E 0x40
|
|
#define TEGRA210_SPDIF_CH_STA_TX_F 0x44
|
|
#define TEGRA210_SPDIF_FLOWCTL_CTRL 0x70
|
|
#define TEGRA210_SPDIF_TX_STEP 0x74
|
|
#define TEGRA210_SPDIF_FLOW_STATUS 0x78
|
|
#define TEGRA210_SPDIF_FLOW_TOTAL 0x7c
|
|
#define TEGRA210_SPDIF_FLOW_OVER 0x80
|
|
#define TEGRA210_SPDIF_FLOW_UNDER 0x84
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_0 0x88
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_1 0x8c
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_2 0x90
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_3 0x94
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_4 0x98
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_5 0x9c
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_0 0xa0
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_1 0xa4
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_2 0xa8
|
|
|
|
/* Fields in TEGRA210_SPDIF_CTRL */
|
|
#define TEGRA210_SPDIF_CTRL_FLOWCTL_EN_ENABLE (1<<31)
|
|
#define TEGRA210_SPDIF_CTRL_CAP_LC_LEFT_CH (1<<30)
|
|
#define TEGRA210_SPDIF_CTRL_RX_EN_ENABLE (1<<29)
|
|
#define TEGRA210_SPDIF_CTRL_TX_EN_ENABLE (1<<28)
|
|
#define TEGRA210_SPDIF_CTRL_TC_EN_ENABLE (1<<27)
|
|
#define TEGRA210_SPDIF_CTRL_TU_EN_ENABLE (1<<26)
|
|
#define TEGRA210_SPDIF_CTRL_IE_P_RSVD_ENABLE (1<<23)
|
|
#define TEGRA210_SPDIF_CTRL_IE_B_RSVD_ENABLE (1<<22)
|
|
#define TEGRA210_SPDIF_CTRL_IE_C_RSVD_ENABLE (1<<21)
|
|
#define TEGRA210_SPDIF_CTRL_IE_U_RSVD_ENABLE (1<<20)
|
|
#define TEGRA210_SPDIF_CTRL_LBK_EN_ENABLE_MASK (1<<15)
|
|
#define TEGRA210_SPDIF_CTRL_LBK_EN_ENABLE_SHIFT 15
|
|
#define TEGRA210_SPDIF_CTRL_PACK_ENABLE (1<<14)
|
|
|
|
#define TEGRA210_SPDIF_BIT_MODE16 0
|
|
#define TEGRA210_SPDIF_BIT_MODE20 1
|
|
#define TEGRA210_SPDIF_BIT_MODE24 2
|
|
#define TEGRA210_SPDIF_BIT_MODERAW 3
|
|
|
|
#define TEGRA210_SPDIF_CTRL_BIT_MODE_SHIFT 12
|
|
#define TEGRA210_SPDIF_CTRL_BIT_MODE_MASK (3 << TEGRA210_SPDIF_CTRL_BIT_MODE_SHIFT)
|
|
#define TEGRA210_SPDIF_CTRL_BIT_MODE_16BIT (TEGRA210_SPDIF_BIT_MODE16 << TEGRA210_SPDIF_CTRL_BIT_MODE_SHIFT)
|
|
#define TEGRA210_SPDIF_CTRL_BIT_MODE_20BIT (TEGRA210_SPDIF_BIT_MODE20 << TEGRA210_SPDIF_CTRL_BIT_MODE_SHIFT)
|
|
#define TEGRA210_SPDIF_CTRL_BIT_MODE_24BIT (TEGRA210_SPDIF_BIT_MODE24 << TEGRA210_SPDIF_CTRL_BIT_MODE_SHIFT)
|
|
#define TEGRA210_SPDIF_CTRL_BIT_MODE_RAW (TEGRA210_SPDIF_BIT_MODERAW << TEGRA210_SPDIF_CTRL_BIT_MODE_SHIFT)
|
|
|
|
#define TEGRA210_SPDIF_CTRL_CG_EN_ENABLE (1<<11)
|
|
|
|
#define TEGRA210_SPDIF_CTRL_OBS_SEL_SHIFT 8
|
|
#define TEGRA210_SPDIF_CTRL_OBS_SEL_NASK (0x7 << TEGRA210_SPDIF_CTRL_OBS_SEL_SHIFT)
|
|
|
|
#define TEGRA210_SPDIF_CTRL_SOFT_RESET_ENABLE (1<<7)
|
|
|
|
/* Fields in TEGRA210_SPDIF_STROBE_CTRL */
|
|
#define TEGRA210_SPDIF_STROBE_CTRL_PERIOD_SHIFT 16
|
|
#define TEGRA210_SPDIF_STROBE_CTRL_PERIOD_MASK (0xff << TEGRA210_SPDIF_STROBE_CTRL_PERIOD_SHIFT)
|
|
|
|
#define TEGRA210_SPDIF_STROBE_CTRL_STROBE (1<<15)
|
|
|
|
#define TEGRA210_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT 8
|
|
#define TEGRA210_SPDIF_STROBE_CTRL_DATA_STROBES_MASK (0x1f << TEGRA210_SPDIF_STROBE_CTRL_DATA_STROBES_SHIFT)
|
|
|
|
#define TEGRA210_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT 0
|
|
#define TEGRA210_SPDIF_STROBE_CTRL_CLOCK_PERIOD_MASK (0x3f << TEGRA210_SPDIF_STROBE_CTRL_CLOCK_PERIOD_SHIFT)
|
|
|
|
/*
|
|
* The 6-word receive channel data page buffer holds a block (192 frames) of
|
|
* channel status information. The order of receive is from LSB to MSB
|
|
* bit, and from CH_STA_RX_A to CH_STA_RX_F then back to CH_STA_RX_A.
|
|
*/
|
|
|
|
/* Fields in TEGRA210_SPDIF_CH_STA_TX_A */
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_22050 0x4
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_24000 0x6
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_32000 0x3
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_44100 0x0
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_48000 0x2
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_88200 0x8
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_96000 0xA
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_176400 0xC
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SF_192000 0xE
|
|
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT 24
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_MASK \
|
|
(0xF << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_22050 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_22050 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_24000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_24000 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_32000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_32000 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_44100 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_44100 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_48000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_48000 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_88200 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_88200 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_96000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_96000 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_176400 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_176400 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_192000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_A_SF_192000 << TEGRA210_SPDIF_CH_STA_TX_A_SAMP_FREQ_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_CH_STA_TX_B */
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_8000 0x6
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_11025 0xA
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_12000 0x2
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_16000 0x8
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_22050 0xB
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_24000 0x9
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_32000 0xC
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_44100 0xF
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_48000 0xD
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_88200 0x7
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_96000 0x5
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_176400 0x3
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_SF_192000 0x1
|
|
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT 4
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_MASK \
|
|
(0xF << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_8000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_8000 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_11025 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_11025 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_12000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_12000 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_16000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_16000 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_22050 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_22025 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_24000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_24000 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_32000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_32000 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_44100 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_44100 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_48000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_48000 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_88200 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_88200 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_96000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_96000 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_176400 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_176400 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
#define TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_192000 \
|
|
(TEGRA210_SPDIF_CH_STA_TX_B_SF_192000 << TEGRA210_SPDIF_CH_STA_TX_B_ORIG_SAMP_FREQ_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_CH_STA_TX_C */
|
|
/* Fields in TEGRA210_SPDIF_CH_STA_TX_D */
|
|
/* Fields in TEGRA210_SPDIF_CH_STA_TX_E */
|
|
/* Fields in TEGRA210_SPDIF_CH_STA_TX_F */
|
|
|
|
/* Fields in TEGRA210_SPDIF_FLOWCTL_CTRL */
|
|
#define TEGRA210_SPDIF_FLOWCTL_CTRL_FILTER_QUAD (1<<31)
|
|
|
|
/* Fields in TEGRA210_SPDIF_TX_STEP */
|
|
#define TEGRA210_SPDIF_TX_STEP_STEP_SIZE_SHIFT 0
|
|
#define TEGRA210_SPDIF_TX_STEP_STEP_SIZE_MASK (0xffff << TEGRA210_SPDIF_TX_STEP_STEP_SIZE_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_FLOW_STATUS */
|
|
#define TEGRA210_SPDIF_FLOW_STATUS_COUNTER_EN_ENABLE (1<<1)
|
|
#define TEGRA210_SPDIF_FLOW_STATUS_MONITOR_CLR_CLEAR (1<<2)
|
|
#define TEGRA210_SPDIF_FLOW_STATUS_COUNTER_CLR_CLEAR (1<<3)
|
|
#define TEGRA210_SPDIF_FLOW_STATUS_MONITOR_INT_EN_ENABLE (1<<4)
|
|
#define TEGRA210_SPDIF_FLOW_STATUS_FLOW_OVERFLOW_OVER (1<<30)
|
|
#define TEGRA210_SPDIF_FLOW_STATUS_FLOW_UNDERFLOW_UNDER (1<<31)
|
|
|
|
/* Fields in TEGRA210_SPDIF_FLOW_TOTAL */
|
|
/* Fields in TEGRA210_SPDIF_FLOW_OVER */
|
|
/* Fields in TEGRA210_SPDIF_FLOW_UNDER */
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_1_4_0 */
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_0_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_0_COEF_MASK (0xffff << TEGRA30_TEGRA210_SPDIF_LCOEF_1_4_0_COEF_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_1_4_1 */
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_1_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_1_COEF_MASK (0xffff << TEGRA210_SPDIF_LCOEF_1_4_1_COEF_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_1_4_2 */
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_2_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_2_COEF_MASK (0xffff << TEGRA210_SPDIF_LCOEF_1_4_2_COEF_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_1_4_3 */
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_3_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_3_COEF_MASK (0xffff << TEGRA210_SPDIF_LCOEF_1_4_3_COEF_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_1_4_4 */
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_4_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_4_COEF_MASK (0xffff << TEGRA210_SPDIF_LCOEF_1_4_4_COEF_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_1_4_5 */
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_5_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_1_4_5_COEF_MASK (0xffff << TEGRA210_SPDIF_LCOEF_1_4_5_COEF_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_2_4_0 */
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_0_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_0_COEF_MASK (0xffff << TEGRA210_SPDIF_LCOEF_2_4_0_COEF_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_2_4_1 */
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_1_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_1_COEF_MASK (0xffff << TEGRA210_SPDIF_LCOEF_2_4_1_COEF_SHIFT)
|
|
|
|
/* Fields in TEGRA210_SPDIF_LCOEF_2_4_2 */
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_2_COEF_SHIFT 0
|
|
#define TEGRA210_SPDIF_LCOEF_2_4_2_COEF_MASK (0xffff << TEGRA210_SPDIF_LCOEF_2_4_2_COEF_SHIFT)
|
|
|
|
struct tegra210_spdif {
|
|
struct clk *clk_spdif_out;
|
|
struct clk *clk_spdif_in;
|
|
struct regmap *regmap;
|
|
unsigned int loopback;
|
|
};
|
|
|
|
#endif
|