atmel_ssc_dai.c (23529B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * atmel_ssc_dai.c -- ALSA SoC ATMEL SSC Audio Layer Platform driver 4 * 5 * Copyright (C) 2005 SAN People 6 * Copyright (C) 2008 Atmel 7 * 8 * Author: Sedji Gaouaou <sedji.gaouaou@atmel.com> 9 * ATMEL CORP. 10 * 11 * Based on at91-ssc.c by 12 * Frank Mandarino <fmandarino@endrelia.com> 13 * Based on pxa2xx Platform drivers by 14 * Liam Girdwood <lrg@slimlogic.co.uk> 15 */ 16 17#include <linux/init.h> 18#include <linux/module.h> 19#include <linux/interrupt.h> 20#include <linux/device.h> 21#include <linux/delay.h> 22#include <linux/clk.h> 23#include <linux/atmel_pdc.h> 24 25#include <linux/atmel-ssc.h> 26#include <sound/core.h> 27#include <sound/pcm.h> 28#include <sound/pcm_params.h> 29#include <sound/initval.h> 30#include <sound/soc.h> 31 32#include "atmel-pcm.h" 33#include "atmel_ssc_dai.h" 34 35 36#define NUM_SSC_DEVICES 3 37 38/* 39 * SSC PDC registers required by the PCM DMA engine. 40 */ 41static struct atmel_pdc_regs pdc_tx_reg = { 42 .xpr = ATMEL_PDC_TPR, 43 .xcr = ATMEL_PDC_TCR, 44 .xnpr = ATMEL_PDC_TNPR, 45 .xncr = ATMEL_PDC_TNCR, 46}; 47 48static struct atmel_pdc_regs pdc_rx_reg = { 49 .xpr = ATMEL_PDC_RPR, 50 .xcr = ATMEL_PDC_RCR, 51 .xnpr = ATMEL_PDC_RNPR, 52 .xncr = ATMEL_PDC_RNCR, 53}; 54 55/* 56 * SSC & PDC status bits for transmit and receive. 57 */ 58static struct atmel_ssc_mask ssc_tx_mask = { 59 .ssc_enable = SSC_BIT(CR_TXEN), 60 .ssc_disable = SSC_BIT(CR_TXDIS), 61 .ssc_endx = SSC_BIT(SR_ENDTX), 62 .ssc_endbuf = SSC_BIT(SR_TXBUFE), 63 .ssc_error = SSC_BIT(SR_OVRUN), 64 .pdc_enable = ATMEL_PDC_TXTEN, 65 .pdc_disable = ATMEL_PDC_TXTDIS, 66}; 67 68static struct atmel_ssc_mask ssc_rx_mask = { 69 .ssc_enable = SSC_BIT(CR_RXEN), 70 .ssc_disable = SSC_BIT(CR_RXDIS), 71 .ssc_endx = SSC_BIT(SR_ENDRX), 72 .ssc_endbuf = SSC_BIT(SR_RXBUFF), 73 .ssc_error = SSC_BIT(SR_OVRUN), 74 .pdc_enable = ATMEL_PDC_RXTEN, 75 .pdc_disable = ATMEL_PDC_RXTDIS, 76}; 77 78 79/* 80 * DMA parameters. 81 */ 82static struct atmel_pcm_dma_params ssc_dma_params[NUM_SSC_DEVICES][2] = { 83 {{ 84 .name = "SSC0 PCM out", 85 .pdc = &pdc_tx_reg, 86 .mask = &ssc_tx_mask, 87 }, 88 { 89 .name = "SSC0 PCM in", 90 .pdc = &pdc_rx_reg, 91 .mask = &ssc_rx_mask, 92 } }, 93 {{ 94 .name = "SSC1 PCM out", 95 .pdc = &pdc_tx_reg, 96 .mask = &ssc_tx_mask, 97 }, 98 { 99 .name = "SSC1 PCM in", 100 .pdc = &pdc_rx_reg, 101 .mask = &ssc_rx_mask, 102 } }, 103 {{ 104 .name = "SSC2 PCM out", 105 .pdc = &pdc_tx_reg, 106 .mask = &ssc_tx_mask, 107 }, 108 { 109 .name = "SSC2 PCM in", 110 .pdc = &pdc_rx_reg, 111 .mask = &ssc_rx_mask, 112 } }, 113}; 114 115 116static struct atmel_ssc_info ssc_info[NUM_SSC_DEVICES] = { 117 { 118 .name = "ssc0", 119 .dir_mask = SSC_DIR_MASK_UNUSED, 120 .initialized = 0, 121 }, 122 { 123 .name = "ssc1", 124 .dir_mask = SSC_DIR_MASK_UNUSED, 125 .initialized = 0, 126 }, 127 { 128 .name = "ssc2", 129 .dir_mask = SSC_DIR_MASK_UNUSED, 130 .initialized = 0, 131 }, 132}; 133 134 135/* 136 * SSC interrupt handler. Passes PDC interrupts to the DMA 137 * interrupt handler in the PCM driver. 138 */ 139static irqreturn_t atmel_ssc_interrupt(int irq, void *dev_id) 140{ 141 struct atmel_ssc_info *ssc_p = dev_id; 142 struct atmel_pcm_dma_params *dma_params; 143 u32 ssc_sr; 144 u32 ssc_substream_mask; 145 int i; 146 147 ssc_sr = (unsigned long)ssc_readl(ssc_p->ssc->regs, SR) 148 & (unsigned long)ssc_readl(ssc_p->ssc->regs, IMR); 149 150 /* 151 * Loop through the substreams attached to this SSC. If 152 * a DMA-related interrupt occurred on that substream, call 153 * the DMA interrupt handler function, if one has been 154 * registered in the dma_params structure by the PCM driver. 155 */ 156 for (i = 0; i < ARRAY_SIZE(ssc_p->dma_params); i++) { 157 dma_params = ssc_p->dma_params[i]; 158 159 if ((dma_params != NULL) && 160 (dma_params->dma_intr_handler != NULL)) { 161 ssc_substream_mask = (dma_params->mask->ssc_endx | 162 dma_params->mask->ssc_endbuf); 163 if (ssc_sr & ssc_substream_mask) { 164 dma_params->dma_intr_handler(ssc_sr, 165 dma_params-> 166 substream); 167 } 168 } 169 } 170 171 return IRQ_HANDLED; 172} 173 174/* 175 * When the bit clock is input, limit the maximum rate according to the 176 * Serial Clock Ratio Considerations section from the SSC documentation: 177 * 178 * The Transmitter and the Receiver can be programmed to operate 179 * with the clock signals provided on either the TK or RK pins. 180 * This allows the SSC to support many slave-mode data transfers. 181 * In this case, the maximum clock speed allowed on the RK pin is: 182 * - Peripheral clock divided by 2 if Receiver Frame Synchro is input 183 * - Peripheral clock divided by 3 if Receiver Frame Synchro is output 184 * In addition, the maximum clock speed allowed on the TK pin is: 185 * - Peripheral clock divided by 6 if Transmit Frame Synchro is input 186 * - Peripheral clock divided by 2 if Transmit Frame Synchro is output 187 * 188 * When the bit clock is output, limit the rate according to the 189 * SSC divider restrictions. 190 */ 191static int atmel_ssc_hw_rule_rate(struct snd_pcm_hw_params *params, 192 struct snd_pcm_hw_rule *rule) 193{ 194 struct atmel_ssc_info *ssc_p = rule->private; 195 struct ssc_device *ssc = ssc_p->ssc; 196 struct snd_interval *i = hw_param_interval(params, rule->var); 197 struct snd_interval t; 198 struct snd_ratnum r = { 199 .den_min = 1, 200 .den_max = 4095, 201 .den_step = 1, 202 }; 203 unsigned int num = 0, den = 0; 204 int frame_size; 205 int mck_div = 2; 206 int ret; 207 208 frame_size = snd_soc_params_to_frame_size(params); 209 if (frame_size < 0) 210 return frame_size; 211 212 switch (ssc_p->daifmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 213 case SND_SOC_DAIFMT_CBP_CFC: 214 if ((ssc_p->dir_mask & SSC_DIR_MASK_CAPTURE) 215 && ssc->clk_from_rk_pin) 216 /* Receiver Frame Synchro (i.e. capture) 217 * is output (format is _CFS) and the RK pin 218 * is used for input (format is _CBM_). 219 */ 220 mck_div = 3; 221 break; 222 223 case SND_SOC_DAIFMT_CBP_CFP: 224 if ((ssc_p->dir_mask & SSC_DIR_MASK_PLAYBACK) 225 && !ssc->clk_from_rk_pin) 226 /* Transmit Frame Synchro (i.e. playback) 227 * is input (format is _CFM) and the TK pin 228 * is used for input (format _CBM_ but not 229 * using the RK pin). 230 */ 231 mck_div = 6; 232 break; 233 } 234 235 switch (ssc_p->daifmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 236 case SND_SOC_DAIFMT_CBC_CFC: 237 r.num = ssc_p->mck_rate / mck_div / frame_size; 238 239 ret = snd_interval_ratnum(i, 1, &r, &num, &den); 240 if (ret >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) { 241 params->rate_num = num; 242 params->rate_den = den; 243 } 244 break; 245 246 case SND_SOC_DAIFMT_CBP_CFC: 247 case SND_SOC_DAIFMT_CBP_CFP: 248 t.min = 8000; 249 t.max = ssc_p->mck_rate / mck_div / frame_size; 250 t.openmin = t.openmax = 0; 251 t.integer = 0; 252 ret = snd_interval_refine(i, &t); 253 break; 254 255 default: 256 ret = -EINVAL; 257 break; 258 } 259 260 return ret; 261} 262 263/*-------------------------------------------------------------------------*\ 264 * DAI functions 265\*-------------------------------------------------------------------------*/ 266/* 267 * Startup. Only that one substream allowed in each direction. 268 */ 269static int atmel_ssc_startup(struct snd_pcm_substream *substream, 270 struct snd_soc_dai *dai) 271{ 272 struct platform_device *pdev = to_platform_device(dai->dev); 273 struct atmel_ssc_info *ssc_p = &ssc_info[pdev->id]; 274 struct atmel_pcm_dma_params *dma_params; 275 int dir, dir_mask; 276 int ret; 277 278 pr_debug("atmel_ssc_startup: SSC_SR=0x%x\n", 279 ssc_readl(ssc_p->ssc->regs, SR)); 280 281 /* Enable PMC peripheral clock for this SSC */ 282 pr_debug("atmel_ssc_dai: Starting clock\n"); 283 ret = clk_enable(ssc_p->ssc->clk); 284 if (ret) 285 return ret; 286 287 ssc_p->mck_rate = clk_get_rate(ssc_p->ssc->clk); 288 289 /* Reset the SSC unless initialized to keep it in a clean state */ 290 if (!ssc_p->initialized) 291 ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_SWRST)); 292 293 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 294 dir = 0; 295 dir_mask = SSC_DIR_MASK_PLAYBACK; 296 } else { 297 dir = 1; 298 dir_mask = SSC_DIR_MASK_CAPTURE; 299 } 300 301 ret = snd_pcm_hw_rule_add(substream->runtime, 0, 302 SNDRV_PCM_HW_PARAM_RATE, 303 atmel_ssc_hw_rule_rate, 304 ssc_p, 305 SNDRV_PCM_HW_PARAM_FRAME_BITS, 306 SNDRV_PCM_HW_PARAM_CHANNELS, -1); 307 if (ret < 0) { 308 dev_err(dai->dev, "Failed to specify rate rule: %d\n", ret); 309 return ret; 310 } 311 312 dma_params = &ssc_dma_params[pdev->id][dir]; 313 dma_params->ssc = ssc_p->ssc; 314 dma_params->substream = substream; 315 316 ssc_p->dma_params[dir] = dma_params; 317 318 snd_soc_dai_set_dma_data(dai, substream, dma_params); 319 320 if (ssc_p->dir_mask & dir_mask) 321 return -EBUSY; 322 323 ssc_p->dir_mask |= dir_mask; 324 325 return 0; 326} 327 328/* 329 * Shutdown. Clear DMA parameters and shutdown the SSC if there 330 * are no other substreams open. 331 */ 332static void atmel_ssc_shutdown(struct snd_pcm_substream *substream, 333 struct snd_soc_dai *dai) 334{ 335 struct platform_device *pdev = to_platform_device(dai->dev); 336 struct atmel_ssc_info *ssc_p = &ssc_info[pdev->id]; 337 struct atmel_pcm_dma_params *dma_params; 338 int dir, dir_mask; 339 340 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 341 dir = 0; 342 else 343 dir = 1; 344 345 dma_params = ssc_p->dma_params[dir]; 346 347 if (dma_params != NULL) { 348 dma_params->ssc = NULL; 349 dma_params->substream = NULL; 350 ssc_p->dma_params[dir] = NULL; 351 } 352 353 dir_mask = 1 << dir; 354 355 ssc_p->dir_mask &= ~dir_mask; 356 if (!ssc_p->dir_mask) { 357 if (ssc_p->initialized) { 358 free_irq(ssc_p->ssc->irq, ssc_p); 359 ssc_p->initialized = 0; 360 } 361 362 /* Reset the SSC */ 363 ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_SWRST)); 364 /* Clear the SSC dividers */ 365 ssc_p->cmr_div = ssc_p->tcmr_period = ssc_p->rcmr_period = 0; 366 ssc_p->forced_divider = 0; 367 } 368 369 /* Shutdown the SSC clock. */ 370 pr_debug("atmel_ssc_dai: Stopping clock\n"); 371 clk_disable(ssc_p->ssc->clk); 372} 373 374 375/* 376 * Record the DAI format for use in hw_params(). 377 */ 378static int atmel_ssc_set_dai_fmt(struct snd_soc_dai *cpu_dai, 379 unsigned int fmt) 380{ 381 struct platform_device *pdev = to_platform_device(cpu_dai->dev); 382 struct atmel_ssc_info *ssc_p = &ssc_info[pdev->id]; 383 384 ssc_p->daifmt = fmt; 385 return 0; 386} 387 388/* 389 * Record SSC clock dividers for use in hw_params(). 390 */ 391static int atmel_ssc_set_dai_clkdiv(struct snd_soc_dai *cpu_dai, 392 int div_id, int div) 393{ 394 struct platform_device *pdev = to_platform_device(cpu_dai->dev); 395 struct atmel_ssc_info *ssc_p = &ssc_info[pdev->id]; 396 397 switch (div_id) { 398 case ATMEL_SSC_CMR_DIV: 399 /* 400 * The same master clock divider is used for both 401 * transmit and receive, so if a value has already 402 * been set, it must match this value. 403 */ 404 if (ssc_p->dir_mask != 405 (SSC_DIR_MASK_PLAYBACK | SSC_DIR_MASK_CAPTURE)) 406 ssc_p->cmr_div = div; 407 else if (ssc_p->cmr_div == 0) 408 ssc_p->cmr_div = div; 409 else 410 if (div != ssc_p->cmr_div) 411 return -EBUSY; 412 ssc_p->forced_divider |= BIT(ATMEL_SSC_CMR_DIV); 413 break; 414 415 case ATMEL_SSC_TCMR_PERIOD: 416 ssc_p->tcmr_period = div; 417 ssc_p->forced_divider |= BIT(ATMEL_SSC_TCMR_PERIOD); 418 break; 419 420 case ATMEL_SSC_RCMR_PERIOD: 421 ssc_p->rcmr_period = div; 422 ssc_p->forced_divider |= BIT(ATMEL_SSC_RCMR_PERIOD); 423 break; 424 425 default: 426 return -EINVAL; 427 } 428 429 return 0; 430} 431 432/* Is the cpu-dai master of the frame clock? */ 433static int atmel_ssc_cfs(struct atmel_ssc_info *ssc_p) 434{ 435 switch (ssc_p->daifmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 436 case SND_SOC_DAIFMT_CBP_CFC: 437 case SND_SOC_DAIFMT_CBC_CFC: 438 return 1; 439 } 440 return 0; 441} 442 443/* Is the cpu-dai master of the bit clock? */ 444static int atmel_ssc_cbs(struct atmel_ssc_info *ssc_p) 445{ 446 switch (ssc_p->daifmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 447 case SND_SOC_DAIFMT_CBC_CFP: 448 case SND_SOC_DAIFMT_CBC_CFC: 449 return 1; 450 } 451 return 0; 452} 453 454/* 455 * Configure the SSC. 456 */ 457static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, 458 struct snd_pcm_hw_params *params, 459 struct snd_soc_dai *dai) 460{ 461 struct platform_device *pdev = to_platform_device(dai->dev); 462 int id = pdev->id; 463 struct atmel_ssc_info *ssc_p = &ssc_info[id]; 464 struct ssc_device *ssc = ssc_p->ssc; 465 struct atmel_pcm_dma_params *dma_params; 466 int dir, channels, bits; 467 u32 tfmr, rfmr, tcmr, rcmr; 468 int ret; 469 int fslen, fslen_ext, fs_osync, fs_edge; 470 u32 cmr_div; 471 u32 tcmr_period; 472 u32 rcmr_period; 473 474 /* 475 * Currently, there is only one set of dma params for 476 * each direction. If more are added, this code will 477 * have to be changed to select the proper set. 478 */ 479 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 480 dir = 0; 481 else 482 dir = 1; 483 484 /* 485 * If the cpu dai should provide BCLK, but noone has provided the 486 * divider needed for that to work, fall back to something sensible. 487 */ 488 cmr_div = ssc_p->cmr_div; 489 if (!(ssc_p->forced_divider & BIT(ATMEL_SSC_CMR_DIV)) && 490 atmel_ssc_cbs(ssc_p)) { 491 int bclk_rate = snd_soc_params_to_bclk(params); 492 493 if (bclk_rate < 0) { 494 dev_err(dai->dev, "unable to calculate cmr_div: %d\n", 495 bclk_rate); 496 return bclk_rate; 497 } 498 499 cmr_div = DIV_ROUND_CLOSEST(ssc_p->mck_rate, 2 * bclk_rate); 500 } 501 502 /* 503 * If the cpu dai should provide LRCLK, but noone has provided the 504 * dividers needed for that to work, fall back to something sensible. 505 */ 506 tcmr_period = ssc_p->tcmr_period; 507 rcmr_period = ssc_p->rcmr_period; 508 if (atmel_ssc_cfs(ssc_p)) { 509 int frame_size = snd_soc_params_to_frame_size(params); 510 511 if (frame_size < 0) { 512 dev_err(dai->dev, 513 "unable to calculate tx/rx cmr_period: %d\n", 514 frame_size); 515 return frame_size; 516 } 517 518 if (!(ssc_p->forced_divider & BIT(ATMEL_SSC_TCMR_PERIOD))) 519 tcmr_period = frame_size / 2 - 1; 520 if (!(ssc_p->forced_divider & BIT(ATMEL_SSC_RCMR_PERIOD))) 521 rcmr_period = frame_size / 2 - 1; 522 } 523 524 dma_params = ssc_p->dma_params[dir]; 525 526 channels = params_channels(params); 527 528 /* 529 * Determine sample size in bits and the PDC increment. 530 */ 531 switch (params_format(params)) { 532 case SNDRV_PCM_FORMAT_S8: 533 bits = 8; 534 dma_params->pdc_xfer_size = 1; 535 break; 536 case SNDRV_PCM_FORMAT_S16_LE: 537 bits = 16; 538 dma_params->pdc_xfer_size = 2; 539 break; 540 case SNDRV_PCM_FORMAT_S24_LE: 541 bits = 24; 542 dma_params->pdc_xfer_size = 4; 543 break; 544 case SNDRV_PCM_FORMAT_S32_LE: 545 bits = 32; 546 dma_params->pdc_xfer_size = 4; 547 break; 548 default: 549 printk(KERN_WARNING "atmel_ssc_dai: unsupported PCM format"); 550 return -EINVAL; 551 } 552 553 /* 554 * Compute SSC register settings. 555 */ 556 557 fslen_ext = (bits - 1) / 16; 558 fslen = (bits - 1) % 16; 559 560 switch (ssc_p->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) { 561 562 case SND_SOC_DAIFMT_LEFT_J: 563 fs_osync = SSC_FSOS_POSITIVE; 564 fs_edge = SSC_START_RISING_RF; 565 566 rcmr = SSC_BF(RCMR_STTDLY, 0); 567 tcmr = SSC_BF(TCMR_STTDLY, 0); 568 569 break; 570 571 case SND_SOC_DAIFMT_I2S: 572 fs_osync = SSC_FSOS_NEGATIVE; 573 fs_edge = SSC_START_FALLING_RF; 574 575 rcmr = SSC_BF(RCMR_STTDLY, 1); 576 tcmr = SSC_BF(TCMR_STTDLY, 1); 577 578 break; 579 580 case SND_SOC_DAIFMT_DSP_A: 581 /* 582 * DSP/PCM Mode A format 583 * 584 * Data is transferred on first BCLK after LRC pulse rising 585 * edge.If stereo, the right channel data is contiguous with 586 * the left channel data. 587 */ 588 fs_osync = SSC_FSOS_POSITIVE; 589 fs_edge = SSC_START_RISING_RF; 590 fslen = fslen_ext = 0; 591 592 rcmr = SSC_BF(RCMR_STTDLY, 1); 593 tcmr = SSC_BF(TCMR_STTDLY, 1); 594 595 break; 596 597 default: 598 printk(KERN_WARNING "atmel_ssc_dai: unsupported DAI format 0x%x\n", 599 ssc_p->daifmt); 600 return -EINVAL; 601 } 602 603 if (!atmel_ssc_cfs(ssc_p)) { 604 fslen = fslen_ext = 0; 605 rcmr_period = tcmr_period = 0; 606 fs_osync = SSC_FSOS_NONE; 607 } 608 609 rcmr |= SSC_BF(RCMR_START, fs_edge); 610 tcmr |= SSC_BF(TCMR_START, fs_edge); 611 612 if (atmel_ssc_cbs(ssc_p)) { 613 /* 614 * SSC provides BCLK 615 * 616 * The SSC transmit and receive clocks are generated from the 617 * MCK divider, and the BCLK signal is output 618 * on the SSC TK line. 619 */ 620 rcmr |= SSC_BF(RCMR_CKS, SSC_CKS_DIV) 621 | SSC_BF(RCMR_CKO, SSC_CKO_NONE); 622 623 tcmr |= SSC_BF(TCMR_CKS, SSC_CKS_DIV) 624 | SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS); 625 } else { 626 rcmr |= SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? 627 SSC_CKS_PIN : SSC_CKS_CLOCK) 628 | SSC_BF(RCMR_CKO, SSC_CKO_NONE); 629 630 tcmr |= SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ? 631 SSC_CKS_CLOCK : SSC_CKS_PIN) 632 | SSC_BF(TCMR_CKO, SSC_CKO_NONE); 633 } 634 635 rcmr |= SSC_BF(RCMR_PERIOD, rcmr_period) 636 | SSC_BF(RCMR_CKI, SSC_CKI_RISING); 637 638 tcmr |= SSC_BF(TCMR_PERIOD, tcmr_period) 639 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING); 640 641 rfmr = SSC_BF(RFMR_FSLEN_EXT, fslen_ext) 642 | SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) 643 | SSC_BF(RFMR_FSOS, fs_osync) 644 | SSC_BF(RFMR_FSLEN, fslen) 645 | SSC_BF(RFMR_DATNB, (channels - 1)) 646 | SSC_BIT(RFMR_MSBF) 647 | SSC_BF(RFMR_LOOP, 0) 648 | SSC_BF(RFMR_DATLEN, (bits - 1)); 649 650 tfmr = SSC_BF(TFMR_FSLEN_EXT, fslen_ext) 651 | SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE) 652 | SSC_BF(TFMR_FSDEN, 0) 653 | SSC_BF(TFMR_FSOS, fs_osync) 654 | SSC_BF(TFMR_FSLEN, fslen) 655 | SSC_BF(TFMR_DATNB, (channels - 1)) 656 | SSC_BIT(TFMR_MSBF) 657 | SSC_BF(TFMR_DATDEF, 0) 658 | SSC_BF(TFMR_DATLEN, (bits - 1)); 659 660 if (fslen_ext && !ssc->pdata->has_fslen_ext) { 661 dev_err(dai->dev, "sample size %d is too large for SSC device\n", 662 bits); 663 return -EINVAL; 664 } 665 666 pr_debug("atmel_ssc_hw_params: " 667 "RCMR=%08x RFMR=%08x TCMR=%08x TFMR=%08x\n", 668 rcmr, rfmr, tcmr, tfmr); 669 670 if (!ssc_p->initialized) { 671 if (!ssc_p->ssc->pdata->use_dma) { 672 ssc_writel(ssc_p->ssc->regs, PDC_RPR, 0); 673 ssc_writel(ssc_p->ssc->regs, PDC_RCR, 0); 674 ssc_writel(ssc_p->ssc->regs, PDC_RNPR, 0); 675 ssc_writel(ssc_p->ssc->regs, PDC_RNCR, 0); 676 677 ssc_writel(ssc_p->ssc->regs, PDC_TPR, 0); 678 ssc_writel(ssc_p->ssc->regs, PDC_TCR, 0); 679 ssc_writel(ssc_p->ssc->regs, PDC_TNPR, 0); 680 ssc_writel(ssc_p->ssc->regs, PDC_TNCR, 0); 681 } 682 683 ret = request_irq(ssc_p->ssc->irq, atmel_ssc_interrupt, 0, 684 ssc_p->name, ssc_p); 685 if (ret < 0) { 686 printk(KERN_WARNING 687 "atmel_ssc_dai: request_irq failure\n"); 688 pr_debug("Atmel_ssc_dai: Stopping clock\n"); 689 clk_disable(ssc_p->ssc->clk); 690 return ret; 691 } 692 693 ssc_p->initialized = 1; 694 } 695 696 /* set SSC clock mode register */ 697 ssc_writel(ssc_p->ssc->regs, CMR, cmr_div); 698 699 /* set receive clock mode and format */ 700 ssc_writel(ssc_p->ssc->regs, RCMR, rcmr); 701 ssc_writel(ssc_p->ssc->regs, RFMR, rfmr); 702 703 /* set transmit clock mode and format */ 704 ssc_writel(ssc_p->ssc->regs, TCMR, tcmr); 705 ssc_writel(ssc_p->ssc->regs, TFMR, tfmr); 706 707 pr_debug("atmel_ssc_dai,hw_params: SSC initialized\n"); 708 return 0; 709} 710 711 712static int atmel_ssc_prepare(struct snd_pcm_substream *substream, 713 struct snd_soc_dai *dai) 714{ 715 struct platform_device *pdev = to_platform_device(dai->dev); 716 struct atmel_ssc_info *ssc_p = &ssc_info[pdev->id]; 717 struct atmel_pcm_dma_params *dma_params; 718 int dir; 719 720 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 721 dir = 0; 722 else 723 dir = 1; 724 725 dma_params = ssc_p->dma_params[dir]; 726 727 ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable); 728 ssc_writel(ssc_p->ssc->regs, IDR, dma_params->mask->ssc_error); 729 730 pr_debug("%s enabled SSC_SR=0x%08x\n", 731 dir ? "receive" : "transmit", 732 ssc_readl(ssc_p->ssc->regs, SR)); 733 return 0; 734} 735 736static int atmel_ssc_trigger(struct snd_pcm_substream *substream, 737 int cmd, struct snd_soc_dai *dai) 738{ 739 struct platform_device *pdev = to_platform_device(dai->dev); 740 struct atmel_ssc_info *ssc_p = &ssc_info[pdev->id]; 741 struct atmel_pcm_dma_params *dma_params; 742 int dir; 743 744 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 745 dir = 0; 746 else 747 dir = 1; 748 749 dma_params = ssc_p->dma_params[dir]; 750 751 switch (cmd) { 752 case SNDRV_PCM_TRIGGER_START: 753 case SNDRV_PCM_TRIGGER_RESUME: 754 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 755 ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable); 756 break; 757 default: 758 ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable); 759 break; 760 } 761 762 return 0; 763} 764 765#ifdef CONFIG_PM 766static int atmel_ssc_suspend(struct snd_soc_component *component) 767{ 768 struct atmel_ssc_info *ssc_p; 769 struct platform_device *pdev = to_platform_device(component->dev); 770 771 if (!snd_soc_component_active(component)) 772 return 0; 773 774 ssc_p = &ssc_info[pdev->id]; 775 776 /* Save the status register before disabling transmit and receive */ 777 ssc_p->ssc_state.ssc_sr = ssc_readl(ssc_p->ssc->regs, SR); 778 ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_TXDIS) | SSC_BIT(CR_RXDIS)); 779 780 /* Save the current interrupt mask, then disable unmasked interrupts */ 781 ssc_p->ssc_state.ssc_imr = ssc_readl(ssc_p->ssc->regs, IMR); 782 ssc_writel(ssc_p->ssc->regs, IDR, ssc_p->ssc_state.ssc_imr); 783 784 ssc_p->ssc_state.ssc_cmr = ssc_readl(ssc_p->ssc->regs, CMR); 785 ssc_p->ssc_state.ssc_rcmr = ssc_readl(ssc_p->ssc->regs, RCMR); 786 ssc_p->ssc_state.ssc_rfmr = ssc_readl(ssc_p->ssc->regs, RFMR); 787 ssc_p->ssc_state.ssc_tcmr = ssc_readl(ssc_p->ssc->regs, TCMR); 788 ssc_p->ssc_state.ssc_tfmr = ssc_readl(ssc_p->ssc->regs, TFMR); 789 790 return 0; 791} 792 793static int atmel_ssc_resume(struct snd_soc_component *component) 794{ 795 struct atmel_ssc_info *ssc_p; 796 struct platform_device *pdev = to_platform_device(component->dev); 797 u32 cr; 798 799 if (!snd_soc_component_active(component)) 800 return 0; 801 802 ssc_p = &ssc_info[pdev->id]; 803 804 /* restore SSC register settings */ 805 ssc_writel(ssc_p->ssc->regs, TFMR, ssc_p->ssc_state.ssc_tfmr); 806 ssc_writel(ssc_p->ssc->regs, TCMR, ssc_p->ssc_state.ssc_tcmr); 807 ssc_writel(ssc_p->ssc->regs, RFMR, ssc_p->ssc_state.ssc_rfmr); 808 ssc_writel(ssc_p->ssc->regs, RCMR, ssc_p->ssc_state.ssc_rcmr); 809 ssc_writel(ssc_p->ssc->regs, CMR, ssc_p->ssc_state.ssc_cmr); 810 811 /* re-enable interrupts */ 812 ssc_writel(ssc_p->ssc->regs, IER, ssc_p->ssc_state.ssc_imr); 813 814 /* Re-enable receive and transmit as appropriate */ 815 cr = 0; 816 cr |= 817 (ssc_p->ssc_state.ssc_sr & SSC_BIT(SR_RXEN)) ? SSC_BIT(CR_RXEN) : 0; 818 cr |= 819 (ssc_p->ssc_state.ssc_sr & SSC_BIT(SR_TXEN)) ? SSC_BIT(CR_TXEN) : 0; 820 ssc_writel(ssc_p->ssc->regs, CR, cr); 821 822 return 0; 823} 824#else /* CONFIG_PM */ 825# define atmel_ssc_suspend NULL 826# define atmel_ssc_resume NULL 827#endif /* CONFIG_PM */ 828 829#define ATMEL_SSC_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\ 830 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 831 832static const struct snd_soc_dai_ops atmel_ssc_dai_ops = { 833 .startup = atmel_ssc_startup, 834 .shutdown = atmel_ssc_shutdown, 835 .prepare = atmel_ssc_prepare, 836 .trigger = atmel_ssc_trigger, 837 .hw_params = atmel_ssc_hw_params, 838 .set_fmt = atmel_ssc_set_dai_fmt, 839 .set_clkdiv = atmel_ssc_set_dai_clkdiv, 840}; 841 842static struct snd_soc_dai_driver atmel_ssc_dai = { 843 .playback = { 844 .channels_min = 1, 845 .channels_max = 2, 846 .rates = SNDRV_PCM_RATE_CONTINUOUS, 847 .rate_min = 8000, 848 .rate_max = 384000, 849 .formats = ATMEL_SSC_FORMATS,}, 850 .capture = { 851 .channels_min = 1, 852 .channels_max = 2, 853 .rates = SNDRV_PCM_RATE_CONTINUOUS, 854 .rate_min = 8000, 855 .rate_max = 384000, 856 .formats = ATMEL_SSC_FORMATS,}, 857 .ops = &atmel_ssc_dai_ops, 858}; 859 860static const struct snd_soc_component_driver atmel_ssc_component = { 861 .name = "atmel-ssc", 862 .suspend = atmel_ssc_suspend, 863 .resume = atmel_ssc_resume, 864}; 865 866static int asoc_ssc_init(struct device *dev) 867{ 868 struct ssc_device *ssc = dev_get_drvdata(dev); 869 int ret; 870 871 ret = devm_snd_soc_register_component(dev, &atmel_ssc_component, 872 &atmel_ssc_dai, 1); 873 if (ret) { 874 dev_err(dev, "Could not register DAI: %d\n", ret); 875 return ret; 876 } 877 878 if (ssc->pdata->use_dma) 879 ret = atmel_pcm_dma_platform_register(dev); 880 else 881 ret = atmel_pcm_pdc_platform_register(dev); 882 883 if (ret) { 884 dev_err(dev, "Could not register PCM: %d\n", ret); 885 return ret; 886 } 887 888 return 0; 889} 890 891/** 892 * atmel_ssc_set_audio - Allocate the specified SSC for audio use. 893 * @ssc_id: SSD ID in [0, NUM_SSC_DEVICES[ 894 */ 895int atmel_ssc_set_audio(int ssc_id) 896{ 897 struct ssc_device *ssc; 898 int ret; 899 900 /* If we can grab the SSC briefly to parent the DAI device off it */ 901 ssc = ssc_request(ssc_id); 902 if (IS_ERR(ssc)) { 903 pr_err("Unable to parent ASoC SSC DAI on SSC: %ld\n", 904 PTR_ERR(ssc)); 905 return PTR_ERR(ssc); 906 } else { 907 ssc_info[ssc_id].ssc = ssc; 908 } 909 910 ret = asoc_ssc_init(&ssc->pdev->dev); 911 912 return ret; 913} 914EXPORT_SYMBOL_GPL(atmel_ssc_set_audio); 915 916void atmel_ssc_put_audio(int ssc_id) 917{ 918 struct ssc_device *ssc = ssc_info[ssc_id].ssc; 919 920 ssc_free(ssc); 921} 922EXPORT_SYMBOL_GPL(atmel_ssc_put_audio); 923 924/* Module information */ 925MODULE_AUTHOR("Sedji Gaouaou, sedji.gaouaou@atmel.com, www.atmel.com"); 926MODULE_DESCRIPTION("ATMEL SSC ASoC Interface"); 927MODULE_LICENSE("GPL");