linux/sound/soc/fsl/fsl_sai.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Copyright 2012-2013 Freescale Semiconductor, Inc.
   4 */
   5
   6#ifndef __FSL_SAI_H
   7#define __FSL_SAI_H
   8
   9#include <sound/dmaengine_pcm.h>
  10
  11#define FSL_SAI_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  12                         SNDRV_PCM_FMTBIT_S20_3LE |\
  13                         SNDRV_PCM_FMTBIT_S24_LE |\
  14                         SNDRV_PCM_FMTBIT_S32_LE)
  15
  16/* SAI Register Map Register */
  17#define FSL_SAI_VERID   0x00 /* SAI Version ID Register */
  18#define FSL_SAI_PARAM   0x04 /* SAI Parameter Register */
  19#define FSL_SAI_TCSR(ofs)       (0x00 + ofs) /* SAI Transmit Control */
  20#define FSL_SAI_TCR1(ofs)       (0x04 + ofs) /* SAI Transmit Configuration 1 */
  21#define FSL_SAI_TCR2(ofs)       (0x08 + ofs) /* SAI Transmit Configuration 2 */
  22#define FSL_SAI_TCR3(ofs)       (0x0c + ofs) /* SAI Transmit Configuration 3 */
  23#define FSL_SAI_TCR4(ofs)       (0x10 + ofs) /* SAI Transmit Configuration 4 */
  24#define FSL_SAI_TCR5(ofs)       (0x14 + ofs) /* SAI Transmit Configuration 5 */
  25#define FSL_SAI_TDR0    0x20 /* SAI Transmit Data 0 */
  26#define FSL_SAI_TDR1    0x24 /* SAI Transmit Data 1 */
  27#define FSL_SAI_TDR2    0x28 /* SAI Transmit Data 2 */
  28#define FSL_SAI_TDR3    0x2C /* SAI Transmit Data 3 */
  29#define FSL_SAI_TDR4    0x30 /* SAI Transmit Data 4 */
  30#define FSL_SAI_TDR5    0x34 /* SAI Transmit Data 5 */
  31#define FSL_SAI_TDR6    0x38 /* SAI Transmit Data 6 */
  32#define FSL_SAI_TDR7    0x3C /* SAI Transmit Data 7 */
  33#define FSL_SAI_TFR0    0x40 /* SAI Transmit FIFO 0 */
  34#define FSL_SAI_TFR1    0x44 /* SAI Transmit FIFO 1 */
  35#define FSL_SAI_TFR2    0x48 /* SAI Transmit FIFO 2 */
  36#define FSL_SAI_TFR3    0x4C /* SAI Transmit FIFO 3 */
  37#define FSL_SAI_TFR4    0x50 /* SAI Transmit FIFO 4 */
  38#define FSL_SAI_TFR5    0x54 /* SAI Transmit FIFO 5 */
  39#define FSL_SAI_TFR6    0x58 /* SAI Transmit FIFO 6 */
  40#define FSL_SAI_TFR7    0x5C /* SAI Transmit FIFO 7 */
  41#define FSL_SAI_TMR     0x60 /* SAI Transmit Mask */
  42#define FSL_SAI_TTCTL   0x70 /* SAI Transmit Timestamp Control Register */
  43#define FSL_SAI_TTCTN   0x74 /* SAI Transmit Timestamp Counter Register */
  44#define FSL_SAI_TBCTN   0x78 /* SAI Transmit Bit Counter Register */
  45#define FSL_SAI_TTCAP   0x7C /* SAI Transmit Timestamp Capture */
  46#define FSL_SAI_RCSR(ofs)       (0x80 + ofs) /* SAI Receive Control */
  47#define FSL_SAI_RCR1(ofs)       (0x84 + ofs)/* SAI Receive Configuration 1 */
  48#define FSL_SAI_RCR2(ofs)       (0x88 + ofs) /* SAI Receive Configuration 2 */
  49#define FSL_SAI_RCR3(ofs)       (0x8c + ofs) /* SAI Receive Configuration 3 */
  50#define FSL_SAI_RCR4(ofs)       (0x90 + ofs) /* SAI Receive Configuration 4 */
  51#define FSL_SAI_RCR5(ofs)       (0x94 + ofs) /* SAI Receive Configuration 5 */
  52#define FSL_SAI_RDR0    0xa0 /* SAI Receive Data 0 */
  53#define FSL_SAI_RDR1    0xa4 /* SAI Receive Data 1 */
  54#define FSL_SAI_RDR2    0xa8 /* SAI Receive Data 2 */
  55#define FSL_SAI_RDR3    0xac /* SAI Receive Data 3 */
  56#define FSL_SAI_RDR4    0xb0 /* SAI Receive Data 4 */
  57#define FSL_SAI_RDR5    0xb4 /* SAI Receive Data 5 */
  58#define FSL_SAI_RDR6    0xb8 /* SAI Receive Data 6 */
  59#define FSL_SAI_RDR7    0xbc /* SAI Receive Data 7 */
  60#define FSL_SAI_RFR0    0xc0 /* SAI Receive FIFO 0 */
  61#define FSL_SAI_RFR1    0xc4 /* SAI Receive FIFO 1 */
  62#define FSL_SAI_RFR2    0xc8 /* SAI Receive FIFO 2 */
  63#define FSL_SAI_RFR3    0xcc /* SAI Receive FIFO 3 */
  64#define FSL_SAI_RFR4    0xd0 /* SAI Receive FIFO 4 */
  65#define FSL_SAI_RFR5    0xd4 /* SAI Receive FIFO 5 */
  66#define FSL_SAI_RFR6    0xd8 /* SAI Receive FIFO 6 */
  67#define FSL_SAI_RFR7    0xdc /* SAI Receive FIFO 7 */
  68#define FSL_SAI_RMR     0xe0 /* SAI Receive Mask */
  69#define FSL_SAI_RTCTL   0xf0 /* SAI Receive Timestamp Control Register */
  70#define FSL_SAI_RTCTN   0xf4 /* SAI Receive Timestamp Counter Register */
  71#define FSL_SAI_RBCTN   0xf8 /* SAI Receive Bit Counter Register */
  72#define FSL_SAI_RTCAP   0xfc /* SAI Receive Timestamp Capture */
  73
  74#define FSL_SAI_MCTL    0x100 /* SAI MCLK Control Register */
  75#define FSL_SAI_MDIV    0x104 /* SAI MCLK Divide Register */
  76
  77#define FSL_SAI_xCSR(tx, ofs)   (tx ? FSL_SAI_TCSR(ofs) : FSL_SAI_RCSR(ofs))
  78#define FSL_SAI_xCR1(tx, ofs)   (tx ? FSL_SAI_TCR1(ofs) : FSL_SAI_RCR1(ofs))
  79#define FSL_SAI_xCR2(tx, ofs)   (tx ? FSL_SAI_TCR2(ofs) : FSL_SAI_RCR2(ofs))
  80#define FSL_SAI_xCR3(tx, ofs)   (tx ? FSL_SAI_TCR3(ofs) : FSL_SAI_RCR3(ofs))
  81#define FSL_SAI_xCR4(tx, ofs)   (tx ? FSL_SAI_TCR4(ofs) : FSL_SAI_RCR4(ofs))
  82#define FSL_SAI_xCR5(tx, ofs)   (tx ? FSL_SAI_TCR5(ofs) : FSL_SAI_RCR5(ofs))
  83#define FSL_SAI_xDR(tx, ofs)    (tx ? FSL_SAI_TDR(ofs) : FSL_SAI_RDR(ofs))
  84#define FSL_SAI_xFR(tx, ofs)    (tx ? FSL_SAI_TFR(ofs) : FSL_SAI_RFR(ofs))
  85#define FSL_SAI_xMR(tx)         (tx ? FSL_SAI_TMR : FSL_SAI_RMR)
  86
  87/* SAI Transmit/Receive Control Register */
  88#define FSL_SAI_CSR_TERE        BIT(31)
  89#define FSL_SAI_CSR_SE          BIT(30)
  90#define FSL_SAI_CSR_FR          BIT(25)
  91#define FSL_SAI_CSR_SR          BIT(24)
  92#define FSL_SAI_CSR_xF_SHIFT    16
  93#define FSL_SAI_CSR_xF_W_SHIFT  18
  94#define FSL_SAI_CSR_xF_MASK     (0x1f << FSL_SAI_CSR_xF_SHIFT)
  95#define FSL_SAI_CSR_xF_W_MASK   (0x7 << FSL_SAI_CSR_xF_W_SHIFT)
  96#define FSL_SAI_CSR_WSF         BIT(20)
  97#define FSL_SAI_CSR_SEF         BIT(19)
  98#define FSL_SAI_CSR_FEF         BIT(18)
  99#define FSL_SAI_CSR_FWF         BIT(17)
 100#define FSL_SAI_CSR_FRF         BIT(16)
 101#define FSL_SAI_CSR_xIE_SHIFT   8
 102#define FSL_SAI_CSR_xIE_MASK    (0x1f << FSL_SAI_CSR_xIE_SHIFT)
 103#define FSL_SAI_CSR_WSIE        BIT(12)
 104#define FSL_SAI_CSR_SEIE        BIT(11)
 105#define FSL_SAI_CSR_FEIE        BIT(10)
 106#define FSL_SAI_CSR_FWIE        BIT(9)
 107#define FSL_SAI_CSR_FRIE        BIT(8)
 108#define FSL_SAI_CSR_FRDE        BIT(0)
 109
 110/* SAI Transmit and Receive Configuration 1 Register */
 111#define FSL_SAI_CR1_RFW_MASK(x) ((x) - 1)
 112
 113/* SAI Transmit and Receive Configuration 2 Register */
 114#define FSL_SAI_CR2_SYNC        BIT(30)
 115#define FSL_SAI_CR2_MSEL_MASK   (0x3 << 26)
 116#define FSL_SAI_CR2_MSEL_BUS    0
 117#define FSL_SAI_CR2_MSEL_MCLK1  BIT(26)
 118#define FSL_SAI_CR2_MSEL_MCLK2  BIT(27)
 119#define FSL_SAI_CR2_MSEL_MCLK3  (BIT(26) | BIT(27))
 120#define FSL_SAI_CR2_MSEL(ID)    ((ID) << 26)
 121#define FSL_SAI_CR2_BCP         BIT(25)
 122#define FSL_SAI_CR2_BCD_MSTR    BIT(24)
 123#define FSL_SAI_CR2_BYP         BIT(23) /* BCLK bypass */
 124#define FSL_SAI_CR2_DIV_MASK    0xff
 125
 126/* SAI Transmit and Receive Configuration 3 Register */
 127#define FSL_SAI_CR3_TRCE(x)     ((x) << 16)
 128#define FSL_SAI_CR3_TRCE_MASK   GENMASK(23, 16)
 129#define FSL_SAI_CR3_WDFL(x)     (x)
 130#define FSL_SAI_CR3_WDFL_MASK   0x1f
 131
 132/* SAI Transmit and Receive Configuration 4 Register */
 133
 134#define FSL_SAI_CR4_FCONT       BIT(28)
 135#define FSL_SAI_CR4_FCOMB_SHIFT BIT(26)
 136#define FSL_SAI_CR4_FCOMB_SOFT  BIT(27)
 137#define FSL_SAI_CR4_FCOMB_MASK  (0x3 << 26)
 138#define FSL_SAI_CR4_FPACK_8     (0x2 << 24)
 139#define FSL_SAI_CR4_FPACK_16    (0x3 << 24)
 140#define FSL_SAI_CR4_FRSZ(x)     (((x) - 1) << 16)
 141#define FSL_SAI_CR4_FRSZ_MASK   (0x1f << 16)
 142#define FSL_SAI_CR4_SYWD(x)     (((x) - 1) << 8)
 143#define FSL_SAI_CR4_SYWD_MASK   (0x1f << 8)
 144#define FSL_SAI_CR4_CHMOD       BIT(5)
 145#define FSL_SAI_CR4_CHMOD_MASK  BIT(5)
 146#define FSL_SAI_CR4_MF          BIT(4)
 147#define FSL_SAI_CR4_FSE         BIT(3)
 148#define FSL_SAI_CR4_FSP         BIT(1)
 149#define FSL_SAI_CR4_FSD_MSTR    BIT(0)
 150
 151/* SAI Transmit and Receive Configuration 5 Register */
 152#define FSL_SAI_CR5_WNW(x)      (((x) - 1) << 24)
 153#define FSL_SAI_CR5_WNW_MASK    (0x1f << 24)
 154#define FSL_SAI_CR5_W0W(x)      (((x) - 1) << 16)
 155#define FSL_SAI_CR5_W0W_MASK    (0x1f << 16)
 156#define FSL_SAI_CR5_FBT(x)      ((x) << 8)
 157#define FSL_SAI_CR5_FBT_MASK    (0x1f << 8)
 158
 159/* SAI MCLK Control Register */
 160#define FSL_SAI_MCTL_MCLK_EN    BIT(30) /* MCLK Enable */
 161#define FSL_SAI_MCTL_MSEL_MASK  (0x3 << 24)
 162#define FSL_SAI_MCTL_MSEL(ID)   ((ID) << 24)
 163#define FSL_SAI_MCTL_MSEL_BUS   0
 164#define FSL_SAI_MCTL_MSEL_MCLK1 BIT(24)
 165#define FSL_SAI_MCTL_MSEL_MCLK2 BIT(25)
 166#define FSL_SAI_MCTL_MSEL_MCLK3 (BIT(24) | BIT(25))
 167#define FSL_SAI_MCTL_DIV_EN     BIT(23)
 168#define FSL_SAI_MCTL_DIV_MASK   0xFF
 169
 170/* SAI VERID Register */
 171#define FSL_SAI_VERID_MAJOR_SHIFT   24
 172#define FSL_SAI_VERID_MAJOR_MASK    GENMASK(31, 24)
 173#define FSL_SAI_VERID_MINOR_SHIFT   16
 174#define FSL_SAI_VERID_MINOR_MASK    GENMASK(23, 16)
 175#define FSL_SAI_VERID_FEATURE_SHIFT 0
 176#define FSL_SAI_VERID_FEATURE_MASK  GENMASK(15, 0)
 177#define FSL_SAI_VERID_EFIFO_EN      BIT(0)
 178#define FSL_SAI_VERID_TSTMP_EN      BIT(1)
 179
 180/* SAI PARAM Register */
 181#define FSL_SAI_PARAM_SPF_SHIFT     16
 182#define FSL_SAI_PARAM_SPF_MASK      GENMASK(19, 16)
 183#define FSL_SAI_PARAM_WPF_SHIFT     8
 184#define FSL_SAI_PARAM_WPF_MASK      GENMASK(11, 8)
 185#define FSL_SAI_PARAM_DLN_MASK      GENMASK(3, 0)
 186
 187/* SAI MCLK Divide Register */
 188#define FSL_SAI_MDIV_MASK           0xFFFFF
 189
 190/* SAI timestamp and bitcounter */
 191#define FSL_SAI_xTCTL_TSEN         BIT(0)
 192#define FSL_SAI_xTCTL_TSINC        BIT(1)
 193#define FSL_SAI_xTCTL_RTSC         BIT(8)
 194#define FSL_SAI_xTCTL_RBC          BIT(9)
 195
 196/* SAI type */
 197#define FSL_SAI_DMA             BIT(0)
 198#define FSL_SAI_USE_AC97        BIT(1)
 199#define FSL_SAI_NET             BIT(2)
 200#define FSL_SAI_TRA_SYN         BIT(3)
 201#define FSL_SAI_REC_SYN         BIT(4)
 202#define FSL_SAI_USE_I2S_SLAVE   BIT(5)
 203
 204#define FSL_FMT_TRANSMITTER     0
 205#define FSL_FMT_RECEIVER        1
 206
 207/* SAI clock sources */
 208#define FSL_SAI_CLK_BUS         0
 209#define FSL_SAI_CLK_MAST1       1
 210#define FSL_SAI_CLK_MAST2       2
 211#define FSL_SAI_CLK_MAST3       3
 212
 213#define FSL_SAI_MCLK_MAX        4
 214
 215/* SAI data transfer numbers per DMA request */
 216#define FSL_SAI_MAXBURST_TX 6
 217#define FSL_SAI_MAXBURST_RX 6
 218
 219#define PMQOS_CPU_LATENCY   BIT(0)
 220
 221struct fsl_sai_soc_data {
 222        bool use_imx_pcm;
 223        bool use_edma;
 224        bool mclk0_is_mclk1;
 225        unsigned int fifo_depth;
 226        unsigned int reg_offset;
 227        unsigned int flags;
 228};
 229
 230/**
 231 * struct fsl_sai_verid - version id data
 232 * @major: major version number
 233 * @minor: minor version number
 234 * @feature: feature specification number
 235 *           0000000000000000b - Standard feature set
 236 *           0000000000000000b - Standard feature set
 237 */
 238struct fsl_sai_verid {
 239        u32 major;
 240        u32 minor;
 241        u32 feature;
 242};
 243
 244/**
 245 * struct fsl_sai_param - parameter data
 246 * @slot_num: The maximum number of slots per frame
 247 * @fifo_depth: The number of words in each FIFO (depth)
 248 * @dataline: The number of datalines implemented
 249 */
 250struct fsl_sai_param {
 251        u32 slot_num;
 252        u32 fifo_depth;
 253        u32 dataline;
 254};
 255
 256struct fsl_sai {
 257        struct platform_device *pdev;
 258        struct regmap *regmap;
 259        struct clk *bus_clk;
 260        struct clk *mclk_clk[FSL_SAI_MCLK_MAX];
 261
 262        bool is_slave_mode;
 263        bool is_lsb_first;
 264        bool is_dsp_mode;
 265        bool synchronous[2];
 266
 267        unsigned int mclk_id[2];
 268        unsigned int mclk_streams;
 269        unsigned int slots;
 270        unsigned int slot_width;
 271        unsigned int bclk_ratio;
 272
 273        const struct fsl_sai_soc_data *soc_data;
 274        struct snd_soc_dai_driver cpu_dai_drv;
 275        struct snd_dmaengine_dai_dma_data dma_params_rx;
 276        struct snd_dmaengine_dai_dma_data dma_params_tx;
 277        struct fsl_sai_verid verid;
 278        struct fsl_sai_param param;
 279        struct pm_qos_request pm_qos_req;
 280};
 281
 282#define TX 1
 283#define RX 0
 284
 285#endif /* __FSL_SAI_H */
 286