Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * tegra30_i2s.h - Definitions for Tegra30 I2S driver
0004  *
0005  * Copyright (c) 2011,2012, NVIDIA CORPORATION.  All rights reserved.
0006  */
0007 
0008 #ifndef __TEGRA30_I2S_H__
0009 #define __TEGRA30_I2S_H__
0010 
0011 #include "tegra_pcm.h"
0012 
0013 /* Register offsets from TEGRA30_I2S*_BASE */
0014 
0015 #define TEGRA30_I2S_CTRL                0x0
0016 #define TEGRA30_I2S_TIMING              0x4
0017 #define TEGRA30_I2S_OFFSET              0x08
0018 #define TEGRA30_I2S_CH_CTRL             0x0c
0019 #define TEGRA30_I2S_SLOT_CTRL               0x10
0020 #define TEGRA30_I2S_CIF_RX_CTRL             0x14
0021 #define TEGRA30_I2S_CIF_TX_CTRL             0x18
0022 #define TEGRA30_I2S_FLOWCTL             0x1c
0023 #define TEGRA30_I2S_TX_STEP             0x20
0024 #define TEGRA30_I2S_FLOW_STATUS             0x24
0025 #define TEGRA30_I2S_FLOW_TOTAL              0x28
0026 #define TEGRA30_I2S_FLOW_OVER               0x2c
0027 #define TEGRA30_I2S_FLOW_UNDER              0x30
0028 #define TEGRA30_I2S_LCOEF_1_4_0             0x34
0029 #define TEGRA30_I2S_LCOEF_1_4_1             0x38
0030 #define TEGRA30_I2S_LCOEF_1_4_2             0x3c
0031 #define TEGRA30_I2S_LCOEF_1_4_3             0x40
0032 #define TEGRA30_I2S_LCOEF_1_4_4             0x44
0033 #define TEGRA30_I2S_LCOEF_1_4_5             0x48
0034 #define TEGRA30_I2S_LCOEF_2_4_0             0x4c
0035 #define TEGRA30_I2S_LCOEF_2_4_1             0x50
0036 #define TEGRA30_I2S_LCOEF_2_4_2             0x54
0037 
0038 /* Fields in TEGRA30_I2S_CTRL */
0039 
0040 #define TEGRA30_I2S_CTRL_XFER_EN_TX         (1 << 31)
0041 #define TEGRA30_I2S_CTRL_XFER_EN_RX         (1 << 30)
0042 #define TEGRA30_I2S_CTRL_CG_EN              (1 << 29)
0043 #define TEGRA30_I2S_CTRL_SOFT_RESET         (1 << 28)
0044 #define TEGRA30_I2S_CTRL_TX_FLOWCTL_EN          (1 << 27)
0045 
0046 #define TEGRA30_I2S_CTRL_OBS_SEL_SHIFT          24
0047 #define TEGRA30_I2S_CTRL_OBS_SEL_MASK           (7 << TEGRA30_I2S_CTRL_OBS_SEL_SHIFT)
0048 
0049 #define TEGRA30_I2S_FRAME_FORMAT_LRCK           0
0050 #define TEGRA30_I2S_FRAME_FORMAT_FSYNC          1
0051 
0052 #define TEGRA30_I2S_CTRL_FRAME_FORMAT_SHIFT     12
0053 #define TEGRA30_I2S_CTRL_FRAME_FORMAT_MASK      (7                              << TEGRA30_I2S_CTRL_FRAME_FORMAT_SHIFT)
0054 #define TEGRA30_I2S_CTRL_FRAME_FORMAT_LRCK      (TEGRA30_I2S_FRAME_FORMAT_LRCK  << TEGRA30_I2S_CTRL_FRAME_FORMAT_SHIFT)
0055 #define TEGRA30_I2S_CTRL_FRAME_FORMAT_FSYNC     (TEGRA30_I2S_FRAME_FORMAT_FSYNC << TEGRA30_I2S_CTRL_FRAME_FORMAT_SHIFT)
0056 
0057 #define TEGRA30_I2S_CTRL_MASTER_ENABLE          (1 << 10)
0058 
0059 #define TEGRA30_I2S_LRCK_LEFT_LOW           0
0060 #define TEGRA30_I2S_LRCK_RIGHT_LOW          1
0061 
0062 #define TEGRA30_I2S_CTRL_LRCK_SHIFT         9
0063 #define TEGRA30_I2S_CTRL_LRCK_MASK          (1                          << TEGRA30_I2S_CTRL_LRCK_SHIFT)
0064 #define TEGRA30_I2S_CTRL_LRCK_L_LOW         (TEGRA30_I2S_LRCK_LEFT_LOW  << TEGRA30_I2S_CTRL_LRCK_SHIFT)
0065 #define TEGRA30_I2S_CTRL_LRCK_R_LOW         (TEGRA30_I2S_LRCK_RIGHT_LOW << TEGRA30_I2S_CTRL_LRCK_SHIFT)
0066 
0067 #define TEGRA30_I2S_CTRL_LPBK_ENABLE            (1 << 8)
0068 
0069 #define TEGRA30_I2S_BIT_CODE_LINEAR         0
0070 #define TEGRA30_I2S_BIT_CODE_ULAW           1
0071 #define TEGRA30_I2S_BIT_CODE_ALAW           2
0072 
0073 #define TEGRA30_I2S_CTRL_BIT_CODE_SHIFT         4
0074 #define TEGRA30_I2S_CTRL_BIT_CODE_MASK          (3                           << TEGRA30_I2S_CTRL_BIT_CODE_SHIFT)
0075 #define TEGRA30_I2S_CTRL_BIT_CODE_LINEAR        (TEGRA30_I2S_BIT_CODE_LINEAR << TEGRA30_I2S_CTRL_BIT_CODE_SHIFT)
0076 #define TEGRA30_I2S_CTRL_BIT_CODE_ULAW          (TEGRA30_I2S_BIT_CODE_ULAW   << TEGRA30_I2S_CTRL_BIT_CODE_SHIFT)
0077 #define TEGRA30_I2S_CTRL_BIT_CODE_ALAW          (TEGRA30_I2S_BIT_CODE_ALAW   << TEGRA30_I2S_CTRL_BIT_CODE_SHIFT)
0078 
0079 #define TEGRA30_I2S_BITS_8              1
0080 #define TEGRA30_I2S_BITS_12             2
0081 #define TEGRA30_I2S_BITS_16             3
0082 #define TEGRA30_I2S_BITS_20             4
0083 #define TEGRA30_I2S_BITS_24             5
0084 #define TEGRA30_I2S_BITS_28             6
0085 #define TEGRA30_I2S_BITS_32             7
0086 
0087 /* Sample container size; see {RX,TX}_MASK field in CH_CTRL below */
0088 #define TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT         0
0089 #define TEGRA30_I2S_CTRL_BIT_SIZE_MASK          (7                   << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
0090 #define TEGRA30_I2S_CTRL_BIT_SIZE_8         (TEGRA30_I2S_BITS_8  << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
0091 #define TEGRA30_I2S_CTRL_BIT_SIZE_12            (TEGRA30_I2S_BITS_12 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
0092 #define TEGRA30_I2S_CTRL_BIT_SIZE_16            (TEGRA30_I2S_BITS_16 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
0093 #define TEGRA30_I2S_CTRL_BIT_SIZE_20            (TEGRA30_I2S_BITS_20 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
0094 #define TEGRA30_I2S_CTRL_BIT_SIZE_24            (TEGRA30_I2S_BITS_24 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
0095 #define TEGRA30_I2S_CTRL_BIT_SIZE_28            (TEGRA30_I2S_BITS_28 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
0096 #define TEGRA30_I2S_CTRL_BIT_SIZE_32            (TEGRA30_I2S_BITS_32 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
0097 
0098 /* Fields in TEGRA30_I2S_TIMING */
0099 
0100 #define TEGRA30_I2S_TIMING_NON_SYM_ENABLE       (1 << 12)
0101 #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT  0
0102 #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US    0x7ff
0103 #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK   (TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT)
0104 
0105 /* Fields in TEGRA30_I2S_OFFSET */
0106 
0107 #define TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_SHIFT     16
0108 #define TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_MASK_US   0x7ff
0109 #define TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_MASK      (TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_MASK_US << TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_SHIFT)
0110 #define TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_SHIFT     0
0111 #define TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_MASK_US   0x7ff
0112 #define TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_MASK      (TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_MASK_US << TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_SHIFT)
0113 
0114 /* Fields in TEGRA30_I2S_CH_CTRL */
0115 
0116 /* (FSYNC width - 1) in bit clocks */
0117 #define TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_SHIFT       24
0118 #define TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_MASK_US     0xff
0119 #define TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_MASK        (TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_MASK_US << TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_SHIFT)
0120 
0121 #define TEGRA30_I2S_HIGHZ_NO                0
0122 #define TEGRA30_I2S_HIGHZ_YES               1
0123 #define TEGRA30_I2S_HIGHZ_ON_HALF_BIT_CLK       2
0124 
0125 #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT        12
0126 #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_MASK     (3                                 << TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT)
0127 #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_NO       (TEGRA30_I2S_HIGHZ_NO              << TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT)
0128 #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_YES      (TEGRA30_I2S_HIGHZ_YES             << TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT)
0129 #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_ON_HALF_BIT_CLK  (TEGRA30_I2S_HIGHZ_ON_HALF_BIT_CLK << TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT)
0130 
0131 #define TEGRA30_I2S_MSB_FIRST               0
0132 #define TEGRA30_I2S_LSB_FIRST               1
0133 
0134 #define TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_SHIFT      10
0135 #define TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_MASK       (1                     << TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_SHIFT)
0136 #define TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_MSB_FIRST  (TEGRA30_I2S_MSB_FIRST << TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_SHIFT)
0137 #define TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_LSB_FIRST  (TEGRA30_I2S_LSB_FIRST << TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_SHIFT)
0138 #define TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_SHIFT      9
0139 #define TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_MASK       (1                     << TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_SHIFT)
0140 #define TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_MSB_FIRST  (TEGRA30_I2S_MSB_FIRST << TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_SHIFT)
0141 #define TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_LSB_FIRST  (TEGRA30_I2S_LSB_FIRST << TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_SHIFT)
0142 
0143 #define TEGRA30_I2S_POS_EDGE                0
0144 #define TEGRA30_I2S_NEG_EDGE                1
0145 
0146 #define TEGRA30_I2S_CH_CTRL_EGDE_CTRL_SHIFT     8
0147 #define TEGRA30_I2S_CH_CTRL_EGDE_CTRL_MASK      (1                    << TEGRA30_I2S_CH_CTRL_EGDE_CTRL_SHIFT)
0148 #define TEGRA30_I2S_CH_CTRL_EGDE_CTRL_POS_EDGE      (TEGRA30_I2S_POS_EDGE << TEGRA30_I2S_CH_CTRL_EGDE_CTRL_SHIFT)
0149 #define TEGRA30_I2S_CH_CTRL_EGDE_CTRL_NEG_EDGE      (TEGRA30_I2S_NEG_EDGE << TEGRA30_I2S_CH_CTRL_EGDE_CTRL_SHIFT)
0150 
0151 /* Sample size is # bits from BIT_SIZE minus this field */
0152 #define TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_SHIFT      4
0153 #define TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_MASK_US    7
0154 #define TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_MASK       (TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_MASK_US << TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_SHIFT)
0155 
0156 #define TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_SHIFT      0
0157 #define TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_MASK_US    7
0158 #define TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_MASK       (TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_MASK_US << TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_SHIFT)
0159 
0160 /* Fields in TEGRA30_I2S_SLOT_CTRL */
0161 
0162 /* Number of slots in frame, minus 1 */
0163 #define TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_SHIFT     16
0164 #define TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_MASK_US   7
0165 #define TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_MASK      (TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_MASK_US << TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_SHIFT)
0166 
0167 /* TDM mode slot enable bitmask */
0168 #define TEGRA30_I2S_SLOT_CTRL_RX_SLOT_ENABLES_SHIFT 8
0169 #define TEGRA30_I2S_SLOT_CTRL_RX_SLOT_ENABLES_MASK  (0xff << TEGRA30_I2S_SLOT_CTRL_RX_SLOT_ENABLES_SHIFT)
0170 
0171 #define TEGRA30_I2S_SLOT_CTRL_TX_SLOT_ENABLES_SHIFT 0
0172 #define TEGRA30_I2S_SLOT_CTRL_TX_SLOT_ENABLES_MASK  (0xff << TEGRA30_I2S_SLOT_CTRL_TX_SLOT_ENABLES_SHIFT)
0173 
0174 /* Fields in TEGRA30_I2S_CIF_RX_CTRL */
0175 /* Uses field from TEGRA30_AUDIOCIF_CTRL_* in tegra30_ahub.h */
0176 
0177 /* Fields in TEGRA30_I2S_CIF_TX_CTRL */
0178 /* Uses field from TEGRA30_AUDIOCIF_CTRL_* in tegra30_ahub.h */
0179 
0180 /* Fields in TEGRA30_I2S_FLOWCTL */
0181 
0182 #define TEGRA30_I2S_FILTER_LINEAR           0
0183 #define TEGRA30_I2S_FILTER_QUAD             1
0184 
0185 #define TEGRA30_I2S_FLOWCTL_FILTER_SHIFT        31
0186 #define TEGRA30_I2S_FLOWCTL_FILTER_MASK         (1                         << TEGRA30_I2S_FLOWCTL_FILTER_SHIFT)
0187 #define TEGRA30_I2S_FLOWCTL_FILTER_LINEAR       (TEGRA30_I2S_FILTER_LINEAR << TEGRA30_I2S_FLOWCTL_FILTER_SHIFT)
0188 #define TEGRA30_I2S_FLOWCTL_FILTER_QUAD         (TEGRA30_I2S_FILTER_QUAD   << TEGRA30_I2S_FLOWCTL_FILTER_SHIFT)
0189 
0190 /* Fields in TEGRA30_I2S_TX_STEP */
0191 
0192 #define TEGRA30_I2S_TX_STEP_SHIFT           0
0193 #define TEGRA30_I2S_TX_STEP_MASK_US         0xffff
0194 #define TEGRA30_I2S_TX_STEP_MASK            (TEGRA30_I2S_TX_STEP_MASK_US << TEGRA30_I2S_TX_STEP_SHIFT)
0195 
0196 /* Fields in TEGRA30_I2S_FLOW_STATUS */
0197 
0198 #define TEGRA30_I2S_FLOW_STATUS_UNDERFLOW       (1 << 31)
0199 #define TEGRA30_I2S_FLOW_STATUS_OVERFLOW        (1 << 30)
0200 #define TEGRA30_I2S_FLOW_STATUS_MONITOR_INT_EN      (1 << 4)
0201 #define TEGRA30_I2S_FLOW_STATUS_COUNTER_CLR     (1 << 3)
0202 #define TEGRA30_I2S_FLOW_STATUS_MONITOR_CLR     (1 << 2)
0203 #define TEGRA30_I2S_FLOW_STATUS_COUNTER_EN      (1 << 1)
0204 #define TEGRA30_I2S_FLOW_STATUS_MONITOR_EN      (1 << 0)
0205 
0206 /*
0207  * There are no fields in TEGRA30_I2S_FLOW_TOTAL, TEGRA30_I2S_FLOW_OVER,
0208  * TEGRA30_I2S_FLOW_UNDER; they are counters taking the whole register.
0209  */
0210 
0211 /* Fields in TEGRA30_I2S_LCOEF_* */
0212 
0213 #define TEGRA30_I2S_LCOEF_COEF_SHIFT            0
0214 #define TEGRA30_I2S_LCOEF_COEF_MASK_US          0xffff
0215 #define TEGRA30_I2S_LCOEF_COEF_MASK         (TEGRA30_I2S_LCOEF_COEF_MASK_US << TEGRA30_I2S_LCOEF_COEF_SHIFT)
0216 
0217 struct tegra30_i2s_soc_data {
0218     void (*set_audio_cif)(struct regmap *regmap,
0219                   unsigned int reg,
0220                   struct tegra30_ahub_cif_conf *conf);
0221 };
0222 
0223 struct tegra30_i2s {
0224     const struct tegra30_i2s_soc_data *soc_data;
0225     struct snd_soc_dai_driver dai;
0226     int cif_id;
0227     struct clk *clk_i2s;
0228     enum tegra30_ahub_txcif capture_i2s_cif;
0229     enum tegra30_ahub_rxcif capture_fifo_cif;
0230     char capture_dma_chan[8];
0231     struct snd_dmaengine_dai_dma_data capture_dma_data;
0232     enum tegra30_ahub_rxcif playback_i2s_cif;
0233     enum tegra30_ahub_txcif playback_fifo_cif;
0234     char playback_dma_chan[8];
0235     struct snd_dmaengine_dai_dma_data playback_dma_data;
0236     struct regmap *regmap;
0237     struct snd_dmaengine_pcm_config dma_config;
0238 };
0239 
0240 #endif