1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) STMicroelectronics SA 2015 4 * Authors: Arnaud Pouliquen <arnaud.pouliquen@st.com> 5 * for STMicroelectronics. 6 */ 7 8 #include <linux/clk.h> 9 #include <linux/mfd/syscon.h> 10 11 #include <sound/asoundef.h> 12 #include <sound/soc.h> 13 14 #include "uniperif.h" 15 16 /* 17 * Some hardware-related definitions 18 */ 19 20 /* sys config registers definitions */ 21 #define SYS_CFG_AUDIO_GLUE 0xA4 22 23 /* 24 * Driver specific types. 25 */ 26 27 #define UNIPERIF_PLAYER_CLK_ADJ_MIN -999999 28 #define UNIPERIF_PLAYER_CLK_ADJ_MAX 1000000 29 #define UNIPERIF_PLAYER_I2S_OUT 1 /* player id connected to I2S/TDM TX bus */ 30 31 /* 32 * Note: snd_pcm_hardware is linked to DMA controller but is declared here to 33 * integrate DAI_CPU capability in term of rate and supported channels 34 */ 35 static const struct snd_pcm_hardware uni_player_pcm_hw = { 36 .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | 37 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP | 38 SNDRV_PCM_INFO_MMAP_VALID, 39 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE, 40 41 .rates = SNDRV_PCM_RATE_CONTINUOUS, 42 .rate_min = 8000, 43 .rate_max = 192000, 44 45 .channels_min = 2, 46 .channels_max = 8, 47 48 .periods_min = 2, 49 .periods_max = 48, 50 51 .period_bytes_min = 128, 52 .period_bytes_max = 64 * PAGE_SIZE, 53 .buffer_bytes_max = 256 * PAGE_SIZE 54 }; 55 56 /* 57 * uni_player_irq_handler 58 * In case of error audio stream is stopped; stop action is protected via PCM 59 * stream lock to avoid race condition with trigger callback. 60 */ 61 static irqreturn_t uni_player_irq_handler(int irq, void *dev_id) 62 { 63 irqreturn_t ret = IRQ_NONE; 64 struct uniperif *player = dev_id; 65 unsigned int status; 66 unsigned int tmp; 67 68 guard(spinlock)(&player->irq_lock); 69 if (!player->substream) 70 return ret; 71 72 snd_pcm_stream_lock(player->substream); 73 if (player->state == UNIPERIF_STATE_STOPPED) { 74 snd_pcm_stream_unlock(player->substream); 75 return ret; 76 } 77 78 /* Get interrupt status & clear them immediately */ 79 status = GET_UNIPERIF_ITS(player); 80 SET_UNIPERIF_ITS_BCLR(player, status); 81 82 /* Check for fifo error (underrun) */ 83 if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(player))) { 84 dev_err(player->dev, "FIFO underflow error detected\n"); 85 86 /* Interrupt is just for information when underflow recovery */ 87 if (player->underflow_enabled) { 88 /* Update state to underflow */ 89 player->state = UNIPERIF_STATE_UNDERFLOW; 90 91 } else { 92 /* Disable interrupt so doesn't continually fire */ 93 SET_UNIPERIF_ITM_BCLR_FIFO_ERROR(player); 94 95 /* Stop the player */ 96 snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN); 97 } 98 99 ret = IRQ_HANDLED; 100 } 101 102 /* Check for dma error (overrun) */ 103 if (unlikely(status & UNIPERIF_ITS_DMA_ERROR_MASK(player))) { 104 dev_err(player->dev, "DMA error detected\n"); 105 106 /* Disable interrupt so doesn't continually fire */ 107 SET_UNIPERIF_ITM_BCLR_DMA_ERROR(player); 108 109 /* Stop the player */ 110 snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN); 111 112 ret = IRQ_HANDLED; 113 } 114 115 /* Check for underflow recovery done */ 116 if (unlikely(status & UNIPERIF_ITM_UNDERFLOW_REC_DONE_MASK(player))) { 117 if (!player->underflow_enabled) { 118 dev_err(player->dev, 119 "unexpected Underflow recovering\n"); 120 ret = -EPERM; 121 snd_pcm_stream_unlock(player->substream); 122 return ret; 123 } 124 /* Read the underflow recovery duration */ 125 tmp = GET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(player); 126 dev_dbg(player->dev, "Underflow recovered (%d LR clocks max)\n", 127 tmp); 128 129 /* Clear the underflow recovery duration */ 130 SET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(player); 131 132 /* Update state to started */ 133 player->state = UNIPERIF_STATE_STARTED; 134 135 ret = IRQ_HANDLED; 136 } 137 138 /* Check if underflow recovery failed */ 139 if (unlikely(status & 140 UNIPERIF_ITM_UNDERFLOW_REC_FAILED_MASK(player))) { 141 dev_err(player->dev, "Underflow recovery failed\n"); 142 143 /* Stop the player */ 144 snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN); 145 146 ret = IRQ_HANDLED; 147 } 148 149 snd_pcm_stream_unlock(player->substream); 150 151 return ret; 152 } 153 154 static int uni_player_clk_set_rate(struct uniperif *player, unsigned long rate) 155 { 156 int rate_adjusted, rate_achieved, delta, ret; 157 int adjustment = player->clk_adj; 158 159 /* 160 * a 161 * F = f + --------- * f = f + d 162 * 1000000 163 * 164 * a 165 * d = --------- * f 166 * 1000000 167 * 168 * where: 169 * f - nominal rate 170 * a - adjustment in ppm (parts per milion) 171 * F - rate to be set in synthesizer 172 * d - delta (difference) between f and F 173 */ 174 if (adjustment < 0) { 175 /* div64_64 operates on unsigned values... */ 176 delta = -1; 177 adjustment = -adjustment; 178 } else { 179 delta = 1; 180 } 181 /* 500000 ppm is 0.5, which is used to round up values */ 182 delta *= (int)div64_u64((uint64_t)rate * 183 (uint64_t)adjustment + 500000, 1000000); 184 rate_adjusted = rate + delta; 185 186 /* Adjusted rate should never be == 0 */ 187 if (!rate_adjusted) 188 return -EINVAL; 189 190 ret = clk_set_rate(player->clk, rate_adjusted); 191 if (ret < 0) 192 return ret; 193 194 rate_achieved = clk_get_rate(player->clk); 195 if (!rate_achieved) 196 /* If value is 0 means that clock or parent not valid */ 197 return -EINVAL; 198 199 /* 200 * Using ALSA's adjustment control, we can modify the rate to be up 201 * to twice as much as requested, but no more 202 */ 203 delta = rate_achieved - rate; 204 if (delta < 0) { 205 /* div64_64 operates on unsigned values... */ 206 delta = -delta; 207 adjustment = -1; 208 } else { 209 adjustment = 1; 210 } 211 /* Frequency/2 is added to round up result */ 212 adjustment *= (int)div64_u64((uint64_t)delta * 1000000 + rate / 2, 213 rate); 214 player->clk_adj = adjustment; 215 return 0; 216 } 217 218 static void uni_player_set_channel_status(struct uniperif *player, 219 struct snd_pcm_runtime *runtime) 220 { 221 int n; 222 unsigned int status; 223 224 /* 225 * Some AVRs and TVs require the channel status to contain a correct 226 * sampling frequency. If no sample rate is already specified, then 227 * set one. 228 */ 229 if (runtime) { 230 switch (runtime->rate) { 231 case 22050: 232 player->stream_settings.iec958.status[3] = 233 IEC958_AES3_CON_FS_22050; 234 break; 235 case 44100: 236 player->stream_settings.iec958.status[3] = 237 IEC958_AES3_CON_FS_44100; 238 break; 239 case 88200: 240 player->stream_settings.iec958.status[3] = 241 IEC958_AES3_CON_FS_88200; 242 break; 243 case 176400: 244 player->stream_settings.iec958.status[3] = 245 IEC958_AES3_CON_FS_176400; 246 break; 247 case 24000: 248 player->stream_settings.iec958.status[3] = 249 IEC958_AES3_CON_FS_24000; 250 break; 251 case 48000: 252 player->stream_settings.iec958.status[3] = 253 IEC958_AES3_CON_FS_48000; 254 break; 255 case 96000: 256 player->stream_settings.iec958.status[3] = 257 IEC958_AES3_CON_FS_96000; 258 break; 259 case 192000: 260 player->stream_settings.iec958.status[3] = 261 IEC958_AES3_CON_FS_192000; 262 break; 263 case 32000: 264 player->stream_settings.iec958.status[3] = 265 IEC958_AES3_CON_FS_32000; 266 break; 267 default: 268 /* Mark as sampling frequency not indicated */ 269 player->stream_settings.iec958.status[3] = 270 IEC958_AES3_CON_FS_NOTID; 271 break; 272 } 273 } 274 275 /* Audio mode: 276 * Use audio mode status to select PCM or encoded mode 277 */ 278 if (player->stream_settings.iec958.status[0] & IEC958_AES0_NONAUDIO) 279 player->stream_settings.encoding_mode = 280 UNIPERIF_IEC958_ENCODING_MODE_ENCODED; 281 else 282 player->stream_settings.encoding_mode = 283 UNIPERIF_IEC958_ENCODING_MODE_PCM; 284 285 if (player->stream_settings.encoding_mode == 286 UNIPERIF_IEC958_ENCODING_MODE_PCM) 287 /* Clear user validity bits */ 288 SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0); 289 else 290 /* Set user validity bits */ 291 SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 1); 292 293 /* Program the new channel status */ 294 for (n = 0; n < 6; ++n) { 295 status = 296 player->stream_settings.iec958.status[0 + (n * 4)] & 0xf; 297 status |= 298 player->stream_settings.iec958.status[1 + (n * 4)] << 8; 299 status |= 300 player->stream_settings.iec958.status[2 + (n * 4)] << 16; 301 status |= 302 player->stream_settings.iec958.status[3 + (n * 4)] << 24; 303 SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status); 304 } 305 306 /* Update the channel status */ 307 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) 308 SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(player); 309 else 310 SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(player); 311 } 312 313 static int uni_player_prepare_iec958(struct uniperif *player, 314 struct snd_pcm_runtime *runtime) 315 { 316 int clk_div; 317 318 clk_div = player->mclk / runtime->rate; 319 320 /* Oversampling must be multiple of 128 as iec958 frame is 32-bits */ 321 if ((clk_div % 128) || (clk_div <= 0)) { 322 dev_err(player->dev, "%s: invalid clk_div %d\n", 323 __func__, clk_div); 324 return -EINVAL; 325 } 326 327 switch (runtime->format) { 328 case SNDRV_PCM_FORMAT_S16_LE: 329 /* 16/16 memory format */ 330 SET_UNIPERIF_CONFIG_MEM_FMT_16_16(player); 331 /* 16-bits per sub-frame */ 332 SET_UNIPERIF_I2S_FMT_NBIT_32(player); 333 /* Set 16-bit sample precision */ 334 SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player); 335 break; 336 case SNDRV_PCM_FORMAT_S32_LE: 337 /* 16/0 memory format */ 338 SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player); 339 /* 32-bits per sub-frame */ 340 SET_UNIPERIF_I2S_FMT_NBIT_32(player); 341 /* Set 24-bit sample precision */ 342 SET_UNIPERIF_I2S_FMT_DATA_SIZE_24(player); 343 break; 344 default: 345 dev_err(player->dev, "format not supported\n"); 346 return -EINVAL; 347 } 348 349 /* Set parity to be calculated by the hardware */ 350 SET_UNIPERIF_CONFIG_PARITY_CNTR_BY_HW(player); 351 352 /* Set channel status bits to be inserted by the hardware */ 353 SET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR_BY_HW(player); 354 355 /* Set user data bits to be inserted by the hardware */ 356 SET_UNIPERIF_CONFIG_USER_DAT_CNTR_BY_HW(player); 357 358 /* Set validity bits to be inserted by the hardware */ 359 SET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_BY_HW(player); 360 361 /* Set full software control to disabled */ 362 SET_UNIPERIF_CONFIG_SPDIF_SW_CTRL_DISABLE(player); 363 364 SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player); 365 366 /* Update the channel status */ 367 scoped_guard(mutex, &player->ctrl_lock) 368 uni_player_set_channel_status(player, runtime); 369 370 371 /* Clear the user validity user bits */ 372 SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0); 373 374 /* Disable one-bit audio mode */ 375 SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(player); 376 377 /* Enable consecutive frames repetition of Z preamble (not for HBRA) */ 378 SET_UNIPERIF_CONFIG_REPEAT_CHL_STS_ENABLE(player); 379 380 /* Change to SUF0_SUBF1 and left/right channels swap! */ 381 SET_UNIPERIF_CONFIG_SUBFRAME_SEL_SUBF1_SUBF0(player); 382 383 /* Set data output as MSB first */ 384 SET_UNIPERIF_I2S_FMT_ORDER_MSB(player); 385 386 if (player->stream_settings.encoding_mode == 387 UNIPERIF_IEC958_ENCODING_MODE_ENCODED) 388 SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_ON(player); 389 else 390 SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_OFF(player); 391 392 SET_UNIPERIF_I2S_FMT_NUM_CH(player, runtime->channels / 2); 393 394 /* Set rounding to off */ 395 SET_UNIPERIF_CTRL_ROUNDING_OFF(player); 396 397 /* Set clock divisor */ 398 SET_UNIPERIF_CTRL_DIVIDER(player, clk_div / 128); 399 400 /* Set the spdif latency to not wait before starting player */ 401 SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player); 402 403 /* 404 * Ensure iec958 formatting is off. It will be enabled in function 405 * uni_player_start() at the same time as the operation 406 * mode is set to work around a silicon issue. 407 */ 408 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) 409 SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(player); 410 else 411 SET_UNIPERIF_CTRL_SPDIF_FMT_ON(player); 412 413 return 0; 414 } 415 416 static int uni_player_prepare_pcm(struct uniperif *player, 417 struct snd_pcm_runtime *runtime) 418 { 419 int output_frame_size, slot_width, clk_div; 420 421 /* Force slot width to 32 in I2S mode (HW constraint) */ 422 if ((player->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) == 423 SND_SOC_DAIFMT_I2S) 424 slot_width = 32; 425 else 426 slot_width = snd_pcm_format_width(runtime->format); 427 428 output_frame_size = slot_width * runtime->channels; 429 430 clk_div = player->mclk / runtime->rate; 431 /* 432 * For 32 bits subframe clk_div must be a multiple of 128, 433 * for 16 bits must be a multiple of 64 434 */ 435 if ((slot_width == 32) && (clk_div % 128)) { 436 dev_err(player->dev, "%s: invalid clk_div\n", __func__); 437 return -EINVAL; 438 } 439 440 if ((slot_width == 16) && (clk_div % 64)) { 441 dev_err(player->dev, "%s: invalid clk_div\n", __func__); 442 return -EINVAL; 443 } 444 445 /* 446 * Number of bits per subframe (which is one channel sample) 447 * on output - Transfer 16 or 32 bits from FIFO 448 */ 449 switch (slot_width) { 450 case 32: 451 SET_UNIPERIF_I2S_FMT_NBIT_32(player); 452 SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(player); 453 break; 454 case 16: 455 SET_UNIPERIF_I2S_FMT_NBIT_16(player); 456 SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player); 457 break; 458 default: 459 dev_err(player->dev, "subframe format not supported\n"); 460 return -EINVAL; 461 } 462 463 /* Configure data memory format */ 464 switch (runtime->format) { 465 case SNDRV_PCM_FORMAT_S16_LE: 466 /* One data word contains two samples */ 467 SET_UNIPERIF_CONFIG_MEM_FMT_16_16(player); 468 break; 469 470 case SNDRV_PCM_FORMAT_S32_LE: 471 /* 472 * Actually "16 bits/0 bits" means "32/28/24/20/18/16 bits 473 * on the left than zeros (if less than 32 bytes)"... ;-) 474 */ 475 SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player); 476 break; 477 478 default: 479 dev_err(player->dev, "format not supported\n"); 480 return -EINVAL; 481 } 482 483 /* Set rounding to off */ 484 SET_UNIPERIF_CTRL_ROUNDING_OFF(player); 485 486 /* Set clock divisor */ 487 SET_UNIPERIF_CTRL_DIVIDER(player, clk_div / (2 * output_frame_size)); 488 489 /* Number of channelsmust be even*/ 490 if ((runtime->channels % 2) || (runtime->channels < 2) || 491 (runtime->channels > 10)) { 492 dev_err(player->dev, "%s: invalid nb of channels\n", __func__); 493 return -EINVAL; 494 } 495 496 SET_UNIPERIF_I2S_FMT_NUM_CH(player, runtime->channels / 2); 497 498 /* Set 1-bit audio format to disabled */ 499 SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(player); 500 501 SET_UNIPERIF_I2S_FMT_ORDER_MSB(player); 502 503 /* No iec958 formatting as outputting to DAC */ 504 SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(player); 505 506 return 0; 507 } 508 509 static int uni_player_prepare_tdm(struct uniperif *player, 510 struct snd_pcm_runtime *runtime) 511 { 512 int tdm_frame_size; /* unip tdm frame size in bytes */ 513 int user_frame_size; /* user tdm frame size in bytes */ 514 /* default unip TDM_WORD_POS_X_Y */ 515 unsigned int word_pos[4] = { 516 0x04060002, 0x0C0E080A, 0x14161012, 0x1C1E181A}; 517 int freq, ret; 518 519 tdm_frame_size = 520 sti_uniperiph_get_unip_tdm_frame_size(player); 521 user_frame_size = 522 sti_uniperiph_get_user_frame_size(runtime); 523 524 /* fix 16/0 format */ 525 SET_UNIPERIF_CONFIG_MEM_FMT_16_0(player); 526 SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(player); 527 528 /* number of words inserted on the TDM line */ 529 SET_UNIPERIF_I2S_FMT_NUM_CH(player, user_frame_size / 4 / 2); 530 531 SET_UNIPERIF_I2S_FMT_ORDER_MSB(player); 532 SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player); 533 534 /* Enable the tdm functionality */ 535 SET_UNIPERIF_TDM_ENABLE_TDM_ENABLE(player); 536 537 /* number of 8 bits timeslots avail in unip tdm frame */ 538 SET_UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT(player, tdm_frame_size); 539 540 /* set the timeslot allocation for words in FIFO */ 541 sti_uniperiph_get_tdm_word_pos(player, word_pos); 542 SET_UNIPERIF_TDM_WORD_POS(player, 1_2, word_pos[WORD_1_2]); 543 SET_UNIPERIF_TDM_WORD_POS(player, 3_4, word_pos[WORD_3_4]); 544 SET_UNIPERIF_TDM_WORD_POS(player, 5_6, word_pos[WORD_5_6]); 545 SET_UNIPERIF_TDM_WORD_POS(player, 7_8, word_pos[WORD_7_8]); 546 547 /* set unip clk rate (not done vai set_sysclk ops) */ 548 freq = runtime->rate * tdm_frame_size * 8; 549 scoped_guard(mutex, &player->ctrl_lock) { 550 ret = uni_player_clk_set_rate(player, freq); 551 if (!ret) 552 player->mclk = freq; 553 } 554 555 return 0; 556 } 557 558 /* 559 * ALSA uniperipheral iec958 controls 560 */ 561 static int uni_player_ctl_iec958_info(struct snd_kcontrol *kcontrol, 562 struct snd_ctl_elem_info *uinfo) 563 { 564 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; 565 uinfo->count = 1; 566 567 return 0; 568 } 569 570 static int uni_player_ctl_iec958_get(struct snd_kcontrol *kcontrol, 571 struct snd_ctl_elem_value *ucontrol) 572 { 573 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); 574 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 575 struct uniperif *player = priv->dai_data.uni; 576 struct snd_aes_iec958 *iec958 = &player->stream_settings.iec958; 577 578 guard(mutex)(&player->ctrl_lock); 579 ucontrol->value.iec958.status[0] = iec958->status[0]; 580 ucontrol->value.iec958.status[1] = iec958->status[1]; 581 ucontrol->value.iec958.status[2] = iec958->status[2]; 582 ucontrol->value.iec958.status[3] = iec958->status[3]; 583 return 0; 584 } 585 586 static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, 587 struct snd_ctl_elem_value *ucontrol) 588 { 589 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); 590 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 591 struct uniperif *player = priv->dai_data.uni; 592 struct snd_aes_iec958 *iec958 = &player->stream_settings.iec958; 593 594 guard(mutex)(&player->ctrl_lock); 595 iec958->status[0] = ucontrol->value.iec958.status[0]; 596 iec958->status[1] = ucontrol->value.iec958.status[1]; 597 iec958->status[2] = ucontrol->value.iec958.status[2]; 598 iec958->status[3] = ucontrol->value.iec958.status[3]; 599 600 scoped_guard(spinlock_irqsave, &player->irq_lock) { 601 if (player->substream && player->substream->runtime) 602 uni_player_set_channel_status(player, 603 player->substream->runtime); 604 else 605 uni_player_set_channel_status(player, NULL); 606 } 607 608 return 0; 609 } 610 611 static struct snd_kcontrol_new uni_player_iec958_ctl = { 612 .iface = SNDRV_CTL_ELEM_IFACE_PCM, 613 .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT), 614 .info = uni_player_ctl_iec958_info, 615 .get = uni_player_ctl_iec958_get, 616 .put = uni_player_ctl_iec958_put, 617 }; 618 619 /* 620 * uniperif rate adjustement control 621 */ 622 static int snd_sti_clk_adjustment_info(struct snd_kcontrol *kcontrol, 623 struct snd_ctl_elem_info *uinfo) 624 { 625 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 626 uinfo->count = 1; 627 uinfo->value.integer.min = UNIPERIF_PLAYER_CLK_ADJ_MIN; 628 uinfo->value.integer.max = UNIPERIF_PLAYER_CLK_ADJ_MAX; 629 uinfo->value.integer.step = 1; 630 631 return 0; 632 } 633 634 static int snd_sti_clk_adjustment_get(struct snd_kcontrol *kcontrol, 635 struct snd_ctl_elem_value *ucontrol) 636 { 637 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); 638 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 639 struct uniperif *player = priv->dai_data.uni; 640 641 guard(mutex)(&player->ctrl_lock); 642 ucontrol->value.integer.value[0] = player->clk_adj; 643 644 return 0; 645 } 646 647 static int snd_sti_clk_adjustment_put(struct snd_kcontrol *kcontrol, 648 struct snd_ctl_elem_value *ucontrol) 649 { 650 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); 651 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 652 struct uniperif *player = priv->dai_data.uni; 653 int ret = 0; 654 655 if ((ucontrol->value.integer.value[0] < UNIPERIF_PLAYER_CLK_ADJ_MIN) || 656 (ucontrol->value.integer.value[0] > UNIPERIF_PLAYER_CLK_ADJ_MAX)) 657 return -EINVAL; 658 659 guard(mutex)(&player->ctrl_lock); 660 player->clk_adj = ucontrol->value.integer.value[0]; 661 662 if (player->mclk) 663 ret = uni_player_clk_set_rate(player, player->mclk); 664 665 return ret; 666 } 667 668 static struct snd_kcontrol_new uni_player_clk_adj_ctl = { 669 .iface = SNDRV_CTL_ELEM_IFACE_PCM, 670 .name = "PCM Playback Oversampling Freq. Adjustment", 671 .info = snd_sti_clk_adjustment_info, 672 .get = snd_sti_clk_adjustment_get, 673 .put = snd_sti_clk_adjustment_put, 674 }; 675 676 static struct snd_kcontrol_new *snd_sti_pcm_ctl[] = { 677 &uni_player_clk_adj_ctl, 678 }; 679 680 static struct snd_kcontrol_new *snd_sti_iec_ctl[] = { 681 &uni_player_iec958_ctl, 682 &uni_player_clk_adj_ctl, 683 }; 684 685 static int uni_player_startup(struct snd_pcm_substream *substream, 686 struct snd_soc_dai *dai) 687 { 688 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 689 struct uniperif *player = priv->dai_data.uni; 690 int ret; 691 692 scoped_guard(spinlock_irqsave, &player->irq_lock) 693 player->substream = substream; 694 695 player->clk_adj = 0; 696 697 if (!UNIPERIF_TYPE_IS_TDM(player)) 698 return 0; 699 700 /* refine hw constraint in tdm mode */ 701 ret = snd_pcm_hw_rule_add(substream->runtime, 0, 702 SNDRV_PCM_HW_PARAM_CHANNELS, 703 sti_uniperiph_fix_tdm_chan, 704 player, SNDRV_PCM_HW_PARAM_CHANNELS, 705 -1); 706 if (ret < 0) 707 return ret; 708 709 return snd_pcm_hw_rule_add(substream->runtime, 0, 710 SNDRV_PCM_HW_PARAM_FORMAT, 711 sti_uniperiph_fix_tdm_format, 712 player, SNDRV_PCM_HW_PARAM_FORMAT, 713 -1); 714 } 715 716 static int uni_player_set_sysclk(struct snd_soc_dai *dai, int clk_id, 717 unsigned int freq, int dir) 718 { 719 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 720 struct uniperif *player = priv->dai_data.uni; 721 int ret; 722 723 if (UNIPERIF_TYPE_IS_TDM(player) || (dir == SND_SOC_CLOCK_IN)) 724 return 0; 725 726 if (clk_id != 0) 727 return -EINVAL; 728 729 guard(mutex)(&player->ctrl_lock); 730 ret = uni_player_clk_set_rate(player, freq); 731 if (!ret) 732 player->mclk = freq; 733 734 return ret; 735 } 736 737 static int uni_player_prepare(struct snd_pcm_substream *substream, 738 struct snd_soc_dai *dai) 739 { 740 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 741 struct uniperif *player = priv->dai_data.uni; 742 struct snd_pcm_runtime *runtime = substream->runtime; 743 int transfer_size, trigger_limit; 744 int ret; 745 746 /* The player should be stopped */ 747 if (player->state != UNIPERIF_STATE_STOPPED) { 748 dev_err(player->dev, "%s: invalid player state %d\n", __func__, 749 player->state); 750 return -EINVAL; 751 } 752 753 /* Calculate transfer size (in fifo cells and bytes) for frame count */ 754 if (player->type == SND_ST_UNIPERIF_TYPE_TDM) { 755 /* transfer size = user frame size (in 32 bits FIFO cell) */ 756 transfer_size = 757 sti_uniperiph_get_user_frame_size(runtime) / 4; 758 } else { 759 transfer_size = runtime->channels * UNIPERIF_FIFO_FRAMES; 760 } 761 762 /* Calculate number of empty cells available before asserting DREQ */ 763 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) { 764 trigger_limit = UNIPERIF_FIFO_SIZE - transfer_size; 765 } else { 766 /* 767 * Since SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 768 * FDMA_TRIGGER_LIMIT also controls when the state switches 769 * from OFF or STANDBY to AUDIO DATA. 770 */ 771 trigger_limit = transfer_size; 772 } 773 774 /* Trigger limit must be an even number */ 775 if ((!trigger_limit % 2) || (trigger_limit != 1 && transfer_size % 2) || 776 (trigger_limit > UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(player))) { 777 dev_err(player->dev, "invalid trigger limit %d\n", 778 trigger_limit); 779 return -EINVAL; 780 } 781 782 SET_UNIPERIF_CONFIG_DMA_TRIG_LIMIT(player, trigger_limit); 783 784 /* Uniperipheral setup depends on player type */ 785 switch (player->type) { 786 case SND_ST_UNIPERIF_TYPE_HDMI: 787 ret = uni_player_prepare_iec958(player, runtime); 788 break; 789 case SND_ST_UNIPERIF_TYPE_PCM: 790 ret = uni_player_prepare_pcm(player, runtime); 791 break; 792 case SND_ST_UNIPERIF_TYPE_SPDIF: 793 ret = uni_player_prepare_iec958(player, runtime); 794 break; 795 case SND_ST_UNIPERIF_TYPE_TDM: 796 ret = uni_player_prepare_tdm(player, runtime); 797 break; 798 default: 799 dev_err(player->dev, "invalid player type\n"); 800 return -EINVAL; 801 } 802 803 if (ret) 804 return ret; 805 806 switch (player->daifmt & SND_SOC_DAIFMT_INV_MASK) { 807 case SND_SOC_DAIFMT_NB_NF: 808 SET_UNIPERIF_I2S_FMT_LR_POL_LOW(player); 809 SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(player); 810 break; 811 case SND_SOC_DAIFMT_NB_IF: 812 SET_UNIPERIF_I2S_FMT_LR_POL_HIG(player); 813 SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(player); 814 break; 815 case SND_SOC_DAIFMT_IB_NF: 816 SET_UNIPERIF_I2S_FMT_LR_POL_LOW(player); 817 SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(player); 818 break; 819 case SND_SOC_DAIFMT_IB_IF: 820 SET_UNIPERIF_I2S_FMT_LR_POL_HIG(player); 821 SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(player); 822 break; 823 } 824 825 switch (player->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) { 826 case SND_SOC_DAIFMT_I2S: 827 SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player); 828 SET_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(player); 829 break; 830 case SND_SOC_DAIFMT_LEFT_J: 831 SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(player); 832 SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player); 833 break; 834 case SND_SOC_DAIFMT_RIGHT_J: 835 SET_UNIPERIF_I2S_FMT_ALIGN_RIGHT(player); 836 SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player); 837 break; 838 default: 839 dev_err(player->dev, "format not supported\n"); 840 return -EINVAL; 841 } 842 843 SET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(player, 0); 844 845 846 return sti_uniperiph_reset(player); 847 } 848 849 static int uni_player_start(struct uniperif *player) 850 { 851 int ret; 852 853 /* The player should be stopped */ 854 if (player->state != UNIPERIF_STATE_STOPPED) { 855 dev_err(player->dev, "%s: invalid player state\n", __func__); 856 return -EINVAL; 857 } 858 859 ret = clk_prepare_enable(player->clk); 860 if (ret) { 861 dev_err(player->dev, "%s: Failed to enable clock\n", __func__); 862 return ret; 863 } 864 865 /* Clear any pending interrupts */ 866 SET_UNIPERIF_ITS_BCLR(player, GET_UNIPERIF_ITS(player)); 867 868 /* Set the interrupt mask */ 869 SET_UNIPERIF_ITM_BSET_DMA_ERROR(player); 870 SET_UNIPERIF_ITM_BSET_FIFO_ERROR(player); 871 872 /* Enable underflow recovery interrupts */ 873 if (player->underflow_enabled) { 874 SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE(player); 875 SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED(player); 876 } 877 878 ret = sti_uniperiph_reset(player); 879 if (ret < 0) { 880 clk_disable_unprepare(player->clk); 881 return ret; 882 } 883 884 /* 885 * Does not use IEC61937 features of the uniperipheral hardware. 886 * Instead it performs IEC61937 in software and inserts it directly 887 * into the audio data stream. As such, when encoded mode is selected, 888 * linear pcm mode is still used, but with the differences of the 889 * channel status bits set for encoded mode and the validity bits set. 890 */ 891 SET_UNIPERIF_CTRL_OPERATION_PCM_DATA(player); 892 893 /* 894 * If iec958 formatting is required for hdmi or spdif, then it must be 895 * enabled after the operation mode is set. If set prior to this, it 896 * will not take affect and hang the player. 897 */ 898 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) 899 if (UNIPERIF_TYPE_IS_IEC958(player)) 900 SET_UNIPERIF_CTRL_SPDIF_FMT_ON(player); 901 902 /* Force channel status update (no update if clk disable) */ 903 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) 904 SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(player); 905 else 906 SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(player); 907 908 /* Update state to started */ 909 player->state = UNIPERIF_STATE_STARTED; 910 911 return 0; 912 } 913 914 static int uni_player_stop(struct uniperif *player) 915 { 916 int ret; 917 918 /* The player should not be in stopped state */ 919 if (player->state == UNIPERIF_STATE_STOPPED) { 920 dev_err(player->dev, "%s: invalid player state\n", __func__); 921 return -EINVAL; 922 } 923 924 /* Turn the player off */ 925 SET_UNIPERIF_CTRL_OPERATION_OFF(player); 926 927 ret = sti_uniperiph_reset(player); 928 if (ret < 0) 929 return ret; 930 931 /* Disable interrupts */ 932 SET_UNIPERIF_ITM_BCLR(player, GET_UNIPERIF_ITM(player)); 933 934 /* Disable clock */ 935 clk_disable_unprepare(player->clk); 936 937 /* Update state to stopped and return */ 938 player->state = UNIPERIF_STATE_STOPPED; 939 940 return 0; 941 } 942 943 int uni_player_resume(struct uniperif *player) 944 { 945 int ret; 946 947 /* Select the frequency synthesizer clock */ 948 if (player->clk_sel) { 949 ret = regmap_field_write(player->clk_sel, 1); 950 if (ret) { 951 dev_err(player->dev, 952 "%s: Failed to select freq synth clock\n", 953 __func__); 954 return ret; 955 } 956 } 957 958 SET_UNIPERIF_CONFIG_BACK_STALL_REQ_DISABLE(player); 959 SET_UNIPERIF_CTRL_ROUNDING_OFF(player); 960 SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player); 961 SET_UNIPERIF_CONFIG_IDLE_MOD_DISABLE(player); 962 963 return 0; 964 } 965 EXPORT_SYMBOL_GPL(uni_player_resume); 966 967 static int uni_player_trigger(struct snd_pcm_substream *substream, 968 int cmd, struct snd_soc_dai *dai) 969 { 970 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 971 struct uniperif *player = priv->dai_data.uni; 972 973 switch (cmd) { 974 case SNDRV_PCM_TRIGGER_START: 975 return uni_player_start(player); 976 case SNDRV_PCM_TRIGGER_STOP: 977 return uni_player_stop(player); 978 case SNDRV_PCM_TRIGGER_RESUME: 979 return uni_player_resume(player); 980 default: 981 return -EINVAL; 982 } 983 } 984 985 static void uni_player_shutdown(struct snd_pcm_substream *substream, 986 struct snd_soc_dai *dai) 987 { 988 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 989 struct uniperif *player = priv->dai_data.uni; 990 991 guard(spinlock_irqsave)(&player->irq_lock); 992 if (player->state != UNIPERIF_STATE_STOPPED) 993 /* Stop the player */ 994 uni_player_stop(player); 995 996 player->substream = NULL; 997 } 998 999 static int uni_player_parse_dt_audio_glue(struct platform_device *pdev, 1000 struct uniperif *player) 1001 { 1002 struct device_node *node = pdev->dev.of_node; 1003 struct regmap *regmap; 1004 struct reg_field regfield[2] = { 1005 /* PCM_CLK_SEL */ 1006 REG_FIELD(SYS_CFG_AUDIO_GLUE, 1007 8 + player->id, 1008 8 + player->id), 1009 /* PCMP_VALID_SEL */ 1010 REG_FIELD(SYS_CFG_AUDIO_GLUE, 0, 1) 1011 }; 1012 1013 regmap = syscon_regmap_lookup_by_phandle(node, "st,syscfg"); 1014 1015 if (IS_ERR(regmap)) { 1016 dev_err(&pdev->dev, "sti-audio-clk-glue syscf not found\n"); 1017 return PTR_ERR(regmap); 1018 } 1019 1020 player->clk_sel = devm_regmap_field_alloc(&pdev->dev, regmap, regfield[0]); 1021 if (IS_ERR(player->clk_sel)) 1022 return PTR_ERR(player->clk_sel); 1023 1024 player->valid_sel = devm_regmap_field_alloc(&pdev->dev, regmap, regfield[1]); 1025 if (IS_ERR(player->valid_sel)) 1026 return PTR_ERR(player->valid_sel); 1027 1028 return 0; 1029 } 1030 1031 static const struct snd_soc_dai_ops uni_player_dai_ops = { 1032 .startup = uni_player_startup, 1033 .shutdown = uni_player_shutdown, 1034 .prepare = uni_player_prepare, 1035 .probe = sti_uniperiph_dai_probe, 1036 .trigger = uni_player_trigger, 1037 .hw_params = sti_uniperiph_dai_hw_params, 1038 .set_fmt = sti_uniperiph_dai_set_fmt, 1039 .set_sysclk = uni_player_set_sysclk, 1040 .set_tdm_slot = sti_uniperiph_set_tdm_slot 1041 }; 1042 1043 int uni_player_init(struct platform_device *pdev, 1044 struct uniperif *player) 1045 { 1046 int ret = 0; 1047 1048 player->dev = &pdev->dev; 1049 player->state = UNIPERIF_STATE_STOPPED; 1050 player->dai_ops = &uni_player_dai_ops; 1051 1052 /* Get PCM_CLK_SEL & PCMP_VALID_SEL from audio-glue-ctrl SoC reg */ 1053 ret = uni_player_parse_dt_audio_glue(pdev, player); 1054 1055 if (ret < 0) { 1056 dev_err(player->dev, "Failed to parse DeviceTree\n"); 1057 return ret; 1058 } 1059 1060 /* Underflow recovery is only supported on later ip revisions */ 1061 if (player->ver >= SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) 1062 player->underflow_enabled = 1; 1063 1064 if (UNIPERIF_TYPE_IS_TDM(player)) 1065 player->hw = &uni_tdm_hw; 1066 else 1067 player->hw = &uni_player_pcm_hw; 1068 1069 /* Get uniperif resource */ 1070 player->clk = of_clk_get(pdev->dev.of_node, 0); 1071 if (IS_ERR(player->clk)) { 1072 dev_err(player->dev, "Failed to get clock\n"); 1073 return PTR_ERR(player->clk); 1074 } 1075 1076 /* Select the frequency synthesizer clock */ 1077 if (player->clk_sel) { 1078 ret = regmap_field_write(player->clk_sel, 1); 1079 if (ret) { 1080 dev_err(player->dev, 1081 "%s: Failed to select freq synth clock\n", 1082 __func__); 1083 return ret; 1084 } 1085 } 1086 1087 /* connect to I2S/TDM TX bus */ 1088 if (player->valid_sel && 1089 (player->id == UNIPERIF_PLAYER_I2S_OUT)) { 1090 ret = regmap_field_write(player->valid_sel, player->id); 1091 if (ret) { 1092 dev_err(player->dev, 1093 "%s: unable to connect to tdm bus\n", __func__); 1094 return ret; 1095 } 1096 } 1097 1098 ret = devm_request_irq(&pdev->dev, player->irq, 1099 uni_player_irq_handler, IRQF_SHARED, 1100 dev_name(&pdev->dev), player); 1101 if (ret < 0) { 1102 dev_err(player->dev, "unable to request IRQ %d\n", player->irq); 1103 return ret; 1104 } 1105 1106 mutex_init(&player->ctrl_lock); 1107 spin_lock_init(&player->irq_lock); 1108 1109 /* Ensure that disabled by default */ 1110 SET_UNIPERIF_CONFIG_BACK_STALL_REQ_DISABLE(player); 1111 SET_UNIPERIF_CTRL_ROUNDING_OFF(player); 1112 SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(player); 1113 SET_UNIPERIF_CONFIG_IDLE_MOD_DISABLE(player); 1114 1115 if (UNIPERIF_TYPE_IS_IEC958(player)) { 1116 /* Set default iec958 status bits */ 1117 1118 /* Consumer, PCM, copyright, 2ch, mode 0 */ 1119 player->stream_settings.iec958.status[0] = 0x00; 1120 /* Broadcast reception category */ 1121 player->stream_settings.iec958.status[1] = 1122 IEC958_AES1_CON_GENERAL; 1123 /* Do not take into account source or channel number */ 1124 player->stream_settings.iec958.status[2] = 1125 IEC958_AES2_CON_SOURCE_UNSPEC; 1126 /* Sampling frequency not indicated */ 1127 player->stream_settings.iec958.status[3] = 1128 IEC958_AES3_CON_FS_NOTID; 1129 /* Max sample word 24-bit, sample word length not indicated */ 1130 player->stream_settings.iec958.status[4] = 1131 IEC958_AES4_CON_MAX_WORDLEN_24 | 1132 IEC958_AES4_CON_WORDLEN_24_20; 1133 1134 player->num_ctrls = ARRAY_SIZE(snd_sti_iec_ctl); 1135 player->snd_ctrls = snd_sti_iec_ctl[0]; 1136 } else { 1137 player->num_ctrls = ARRAY_SIZE(snd_sti_pcm_ctl); 1138 player->snd_ctrls = snd_sti_pcm_ctl[0]; 1139 } 1140 1141 return 0; 1142 } 1143 EXPORT_SYMBOL_GPL(uni_player_init); 1144