.. | .. |
---|
14 | 14 | SNDRV_PCM_FMTBIT_S32_LE) |
---|
15 | 15 | |
---|
16 | 16 | /* SAI Register Map Register */ |
---|
17 | | -#define FSL_SAI_TCSR 0x00 /* SAI Transmit Control */ |
---|
18 | | -#define FSL_SAI_TCR1 0x04 /* SAI Transmit Configuration 1 */ |
---|
19 | | -#define FSL_SAI_TCR2 0x08 /* SAI Transmit Configuration 2 */ |
---|
20 | | -#define FSL_SAI_TCR3 0x0c /* SAI Transmit Configuration 3 */ |
---|
21 | | -#define FSL_SAI_TCR4 0x10 /* SAI Transmit Configuration 4 */ |
---|
22 | | -#define FSL_SAI_TCR5 0x14 /* SAI Transmit Configuration 5 */ |
---|
23 | | -#define FSL_SAI_TDR 0x20 /* SAI Transmit Data */ |
---|
24 | | -#define FSL_SAI_TFR 0x40 /* SAI Transmit FIFO */ |
---|
| 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 */ |
---|
25 | 41 | #define FSL_SAI_TMR 0x60 /* SAI Transmit Mask */ |
---|
26 | | -#define FSL_SAI_RCSR 0x80 /* SAI Receive Control */ |
---|
27 | | -#define FSL_SAI_RCR1 0x84 /* SAI Receive Configuration 1 */ |
---|
28 | | -#define FSL_SAI_RCR2 0x88 /* SAI Receive Configuration 2 */ |
---|
29 | | -#define FSL_SAI_RCR3 0x8c /* SAI Receive Configuration 3 */ |
---|
30 | | -#define FSL_SAI_RCR4 0x90 /* SAI Receive Configuration 4 */ |
---|
31 | | -#define FSL_SAI_RCR5 0x94 /* SAI Receive Configuration 5 */ |
---|
32 | | -#define FSL_SAI_RDR 0xa0 /* SAI Receive Data */ |
---|
33 | | -#define FSL_SAI_RFR 0xc0 /* SAI Receive FIFO */ |
---|
| 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 */ |
---|
34 | 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 */ |
---|
35 | 73 | |
---|
36 | | -#define FSL_SAI_xCSR(tx) (tx ? FSL_SAI_TCSR : FSL_SAI_RCSR) |
---|
37 | | -#define FSL_SAI_xCR1(tx) (tx ? FSL_SAI_TCR1 : FSL_SAI_RCR1) |
---|
38 | | -#define FSL_SAI_xCR2(tx) (tx ? FSL_SAI_TCR2 : FSL_SAI_RCR2) |
---|
39 | | -#define FSL_SAI_xCR3(tx) (tx ? FSL_SAI_TCR3 : FSL_SAI_RCR3) |
---|
40 | | -#define FSL_SAI_xCR4(tx) (tx ? FSL_SAI_TCR4 : FSL_SAI_RCR4) |
---|
41 | | -#define FSL_SAI_xCR5(tx) (tx ? FSL_SAI_TCR5 : FSL_SAI_RCR5) |
---|
42 | | -#define FSL_SAI_xDR(tx) (tx ? FSL_SAI_TDR : FSL_SAI_RDR) |
---|
43 | | -#define FSL_SAI_xFR(tx) (tx ? FSL_SAI_TFR : FSL_SAI_RFR) |
---|
| 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_xDR0(tx) (tx ? FSL_SAI_TDR0 : FSL_SAI_RDR0) |
---|
| 84 | +#define FSL_SAI_xFR0(tx) (tx ? FSL_SAI_TFR0 : FSL_SAI_RFR0) |
---|
44 | 85 | #define FSL_SAI_xMR(tx) (tx ? FSL_SAI_TMR : FSL_SAI_RMR) |
---|
45 | 86 | |
---|
46 | 87 | /* SAI Transmit/Receive Control Register */ |
---|
47 | 88 | #define FSL_SAI_CSR_TERE BIT(31) |
---|
| 89 | +#define FSL_SAI_CSR_SE BIT(30) |
---|
| 90 | +#define FSL_SAI_CSR_BCE BIT(28) |
---|
48 | 91 | #define FSL_SAI_CSR_FR BIT(25) |
---|
49 | 92 | #define FSL_SAI_CSR_SR BIT(24) |
---|
50 | 93 | #define FSL_SAI_CSR_xF_SHIFT 16 |
---|
.. | .. |
---|
66 | 109 | #define FSL_SAI_CSR_FRDE BIT(0) |
---|
67 | 110 | |
---|
68 | 111 | /* SAI Transmit and Receive Configuration 1 Register */ |
---|
69 | | -#define FSL_SAI_CR1_RFW_MASK 0x1f |
---|
| 112 | +#define FSL_SAI_CR1_RFW_MASK(x) ((x) - 1) |
---|
70 | 113 | |
---|
71 | 114 | /* SAI Transmit and Receive Configuration 2 Register */ |
---|
72 | 115 | #define FSL_SAI_CR2_SYNC BIT(30) |
---|
.. | .. |
---|
78 | 121 | #define FSL_SAI_CR2_MSEL(ID) ((ID) << 26) |
---|
79 | 122 | #define FSL_SAI_CR2_BCP BIT(25) |
---|
80 | 123 | #define FSL_SAI_CR2_BCD_MSTR BIT(24) |
---|
| 124 | +#define FSL_SAI_CR2_BYP BIT(23) /* BCLK bypass */ |
---|
81 | 125 | #define FSL_SAI_CR2_DIV_MASK 0xff |
---|
82 | 126 | |
---|
83 | 127 | /* SAI Transmit and Receive Configuration 3 Register */ |
---|
84 | | -#define FSL_SAI_CR3_TRCE BIT(16) |
---|
| 128 | +#define FSL_SAI_CR3_TRCE(x) ((x) << 16) |
---|
| 129 | +#define FSL_SAI_CR3_TRCE_MASK GENMASK(23, 16) |
---|
85 | 130 | #define FSL_SAI_CR3_WDFL(x) (x) |
---|
86 | 131 | #define FSL_SAI_CR3_WDFL_MASK 0x1f |
---|
87 | 132 | |
---|
88 | 133 | /* SAI Transmit and Receive Configuration 4 Register */ |
---|
| 134 | + |
---|
| 135 | +#define FSL_SAI_CR4_FCONT BIT(28) |
---|
| 136 | +#define FSL_SAI_CR4_FCOMB_SHIFT BIT(26) |
---|
| 137 | +#define FSL_SAI_CR4_FCOMB_SOFT BIT(27) |
---|
| 138 | +#define FSL_SAI_CR4_FCOMB_MASK (0x3 << 26) |
---|
| 139 | +#define FSL_SAI_CR4_FPACK_8 (0x2 << 24) |
---|
| 140 | +#define FSL_SAI_CR4_FPACK_16 (0x3 << 24) |
---|
89 | 141 | #define FSL_SAI_CR4_FRSZ(x) (((x) - 1) << 16) |
---|
90 | 142 | #define FSL_SAI_CR4_FRSZ_MASK (0x1f << 16) |
---|
91 | 143 | #define FSL_SAI_CR4_SYWD(x) (((x) - 1) << 8) |
---|
92 | 144 | #define FSL_SAI_CR4_SYWD_MASK (0x1f << 8) |
---|
| 145 | +#define FSL_SAI_CR4_CHMOD BIT(5) |
---|
| 146 | +#define FSL_SAI_CR4_CHMOD_MASK BIT(5) |
---|
93 | 147 | #define FSL_SAI_CR4_MF BIT(4) |
---|
94 | 148 | #define FSL_SAI_CR4_FSE BIT(3) |
---|
95 | 149 | #define FSL_SAI_CR4_FSP BIT(1) |
---|
.. | .. |
---|
102 | 156 | #define FSL_SAI_CR5_W0W_MASK (0x1f << 16) |
---|
103 | 157 | #define FSL_SAI_CR5_FBT(x) ((x) << 8) |
---|
104 | 158 | #define FSL_SAI_CR5_FBT_MASK (0x1f << 8) |
---|
| 159 | + |
---|
| 160 | +/* SAI MCLK Control Register */ |
---|
| 161 | +#define FSL_SAI_MCTL_MCLK_EN BIT(30) /* MCLK Enable */ |
---|
| 162 | +#define FSL_SAI_MCTL_MSEL_MASK (0x3 << 24) |
---|
| 163 | +#define FSL_SAI_MCTL_MSEL(ID) ((ID) << 24) |
---|
| 164 | +#define FSL_SAI_MCTL_MSEL_BUS 0 |
---|
| 165 | +#define FSL_SAI_MCTL_MSEL_MCLK1 BIT(24) |
---|
| 166 | +#define FSL_SAI_MCTL_MSEL_MCLK2 BIT(25) |
---|
| 167 | +#define FSL_SAI_MCTL_MSEL_MCLK3 (BIT(24) | BIT(25)) |
---|
| 168 | +#define FSL_SAI_MCTL_DIV_EN BIT(23) |
---|
| 169 | +#define FSL_SAI_MCTL_DIV_MASK 0xFF |
---|
| 170 | + |
---|
| 171 | +/* SAI VERID Register */ |
---|
| 172 | +#define FSL_SAI_VERID_MAJOR_SHIFT 24 |
---|
| 173 | +#define FSL_SAI_VERID_MAJOR_MASK GENMASK(31, 24) |
---|
| 174 | +#define FSL_SAI_VERID_MINOR_SHIFT 16 |
---|
| 175 | +#define FSL_SAI_VERID_MINOR_MASK GENMASK(23, 16) |
---|
| 176 | +#define FSL_SAI_VERID_FEATURE_SHIFT 0 |
---|
| 177 | +#define FSL_SAI_VERID_FEATURE_MASK GENMASK(15, 0) |
---|
| 178 | +#define FSL_SAI_VERID_EFIFO_EN BIT(0) |
---|
| 179 | +#define FSL_SAI_VERID_TSTMP_EN BIT(1) |
---|
| 180 | + |
---|
| 181 | +/* SAI PARAM Register */ |
---|
| 182 | +#define FSL_SAI_PARAM_SPF_SHIFT 16 |
---|
| 183 | +#define FSL_SAI_PARAM_SPF_MASK GENMASK(19, 16) |
---|
| 184 | +#define FSL_SAI_PARAM_WPF_SHIFT 8 |
---|
| 185 | +#define FSL_SAI_PARAM_WPF_MASK GENMASK(11, 8) |
---|
| 186 | +#define FSL_SAI_PARAM_DLN_MASK GENMASK(3, 0) |
---|
| 187 | + |
---|
| 188 | +/* SAI MCLK Divide Register */ |
---|
| 189 | +#define FSL_SAI_MDIV_MASK 0xFFFFF |
---|
| 190 | + |
---|
| 191 | +/* SAI timestamp and bitcounter */ |
---|
| 192 | +#define FSL_SAI_xTCTL_TSEN BIT(0) |
---|
| 193 | +#define FSL_SAI_xTCTL_TSINC BIT(1) |
---|
| 194 | +#define FSL_SAI_xTCTL_RTSC BIT(8) |
---|
| 195 | +#define FSL_SAI_xTCTL_RBC BIT(9) |
---|
105 | 196 | |
---|
106 | 197 | /* SAI type */ |
---|
107 | 198 | #define FSL_SAI_DMA BIT(0) |
---|
.. | .. |
---|
126 | 217 | #define FSL_SAI_MAXBURST_TX 6 |
---|
127 | 218 | #define FSL_SAI_MAXBURST_RX 6 |
---|
128 | 219 | |
---|
| 220 | +struct fsl_sai_soc_data { |
---|
| 221 | + bool use_imx_pcm; |
---|
| 222 | + bool use_edma; |
---|
| 223 | + unsigned int fifo_depth; |
---|
| 224 | + unsigned int reg_offset; |
---|
| 225 | +}; |
---|
| 226 | + |
---|
| 227 | +/** |
---|
| 228 | + * struct fsl_sai_verid - version id data |
---|
| 229 | + * @major: major version number |
---|
| 230 | + * @minor: minor version number |
---|
| 231 | + * @feature: feature specification number |
---|
| 232 | + * 0000000000000000b - Standard feature set |
---|
| 233 | + * 0000000000000000b - Standard feature set |
---|
| 234 | + */ |
---|
| 235 | +struct fsl_sai_verid { |
---|
| 236 | + u32 major; |
---|
| 237 | + u32 minor; |
---|
| 238 | + u32 feature; |
---|
| 239 | +}; |
---|
| 240 | + |
---|
| 241 | +/** |
---|
| 242 | + * struct fsl_sai_param - parameter data |
---|
| 243 | + * @slot_num: The maximum number of slots per frame |
---|
| 244 | + * @fifo_depth: The number of words in each FIFO (depth) |
---|
| 245 | + * @dataline: The number of datalines implemented |
---|
| 246 | + */ |
---|
| 247 | +struct fsl_sai_param { |
---|
| 248 | + u32 slot_num; |
---|
| 249 | + u32 fifo_depth; |
---|
| 250 | + u32 dataline; |
---|
| 251 | +}; |
---|
| 252 | + |
---|
129 | 253 | struct fsl_sai { |
---|
130 | 254 | struct platform_device *pdev; |
---|
131 | 255 | struct regmap *regmap; |
---|
.. | .. |
---|
135 | 259 | bool is_slave_mode; |
---|
136 | 260 | bool is_lsb_first; |
---|
137 | 261 | bool is_dsp_mode; |
---|
138 | | - bool sai_on_imx; |
---|
139 | 262 | bool synchronous[2]; |
---|
140 | 263 | |
---|
141 | 264 | unsigned int mclk_id[2]; |
---|
142 | 265 | unsigned int mclk_streams; |
---|
143 | 266 | unsigned int slots; |
---|
144 | 267 | unsigned int slot_width; |
---|
| 268 | + unsigned int bclk_ratio; |
---|
145 | 269 | |
---|
| 270 | + const struct fsl_sai_soc_data *soc_data; |
---|
| 271 | + struct snd_soc_dai_driver cpu_dai_drv; |
---|
146 | 272 | struct snd_dmaengine_dai_dma_data dma_params_rx; |
---|
147 | 273 | struct snd_dmaengine_dai_dma_data dma_params_tx; |
---|
| 274 | + struct fsl_sai_verid verid; |
---|
| 275 | + struct fsl_sai_param param; |
---|
148 | 276 | }; |
---|
149 | 277 | |
---|
150 | 278 | #define TX 1 |
---|