1 // SPDX-License-Identifier: GPL-2.0+ 2 // 3 // Freescale ALSA SoC Digital Audio Interface (SAI) driver. 4 // 5 // Copyright 2012-2015 Freescale Semiconductor, Inc. 6 7 #include <linux/clk.h> 8 #include <linux/delay.h> 9 #include <linux/dmaengine.h> 10 #include <linux/module.h> 11 #include <linux/of_address.h> 12 #include <linux/of_device.h> 13 #include <linux/pinctrl/consumer.h> 14 #include <linux/pm_qos.h> 15 #include <linux/pm_runtime.h> 16 #include <linux/regmap.h> 17 #include <linux/slab.h> 18 #include <linux/time.h> 19 #include <sound/core.h> 20 #include <sound/dmaengine_pcm.h> 21 #include <sound/pcm_params.h> 22 #include <linux/mfd/syscon.h> 23 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> 24 25 #include "fsl_sai.h" 26 #include "fsl_utils.h" 27 #include "imx-pcm.h" 28 29 #define FSL_SAI_FLAGS (FSL_SAI_CSR_SEIE |\ 30 FSL_SAI_CSR_FEIE) 31 32 static const unsigned int fsl_sai_rates[] = { 33 8000, 11025, 12000, 16000, 22050, 34 24000, 32000, 44100, 48000, 64000, 35 88200, 96000, 176400, 192000, 352800, 36 384000, 705600, 768000, 1411200, 2822400, 37 }; 38 39 static const struct snd_pcm_hw_constraint_list fsl_sai_rate_constraints = { 40 .count = ARRAY_SIZE(fsl_sai_rates), 41 .list = fsl_sai_rates, 42 }; 43 44 /** 45 * fsl_sai_dir_is_synced - Check if stream is synced by the opposite stream 46 * 47 * SAI supports synchronous mode using bit/frame clocks of either Transmitter's 48 * or Receiver's for both streams. This function is used to check if clocks of 49 * the stream's are synced by the opposite stream. 50 * 51 * @sai: SAI context 52 * @dir: stream direction 53 */ 54 static inline bool fsl_sai_dir_is_synced(struct fsl_sai *sai, int dir) 55 { 56 int adir = (dir == TX) ? RX : TX; 57 58 /* current dir in async mode while opposite dir in sync mode */ 59 return !sai->synchronous[dir] && sai->synchronous[adir]; 60 } 61 62 static struct pinctrl_state *fsl_sai_get_pins_state(struct fsl_sai *sai, u32 bclk) 63 { 64 struct pinctrl_state *state = NULL; 65 66 if (sai->is_pdm_mode) { 67 /* DSD512@44.1kHz, DSD512@48kHz */ 68 if (bclk >= 22579200) 69 state = pinctrl_lookup_state(sai->pinctrl, "dsd512"); 70 71 /* Get default DSD state */ 72 if (IS_ERR_OR_NULL(state)) 73 state = pinctrl_lookup_state(sai->pinctrl, "dsd"); 74 } else { 75 /* 706k32b2c, 768k32b2c, etc */ 76 if (bclk >= 45158400) 77 state = pinctrl_lookup_state(sai->pinctrl, "pcm_b2m"); 78 } 79 80 /* Get default state */ 81 if (IS_ERR_OR_NULL(state)) 82 state = pinctrl_lookup_state(sai->pinctrl, "default"); 83 84 return state; 85 } 86 87 static irqreturn_t fsl_sai_isr(int irq, void *devid) 88 { 89 struct fsl_sai *sai = (struct fsl_sai *)devid; 90 unsigned int ofs = sai->soc_data->reg_offset; 91 struct device *dev = &sai->pdev->dev; 92 u32 flags, xcsr, mask; 93 irqreturn_t iret = IRQ_NONE; 94 95 /* 96 * Both IRQ status bits and IRQ mask bits are in the xCSR but 97 * different shifts. And we here create a mask only for those 98 * IRQs that we activated. 99 */ 100 mask = (FSL_SAI_FLAGS >> FSL_SAI_CSR_xIE_SHIFT) << FSL_SAI_CSR_xF_SHIFT; 101 102 /* Tx IRQ */ 103 regmap_read(sai->regmap, FSL_SAI_TCSR(ofs), &xcsr); 104 flags = xcsr & mask; 105 106 if (flags) 107 iret = IRQ_HANDLED; 108 else 109 goto irq_rx; 110 111 if (flags & FSL_SAI_CSR_WSF) 112 dev_dbg(dev, "isr: Start of Tx word detected\n"); 113 114 if (flags & FSL_SAI_CSR_SEF) 115 dev_dbg(dev, "isr: Tx Frame sync error detected\n"); 116 117 if (flags & FSL_SAI_CSR_FEF) 118 dev_dbg(dev, "isr: Transmit underrun detected\n"); 119 120 if (flags & FSL_SAI_CSR_FWF) 121 dev_dbg(dev, "isr: Enabled transmit FIFO is empty\n"); 122 123 if (flags & FSL_SAI_CSR_FRF) 124 dev_dbg(dev, "isr: Transmit FIFO watermark has been reached\n"); 125 126 flags &= FSL_SAI_CSR_xF_W_MASK; 127 xcsr &= ~FSL_SAI_CSR_xF_MASK; 128 129 if (flags) 130 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), flags | xcsr); 131 132 irq_rx: 133 /* Rx IRQ */ 134 regmap_read(sai->regmap, FSL_SAI_RCSR(ofs), &xcsr); 135 flags = xcsr & mask; 136 137 if (flags) 138 iret = IRQ_HANDLED; 139 else 140 goto out; 141 142 if (flags & FSL_SAI_CSR_WSF) 143 dev_dbg(dev, "isr: Start of Rx word detected\n"); 144 145 if (flags & FSL_SAI_CSR_SEF) 146 dev_dbg(dev, "isr: Rx Frame sync error detected\n"); 147 148 if (flags & FSL_SAI_CSR_FEF) 149 dev_dbg(dev, "isr: Receive overflow detected\n"); 150 151 if (flags & FSL_SAI_CSR_FWF) 152 dev_dbg(dev, "isr: Enabled receive FIFO is full\n"); 153 154 if (flags & FSL_SAI_CSR_FRF) 155 dev_dbg(dev, "isr: Receive FIFO watermark has been reached\n"); 156 157 flags &= FSL_SAI_CSR_xF_W_MASK; 158 xcsr &= ~FSL_SAI_CSR_xF_MASK; 159 160 if (flags) 161 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), flags | xcsr); 162 163 out: 164 return iret; 165 } 166 167 static int fsl_sai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask, 168 u32 rx_mask, int slots, int slot_width) 169 { 170 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 171 172 sai->slots = slots; 173 sai->slot_width = slot_width; 174 175 return 0; 176 } 177 178 static int fsl_sai_set_dai_bclk_ratio(struct snd_soc_dai *dai, 179 unsigned int ratio) 180 { 181 struct fsl_sai *sai = snd_soc_dai_get_drvdata(dai); 182 183 sai->bclk_ratio = ratio; 184 185 return 0; 186 } 187 188 static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai, 189 int clk_id, unsigned int freq, bool tx) 190 { 191 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 192 unsigned int ofs = sai->soc_data->reg_offset; 193 u32 val_cr2 = 0; 194 195 switch (clk_id) { 196 case FSL_SAI_CLK_BUS: 197 val_cr2 |= FSL_SAI_CR2_MSEL_BUS; 198 break; 199 case FSL_SAI_CLK_MAST1: 200 val_cr2 |= FSL_SAI_CR2_MSEL_MCLK1; 201 break; 202 case FSL_SAI_CLK_MAST2: 203 val_cr2 |= FSL_SAI_CR2_MSEL_MCLK2; 204 break; 205 case FSL_SAI_CLK_MAST3: 206 val_cr2 |= FSL_SAI_CR2_MSEL_MCLK3; 207 break; 208 default: 209 return -EINVAL; 210 } 211 212 regmap_update_bits(sai->regmap, FSL_SAI_xCR2(tx, ofs), 213 FSL_SAI_CR2_MSEL_MASK, val_cr2); 214 215 return 0; 216 } 217 218 static int fsl_sai_set_mclk_rate(struct snd_soc_dai *dai, int clk_id, unsigned int freq) 219 { 220 struct fsl_sai *sai = snd_soc_dai_get_drvdata(dai); 221 int ret; 222 223 fsl_asoc_reparent_pll_clocks(dai->dev, sai->mclk_clk[clk_id], 224 sai->pll8k_clk, sai->pll11k_clk, freq); 225 226 ret = clk_set_rate(sai->mclk_clk[clk_id], freq); 227 if (ret < 0) 228 dev_err(dai->dev, "failed to set clock rate (%u): %d\n", freq, ret); 229 230 return ret; 231 } 232 233 static int fsl_sai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, 234 int clk_id, unsigned int freq, int dir) 235 { 236 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 237 int ret; 238 239 if (dir == SND_SOC_CLOCK_IN) 240 return 0; 241 242 if (freq > 0 && clk_id != FSL_SAI_CLK_BUS) { 243 if (clk_id < 0 || clk_id >= FSL_SAI_MCLK_MAX) { 244 dev_err(cpu_dai->dev, "Unknown clock id: %d\n", clk_id); 245 return -EINVAL; 246 } 247 248 if (IS_ERR_OR_NULL(sai->mclk_clk[clk_id])) { 249 dev_err(cpu_dai->dev, "Unassigned clock: %d\n", clk_id); 250 return -EINVAL; 251 } 252 253 if (sai->mclk_streams == 0) { 254 ret = fsl_sai_set_mclk_rate(cpu_dai, clk_id, freq); 255 if (ret < 0) 256 return ret; 257 } 258 } 259 260 ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq, true); 261 if (ret) { 262 dev_err(cpu_dai->dev, "Cannot set tx sysclk: %d\n", ret); 263 return ret; 264 } 265 266 ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq, false); 267 if (ret) 268 dev_err(cpu_dai->dev, "Cannot set rx sysclk: %d\n", ret); 269 270 return ret; 271 } 272 273 static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai, 274 unsigned int fmt, bool tx) 275 { 276 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 277 unsigned int ofs = sai->soc_data->reg_offset; 278 u32 val_cr2 = 0, val_cr4 = 0; 279 280 if (!sai->is_lsb_first) 281 val_cr4 |= FSL_SAI_CR4_MF; 282 283 sai->is_pdm_mode = false; 284 /* DAI mode */ 285 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 286 case SND_SOC_DAIFMT_I2S: 287 /* 288 * Frame low, 1clk before data, one word length for frame sync, 289 * frame sync starts one serial clock cycle earlier, 290 * that is, together with the last bit of the previous 291 * data word. 292 */ 293 val_cr2 |= FSL_SAI_CR2_BCP; 294 val_cr4 |= FSL_SAI_CR4_FSE | FSL_SAI_CR4_FSP; 295 break; 296 case SND_SOC_DAIFMT_LEFT_J: 297 /* 298 * Frame high, one word length for frame sync, 299 * frame sync asserts with the first bit of the frame. 300 */ 301 val_cr2 |= FSL_SAI_CR2_BCP; 302 break; 303 case SND_SOC_DAIFMT_DSP_A: 304 /* 305 * Frame high, 1clk before data, one bit for frame sync, 306 * frame sync starts one serial clock cycle earlier, 307 * that is, together with the last bit of the previous 308 * data word. 309 */ 310 val_cr2 |= FSL_SAI_CR2_BCP; 311 val_cr4 |= FSL_SAI_CR4_FSE; 312 sai->is_dsp_mode = true; 313 break; 314 case SND_SOC_DAIFMT_DSP_B: 315 /* 316 * Frame high, one bit for frame sync, 317 * frame sync asserts with the first bit of the frame. 318 */ 319 val_cr2 |= FSL_SAI_CR2_BCP; 320 sai->is_dsp_mode = true; 321 break; 322 case SND_SOC_DAIFMT_PDM: 323 val_cr2 |= FSL_SAI_CR2_BCP; 324 val_cr4 &= ~FSL_SAI_CR4_MF; 325 sai->is_pdm_mode = true; 326 break; 327 case SND_SOC_DAIFMT_RIGHT_J: 328 /* To be done */ 329 default: 330 return -EINVAL; 331 } 332 333 /* DAI clock inversion */ 334 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 335 case SND_SOC_DAIFMT_IB_IF: 336 /* Invert both clocks */ 337 val_cr2 ^= FSL_SAI_CR2_BCP; 338 val_cr4 ^= FSL_SAI_CR4_FSP; 339 break; 340 case SND_SOC_DAIFMT_IB_NF: 341 /* Invert bit clock */ 342 val_cr2 ^= FSL_SAI_CR2_BCP; 343 break; 344 case SND_SOC_DAIFMT_NB_IF: 345 /* Invert frame clock */ 346 val_cr4 ^= FSL_SAI_CR4_FSP; 347 break; 348 case SND_SOC_DAIFMT_NB_NF: 349 /* Nothing to do for both normal cases */ 350 break; 351 default: 352 return -EINVAL; 353 } 354 355 /* DAI clock provider masks */ 356 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 357 case SND_SOC_DAIFMT_BP_FP: 358 val_cr2 |= FSL_SAI_CR2_BCD_MSTR; 359 val_cr4 |= FSL_SAI_CR4_FSD_MSTR; 360 sai->is_consumer_mode = false; 361 break; 362 case SND_SOC_DAIFMT_BC_FC: 363 sai->is_consumer_mode = true; 364 break; 365 case SND_SOC_DAIFMT_BP_FC: 366 val_cr2 |= FSL_SAI_CR2_BCD_MSTR; 367 sai->is_consumer_mode = false; 368 break; 369 case SND_SOC_DAIFMT_BC_FP: 370 val_cr4 |= FSL_SAI_CR4_FSD_MSTR; 371 sai->is_consumer_mode = true; 372 break; 373 default: 374 return -EINVAL; 375 } 376 377 regmap_update_bits(sai->regmap, FSL_SAI_xCR2(tx, ofs), 378 FSL_SAI_CR2_BCP | FSL_SAI_CR2_BCD_MSTR, val_cr2); 379 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), 380 FSL_SAI_CR4_MF | FSL_SAI_CR4_FSE | 381 FSL_SAI_CR4_FSP | FSL_SAI_CR4_FSD_MSTR, val_cr4); 382 383 return 0; 384 } 385 386 static int fsl_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) 387 { 388 int ret; 389 390 ret = fsl_sai_set_dai_fmt_tr(cpu_dai, fmt, true); 391 if (ret) { 392 dev_err(cpu_dai->dev, "Cannot set tx format: %d\n", ret); 393 return ret; 394 } 395 396 ret = fsl_sai_set_dai_fmt_tr(cpu_dai, fmt, false); 397 if (ret) 398 dev_err(cpu_dai->dev, "Cannot set rx format: %d\n", ret); 399 400 return ret; 401 } 402 403 static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq) 404 { 405 struct fsl_sai *sai = snd_soc_dai_get_drvdata(dai); 406 unsigned int reg, ofs = sai->soc_data->reg_offset; 407 unsigned long clk_rate; 408 u32 savediv = 0, ratio, bestdiff = freq; 409 int adir = tx ? RX : TX; 410 int dir = tx ? TX : RX; 411 u32 id; 412 bool support_1_1_ratio = sai->verid.version >= 0x0301; 413 414 /* Don't apply to consumer mode */ 415 if (sai->is_consumer_mode) 416 return 0; 417 418 /* 419 * There is no point in polling MCLK0 if it is identical to MCLK1. 420 * And given that MQS use case has to use MCLK1 though two clocks 421 * are the same, we simply skip MCLK0 and start to find from MCLK1. 422 */ 423 id = sai->soc_data->mclk0_is_mclk1 ? 1 : 0; 424 425 for (; id < FSL_SAI_MCLK_MAX; id++) { 426 int diff; 427 428 clk_rate = clk_get_rate(sai->mclk_clk[id]); 429 if (!clk_rate) 430 continue; 431 432 ratio = DIV_ROUND_CLOSEST(clk_rate, freq); 433 if (!ratio || ratio > 512) 434 continue; 435 if (ratio == 1 && !support_1_1_ratio) 436 continue; 437 if ((ratio & 1) && ratio > 1) 438 continue; 439 440 diff = abs((long)clk_rate - ratio * freq); 441 442 /* 443 * Drop the source that can not be 444 * divided into the required rate. 445 */ 446 if (diff != 0 && clk_rate / diff < 1000) 447 continue; 448 449 dev_dbg(dai->dev, 450 "ratio %d for freq %dHz based on clock %ldHz\n", 451 ratio, freq, clk_rate); 452 453 454 if (diff < bestdiff) { 455 savediv = ratio; 456 sai->mclk_id[tx] = id; 457 bestdiff = diff; 458 } 459 460 if (diff == 0) 461 break; 462 } 463 464 if (savediv == 0) { 465 dev_err(dai->dev, "failed to derive required %cx rate: %d\n", 466 tx ? 'T' : 'R', freq); 467 return -EINVAL; 468 } 469 470 dev_dbg(dai->dev, "best fit: clock id=%d, div=%d, deviation =%d\n", 471 sai->mclk_id[tx], savediv, bestdiff); 472 473 /* 474 * 1) For Asynchronous mode, we must set RCR2 register for capture, and 475 * set TCR2 register for playback. 476 * 2) For Tx sync with Rx clock, we must set RCR2 register for playback 477 * and capture. 478 * 3) For Rx sync with Tx clock, we must set TCR2 register for playback 479 * and capture. 480 * 4) For Tx and Rx are both Synchronous with another SAI, we just 481 * ignore it. 482 */ 483 if (fsl_sai_dir_is_synced(sai, adir)) 484 reg = FSL_SAI_xCR2(!tx, ofs); 485 else if (!sai->synchronous[dir]) 486 reg = FSL_SAI_xCR2(tx, ofs); 487 else 488 return 0; 489 490 regmap_update_bits(sai->regmap, reg, FSL_SAI_CR2_MSEL_MASK, 491 FSL_SAI_CR2_MSEL(sai->mclk_id[tx])); 492 493 if (savediv == 1) 494 regmap_update_bits(sai->regmap, reg, 495 FSL_SAI_CR2_DIV_MASK | FSL_SAI_CR2_BYP, 496 FSL_SAI_CR2_BYP); 497 else 498 regmap_update_bits(sai->regmap, reg, 499 FSL_SAI_CR2_DIV_MASK | FSL_SAI_CR2_BYP, 500 savediv / 2 - 1); 501 502 if (sai->soc_data->max_register >= FSL_SAI_MCTL) { 503 /* SAI is in master mode at this point, so enable MCLK */ 504 regmap_update_bits(sai->regmap, FSL_SAI_MCTL, 505 FSL_SAI_MCTL_MCLK_EN, FSL_SAI_MCTL_MCLK_EN); 506 } 507 508 return 0; 509 } 510 511 static int fsl_sai_hw_params(struct snd_pcm_substream *substream, 512 struct snd_pcm_hw_params *params, 513 struct snd_soc_dai *cpu_dai) 514 { 515 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 516 unsigned int ofs = sai->soc_data->reg_offset; 517 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 518 unsigned int channels = params_channels(params); 519 struct snd_dmaengine_dai_dma_data *dma_params; 520 struct fsl_sai_dl_cfg *dl_cfg = sai->dl_cfg; 521 u32 word_width = params_width(params); 522 int trce_mask = 0, dl_cfg_idx = 0; 523 int dl_cfg_cnt = sai->dl_cfg_cnt; 524 u32 dl_type = FSL_SAI_DL_I2S; 525 u32 val_cr4 = 0, val_cr5 = 0; 526 u32 slots = (channels == 1) ? 2 : channels; 527 u32 slot_width = word_width; 528 int adir = tx ? RX : TX; 529 u32 pins, bclk; 530 u32 watermark; 531 int ret, i; 532 533 if (sai->slot_width) 534 slot_width = sai->slot_width; 535 536 if (sai->slots) 537 slots = sai->slots; 538 else if (sai->bclk_ratio) 539 slots = sai->bclk_ratio / slot_width; 540 541 pins = DIV_ROUND_UP(channels, slots); 542 543 /* 544 * PDM mode, channels are independent 545 * each channels are on one dataline/FIFO. 546 */ 547 if (sai->is_pdm_mode) { 548 pins = channels; 549 dl_type = FSL_SAI_DL_PDM; 550 } 551 552 for (i = 0; i < dl_cfg_cnt; i++) { 553 if (dl_cfg[i].type == dl_type && dl_cfg[i].pins[tx] == pins) { 554 dl_cfg_idx = i; 555 break; 556 } 557 } 558 559 if (hweight8(dl_cfg[dl_cfg_idx].mask[tx]) < pins) { 560 dev_err(cpu_dai->dev, "channel not supported\n"); 561 return -EINVAL; 562 } 563 564 bclk = params_rate(params) * (sai->bclk_ratio ? sai->bclk_ratio : slots * slot_width); 565 566 if (!IS_ERR_OR_NULL(sai->pinctrl)) { 567 sai->pins_state = fsl_sai_get_pins_state(sai, bclk); 568 if (!IS_ERR_OR_NULL(sai->pins_state)) { 569 ret = pinctrl_select_state(sai->pinctrl, sai->pins_state); 570 if (ret) { 571 dev_err(cpu_dai->dev, "failed to set proper pins state: %d\n", ret); 572 return ret; 573 } 574 } 575 } 576 577 if (!sai->is_consumer_mode) { 578 ret = fsl_sai_set_bclk(cpu_dai, tx, bclk); 579 if (ret) 580 return ret; 581 582 /* Do not enable the clock if it is already enabled */ 583 if (!(sai->mclk_streams & BIT(substream->stream))) { 584 ret = clk_prepare_enable(sai->mclk_clk[sai->mclk_id[tx]]); 585 if (ret) 586 return ret; 587 588 sai->mclk_streams |= BIT(substream->stream); 589 } 590 } 591 592 if (!sai->is_dsp_mode && !sai->is_pdm_mode) 593 val_cr4 |= FSL_SAI_CR4_SYWD(slot_width); 594 595 val_cr5 |= FSL_SAI_CR5_WNW(slot_width); 596 val_cr5 |= FSL_SAI_CR5_W0W(slot_width); 597 598 if (sai->is_lsb_first || sai->is_pdm_mode) 599 val_cr5 |= FSL_SAI_CR5_FBT(0); 600 else 601 val_cr5 |= FSL_SAI_CR5_FBT(word_width - 1); 602 603 val_cr4 |= FSL_SAI_CR4_FRSZ(slots); 604 605 /* Set to output mode to avoid tri-stated data pins */ 606 if (tx) 607 val_cr4 |= FSL_SAI_CR4_CHMOD; 608 609 /* 610 * For SAI provider mode, when Tx(Rx) sync with Rx(Tx) clock, Rx(Tx) will 611 * generate bclk and frame clock for Tx(Rx), we should set RCR4(TCR4), 612 * RCR5(TCR5) for playback(capture), or there will be sync error. 613 */ 614 615 if (!sai->is_consumer_mode && fsl_sai_dir_is_synced(sai, adir)) { 616 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(!tx, ofs), 617 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK | 618 FSL_SAI_CR4_CHMOD_MASK, 619 val_cr4); 620 regmap_update_bits(sai->regmap, FSL_SAI_xCR5(!tx, ofs), 621 FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK | 622 FSL_SAI_CR5_FBT_MASK, val_cr5); 623 } 624 625 /* 626 * Combine mode has limation: 627 * - Can't used for singel dataline/FIFO case except the FIFO0 628 * - Can't used for multi dataline/FIFO case except the enabled FIFOs 629 * are successive and start from FIFO0 630 * 631 * So for common usage, all multi fifo case disable the combine mode. 632 */ 633 if (hweight8(dl_cfg[dl_cfg_idx].mask[tx]) <= 1 || sai->is_multi_fifo_dma) 634 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), 635 FSL_SAI_CR4_FCOMB_MASK, 0); 636 else 637 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), 638 FSL_SAI_CR4_FCOMB_MASK, FSL_SAI_CR4_FCOMB_SOFT); 639 640 dma_params = tx ? &sai->dma_params_tx : &sai->dma_params_rx; 641 dma_params->addr = sai->res->start + FSL_SAI_xDR0(tx) + 642 dl_cfg[dl_cfg_idx].start_off[tx] * 0x4; 643 644 if (sai->is_multi_fifo_dma) { 645 sai->audio_config[tx].words_per_fifo = min(slots, channels); 646 if (tx) { 647 sai->audio_config[tx].n_fifos_dst = pins; 648 sai->audio_config[tx].stride_fifos_dst = dl_cfg[dl_cfg_idx].next_off[tx]; 649 } else { 650 sai->audio_config[tx].n_fifos_src = pins; 651 sai->audio_config[tx].stride_fifos_src = dl_cfg[dl_cfg_idx].next_off[tx]; 652 } 653 dma_params->maxburst = sai->audio_config[tx].words_per_fifo * pins; 654 dma_params->peripheral_config = &sai->audio_config[tx]; 655 dma_params->peripheral_size = sizeof(sai->audio_config[tx]); 656 657 watermark = tx ? (sai->soc_data->fifo_depth - dma_params->maxburst) : 658 (dma_params->maxburst - 1); 659 regmap_update_bits(sai->regmap, FSL_SAI_xCR1(tx, ofs), 660 FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth), 661 watermark); 662 } 663 664 /* Find a proper tcre setting */ 665 for (i = 0; i < sai->soc_data->pins; i++) { 666 trce_mask = (1 << (i + 1)) - 1; 667 if (hweight8(dl_cfg[dl_cfg_idx].mask[tx] & trce_mask) == pins) 668 break; 669 } 670 671 regmap_update_bits(sai->regmap, FSL_SAI_xCR3(tx, ofs), 672 FSL_SAI_CR3_TRCE_MASK, 673 FSL_SAI_CR3_TRCE((dl_cfg[dl_cfg_idx].mask[tx] & trce_mask))); 674 675 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), 676 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK | 677 FSL_SAI_CR4_CHMOD_MASK, 678 val_cr4); 679 regmap_update_bits(sai->regmap, FSL_SAI_xCR5(tx, ofs), 680 FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK | 681 FSL_SAI_CR5_FBT_MASK, val_cr5); 682 regmap_write(sai->regmap, FSL_SAI_xMR(tx), 683 ~0UL - ((1 << min(channels, slots)) - 1)); 684 685 return 0; 686 } 687 688 static int fsl_sai_hw_free(struct snd_pcm_substream *substream, 689 struct snd_soc_dai *cpu_dai) 690 { 691 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 692 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 693 unsigned int ofs = sai->soc_data->reg_offset; 694 695 regmap_update_bits(sai->regmap, FSL_SAI_xCR3(tx, ofs), 696 FSL_SAI_CR3_TRCE_MASK, 0); 697 698 if (!sai->is_consumer_mode && 699 sai->mclk_streams & BIT(substream->stream)) { 700 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[tx]]); 701 sai->mclk_streams &= ~BIT(substream->stream); 702 } 703 704 return 0; 705 } 706 707 static void fsl_sai_config_disable(struct fsl_sai *sai, int dir) 708 { 709 unsigned int ofs = sai->soc_data->reg_offset; 710 bool tx = dir == TX; 711 u32 xcsr, count = 100; 712 713 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 714 FSL_SAI_CSR_TERE, 0); 715 716 /* TERE will remain set till the end of current frame */ 717 do { 718 udelay(10); 719 regmap_read(sai->regmap, FSL_SAI_xCSR(tx, ofs), &xcsr); 720 } while (--count && xcsr & FSL_SAI_CSR_TERE); 721 722 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 723 FSL_SAI_CSR_FR, FSL_SAI_CSR_FR); 724 725 /* 726 * For sai master mode, after several open/close sai, 727 * there will be no frame clock, and can't recover 728 * anymore. Add software reset to fix this issue. 729 * This is a hardware bug, and will be fix in the 730 * next sai version. 731 */ 732 if (!sai->is_consumer_mode) { 733 /* Software Reset */ 734 regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR); 735 /* Clear SR bit to finish the reset */ 736 regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), 0); 737 } 738 } 739 740 static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd, 741 struct snd_soc_dai *cpu_dai) 742 { 743 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 744 unsigned int ofs = sai->soc_data->reg_offset; 745 746 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 747 int adir = tx ? RX : TX; 748 int dir = tx ? TX : RX; 749 u32 xcsr; 750 751 /* 752 * Asynchronous mode: Clear SYNC for both Tx and Rx. 753 * Rx sync with Tx clocks: Clear SYNC for Tx, set it for Rx. 754 * Tx sync with Rx clocks: Clear SYNC for Rx, set it for Tx. 755 */ 756 regmap_update_bits(sai->regmap, FSL_SAI_TCR2(ofs), FSL_SAI_CR2_SYNC, 757 sai->synchronous[TX] ? FSL_SAI_CR2_SYNC : 0); 758 regmap_update_bits(sai->regmap, FSL_SAI_RCR2(ofs), FSL_SAI_CR2_SYNC, 759 sai->synchronous[RX] ? FSL_SAI_CR2_SYNC : 0); 760 761 /* 762 * It is recommended that the transmitter is the last enabled 763 * and the first disabled. 764 */ 765 switch (cmd) { 766 case SNDRV_PCM_TRIGGER_START: 767 case SNDRV_PCM_TRIGGER_RESUME: 768 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 769 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 770 FSL_SAI_CSR_FRDE, FSL_SAI_CSR_FRDE); 771 772 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 773 FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE); 774 /* 775 * Enable the opposite direction for synchronous mode 776 * 1. Tx sync with Rx: only set RE for Rx; set TE & RE for Tx 777 * 2. Rx sync with Tx: only set TE for Tx; set RE & TE for Rx 778 * 779 * RM recommends to enable RE after TE for case 1 and to enable 780 * TE after RE for case 2, but we here may not always guarantee 781 * that happens: "arecord 1.wav; aplay 2.wav" in case 1 enables 782 * TE after RE, which is against what RM recommends but should 783 * be safe to do, judging by years of testing results. 784 */ 785 if (fsl_sai_dir_is_synced(sai, adir)) 786 regmap_update_bits(sai->regmap, FSL_SAI_xCSR((!tx), ofs), 787 FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE); 788 789 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 790 FSL_SAI_CSR_xIE_MASK, FSL_SAI_FLAGS); 791 break; 792 case SNDRV_PCM_TRIGGER_STOP: 793 case SNDRV_PCM_TRIGGER_SUSPEND: 794 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 795 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 796 FSL_SAI_CSR_FRDE, 0); 797 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 798 FSL_SAI_CSR_xIE_MASK, 0); 799 800 /* Check if the opposite FRDE is also disabled */ 801 regmap_read(sai->regmap, FSL_SAI_xCSR(!tx, ofs), &xcsr); 802 803 /* 804 * If opposite stream provides clocks for synchronous mode and 805 * it is inactive, disable it before disabling the current one 806 */ 807 if (fsl_sai_dir_is_synced(sai, adir) && !(xcsr & FSL_SAI_CSR_FRDE)) 808 fsl_sai_config_disable(sai, adir); 809 810 /* 811 * Disable current stream if either of: 812 * 1. current stream doesn't provide clocks for synchronous mode 813 * 2. current stream provides clocks for synchronous mode but no 814 * more stream is active. 815 */ 816 if (!fsl_sai_dir_is_synced(sai, dir) || !(xcsr & FSL_SAI_CSR_FRDE)) 817 fsl_sai_config_disable(sai, dir); 818 819 break; 820 default: 821 return -EINVAL; 822 } 823 824 return 0; 825 } 826 827 static int fsl_sai_startup(struct snd_pcm_substream *substream, 828 struct snd_soc_dai *cpu_dai) 829 { 830 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 831 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 832 int ret; 833 834 /* 835 * EDMA controller needs period size to be a multiple of 836 * tx/rx maxburst 837 */ 838 if (sai->soc_data->use_edma) 839 snd_pcm_hw_constraint_step(substream->runtime, 0, 840 SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 841 tx ? sai->dma_params_tx.maxburst : 842 sai->dma_params_rx.maxburst); 843 844 ret = snd_pcm_hw_constraint_list(substream->runtime, 0, 845 SNDRV_PCM_HW_PARAM_RATE, &fsl_sai_rate_constraints); 846 847 return ret; 848 } 849 850 static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = { 851 .set_bclk_ratio = fsl_sai_set_dai_bclk_ratio, 852 .set_sysclk = fsl_sai_set_dai_sysclk, 853 .set_fmt = fsl_sai_set_dai_fmt, 854 .set_tdm_slot = fsl_sai_set_dai_tdm_slot, 855 .hw_params = fsl_sai_hw_params, 856 .hw_free = fsl_sai_hw_free, 857 .trigger = fsl_sai_trigger, 858 .startup = fsl_sai_startup, 859 }; 860 861 static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai) 862 { 863 struct fsl_sai *sai = dev_get_drvdata(cpu_dai->dev); 864 unsigned int ofs = sai->soc_data->reg_offset; 865 866 /* Software Reset for both Tx and Rx */ 867 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR); 868 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR); 869 /* Clear SR bit to finish the reset */ 870 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0); 871 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0); 872 873 regmap_update_bits(sai->regmap, FSL_SAI_TCR1(ofs), 874 FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth), 875 sai->soc_data->fifo_depth - sai->dma_params_tx.maxburst); 876 regmap_update_bits(sai->regmap, FSL_SAI_RCR1(ofs), 877 FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth), 878 sai->dma_params_rx.maxburst - 1); 879 880 snd_soc_dai_init_dma_data(cpu_dai, &sai->dma_params_tx, 881 &sai->dma_params_rx); 882 883 return 0; 884 } 885 886 static int fsl_sai_dai_resume(struct snd_soc_component *component) 887 { 888 struct fsl_sai *sai = snd_soc_component_get_drvdata(component); 889 struct device *dev = &sai->pdev->dev; 890 int ret; 891 892 if (!IS_ERR_OR_NULL(sai->pinctrl) && !IS_ERR_OR_NULL(sai->pins_state)) { 893 ret = pinctrl_select_state(sai->pinctrl, sai->pins_state); 894 if (ret) { 895 dev_err(dev, "failed to set proper pins state: %d\n", ret); 896 return ret; 897 } 898 } 899 900 return 0; 901 } 902 903 static struct snd_soc_dai_driver fsl_sai_dai_template = { 904 .probe = fsl_sai_dai_probe, 905 .playback = { 906 .stream_name = "CPU-Playback", 907 .channels_min = 1, 908 .channels_max = 32, 909 .rate_min = 8000, 910 .rate_max = 2822400, 911 .rates = SNDRV_PCM_RATE_KNOT, 912 .formats = FSL_SAI_FORMATS, 913 }, 914 .capture = { 915 .stream_name = "CPU-Capture", 916 .channels_min = 1, 917 .channels_max = 32, 918 .rate_min = 8000, 919 .rate_max = 2822400, 920 .rates = SNDRV_PCM_RATE_KNOT, 921 .formats = FSL_SAI_FORMATS, 922 }, 923 .ops = &fsl_sai_pcm_dai_ops, 924 }; 925 926 static const struct snd_soc_component_driver fsl_component = { 927 .name = "fsl-sai", 928 .resume = fsl_sai_dai_resume, 929 .legacy_dai_naming = 1, 930 }; 931 932 static struct reg_default fsl_sai_reg_defaults_ofs0[] = { 933 {FSL_SAI_TCR1(0), 0}, 934 {FSL_SAI_TCR2(0), 0}, 935 {FSL_SAI_TCR3(0), 0}, 936 {FSL_SAI_TCR4(0), 0}, 937 {FSL_SAI_TCR5(0), 0}, 938 {FSL_SAI_TDR0, 0}, 939 {FSL_SAI_TDR1, 0}, 940 {FSL_SAI_TDR2, 0}, 941 {FSL_SAI_TDR3, 0}, 942 {FSL_SAI_TDR4, 0}, 943 {FSL_SAI_TDR5, 0}, 944 {FSL_SAI_TDR6, 0}, 945 {FSL_SAI_TDR7, 0}, 946 {FSL_SAI_TMR, 0}, 947 {FSL_SAI_RCR1(0), 0}, 948 {FSL_SAI_RCR2(0), 0}, 949 {FSL_SAI_RCR3(0), 0}, 950 {FSL_SAI_RCR4(0), 0}, 951 {FSL_SAI_RCR5(0), 0}, 952 {FSL_SAI_RMR, 0}, 953 }; 954 955 static struct reg_default fsl_sai_reg_defaults_ofs8[] = { 956 {FSL_SAI_TCR1(8), 0}, 957 {FSL_SAI_TCR2(8), 0}, 958 {FSL_SAI_TCR3(8), 0}, 959 {FSL_SAI_TCR4(8), 0}, 960 {FSL_SAI_TCR5(8), 0}, 961 {FSL_SAI_TDR0, 0}, 962 {FSL_SAI_TDR1, 0}, 963 {FSL_SAI_TDR2, 0}, 964 {FSL_SAI_TDR3, 0}, 965 {FSL_SAI_TDR4, 0}, 966 {FSL_SAI_TDR5, 0}, 967 {FSL_SAI_TDR6, 0}, 968 {FSL_SAI_TDR7, 0}, 969 {FSL_SAI_TMR, 0}, 970 {FSL_SAI_RCR1(8), 0}, 971 {FSL_SAI_RCR2(8), 0}, 972 {FSL_SAI_RCR3(8), 0}, 973 {FSL_SAI_RCR4(8), 0}, 974 {FSL_SAI_RCR5(8), 0}, 975 {FSL_SAI_RMR, 0}, 976 {FSL_SAI_MCTL, 0}, 977 {FSL_SAI_MDIV, 0}, 978 }; 979 980 static bool fsl_sai_readable_reg(struct device *dev, unsigned int reg) 981 { 982 struct fsl_sai *sai = dev_get_drvdata(dev); 983 unsigned int ofs = sai->soc_data->reg_offset; 984 985 if (reg >= FSL_SAI_TCSR(ofs) && reg <= FSL_SAI_TCR5(ofs)) 986 return true; 987 988 if (reg >= FSL_SAI_RCSR(ofs) && reg <= FSL_SAI_RCR5(ofs)) 989 return true; 990 991 switch (reg) { 992 case FSL_SAI_TFR0: 993 case FSL_SAI_TFR1: 994 case FSL_SAI_TFR2: 995 case FSL_SAI_TFR3: 996 case FSL_SAI_TFR4: 997 case FSL_SAI_TFR5: 998 case FSL_SAI_TFR6: 999 case FSL_SAI_TFR7: 1000 case FSL_SAI_TMR: 1001 case FSL_SAI_RDR0: 1002 case FSL_SAI_RDR1: 1003 case FSL_SAI_RDR2: 1004 case FSL_SAI_RDR3: 1005 case FSL_SAI_RDR4: 1006 case FSL_SAI_RDR5: 1007 case FSL_SAI_RDR6: 1008 case FSL_SAI_RDR7: 1009 case FSL_SAI_RFR0: 1010 case FSL_SAI_RFR1: 1011 case FSL_SAI_RFR2: 1012 case FSL_SAI_RFR3: 1013 case FSL_SAI_RFR4: 1014 case FSL_SAI_RFR5: 1015 case FSL_SAI_RFR6: 1016 case FSL_SAI_RFR7: 1017 case FSL_SAI_RMR: 1018 case FSL_SAI_MCTL: 1019 case FSL_SAI_MDIV: 1020 case FSL_SAI_VERID: 1021 case FSL_SAI_PARAM: 1022 case FSL_SAI_TTCTN: 1023 case FSL_SAI_RTCTN: 1024 case FSL_SAI_TTCTL: 1025 case FSL_SAI_TBCTN: 1026 case FSL_SAI_TTCAP: 1027 case FSL_SAI_RTCTL: 1028 case FSL_SAI_RBCTN: 1029 case FSL_SAI_RTCAP: 1030 return true; 1031 default: 1032 return false; 1033 } 1034 } 1035 1036 static bool fsl_sai_volatile_reg(struct device *dev, unsigned int reg) 1037 { 1038 struct fsl_sai *sai = dev_get_drvdata(dev); 1039 unsigned int ofs = sai->soc_data->reg_offset; 1040 1041 if (reg == FSL_SAI_TCSR(ofs) || reg == FSL_SAI_RCSR(ofs)) 1042 return true; 1043 1044 /* Set VERID and PARAM be volatile for reading value in probe */ 1045 if (ofs == 8 && (reg == FSL_SAI_VERID || reg == FSL_SAI_PARAM)) 1046 return true; 1047 1048 switch (reg) { 1049 case FSL_SAI_TFR0: 1050 case FSL_SAI_TFR1: 1051 case FSL_SAI_TFR2: 1052 case FSL_SAI_TFR3: 1053 case FSL_SAI_TFR4: 1054 case FSL_SAI_TFR5: 1055 case FSL_SAI_TFR6: 1056 case FSL_SAI_TFR7: 1057 case FSL_SAI_RFR0: 1058 case FSL_SAI_RFR1: 1059 case FSL_SAI_RFR2: 1060 case FSL_SAI_RFR3: 1061 case FSL_SAI_RFR4: 1062 case FSL_SAI_RFR5: 1063 case FSL_SAI_RFR6: 1064 case FSL_SAI_RFR7: 1065 case FSL_SAI_RDR0: 1066 case FSL_SAI_RDR1: 1067 case FSL_SAI_RDR2: 1068 case FSL_SAI_RDR3: 1069 case FSL_SAI_RDR4: 1070 case FSL_SAI_RDR5: 1071 case FSL_SAI_RDR6: 1072 case FSL_SAI_RDR7: 1073 return true; 1074 default: 1075 return false; 1076 } 1077 } 1078 1079 static bool fsl_sai_writeable_reg(struct device *dev, unsigned int reg) 1080 { 1081 struct fsl_sai *sai = dev_get_drvdata(dev); 1082 unsigned int ofs = sai->soc_data->reg_offset; 1083 1084 if (reg >= FSL_SAI_TCSR(ofs) && reg <= FSL_SAI_TCR5(ofs)) 1085 return true; 1086 1087 if (reg >= FSL_SAI_RCSR(ofs) && reg <= FSL_SAI_RCR5(ofs)) 1088 return true; 1089 1090 switch (reg) { 1091 case FSL_SAI_TDR0: 1092 case FSL_SAI_TDR1: 1093 case FSL_SAI_TDR2: 1094 case FSL_SAI_TDR3: 1095 case FSL_SAI_TDR4: 1096 case FSL_SAI_TDR5: 1097 case FSL_SAI_TDR6: 1098 case FSL_SAI_TDR7: 1099 case FSL_SAI_TMR: 1100 case FSL_SAI_RMR: 1101 case FSL_SAI_MCTL: 1102 case FSL_SAI_MDIV: 1103 case FSL_SAI_TTCTL: 1104 case FSL_SAI_RTCTL: 1105 return true; 1106 default: 1107 return false; 1108 } 1109 } 1110 1111 static struct regmap_config fsl_sai_regmap_config = { 1112 .reg_bits = 32, 1113 .reg_stride = 4, 1114 .val_bits = 32, 1115 .fast_io = true, 1116 1117 .max_register = FSL_SAI_RMR, 1118 .reg_defaults = fsl_sai_reg_defaults_ofs0, 1119 .num_reg_defaults = ARRAY_SIZE(fsl_sai_reg_defaults_ofs0), 1120 .readable_reg = fsl_sai_readable_reg, 1121 .volatile_reg = fsl_sai_volatile_reg, 1122 .writeable_reg = fsl_sai_writeable_reg, 1123 .cache_type = REGCACHE_FLAT, 1124 }; 1125 1126 static int fsl_sai_check_version(struct device *dev) 1127 { 1128 struct fsl_sai *sai = dev_get_drvdata(dev); 1129 unsigned char ofs = sai->soc_data->reg_offset; 1130 unsigned int val; 1131 int ret; 1132 1133 if (FSL_SAI_TCSR(ofs) == FSL_SAI_VERID) 1134 return 0; 1135 1136 ret = regmap_read(sai->regmap, FSL_SAI_VERID, &val); 1137 if (ret < 0) 1138 return ret; 1139 1140 dev_dbg(dev, "VERID: 0x%016X\n", val); 1141 1142 sai->verid.version = val & 1143 (FSL_SAI_VERID_MAJOR_MASK | FSL_SAI_VERID_MINOR_MASK); 1144 sai->verid.feature = val & FSL_SAI_VERID_FEATURE_MASK; 1145 1146 ret = regmap_read(sai->regmap, FSL_SAI_PARAM, &val); 1147 if (ret < 0) 1148 return ret; 1149 1150 dev_dbg(dev, "PARAM: 0x%016X\n", val); 1151 1152 /* Max slots per frame, power of 2 */ 1153 sai->param.slot_num = 1 << 1154 ((val & FSL_SAI_PARAM_SPF_MASK) >> FSL_SAI_PARAM_SPF_SHIFT); 1155 1156 /* Words per fifo, power of 2 */ 1157 sai->param.fifo_depth = 1 << 1158 ((val & FSL_SAI_PARAM_WPF_MASK) >> FSL_SAI_PARAM_WPF_SHIFT); 1159 1160 /* Number of datalines implemented */ 1161 sai->param.dataline = val & FSL_SAI_PARAM_DLN_MASK; 1162 1163 return 0; 1164 } 1165 1166 /* 1167 * Calculate the offset between first two datalines, don't 1168 * different offset in one case. 1169 */ 1170 static unsigned int fsl_sai_calc_dl_off(unsigned long dl_mask) 1171 { 1172 int fbidx, nbidx, offset; 1173 1174 fbidx = find_first_bit(&dl_mask, FSL_SAI_DL_NUM); 1175 nbidx = find_next_bit(&dl_mask, FSL_SAI_DL_NUM, fbidx + 1); 1176 offset = nbidx - fbidx - 1; 1177 1178 return (offset < 0 || offset >= (FSL_SAI_DL_NUM - 1) ? 0 : offset); 1179 } 1180 1181 /* 1182 * read the fsl,dataline property from dts file. 1183 * It has 3 value for each configuration, first one means the type: 1184 * I2S(1) or PDM(2), second one is dataline mask for 'rx', third one is 1185 * dataline mask for 'tx'. for example 1186 * 1187 * fsl,dataline = <1 0xff 0xff 2 0xff 0x11>, 1188 * 1189 * It means I2S type rx mask is 0xff, tx mask is 0xff, PDM type 1190 * rx mask is 0xff, tx mask is 0x11 (dataline 1 and 4 enabled). 1191 * 1192 */ 1193 static int fsl_sai_read_dlcfg(struct fsl_sai *sai) 1194 { 1195 struct platform_device *pdev = sai->pdev; 1196 struct device_node *np = pdev->dev.of_node; 1197 struct device *dev = &pdev->dev; 1198 int ret, elems, i, index, num_cfg; 1199 char *propname = "fsl,dataline"; 1200 struct fsl_sai_dl_cfg *cfg; 1201 unsigned long dl_mask; 1202 unsigned int soc_dl; 1203 u32 rx, tx, type; 1204 1205 elems = of_property_count_u32_elems(np, propname); 1206 1207 if (elems <= 0) { 1208 elems = 0; 1209 } else if (elems % 3) { 1210 dev_err(dev, "Number of elements must be divisible to 3.\n"); 1211 return -EINVAL; 1212 } 1213 1214 num_cfg = elems / 3; 1215 /* Add one more for default value */ 1216 cfg = devm_kzalloc(&pdev->dev, (num_cfg + 1) * sizeof(*cfg), GFP_KERNEL); 1217 if (!cfg) 1218 return -ENOMEM; 1219 1220 /* Consider default value "0 0xFF 0xFF" if property is missing */ 1221 soc_dl = BIT(sai->soc_data->pins) - 1; 1222 cfg[0].type = FSL_SAI_DL_DEFAULT; 1223 cfg[0].pins[0] = sai->soc_data->pins; 1224 cfg[0].mask[0] = soc_dl; 1225 cfg[0].start_off[0] = 0; 1226 cfg[0].next_off[0] = 0; 1227 1228 cfg[0].pins[1] = sai->soc_data->pins; 1229 cfg[0].mask[1] = soc_dl; 1230 cfg[0].start_off[1] = 0; 1231 cfg[0].next_off[1] = 0; 1232 for (i = 1, index = 0; i < num_cfg + 1; i++) { 1233 /* 1234 * type of dataline 1235 * 0 means default mode 1236 * 1 means I2S mode 1237 * 2 means PDM mode 1238 */ 1239 ret = of_property_read_u32_index(np, propname, index++, &type); 1240 if (ret) 1241 return -EINVAL; 1242 1243 ret = of_property_read_u32_index(np, propname, index++, &rx); 1244 if (ret) 1245 return -EINVAL; 1246 1247 ret = of_property_read_u32_index(np, propname, index++, &tx); 1248 if (ret) 1249 return -EINVAL; 1250 1251 if ((rx & ~soc_dl) || (tx & ~soc_dl)) { 1252 dev_err(dev, "dataline cfg[%d] setting error, mask is 0x%x\n", i, soc_dl); 1253 return -EINVAL; 1254 } 1255 1256 rx = rx & soc_dl; 1257 tx = tx & soc_dl; 1258 1259 cfg[i].type = type; 1260 cfg[i].pins[0] = hweight8(rx); 1261 cfg[i].mask[0] = rx; 1262 dl_mask = rx; 1263 cfg[i].start_off[0] = find_first_bit(&dl_mask, FSL_SAI_DL_NUM); 1264 cfg[i].next_off[0] = fsl_sai_calc_dl_off(rx); 1265 1266 cfg[i].pins[1] = hweight8(tx); 1267 cfg[i].mask[1] = tx; 1268 dl_mask = tx; 1269 cfg[i].start_off[1] = find_first_bit(&dl_mask, FSL_SAI_DL_NUM); 1270 cfg[i].next_off[1] = fsl_sai_calc_dl_off(tx); 1271 } 1272 1273 sai->dl_cfg = cfg; 1274 sai->dl_cfg_cnt = num_cfg + 1; 1275 return 0; 1276 } 1277 1278 static int fsl_sai_runtime_suspend(struct device *dev); 1279 static int fsl_sai_runtime_resume(struct device *dev); 1280 1281 static int fsl_sai_probe(struct platform_device *pdev) 1282 { 1283 struct device_node *np = pdev->dev.of_node; 1284 struct device *dev = &pdev->dev; 1285 struct fsl_sai *sai; 1286 struct regmap *gpr; 1287 void __iomem *base; 1288 char tmp[8]; 1289 int irq, ret, i; 1290 int index; 1291 u32 dmas[4]; 1292 1293 sai = devm_kzalloc(dev, sizeof(*sai), GFP_KERNEL); 1294 if (!sai) 1295 return -ENOMEM; 1296 1297 sai->pdev = pdev; 1298 sai->soc_data = of_device_get_match_data(dev); 1299 1300 sai->is_lsb_first = of_property_read_bool(np, "lsb-first"); 1301 1302 base = devm_platform_get_and_ioremap_resource(pdev, 0, &sai->res); 1303 if (IS_ERR(base)) 1304 return PTR_ERR(base); 1305 1306 if (sai->soc_data->reg_offset == 8) { 1307 fsl_sai_regmap_config.reg_defaults = fsl_sai_reg_defaults_ofs8; 1308 fsl_sai_regmap_config.max_register = FSL_SAI_MDIV; 1309 fsl_sai_regmap_config.num_reg_defaults = 1310 ARRAY_SIZE(fsl_sai_reg_defaults_ofs8); 1311 } 1312 1313 sai->regmap = devm_regmap_init_mmio(dev, base, &fsl_sai_regmap_config); 1314 if (IS_ERR(sai->regmap)) { 1315 dev_err(dev, "regmap init failed\n"); 1316 return PTR_ERR(sai->regmap); 1317 } 1318 1319 sai->bus_clk = devm_clk_get(dev, "bus"); 1320 /* Compatible with old DTB cases */ 1321 if (IS_ERR(sai->bus_clk) && PTR_ERR(sai->bus_clk) != -EPROBE_DEFER) 1322 sai->bus_clk = devm_clk_get(dev, "sai"); 1323 if (IS_ERR(sai->bus_clk)) { 1324 dev_err(dev, "failed to get bus clock: %ld\n", 1325 PTR_ERR(sai->bus_clk)); 1326 /* -EPROBE_DEFER */ 1327 return PTR_ERR(sai->bus_clk); 1328 } 1329 1330 for (i = 1; i < FSL_SAI_MCLK_MAX; i++) { 1331 sprintf(tmp, "mclk%d", i); 1332 sai->mclk_clk[i] = devm_clk_get(dev, tmp); 1333 if (IS_ERR(sai->mclk_clk[i])) { 1334 dev_err(dev, "failed to get mclk%d clock: %ld\n", 1335 i, PTR_ERR(sai->mclk_clk[i])); 1336 sai->mclk_clk[i] = NULL; 1337 } 1338 } 1339 1340 if (sai->soc_data->mclk0_is_mclk1) 1341 sai->mclk_clk[0] = sai->mclk_clk[1]; 1342 else 1343 sai->mclk_clk[0] = sai->bus_clk; 1344 1345 fsl_asoc_get_pll_clocks(&pdev->dev, &sai->pll8k_clk, 1346 &sai->pll11k_clk); 1347 1348 /* Use Multi FIFO mode depending on the support from SDMA script */ 1349 ret = of_property_read_u32_array(np, "dmas", dmas, 4); 1350 if (!sai->soc_data->use_edma && !ret && dmas[2] == IMX_DMATYPE_MULTI_SAI) 1351 sai->is_multi_fifo_dma = true; 1352 1353 /* read dataline mask for rx and tx*/ 1354 ret = fsl_sai_read_dlcfg(sai); 1355 if (ret < 0) { 1356 dev_err(dev, "failed to read dlcfg %d\n", ret); 1357 return ret; 1358 } 1359 1360 irq = platform_get_irq(pdev, 0); 1361 if (irq < 0) 1362 return irq; 1363 1364 ret = devm_request_irq(dev, irq, fsl_sai_isr, IRQF_SHARED, 1365 np->name, sai); 1366 if (ret) { 1367 dev_err(dev, "failed to claim irq %u\n", irq); 1368 return ret; 1369 } 1370 1371 memcpy(&sai->cpu_dai_drv, &fsl_sai_dai_template, 1372 sizeof(fsl_sai_dai_template)); 1373 1374 /* Sync Tx with Rx as default by following old DT binding */ 1375 sai->synchronous[RX] = true; 1376 sai->synchronous[TX] = false; 1377 sai->cpu_dai_drv.symmetric_rate = 1; 1378 sai->cpu_dai_drv.symmetric_channels = 1; 1379 sai->cpu_dai_drv.symmetric_sample_bits = 1; 1380 1381 if (of_find_property(np, "fsl,sai-synchronous-rx", NULL) && 1382 of_find_property(np, "fsl,sai-asynchronous", NULL)) { 1383 /* error out if both synchronous and asynchronous are present */ 1384 dev_err(dev, "invalid binding for synchronous mode\n"); 1385 return -EINVAL; 1386 } 1387 1388 if (of_find_property(np, "fsl,sai-synchronous-rx", NULL)) { 1389 /* Sync Rx with Tx */ 1390 sai->synchronous[RX] = false; 1391 sai->synchronous[TX] = true; 1392 } else if (of_find_property(np, "fsl,sai-asynchronous", NULL)) { 1393 /* Discard all settings for asynchronous mode */ 1394 sai->synchronous[RX] = false; 1395 sai->synchronous[TX] = false; 1396 sai->cpu_dai_drv.symmetric_rate = 0; 1397 sai->cpu_dai_drv.symmetric_channels = 0; 1398 sai->cpu_dai_drv.symmetric_sample_bits = 0; 1399 } 1400 1401 if (of_find_property(np, "fsl,sai-mclk-direction-output", NULL) && 1402 of_device_is_compatible(np, "fsl,imx6ul-sai")) { 1403 gpr = syscon_regmap_lookup_by_compatible("fsl,imx6ul-iomuxc-gpr"); 1404 if (IS_ERR(gpr)) { 1405 dev_err(dev, "cannot find iomuxc registers\n"); 1406 return PTR_ERR(gpr); 1407 } 1408 1409 index = of_alias_get_id(np, "sai"); 1410 if (index < 0) 1411 return index; 1412 1413 regmap_update_bits(gpr, IOMUXC_GPR1, MCLK_DIR(index), 1414 MCLK_DIR(index)); 1415 } 1416 1417 sai->dma_params_rx.addr = sai->res->start + FSL_SAI_RDR0; 1418 sai->dma_params_tx.addr = sai->res->start + FSL_SAI_TDR0; 1419 sai->dma_params_rx.maxburst = 1420 sai->soc_data->max_burst[RX] ? sai->soc_data->max_burst[RX] : FSL_SAI_MAXBURST_RX; 1421 sai->dma_params_tx.maxburst = 1422 sai->soc_data->max_burst[TX] ? sai->soc_data->max_burst[TX] : FSL_SAI_MAXBURST_TX; 1423 1424 sai->pinctrl = devm_pinctrl_get(&pdev->dev); 1425 1426 platform_set_drvdata(pdev, sai); 1427 pm_runtime_enable(dev); 1428 if (!pm_runtime_enabled(dev)) { 1429 ret = fsl_sai_runtime_resume(dev); 1430 if (ret) 1431 goto err_pm_disable; 1432 } 1433 1434 ret = pm_runtime_resume_and_get(dev); 1435 if (ret < 0) 1436 goto err_pm_get_sync; 1437 1438 /* Get sai version */ 1439 ret = fsl_sai_check_version(dev); 1440 if (ret < 0) 1441 dev_warn(dev, "Error reading SAI version: %d\n", ret); 1442 1443 /* Select MCLK direction */ 1444 if (of_find_property(np, "fsl,sai-mclk-direction-output", NULL) && 1445 sai->soc_data->max_register >= FSL_SAI_MCTL) { 1446 regmap_update_bits(sai->regmap, FSL_SAI_MCTL, 1447 FSL_SAI_MCTL_MCLK_EN, FSL_SAI_MCTL_MCLK_EN); 1448 } 1449 1450 ret = pm_runtime_put_sync(dev); 1451 if (ret < 0 && ret != -ENOSYS) 1452 goto err_pm_get_sync; 1453 1454 /* 1455 * Register platform component before registering cpu dai for there 1456 * is not defer probe for platform component in snd_soc_add_pcm_runtime(). 1457 */ 1458 if (sai->soc_data->use_imx_pcm) { 1459 ret = imx_pcm_dma_init(pdev); 1460 if (ret) { 1461 if (!IS_ENABLED(CONFIG_SND_SOC_IMX_PCM_DMA)) 1462 dev_err(dev, "Error: You must enable the imx-pcm-dma support!\n"); 1463 goto err_pm_get_sync; 1464 } 1465 } else { 1466 ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0); 1467 if (ret) 1468 goto err_pm_get_sync; 1469 } 1470 1471 ret = devm_snd_soc_register_component(dev, &fsl_component, 1472 &sai->cpu_dai_drv, 1); 1473 if (ret) 1474 goto err_pm_get_sync; 1475 1476 return ret; 1477 1478 err_pm_get_sync: 1479 if (!pm_runtime_status_suspended(dev)) 1480 fsl_sai_runtime_suspend(dev); 1481 err_pm_disable: 1482 pm_runtime_disable(dev); 1483 1484 return ret; 1485 } 1486 1487 static int fsl_sai_remove(struct platform_device *pdev) 1488 { 1489 pm_runtime_disable(&pdev->dev); 1490 if (!pm_runtime_status_suspended(&pdev->dev)) 1491 fsl_sai_runtime_suspend(&pdev->dev); 1492 1493 return 0; 1494 } 1495 1496 static const struct fsl_sai_soc_data fsl_sai_vf610_data = { 1497 .use_imx_pcm = false, 1498 .use_edma = false, 1499 .fifo_depth = 32, 1500 .pins = 1, 1501 .reg_offset = 0, 1502 .mclk0_is_mclk1 = false, 1503 .flags = 0, 1504 .max_register = FSL_SAI_RMR, 1505 }; 1506 1507 static const struct fsl_sai_soc_data fsl_sai_imx6sx_data = { 1508 .use_imx_pcm = true, 1509 .use_edma = false, 1510 .fifo_depth = 32, 1511 .pins = 1, 1512 .reg_offset = 0, 1513 .mclk0_is_mclk1 = true, 1514 .flags = 0, 1515 .max_register = FSL_SAI_RMR, 1516 }; 1517 1518 static const struct fsl_sai_soc_data fsl_sai_imx7ulp_data = { 1519 .use_imx_pcm = true, 1520 .use_edma = false, 1521 .fifo_depth = 16, 1522 .pins = 2, 1523 .reg_offset = 8, 1524 .mclk0_is_mclk1 = false, 1525 .flags = PMQOS_CPU_LATENCY, 1526 .max_register = FSL_SAI_RMR, 1527 }; 1528 1529 static const struct fsl_sai_soc_data fsl_sai_imx8mq_data = { 1530 .use_imx_pcm = true, 1531 .use_edma = false, 1532 .fifo_depth = 128, 1533 .pins = 8, 1534 .reg_offset = 8, 1535 .mclk0_is_mclk1 = false, 1536 .flags = 0, 1537 .max_register = FSL_SAI_RMR, 1538 }; 1539 1540 static const struct fsl_sai_soc_data fsl_sai_imx8qm_data = { 1541 .use_imx_pcm = true, 1542 .use_edma = true, 1543 .fifo_depth = 64, 1544 .pins = 1, 1545 .reg_offset = 0, 1546 .mclk0_is_mclk1 = false, 1547 .flags = 0, 1548 .max_register = FSL_SAI_RMR, 1549 }; 1550 1551 static const struct fsl_sai_soc_data fsl_sai_imx8mm_data = { 1552 .use_imx_pcm = true, 1553 .use_edma = false, 1554 .fifo_depth = 128, 1555 .reg_offset = 8, 1556 .mclk0_is_mclk1 = false, 1557 .pins = 8, 1558 .flags = 0, 1559 .max_register = FSL_SAI_MCTL, 1560 }; 1561 1562 static const struct fsl_sai_soc_data fsl_sai_imx8mp_data = { 1563 .use_imx_pcm = true, 1564 .use_edma = false, 1565 .fifo_depth = 128, 1566 .reg_offset = 8, 1567 .mclk0_is_mclk1 = false, 1568 .pins = 8, 1569 .flags = 0, 1570 .max_register = FSL_SAI_MDIV, 1571 }; 1572 1573 static const struct fsl_sai_soc_data fsl_sai_imx8ulp_data = { 1574 .use_imx_pcm = true, 1575 .use_edma = true, 1576 .fifo_depth = 16, 1577 .reg_offset = 8, 1578 .mclk0_is_mclk1 = false, 1579 .pins = 4, 1580 .flags = PMQOS_CPU_LATENCY, 1581 .max_register = FSL_SAI_RTCAP, 1582 }; 1583 1584 static const struct fsl_sai_soc_data fsl_sai_imx93_data = { 1585 .use_imx_pcm = true, 1586 .use_edma = true, 1587 .fifo_depth = 128, 1588 .reg_offset = 8, 1589 .mclk0_is_mclk1 = false, 1590 .pins = 4, 1591 .flags = 0, 1592 .max_register = FSL_SAI_MCTL, 1593 .max_burst = {8, 8}, 1594 }; 1595 1596 static const struct of_device_id fsl_sai_ids[] = { 1597 { .compatible = "fsl,vf610-sai", .data = &fsl_sai_vf610_data }, 1598 { .compatible = "fsl,imx6sx-sai", .data = &fsl_sai_imx6sx_data }, 1599 { .compatible = "fsl,imx6ul-sai", .data = &fsl_sai_imx6sx_data }, 1600 { .compatible = "fsl,imx7ulp-sai", .data = &fsl_sai_imx7ulp_data }, 1601 { .compatible = "fsl,imx8mq-sai", .data = &fsl_sai_imx8mq_data }, 1602 { .compatible = "fsl,imx8qm-sai", .data = &fsl_sai_imx8qm_data }, 1603 { .compatible = "fsl,imx8mm-sai", .data = &fsl_sai_imx8mm_data }, 1604 { .compatible = "fsl,imx8mp-sai", .data = &fsl_sai_imx8mp_data }, 1605 { .compatible = "fsl,imx8ulp-sai", .data = &fsl_sai_imx8ulp_data }, 1606 { .compatible = "fsl,imx8mn-sai", .data = &fsl_sai_imx8mp_data }, 1607 { .compatible = "fsl,imx93-sai", .data = &fsl_sai_imx93_data }, 1608 { /* sentinel */ } 1609 }; 1610 MODULE_DEVICE_TABLE(of, fsl_sai_ids); 1611 1612 static int fsl_sai_runtime_suspend(struct device *dev) 1613 { 1614 struct fsl_sai *sai = dev_get_drvdata(dev); 1615 1616 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_CAPTURE)) 1617 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[0]]); 1618 1619 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_PLAYBACK)) 1620 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[1]]); 1621 1622 clk_disable_unprepare(sai->bus_clk); 1623 1624 if (sai->soc_data->flags & PMQOS_CPU_LATENCY) 1625 cpu_latency_qos_remove_request(&sai->pm_qos_req); 1626 1627 regcache_cache_only(sai->regmap, true); 1628 1629 return 0; 1630 } 1631 1632 static int fsl_sai_runtime_resume(struct device *dev) 1633 { 1634 struct fsl_sai *sai = dev_get_drvdata(dev); 1635 unsigned int ofs = sai->soc_data->reg_offset; 1636 int ret; 1637 1638 ret = clk_prepare_enable(sai->bus_clk); 1639 if (ret) { 1640 dev_err(dev, "failed to enable bus clock: %d\n", ret); 1641 return ret; 1642 } 1643 1644 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_PLAYBACK)) { 1645 ret = clk_prepare_enable(sai->mclk_clk[sai->mclk_id[1]]); 1646 if (ret) 1647 goto disable_bus_clk; 1648 } 1649 1650 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_CAPTURE)) { 1651 ret = clk_prepare_enable(sai->mclk_clk[sai->mclk_id[0]]); 1652 if (ret) 1653 goto disable_tx_clk; 1654 } 1655 1656 if (sai->soc_data->flags & PMQOS_CPU_LATENCY) 1657 cpu_latency_qos_add_request(&sai->pm_qos_req, 0); 1658 1659 regcache_cache_only(sai->regmap, false); 1660 regcache_mark_dirty(sai->regmap); 1661 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR); 1662 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR); 1663 usleep_range(1000, 2000); 1664 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0); 1665 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0); 1666 1667 ret = regcache_sync(sai->regmap); 1668 if (ret) 1669 goto disable_rx_clk; 1670 1671 return 0; 1672 1673 disable_rx_clk: 1674 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_CAPTURE)) 1675 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[0]]); 1676 disable_tx_clk: 1677 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_PLAYBACK)) 1678 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[1]]); 1679 disable_bus_clk: 1680 clk_disable_unprepare(sai->bus_clk); 1681 1682 return ret; 1683 } 1684 1685 static const struct dev_pm_ops fsl_sai_pm_ops = { 1686 SET_RUNTIME_PM_OPS(fsl_sai_runtime_suspend, 1687 fsl_sai_runtime_resume, NULL) 1688 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, 1689 pm_runtime_force_resume) 1690 }; 1691 1692 static struct platform_driver fsl_sai_driver = { 1693 .probe = fsl_sai_probe, 1694 .remove = fsl_sai_remove, 1695 .driver = { 1696 .name = "fsl-sai", 1697 .pm = &fsl_sai_pm_ops, 1698 .of_match_table = fsl_sai_ids, 1699 }, 1700 }; 1701 module_platform_driver(fsl_sai_driver); 1702 1703 MODULE_DESCRIPTION("Freescale Soc SAI Interface"); 1704 MODULE_AUTHOR("Xiubo Li, <Li.Xiubo@freescale.com>"); 1705 MODULE_ALIAS("platform:fsl-sai"); 1706 MODULE_LICENSE("GPL"); 1707