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/pm_runtime.h> 14 #include <linux/regmap.h> 15 #include <linux/slab.h> 16 #include <linux/time.h> 17 #include <sound/core.h> 18 #include <sound/dmaengine_pcm.h> 19 #include <sound/pcm_params.h> 20 #include <linux/mfd/syscon.h> 21 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> 22 23 #include "fsl_sai.h" 24 #include "imx-pcm.h" 25 26 #define FSL_SAI_FLAGS (FSL_SAI_CSR_SEIE |\ 27 FSL_SAI_CSR_FEIE) 28 29 static const unsigned int fsl_sai_rates[] = { 30 8000, 11025, 12000, 16000, 22050, 31 24000, 32000, 44100, 48000, 64000, 32 88200, 96000, 176400, 192000 33 }; 34 35 static const struct snd_pcm_hw_constraint_list fsl_sai_rate_constraints = { 36 .count = ARRAY_SIZE(fsl_sai_rates), 37 .list = fsl_sai_rates, 38 }; 39 40 static irqreturn_t fsl_sai_isr(int irq, void *devid) 41 { 42 struct fsl_sai *sai = (struct fsl_sai *)devid; 43 unsigned int ofs = sai->soc_data->reg_offset; 44 struct device *dev = &sai->pdev->dev; 45 u32 flags, xcsr, mask; 46 bool irq_none = true; 47 48 /* 49 * Both IRQ status bits and IRQ mask bits are in the xCSR but 50 * different shifts. And we here create a mask only for those 51 * IRQs that we activated. 52 */ 53 mask = (FSL_SAI_FLAGS >> FSL_SAI_CSR_xIE_SHIFT) << FSL_SAI_CSR_xF_SHIFT; 54 55 /* Tx IRQ */ 56 regmap_read(sai->regmap, FSL_SAI_TCSR(ofs), &xcsr); 57 flags = xcsr & mask; 58 59 if (flags) 60 irq_none = false; 61 else 62 goto irq_rx; 63 64 if (flags & FSL_SAI_CSR_WSF) 65 dev_dbg(dev, "isr: Start of Tx word detected\n"); 66 67 if (flags & FSL_SAI_CSR_SEF) 68 dev_dbg(dev, "isr: Tx Frame sync error detected\n"); 69 70 if (flags & FSL_SAI_CSR_FEF) { 71 dev_dbg(dev, "isr: Transmit underrun detected\n"); 72 /* FIFO reset for safety */ 73 xcsr |= FSL_SAI_CSR_FR; 74 } 75 76 if (flags & FSL_SAI_CSR_FWF) 77 dev_dbg(dev, "isr: Enabled transmit FIFO is empty\n"); 78 79 if (flags & FSL_SAI_CSR_FRF) 80 dev_dbg(dev, "isr: Transmit FIFO watermark has been reached\n"); 81 82 flags &= FSL_SAI_CSR_xF_W_MASK; 83 xcsr &= ~FSL_SAI_CSR_xF_MASK; 84 85 if (flags) 86 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), flags | xcsr); 87 88 irq_rx: 89 /* Rx IRQ */ 90 regmap_read(sai->regmap, FSL_SAI_RCSR(ofs), &xcsr); 91 flags = xcsr & mask; 92 93 if (flags) 94 irq_none = false; 95 else 96 goto out; 97 98 if (flags & FSL_SAI_CSR_WSF) 99 dev_dbg(dev, "isr: Start of Rx word detected\n"); 100 101 if (flags & FSL_SAI_CSR_SEF) 102 dev_dbg(dev, "isr: Rx Frame sync error detected\n"); 103 104 if (flags & FSL_SAI_CSR_FEF) { 105 dev_dbg(dev, "isr: Receive overflow detected\n"); 106 /* FIFO reset for safety */ 107 xcsr |= FSL_SAI_CSR_FR; 108 } 109 110 if (flags & FSL_SAI_CSR_FWF) 111 dev_dbg(dev, "isr: Enabled receive FIFO is full\n"); 112 113 if (flags & FSL_SAI_CSR_FRF) 114 dev_dbg(dev, "isr: Receive FIFO watermark has been reached\n"); 115 116 flags &= FSL_SAI_CSR_xF_W_MASK; 117 xcsr &= ~FSL_SAI_CSR_xF_MASK; 118 119 if (flags) 120 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), flags | xcsr); 121 122 out: 123 if (irq_none) 124 return IRQ_NONE; 125 else 126 return IRQ_HANDLED; 127 } 128 129 static int fsl_sai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask, 130 u32 rx_mask, int slots, int slot_width) 131 { 132 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 133 134 sai->slots = slots; 135 sai->slot_width = slot_width; 136 137 return 0; 138 } 139 140 static int fsl_sai_set_dai_bclk_ratio(struct snd_soc_dai *dai, 141 unsigned int ratio) 142 { 143 struct fsl_sai *sai = snd_soc_dai_get_drvdata(dai); 144 145 sai->bclk_ratio = ratio; 146 147 return 0; 148 } 149 150 static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai, 151 int clk_id, unsigned int freq, int fsl_dir) 152 { 153 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 154 unsigned int ofs = sai->soc_data->reg_offset; 155 bool tx = fsl_dir == FSL_FMT_TRANSMITTER; 156 u32 val_cr2 = 0; 157 158 switch (clk_id) { 159 case FSL_SAI_CLK_BUS: 160 val_cr2 |= FSL_SAI_CR2_MSEL_BUS; 161 break; 162 case FSL_SAI_CLK_MAST1: 163 val_cr2 |= FSL_SAI_CR2_MSEL_MCLK1; 164 break; 165 case FSL_SAI_CLK_MAST2: 166 val_cr2 |= FSL_SAI_CR2_MSEL_MCLK2; 167 break; 168 case FSL_SAI_CLK_MAST3: 169 val_cr2 |= FSL_SAI_CR2_MSEL_MCLK3; 170 break; 171 default: 172 return -EINVAL; 173 } 174 175 regmap_update_bits(sai->regmap, FSL_SAI_xCR2(tx, ofs), 176 FSL_SAI_CR2_MSEL_MASK, val_cr2); 177 178 return 0; 179 } 180 181 static int fsl_sai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, 182 int clk_id, unsigned int freq, int dir) 183 { 184 int ret; 185 186 if (dir == SND_SOC_CLOCK_IN) 187 return 0; 188 189 ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq, 190 FSL_FMT_TRANSMITTER); 191 if (ret) { 192 dev_err(cpu_dai->dev, "Cannot set tx sysclk: %d\n", ret); 193 return ret; 194 } 195 196 ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq, 197 FSL_FMT_RECEIVER); 198 if (ret) 199 dev_err(cpu_dai->dev, "Cannot set rx sysclk: %d\n", ret); 200 201 return ret; 202 } 203 204 static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai, 205 unsigned int fmt, int fsl_dir) 206 { 207 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 208 unsigned int ofs = sai->soc_data->reg_offset; 209 bool tx = fsl_dir == FSL_FMT_TRANSMITTER; 210 u32 val_cr2 = 0, val_cr4 = 0; 211 212 if (!sai->is_lsb_first) 213 val_cr4 |= FSL_SAI_CR4_MF; 214 215 /* DAI mode */ 216 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 217 case SND_SOC_DAIFMT_I2S: 218 /* 219 * Frame low, 1clk before data, one word length for frame sync, 220 * frame sync starts one serial clock cycle earlier, 221 * that is, together with the last bit of the previous 222 * data word. 223 */ 224 val_cr2 |= FSL_SAI_CR2_BCP; 225 val_cr4 |= FSL_SAI_CR4_FSE | FSL_SAI_CR4_FSP; 226 break; 227 case SND_SOC_DAIFMT_LEFT_J: 228 /* 229 * Frame high, one word length for frame sync, 230 * frame sync asserts with the first bit of the frame. 231 */ 232 val_cr2 |= FSL_SAI_CR2_BCP; 233 break; 234 case SND_SOC_DAIFMT_DSP_A: 235 /* 236 * Frame high, 1clk before data, one bit for frame sync, 237 * frame sync starts one serial clock cycle earlier, 238 * that is, together with the last bit of the previous 239 * data word. 240 */ 241 val_cr2 |= FSL_SAI_CR2_BCP; 242 val_cr4 |= FSL_SAI_CR4_FSE; 243 sai->is_dsp_mode = true; 244 break; 245 case SND_SOC_DAIFMT_DSP_B: 246 /* 247 * Frame high, one bit for frame sync, 248 * frame sync asserts with the first bit of the frame. 249 */ 250 val_cr2 |= FSL_SAI_CR2_BCP; 251 sai->is_dsp_mode = true; 252 break; 253 case SND_SOC_DAIFMT_RIGHT_J: 254 /* To be done */ 255 default: 256 return -EINVAL; 257 } 258 259 /* DAI clock inversion */ 260 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 261 case SND_SOC_DAIFMT_IB_IF: 262 /* Invert both clocks */ 263 val_cr2 ^= FSL_SAI_CR2_BCP; 264 val_cr4 ^= FSL_SAI_CR4_FSP; 265 break; 266 case SND_SOC_DAIFMT_IB_NF: 267 /* Invert bit clock */ 268 val_cr2 ^= FSL_SAI_CR2_BCP; 269 break; 270 case SND_SOC_DAIFMT_NB_IF: 271 /* Invert frame clock */ 272 val_cr4 ^= FSL_SAI_CR4_FSP; 273 break; 274 case SND_SOC_DAIFMT_NB_NF: 275 /* Nothing to do for both normal cases */ 276 break; 277 default: 278 return -EINVAL; 279 } 280 281 /* DAI clock master masks */ 282 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 283 case SND_SOC_DAIFMT_CBS_CFS: 284 val_cr2 |= FSL_SAI_CR2_BCD_MSTR; 285 val_cr4 |= FSL_SAI_CR4_FSD_MSTR; 286 sai->is_slave_mode = false; 287 break; 288 case SND_SOC_DAIFMT_CBM_CFM: 289 sai->is_slave_mode = true; 290 break; 291 case SND_SOC_DAIFMT_CBS_CFM: 292 val_cr2 |= FSL_SAI_CR2_BCD_MSTR; 293 sai->is_slave_mode = false; 294 break; 295 case SND_SOC_DAIFMT_CBM_CFS: 296 val_cr4 |= FSL_SAI_CR4_FSD_MSTR; 297 sai->is_slave_mode = true; 298 break; 299 default: 300 return -EINVAL; 301 } 302 303 regmap_update_bits(sai->regmap, FSL_SAI_xCR2(tx, ofs), 304 FSL_SAI_CR2_BCP | FSL_SAI_CR2_BCD_MSTR, val_cr2); 305 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), 306 FSL_SAI_CR4_MF | FSL_SAI_CR4_FSE | 307 FSL_SAI_CR4_FSP | FSL_SAI_CR4_FSD_MSTR, val_cr4); 308 309 return 0; 310 } 311 312 static int fsl_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) 313 { 314 int ret; 315 316 ret = fsl_sai_set_dai_fmt_tr(cpu_dai, fmt, FSL_FMT_TRANSMITTER); 317 if (ret) { 318 dev_err(cpu_dai->dev, "Cannot set tx format: %d\n", ret); 319 return ret; 320 } 321 322 ret = fsl_sai_set_dai_fmt_tr(cpu_dai, fmt, FSL_FMT_RECEIVER); 323 if (ret) 324 dev_err(cpu_dai->dev, "Cannot set rx format: %d\n", ret); 325 326 return ret; 327 } 328 329 static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq) 330 { 331 struct fsl_sai *sai = snd_soc_dai_get_drvdata(dai); 332 unsigned int ofs = sai->soc_data->reg_offset; 333 unsigned long clk_rate; 334 u32 savediv = 0, ratio, savesub = freq; 335 u32 id; 336 int ret = 0; 337 338 /* Don't apply to slave mode */ 339 if (sai->is_slave_mode) 340 return 0; 341 342 for (id = 0; id < FSL_SAI_MCLK_MAX; id++) { 343 clk_rate = clk_get_rate(sai->mclk_clk[id]); 344 if (!clk_rate) 345 continue; 346 347 ratio = clk_rate / freq; 348 349 ret = clk_rate - ratio * freq; 350 351 /* 352 * Drop the source that can not be 353 * divided into the required rate. 354 */ 355 if (ret != 0 && clk_rate / ret < 1000) 356 continue; 357 358 dev_dbg(dai->dev, 359 "ratio %d for freq %dHz based on clock %ldHz\n", 360 ratio, freq, clk_rate); 361 362 if (ratio % 2 == 0 && ratio >= 2 && ratio <= 512) 363 ratio /= 2; 364 else 365 continue; 366 367 if (ret < savesub) { 368 savediv = ratio; 369 sai->mclk_id[tx] = id; 370 savesub = ret; 371 } 372 373 if (ret == 0) 374 break; 375 } 376 377 if (savediv == 0) { 378 dev_err(dai->dev, "failed to derive required %cx rate: %d\n", 379 tx ? 'T' : 'R', freq); 380 return -EINVAL; 381 } 382 383 /* 384 * 1) For Asynchronous mode, we must set RCR2 register for capture, and 385 * set TCR2 register for playback. 386 * 2) For Tx sync with Rx clock, we must set RCR2 register for playback 387 * and capture. 388 * 3) For Rx sync with Tx clock, we must set TCR2 register for playback 389 * and capture. 390 * 4) For Tx and Rx are both Synchronous with another SAI, we just 391 * ignore it. 392 */ 393 if ((sai->synchronous[TX] && !sai->synchronous[RX]) || 394 (!tx && !sai->synchronous[RX])) { 395 regmap_update_bits(sai->regmap, FSL_SAI_RCR2(ofs), 396 FSL_SAI_CR2_MSEL_MASK, 397 FSL_SAI_CR2_MSEL(sai->mclk_id[tx])); 398 regmap_update_bits(sai->regmap, FSL_SAI_RCR2(ofs), 399 FSL_SAI_CR2_DIV_MASK, savediv - 1); 400 } else if ((sai->synchronous[RX] && !sai->synchronous[TX]) || 401 (tx && !sai->synchronous[TX])) { 402 regmap_update_bits(sai->regmap, FSL_SAI_TCR2(ofs), 403 FSL_SAI_CR2_MSEL_MASK, 404 FSL_SAI_CR2_MSEL(sai->mclk_id[tx])); 405 regmap_update_bits(sai->regmap, FSL_SAI_TCR2(ofs), 406 FSL_SAI_CR2_DIV_MASK, savediv - 1); 407 } 408 409 dev_dbg(dai->dev, "best fit: clock id=%d, div=%d, deviation =%d\n", 410 sai->mclk_id[tx], savediv, savesub); 411 412 return 0; 413 } 414 415 static int fsl_sai_hw_params(struct snd_pcm_substream *substream, 416 struct snd_pcm_hw_params *params, 417 struct snd_soc_dai *cpu_dai) 418 { 419 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 420 unsigned int ofs = sai->soc_data->reg_offset; 421 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 422 unsigned int channels = params_channels(params); 423 u32 word_width = params_width(params); 424 u32 val_cr4 = 0, val_cr5 = 0; 425 u32 slots = (channels == 1) ? 2 : channels; 426 u32 slot_width = word_width; 427 int ret; 428 429 if (sai->slots) 430 slots = sai->slots; 431 432 if (sai->slot_width) 433 slot_width = sai->slot_width; 434 435 if (!sai->is_slave_mode) { 436 if (sai->bclk_ratio) 437 ret = fsl_sai_set_bclk(cpu_dai, tx, 438 sai->bclk_ratio * 439 params_rate(params)); 440 else 441 ret = fsl_sai_set_bclk(cpu_dai, tx, 442 slots * slot_width * 443 params_rate(params)); 444 if (ret) 445 return ret; 446 447 /* Do not enable the clock if it is already enabled */ 448 if (!(sai->mclk_streams & BIT(substream->stream))) { 449 ret = clk_prepare_enable(sai->mclk_clk[sai->mclk_id[tx]]); 450 if (ret) 451 return ret; 452 453 sai->mclk_streams |= BIT(substream->stream); 454 } 455 } 456 457 if (!sai->is_dsp_mode) 458 val_cr4 |= FSL_SAI_CR4_SYWD(slot_width); 459 460 val_cr5 |= FSL_SAI_CR5_WNW(slot_width); 461 val_cr5 |= FSL_SAI_CR5_W0W(slot_width); 462 463 if (sai->is_lsb_first) 464 val_cr5 |= FSL_SAI_CR5_FBT(0); 465 else 466 val_cr5 |= FSL_SAI_CR5_FBT(word_width - 1); 467 468 val_cr4 |= FSL_SAI_CR4_FRSZ(slots); 469 470 /* 471 * For SAI master mode, when Tx(Rx) sync with Rx(Tx) clock, Rx(Tx) will 472 * generate bclk and frame clock for Tx(Rx), we should set RCR4(TCR4), 473 * RCR5(TCR5) and RMR(TMR) for playback(capture), or there will be sync 474 * error. 475 */ 476 477 if (!sai->is_slave_mode) { 478 if (!sai->synchronous[TX] && sai->synchronous[RX] && !tx) { 479 regmap_update_bits(sai->regmap, FSL_SAI_TCR4(ofs), 480 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK, 481 val_cr4); 482 regmap_update_bits(sai->regmap, FSL_SAI_TCR5(ofs), 483 FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK | 484 FSL_SAI_CR5_FBT_MASK, val_cr5); 485 regmap_write(sai->regmap, FSL_SAI_TMR, 486 ~0UL - ((1 << channels) - 1)); 487 } else if (!sai->synchronous[RX] && sai->synchronous[TX] && tx) { 488 regmap_update_bits(sai->regmap, FSL_SAI_RCR4(ofs), 489 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK, 490 val_cr4); 491 regmap_update_bits(sai->regmap, FSL_SAI_RCR5(ofs), 492 FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK | 493 FSL_SAI_CR5_FBT_MASK, val_cr5); 494 regmap_write(sai->regmap, FSL_SAI_RMR, 495 ~0UL - ((1 << channels) - 1)); 496 } 497 } 498 499 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), 500 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK, 501 val_cr4); 502 regmap_update_bits(sai->regmap, FSL_SAI_xCR5(tx, ofs), 503 FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK | 504 FSL_SAI_CR5_FBT_MASK, val_cr5); 505 regmap_write(sai->regmap, FSL_SAI_xMR(tx), ~0UL - ((1 << channels) - 1)); 506 507 return 0; 508 } 509 510 static int fsl_sai_hw_free(struct snd_pcm_substream *substream, 511 struct snd_soc_dai *cpu_dai) 512 { 513 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 514 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 515 516 if (!sai->is_slave_mode && 517 sai->mclk_streams & BIT(substream->stream)) { 518 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[tx]]); 519 sai->mclk_streams &= ~BIT(substream->stream); 520 } 521 522 return 0; 523 } 524 525 526 static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd, 527 struct snd_soc_dai *cpu_dai) 528 { 529 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 530 unsigned int ofs = sai->soc_data->reg_offset; 531 532 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 533 u32 xcsr, count = 100; 534 535 /* 536 * Asynchronous mode: Clear SYNC for both Tx and Rx. 537 * Rx sync with Tx clocks: Clear SYNC for Tx, set it for Rx. 538 * Tx sync with Rx clocks: Clear SYNC for Rx, set it for Tx. 539 */ 540 regmap_update_bits(sai->regmap, FSL_SAI_TCR2(ofs), FSL_SAI_CR2_SYNC, 541 sai->synchronous[TX] ? FSL_SAI_CR2_SYNC : 0); 542 regmap_update_bits(sai->regmap, FSL_SAI_RCR2(ofs), FSL_SAI_CR2_SYNC, 543 sai->synchronous[RX] ? FSL_SAI_CR2_SYNC : 0); 544 545 /* 546 * It is recommended that the transmitter is the last enabled 547 * and the first disabled. 548 */ 549 switch (cmd) { 550 case SNDRV_PCM_TRIGGER_START: 551 case SNDRV_PCM_TRIGGER_RESUME: 552 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 553 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 554 FSL_SAI_CSR_FRDE, FSL_SAI_CSR_FRDE); 555 556 regmap_update_bits(sai->regmap, FSL_SAI_RCSR(ofs), 557 FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE); 558 regmap_update_bits(sai->regmap, FSL_SAI_TCSR(ofs), 559 FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE); 560 561 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 562 FSL_SAI_CSR_xIE_MASK, FSL_SAI_FLAGS); 563 break; 564 case SNDRV_PCM_TRIGGER_STOP: 565 case SNDRV_PCM_TRIGGER_SUSPEND: 566 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 567 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 568 FSL_SAI_CSR_FRDE, 0); 569 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), 570 FSL_SAI_CSR_xIE_MASK, 0); 571 572 /* Check if the opposite FRDE is also disabled */ 573 regmap_read(sai->regmap, FSL_SAI_xCSR(!tx, ofs), &xcsr); 574 if (!(xcsr & FSL_SAI_CSR_FRDE)) { 575 /* Disable both directions and reset their FIFOs */ 576 regmap_update_bits(sai->regmap, FSL_SAI_TCSR(ofs), 577 FSL_SAI_CSR_TERE, 0); 578 regmap_update_bits(sai->regmap, FSL_SAI_RCSR(ofs), 579 FSL_SAI_CSR_TERE, 0); 580 581 /* TERE will remain set till the end of current frame */ 582 do { 583 udelay(10); 584 regmap_read(sai->regmap, 585 FSL_SAI_xCSR(tx, ofs), &xcsr); 586 } while (--count && xcsr & FSL_SAI_CSR_TERE); 587 588 regmap_update_bits(sai->regmap, FSL_SAI_TCSR(ofs), 589 FSL_SAI_CSR_FR, FSL_SAI_CSR_FR); 590 regmap_update_bits(sai->regmap, FSL_SAI_RCSR(ofs), 591 FSL_SAI_CSR_FR, FSL_SAI_CSR_FR); 592 593 /* 594 * For sai master mode, after several open/close sai, 595 * there will be no frame clock, and can't recover 596 * anymore. Add software reset to fix this issue. 597 * This is a hardware bug, and will be fix in the 598 * next sai version. 599 */ 600 if (!sai->is_slave_mode) { 601 /* Software Reset for both Tx and Rx */ 602 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 603 FSL_SAI_CSR_SR); 604 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 605 FSL_SAI_CSR_SR); 606 /* Clear SR bit to finish the reset */ 607 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0); 608 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0); 609 } 610 } 611 break; 612 default: 613 return -EINVAL; 614 } 615 616 return 0; 617 } 618 619 static int fsl_sai_startup(struct snd_pcm_substream *substream, 620 struct snd_soc_dai *cpu_dai) 621 { 622 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 623 unsigned int ofs = sai->soc_data->reg_offset; 624 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 625 int ret; 626 627 regmap_update_bits(sai->regmap, FSL_SAI_xCR3(tx, ofs), 628 FSL_SAI_CR3_TRCE_MASK, 629 FSL_SAI_CR3_TRCE); 630 631 ret = snd_pcm_hw_constraint_list(substream->runtime, 0, 632 SNDRV_PCM_HW_PARAM_RATE, &fsl_sai_rate_constraints); 633 634 return ret; 635 } 636 637 static void fsl_sai_shutdown(struct snd_pcm_substream *substream, 638 struct snd_soc_dai *cpu_dai) 639 { 640 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 641 unsigned int ofs = sai->soc_data->reg_offset; 642 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 643 644 regmap_update_bits(sai->regmap, FSL_SAI_xCR3(tx, ofs), 645 FSL_SAI_CR3_TRCE_MASK, 0); 646 } 647 648 static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = { 649 .set_bclk_ratio = fsl_sai_set_dai_bclk_ratio, 650 .set_sysclk = fsl_sai_set_dai_sysclk, 651 .set_fmt = fsl_sai_set_dai_fmt, 652 .set_tdm_slot = fsl_sai_set_dai_tdm_slot, 653 .hw_params = fsl_sai_hw_params, 654 .hw_free = fsl_sai_hw_free, 655 .trigger = fsl_sai_trigger, 656 .startup = fsl_sai_startup, 657 .shutdown = fsl_sai_shutdown, 658 }; 659 660 static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai) 661 { 662 struct fsl_sai *sai = dev_get_drvdata(cpu_dai->dev); 663 unsigned int ofs = sai->soc_data->reg_offset; 664 665 /* Software Reset for both Tx and Rx */ 666 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR); 667 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR); 668 /* Clear SR bit to finish the reset */ 669 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0); 670 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0); 671 672 regmap_update_bits(sai->regmap, FSL_SAI_TCR1(ofs), 673 FSL_SAI_CR1_RFW_MASK, 674 sai->soc_data->fifo_depth - FSL_SAI_MAXBURST_TX); 675 regmap_update_bits(sai->regmap, FSL_SAI_RCR1(ofs), 676 FSL_SAI_CR1_RFW_MASK, FSL_SAI_MAXBURST_RX - 1); 677 678 snd_soc_dai_init_dma_data(cpu_dai, &sai->dma_params_tx, 679 &sai->dma_params_rx); 680 681 snd_soc_dai_set_drvdata(cpu_dai, sai); 682 683 return 0; 684 } 685 686 static struct snd_soc_dai_driver fsl_sai_dai = { 687 .probe = fsl_sai_dai_probe, 688 .playback = { 689 .stream_name = "CPU-Playback", 690 .channels_min = 1, 691 .channels_max = 32, 692 .rate_min = 8000, 693 .rate_max = 192000, 694 .rates = SNDRV_PCM_RATE_KNOT, 695 .formats = FSL_SAI_FORMATS, 696 }, 697 .capture = { 698 .stream_name = "CPU-Capture", 699 .channels_min = 1, 700 .channels_max = 32, 701 .rate_min = 8000, 702 .rate_max = 192000, 703 .rates = SNDRV_PCM_RATE_KNOT, 704 .formats = FSL_SAI_FORMATS, 705 }, 706 .ops = &fsl_sai_pcm_dai_ops, 707 }; 708 709 static const struct snd_soc_component_driver fsl_component = { 710 .name = "fsl-sai", 711 }; 712 713 static struct reg_default fsl_sai_reg_defaults_ofs0[] = { 714 {FSL_SAI_TCR1(0), 0}, 715 {FSL_SAI_TCR2(0), 0}, 716 {FSL_SAI_TCR3(0), 0}, 717 {FSL_SAI_TCR4(0), 0}, 718 {FSL_SAI_TCR5(0), 0}, 719 {FSL_SAI_TDR0, 0}, 720 {FSL_SAI_TDR1, 0}, 721 {FSL_SAI_TDR2, 0}, 722 {FSL_SAI_TDR3, 0}, 723 {FSL_SAI_TDR4, 0}, 724 {FSL_SAI_TDR5, 0}, 725 {FSL_SAI_TDR6, 0}, 726 {FSL_SAI_TDR7, 0}, 727 {FSL_SAI_TMR, 0}, 728 {FSL_SAI_RCR1(0), 0}, 729 {FSL_SAI_RCR2(0), 0}, 730 {FSL_SAI_RCR3(0), 0}, 731 {FSL_SAI_RCR4(0), 0}, 732 {FSL_SAI_RCR5(0), 0}, 733 {FSL_SAI_RMR, 0}, 734 }; 735 736 static struct reg_default fsl_sai_reg_defaults_ofs8[] = { 737 {FSL_SAI_TCR1(8), 0}, 738 {FSL_SAI_TCR2(8), 0}, 739 {FSL_SAI_TCR3(8), 0}, 740 {FSL_SAI_TCR4(8), 0}, 741 {FSL_SAI_TCR5(8), 0}, 742 {FSL_SAI_TDR0, 0}, 743 {FSL_SAI_TDR1, 0}, 744 {FSL_SAI_TDR2, 0}, 745 {FSL_SAI_TDR3, 0}, 746 {FSL_SAI_TDR4, 0}, 747 {FSL_SAI_TDR5, 0}, 748 {FSL_SAI_TDR6, 0}, 749 {FSL_SAI_TDR7, 0}, 750 {FSL_SAI_TMR, 0}, 751 {FSL_SAI_RCR1(8), 0}, 752 {FSL_SAI_RCR2(8), 0}, 753 {FSL_SAI_RCR3(8), 0}, 754 {FSL_SAI_RCR4(8), 0}, 755 {FSL_SAI_RCR5(8), 0}, 756 {FSL_SAI_RMR, 0}, 757 }; 758 759 static bool fsl_sai_readable_reg(struct device *dev, unsigned int reg) 760 { 761 struct fsl_sai *sai = dev_get_drvdata(dev); 762 unsigned int ofs = sai->soc_data->reg_offset; 763 764 if (reg >= FSL_SAI_TCSR(ofs) && reg <= FSL_SAI_TCR5(ofs)) 765 return true; 766 767 if (reg >= FSL_SAI_RCSR(ofs) && reg <= FSL_SAI_RCR5(ofs)) 768 return true; 769 770 switch (reg) { 771 case FSL_SAI_TFR0: 772 case FSL_SAI_TFR1: 773 case FSL_SAI_TFR2: 774 case FSL_SAI_TFR3: 775 case FSL_SAI_TFR4: 776 case FSL_SAI_TFR5: 777 case FSL_SAI_TFR6: 778 case FSL_SAI_TFR7: 779 case FSL_SAI_TMR: 780 case FSL_SAI_RDR0: 781 case FSL_SAI_RDR1: 782 case FSL_SAI_RDR2: 783 case FSL_SAI_RDR3: 784 case FSL_SAI_RDR4: 785 case FSL_SAI_RDR5: 786 case FSL_SAI_RDR6: 787 case FSL_SAI_RDR7: 788 case FSL_SAI_RFR0: 789 case FSL_SAI_RFR1: 790 case FSL_SAI_RFR2: 791 case FSL_SAI_RFR3: 792 case FSL_SAI_RFR4: 793 case FSL_SAI_RFR5: 794 case FSL_SAI_RFR6: 795 case FSL_SAI_RFR7: 796 case FSL_SAI_RMR: 797 return true; 798 default: 799 return false; 800 } 801 } 802 803 static bool fsl_sai_volatile_reg(struct device *dev, unsigned int reg) 804 { 805 struct fsl_sai *sai = dev_get_drvdata(dev); 806 unsigned int ofs = sai->soc_data->reg_offset; 807 808 if (reg == FSL_SAI_TCSR(ofs) || reg == FSL_SAI_RCSR(ofs)) 809 return true; 810 811 switch (reg) { 812 case FSL_SAI_TFR0: 813 case FSL_SAI_TFR1: 814 case FSL_SAI_TFR2: 815 case FSL_SAI_TFR3: 816 case FSL_SAI_TFR4: 817 case FSL_SAI_TFR5: 818 case FSL_SAI_TFR6: 819 case FSL_SAI_TFR7: 820 case FSL_SAI_RFR0: 821 case FSL_SAI_RFR1: 822 case FSL_SAI_RFR2: 823 case FSL_SAI_RFR3: 824 case FSL_SAI_RFR4: 825 case FSL_SAI_RFR5: 826 case FSL_SAI_RFR6: 827 case FSL_SAI_RFR7: 828 case FSL_SAI_RDR0: 829 case FSL_SAI_RDR1: 830 case FSL_SAI_RDR2: 831 case FSL_SAI_RDR3: 832 case FSL_SAI_RDR4: 833 case FSL_SAI_RDR5: 834 case FSL_SAI_RDR6: 835 case FSL_SAI_RDR7: 836 return true; 837 default: 838 return false; 839 } 840 } 841 842 static bool fsl_sai_writeable_reg(struct device *dev, unsigned int reg) 843 { 844 struct fsl_sai *sai = dev_get_drvdata(dev); 845 unsigned int ofs = sai->soc_data->reg_offset; 846 847 if (reg >= FSL_SAI_TCSR(ofs) && reg <= FSL_SAI_TCR5(ofs)) 848 return true; 849 850 if (reg >= FSL_SAI_RCSR(ofs) && reg <= FSL_SAI_RCR5(ofs)) 851 return true; 852 853 switch (reg) { 854 case FSL_SAI_TDR0: 855 case FSL_SAI_TDR1: 856 case FSL_SAI_TDR2: 857 case FSL_SAI_TDR3: 858 case FSL_SAI_TDR4: 859 case FSL_SAI_TDR5: 860 case FSL_SAI_TDR6: 861 case FSL_SAI_TDR7: 862 case FSL_SAI_TMR: 863 case FSL_SAI_RMR: 864 return true; 865 default: 866 return false; 867 } 868 } 869 870 static struct regmap_config fsl_sai_regmap_config = { 871 .reg_bits = 32, 872 .reg_stride = 4, 873 .val_bits = 32, 874 .fast_io = true, 875 876 .max_register = FSL_SAI_RMR, 877 .reg_defaults = fsl_sai_reg_defaults_ofs0, 878 .num_reg_defaults = ARRAY_SIZE(fsl_sai_reg_defaults_ofs0), 879 .readable_reg = fsl_sai_readable_reg, 880 .volatile_reg = fsl_sai_volatile_reg, 881 .writeable_reg = fsl_sai_writeable_reg, 882 .cache_type = REGCACHE_FLAT, 883 }; 884 885 static int fsl_sai_probe(struct platform_device *pdev) 886 { 887 struct device_node *np = pdev->dev.of_node; 888 struct fsl_sai *sai; 889 struct regmap *gpr; 890 struct resource *res; 891 void __iomem *base; 892 char tmp[8]; 893 int irq, ret, i; 894 int index; 895 896 sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL); 897 if (!sai) 898 return -ENOMEM; 899 900 sai->pdev = pdev; 901 sai->soc_data = of_device_get_match_data(&pdev->dev); 902 903 sai->is_lsb_first = of_property_read_bool(np, "lsb-first"); 904 905 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 906 base = devm_ioremap_resource(&pdev->dev, res); 907 if (IS_ERR(base)) 908 return PTR_ERR(base); 909 910 if (sai->soc_data->reg_offset == 8) { 911 fsl_sai_regmap_config.reg_defaults = fsl_sai_reg_defaults_ofs8; 912 fsl_sai_regmap_config.num_reg_defaults = 913 ARRAY_SIZE(fsl_sai_reg_defaults_ofs8); 914 } 915 916 sai->regmap = devm_regmap_init_mmio_clk(&pdev->dev, 917 "bus", base, &fsl_sai_regmap_config); 918 919 /* Compatible with old DTB cases */ 920 if (IS_ERR(sai->regmap)) 921 sai->regmap = devm_regmap_init_mmio_clk(&pdev->dev, 922 "sai", base, &fsl_sai_regmap_config); 923 if (IS_ERR(sai->regmap)) { 924 dev_err(&pdev->dev, "regmap init failed\n"); 925 return PTR_ERR(sai->regmap); 926 } 927 928 /* No error out for old DTB cases but only mark the clock NULL */ 929 sai->bus_clk = devm_clk_get(&pdev->dev, "bus"); 930 if (IS_ERR(sai->bus_clk)) { 931 dev_err(&pdev->dev, "failed to get bus clock: %ld\n", 932 PTR_ERR(sai->bus_clk)); 933 sai->bus_clk = NULL; 934 } 935 936 sai->mclk_clk[0] = sai->bus_clk; 937 for (i = 1; i < FSL_SAI_MCLK_MAX; i++) { 938 sprintf(tmp, "mclk%d", i); 939 sai->mclk_clk[i] = devm_clk_get(&pdev->dev, tmp); 940 if (IS_ERR(sai->mclk_clk[i])) { 941 dev_err(&pdev->dev, "failed to get mclk%d clock: %ld\n", 942 i + 1, PTR_ERR(sai->mclk_clk[i])); 943 sai->mclk_clk[i] = NULL; 944 } 945 } 946 947 irq = platform_get_irq(pdev, 0); 948 if (irq < 0) 949 return irq; 950 951 ret = devm_request_irq(&pdev->dev, irq, fsl_sai_isr, 0, np->name, sai); 952 if (ret) { 953 dev_err(&pdev->dev, "failed to claim irq %u\n", irq); 954 return ret; 955 } 956 957 /* Sync Tx with Rx as default by following old DT binding */ 958 sai->synchronous[RX] = true; 959 sai->synchronous[TX] = false; 960 fsl_sai_dai.symmetric_rates = 1; 961 fsl_sai_dai.symmetric_channels = 1; 962 fsl_sai_dai.symmetric_samplebits = 1; 963 964 if (of_find_property(np, "fsl,sai-synchronous-rx", NULL) && 965 of_find_property(np, "fsl,sai-asynchronous", NULL)) { 966 /* error out if both synchronous and asynchronous are present */ 967 dev_err(&pdev->dev, "invalid binding for synchronous mode\n"); 968 return -EINVAL; 969 } 970 971 if (of_find_property(np, "fsl,sai-synchronous-rx", NULL)) { 972 /* Sync Rx with Tx */ 973 sai->synchronous[RX] = false; 974 sai->synchronous[TX] = true; 975 } else if (of_find_property(np, "fsl,sai-asynchronous", NULL)) { 976 /* Discard all settings for asynchronous mode */ 977 sai->synchronous[RX] = false; 978 sai->synchronous[TX] = false; 979 fsl_sai_dai.symmetric_rates = 0; 980 fsl_sai_dai.symmetric_channels = 0; 981 fsl_sai_dai.symmetric_samplebits = 0; 982 } 983 984 if (of_find_property(np, "fsl,sai-mclk-direction-output", NULL) && 985 of_device_is_compatible(np, "fsl,imx6ul-sai")) { 986 gpr = syscon_regmap_lookup_by_compatible("fsl,imx6ul-iomuxc-gpr"); 987 if (IS_ERR(gpr)) { 988 dev_err(&pdev->dev, "cannot find iomuxc registers\n"); 989 return PTR_ERR(gpr); 990 } 991 992 index = of_alias_get_id(np, "sai"); 993 if (index < 0) 994 return index; 995 996 regmap_update_bits(gpr, IOMUXC_GPR1, MCLK_DIR(index), 997 MCLK_DIR(index)); 998 } 999 1000 sai->dma_params_rx.addr = res->start + FSL_SAI_RDR0; 1001 sai->dma_params_tx.addr = res->start + FSL_SAI_TDR0; 1002 sai->dma_params_rx.maxburst = FSL_SAI_MAXBURST_RX; 1003 sai->dma_params_tx.maxburst = FSL_SAI_MAXBURST_TX; 1004 1005 platform_set_drvdata(pdev, sai); 1006 1007 pm_runtime_enable(&pdev->dev); 1008 1009 ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, 1010 &fsl_sai_dai, 1); 1011 if (ret) 1012 return ret; 1013 1014 if (sai->soc_data->use_imx_pcm) 1015 return imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE); 1016 else 1017 return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); 1018 } 1019 1020 static int fsl_sai_remove(struct platform_device *pdev) 1021 { 1022 pm_runtime_disable(&pdev->dev); 1023 1024 return 0; 1025 } 1026 1027 static const struct fsl_sai_soc_data fsl_sai_vf610_data = { 1028 .use_imx_pcm = false, 1029 .fifo_depth = 32, 1030 .reg_offset = 0, 1031 }; 1032 1033 static const struct fsl_sai_soc_data fsl_sai_imx6sx_data = { 1034 .use_imx_pcm = true, 1035 .fifo_depth = 32, 1036 .reg_offset = 0, 1037 }; 1038 1039 static const struct fsl_sai_soc_data fsl_sai_imx7ulp_data = { 1040 .use_imx_pcm = true, 1041 .fifo_depth = 16, 1042 .reg_offset = 8, 1043 }; 1044 1045 static const struct fsl_sai_soc_data fsl_sai_imx8mq_data = { 1046 .use_imx_pcm = true, 1047 .fifo_depth = 128, 1048 .reg_offset = 8, 1049 }; 1050 1051 static const struct fsl_sai_soc_data fsl_sai_imx8qm_data = { 1052 .use_imx_pcm = true, 1053 .fifo_depth = 64, 1054 .reg_offset = 0, 1055 }; 1056 1057 static const struct of_device_id fsl_sai_ids[] = { 1058 { .compatible = "fsl,vf610-sai", .data = &fsl_sai_vf610_data }, 1059 { .compatible = "fsl,imx6sx-sai", .data = &fsl_sai_imx6sx_data }, 1060 { .compatible = "fsl,imx6ul-sai", .data = &fsl_sai_imx6sx_data }, 1061 { .compatible = "fsl,imx7ulp-sai", .data = &fsl_sai_imx7ulp_data }, 1062 { .compatible = "fsl,imx8mq-sai", .data = &fsl_sai_imx8mq_data }, 1063 { .compatible = "fsl,imx8qm-sai", .data = &fsl_sai_imx8qm_data }, 1064 { /* sentinel */ } 1065 }; 1066 MODULE_DEVICE_TABLE(of, fsl_sai_ids); 1067 1068 #ifdef CONFIG_PM 1069 static int fsl_sai_runtime_suspend(struct device *dev) 1070 { 1071 struct fsl_sai *sai = dev_get_drvdata(dev); 1072 1073 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_CAPTURE)) 1074 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[0]]); 1075 1076 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_PLAYBACK)) 1077 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[1]]); 1078 1079 clk_disable_unprepare(sai->bus_clk); 1080 1081 regcache_cache_only(sai->regmap, true); 1082 regcache_mark_dirty(sai->regmap); 1083 1084 return 0; 1085 } 1086 1087 static int fsl_sai_runtime_resume(struct device *dev) 1088 { 1089 struct fsl_sai *sai = dev_get_drvdata(dev); 1090 unsigned int ofs = sai->soc_data->reg_offset; 1091 int ret; 1092 1093 ret = clk_prepare_enable(sai->bus_clk); 1094 if (ret) { 1095 dev_err(dev, "failed to enable bus clock: %d\n", ret); 1096 return ret; 1097 } 1098 1099 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_PLAYBACK)) { 1100 ret = clk_prepare_enable(sai->mclk_clk[sai->mclk_id[1]]); 1101 if (ret) 1102 goto disable_bus_clk; 1103 } 1104 1105 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_CAPTURE)) { 1106 ret = clk_prepare_enable(sai->mclk_clk[sai->mclk_id[0]]); 1107 if (ret) 1108 goto disable_tx_clk; 1109 } 1110 1111 regcache_cache_only(sai->regmap, false); 1112 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR); 1113 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR); 1114 usleep_range(1000, 2000); 1115 regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0); 1116 regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0); 1117 1118 ret = regcache_sync(sai->regmap); 1119 if (ret) 1120 goto disable_rx_clk; 1121 1122 return 0; 1123 1124 disable_rx_clk: 1125 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_CAPTURE)) 1126 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[0]]); 1127 disable_tx_clk: 1128 if (sai->mclk_streams & BIT(SNDRV_PCM_STREAM_PLAYBACK)) 1129 clk_disable_unprepare(sai->mclk_clk[sai->mclk_id[1]]); 1130 disable_bus_clk: 1131 clk_disable_unprepare(sai->bus_clk); 1132 1133 return ret; 1134 } 1135 #endif /* CONFIG_PM */ 1136 1137 static const struct dev_pm_ops fsl_sai_pm_ops = { 1138 SET_RUNTIME_PM_OPS(fsl_sai_runtime_suspend, 1139 fsl_sai_runtime_resume, NULL) 1140 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, 1141 pm_runtime_force_resume) 1142 }; 1143 1144 static struct platform_driver fsl_sai_driver = { 1145 .probe = fsl_sai_probe, 1146 .remove = fsl_sai_remove, 1147 .driver = { 1148 .name = "fsl-sai", 1149 .pm = &fsl_sai_pm_ops, 1150 .of_match_table = fsl_sai_ids, 1151 }, 1152 }; 1153 module_platform_driver(fsl_sai_driver); 1154 1155 MODULE_DESCRIPTION("Freescale Soc SAI Interface"); 1156 MODULE_AUTHOR("Xiubo Li, <Li.Xiubo@freescale.com>"); 1157 MODULE_ALIAS("platform:fsl-sai"); 1158 MODULE_LICENSE("GPL"); 1159