1 /* 2 * STM32 ALSA SoC Digital Audio Interface (SAI) driver. 3 * 4 * Copyright (C) 2016, STMicroelectronics - All Rights Reserved 5 * Author(s): Olivier Moysan <olivier.moysan@st.com> for STMicroelectronics. 6 * 7 * License terms: GPL V2.0. 8 * 9 * This program is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License version 2 as published by 11 * the Free Software Foundation. 12 * 13 * This program is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 16 * details. 17 */ 18 19 #include <linux/clk.h> 20 #include <linux/clk-provider.h> 21 #include <linux/kernel.h> 22 #include <linux/module.h> 23 #include <linux/of_irq.h> 24 #include <linux/of_platform.h> 25 #include <linux/regmap.h> 26 27 #include <sound/asoundef.h> 28 #include <sound/core.h> 29 #include <sound/dmaengine_pcm.h> 30 #include <sound/pcm_params.h> 31 32 #include "stm32_sai.h" 33 34 #define SAI_FREE_PROTOCOL 0x0 35 #define SAI_SPDIF_PROTOCOL 0x1 36 37 #define SAI_SLOT_SIZE_AUTO 0x0 38 #define SAI_SLOT_SIZE_16 0x1 39 #define SAI_SLOT_SIZE_32 0x2 40 41 #define SAI_DATASIZE_8 0x2 42 #define SAI_DATASIZE_10 0x3 43 #define SAI_DATASIZE_16 0x4 44 #define SAI_DATASIZE_20 0x5 45 #define SAI_DATASIZE_24 0x6 46 #define SAI_DATASIZE_32 0x7 47 48 #define STM_SAI_FIFO_SIZE 8 49 #define STM_SAI_DAI_NAME_SIZE 15 50 51 #define STM_SAI_IS_PLAYBACK(ip) ((ip)->dir == SNDRV_PCM_STREAM_PLAYBACK) 52 #define STM_SAI_IS_CAPTURE(ip) ((ip)->dir == SNDRV_PCM_STREAM_CAPTURE) 53 54 #define STM_SAI_A_ID 0x0 55 #define STM_SAI_B_ID 0x1 56 57 #define STM_SAI_IS_SUB_A(x) ((x)->id == STM_SAI_A_ID) 58 #define STM_SAI_IS_SUB_B(x) ((x)->id == STM_SAI_B_ID) 59 #define STM_SAI_BLOCK_NAME(x) (((x)->id == STM_SAI_A_ID) ? "A" : "B") 60 61 #define SAI_SYNC_NONE 0x0 62 #define SAI_SYNC_INTERNAL 0x1 63 #define SAI_SYNC_EXTERNAL 0x2 64 65 #define STM_SAI_PROTOCOL_IS_SPDIF(ip) ((ip)->spdif) 66 #define STM_SAI_HAS_SPDIF(x) ((x)->pdata->conf->has_spdif) 67 #define STM_SAI_HAS_EXT_SYNC(x) (!STM_SAI_IS_F4(sai->pdata)) 68 69 #define SAI_IEC60958_BLOCK_FRAMES 192 70 #define SAI_IEC60958_STATUS_BYTES 24 71 72 #define SAI_MCLK_NAME_LEN 32 73 74 /** 75 * struct stm32_sai_sub_data - private data of SAI sub block (block A or B) 76 * @pdev: device data pointer 77 * @regmap: SAI register map pointer 78 * @regmap_config: SAI sub block register map configuration pointer 79 * @dma_params: dma configuration data for rx or tx channel 80 * @cpu_dai_drv: DAI driver data pointer 81 * @cpu_dai: DAI runtime data pointer 82 * @substream: PCM substream data pointer 83 * @pdata: SAI block parent data pointer 84 * @np_sync_provider: synchronization provider node 85 * @sai_ck: kernel clock feeding the SAI clock generator 86 * @sai_mclk: master clock from SAI mclk provider 87 * @phys_addr: SAI registers physical base address 88 * @mclk_rate: SAI block master clock frequency (Hz). set at init 89 * @id: SAI sub block id corresponding to sub-block A or B 90 * @dir: SAI block direction (playback or capture). set at init 91 * @master: SAI block mode flag. (true=master, false=slave) set at init 92 * @spdif: SAI S/PDIF iec60958 mode flag. set at init 93 * @fmt: SAI block format. relevant only for custom protocols. set at init 94 * @sync: SAI block synchronization mode. (none, internal or external) 95 * @synco: SAI block ext sync source (provider setting). (none, sub-block A/B) 96 * @synci: SAI block ext sync source (client setting). (SAI sync provider index) 97 * @fs_length: frame synchronization length. depends on protocol settings 98 * @slots: rx or tx slot number 99 * @slot_width: rx or tx slot width in bits 100 * @slot_mask: rx or tx active slots mask. set at init or at runtime 101 * @data_size: PCM data width. corresponds to PCM substream width. 102 * @spdif_frm_cnt: S/PDIF playback frame counter 103 * @snd_aes_iec958: iec958 data 104 * @ctrl_lock: control lock 105 */ 106 struct stm32_sai_sub_data { 107 struct platform_device *pdev; 108 struct regmap *regmap; 109 const struct regmap_config *regmap_config; 110 struct snd_dmaengine_dai_dma_data dma_params; 111 struct snd_soc_dai_driver *cpu_dai_drv; 112 struct snd_soc_dai *cpu_dai; 113 struct snd_pcm_substream *substream; 114 struct stm32_sai_data *pdata; 115 struct device_node *np_sync_provider; 116 struct clk *sai_ck; 117 struct clk *sai_mclk; 118 dma_addr_t phys_addr; 119 unsigned int mclk_rate; 120 unsigned int id; 121 int dir; 122 bool master; 123 bool spdif; 124 int fmt; 125 int sync; 126 int synco; 127 int synci; 128 int fs_length; 129 int slots; 130 int slot_width; 131 int slot_mask; 132 int data_size; 133 unsigned int spdif_frm_cnt; 134 struct snd_aes_iec958 iec958; 135 struct mutex ctrl_lock; /* protect resources accessed by controls */ 136 }; 137 138 enum stm32_sai_fifo_th { 139 STM_SAI_FIFO_TH_EMPTY, 140 STM_SAI_FIFO_TH_QUARTER, 141 STM_SAI_FIFO_TH_HALF, 142 STM_SAI_FIFO_TH_3_QUARTER, 143 STM_SAI_FIFO_TH_FULL, 144 }; 145 146 static bool stm32_sai_sub_readable_reg(struct device *dev, unsigned int reg) 147 { 148 switch (reg) { 149 case STM_SAI_CR1_REGX: 150 case STM_SAI_CR2_REGX: 151 case STM_SAI_FRCR_REGX: 152 case STM_SAI_SLOTR_REGX: 153 case STM_SAI_IMR_REGX: 154 case STM_SAI_SR_REGX: 155 case STM_SAI_CLRFR_REGX: 156 case STM_SAI_DR_REGX: 157 case STM_SAI_PDMCR_REGX: 158 case STM_SAI_PDMLY_REGX: 159 return true; 160 default: 161 return false; 162 } 163 } 164 165 static bool stm32_sai_sub_volatile_reg(struct device *dev, unsigned int reg) 166 { 167 switch (reg) { 168 case STM_SAI_DR_REGX: 169 return true; 170 default: 171 return false; 172 } 173 } 174 175 static bool stm32_sai_sub_writeable_reg(struct device *dev, unsigned int reg) 176 { 177 switch (reg) { 178 case STM_SAI_CR1_REGX: 179 case STM_SAI_CR2_REGX: 180 case STM_SAI_FRCR_REGX: 181 case STM_SAI_SLOTR_REGX: 182 case STM_SAI_IMR_REGX: 183 case STM_SAI_SR_REGX: 184 case STM_SAI_CLRFR_REGX: 185 case STM_SAI_DR_REGX: 186 case STM_SAI_PDMCR_REGX: 187 case STM_SAI_PDMLY_REGX: 188 return true; 189 default: 190 return false; 191 } 192 } 193 194 static const struct regmap_config stm32_sai_sub_regmap_config_f4 = { 195 .reg_bits = 32, 196 .reg_stride = 4, 197 .val_bits = 32, 198 .max_register = STM_SAI_DR_REGX, 199 .readable_reg = stm32_sai_sub_readable_reg, 200 .volatile_reg = stm32_sai_sub_volatile_reg, 201 .writeable_reg = stm32_sai_sub_writeable_reg, 202 .fast_io = true, 203 }; 204 205 static const struct regmap_config stm32_sai_sub_regmap_config_h7 = { 206 .reg_bits = 32, 207 .reg_stride = 4, 208 .val_bits = 32, 209 .max_register = STM_SAI_PDMLY_REGX, 210 .readable_reg = stm32_sai_sub_readable_reg, 211 .volatile_reg = stm32_sai_sub_volatile_reg, 212 .writeable_reg = stm32_sai_sub_writeable_reg, 213 .fast_io = true, 214 }; 215 216 static int snd_pcm_iec958_info(struct snd_kcontrol *kcontrol, 217 struct snd_ctl_elem_info *uinfo) 218 { 219 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; 220 uinfo->count = 1; 221 222 return 0; 223 } 224 225 static int snd_pcm_iec958_get(struct snd_kcontrol *kcontrol, 226 struct snd_ctl_elem_value *uctl) 227 { 228 struct stm32_sai_sub_data *sai = snd_kcontrol_chip(kcontrol); 229 230 mutex_lock(&sai->ctrl_lock); 231 memcpy(uctl->value.iec958.status, sai->iec958.status, 4); 232 mutex_unlock(&sai->ctrl_lock); 233 234 return 0; 235 } 236 237 static int snd_pcm_iec958_put(struct snd_kcontrol *kcontrol, 238 struct snd_ctl_elem_value *uctl) 239 { 240 struct stm32_sai_sub_data *sai = snd_kcontrol_chip(kcontrol); 241 242 mutex_lock(&sai->ctrl_lock); 243 memcpy(sai->iec958.status, uctl->value.iec958.status, 4); 244 mutex_unlock(&sai->ctrl_lock); 245 246 return 0; 247 } 248 249 static const struct snd_kcontrol_new iec958_ctls = { 250 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 251 SNDRV_CTL_ELEM_ACCESS_VOLATILE), 252 .iface = SNDRV_CTL_ELEM_IFACE_PCM, 253 .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT), 254 .info = snd_pcm_iec958_info, 255 .get = snd_pcm_iec958_get, 256 .put = snd_pcm_iec958_put, 257 }; 258 259 struct stm32_sai_mclk_data { 260 struct clk_hw hw; 261 unsigned long freq; 262 struct stm32_sai_sub_data *sai_data; 263 }; 264 265 #define to_mclk_data(_hw) container_of(_hw, struct stm32_sai_mclk_data, hw) 266 #define STM32_SAI_MAX_CLKS 1 267 268 static int stm32_sai_get_clk_div(struct stm32_sai_sub_data *sai, 269 unsigned long input_rate, 270 unsigned long output_rate) 271 { 272 int version = sai->pdata->conf->version; 273 int div; 274 275 div = DIV_ROUND_CLOSEST(input_rate, output_rate); 276 if (div > SAI_XCR1_MCKDIV_MAX(version)) { 277 dev_err(&sai->pdev->dev, "Divider %d out of range\n", div); 278 return -EINVAL; 279 } 280 dev_dbg(&sai->pdev->dev, "SAI divider %d\n", div); 281 282 if (input_rate % div) 283 dev_dbg(&sai->pdev->dev, 284 "Rate not accurate. requested (%ld), actual (%ld)\n", 285 output_rate, input_rate / div); 286 287 return div; 288 } 289 290 static int stm32_sai_set_clk_div(struct stm32_sai_sub_data *sai, 291 unsigned int div) 292 { 293 int version = sai->pdata->conf->version; 294 int ret, cr1, mask; 295 296 if (div > SAI_XCR1_MCKDIV_MAX(version)) { 297 dev_err(&sai->pdev->dev, "Divider %d out of range\n", div); 298 return -EINVAL; 299 } 300 301 mask = SAI_XCR1_MCKDIV_MASK(SAI_XCR1_MCKDIV_WIDTH(version)); 302 cr1 = SAI_XCR1_MCKDIV_SET(div); 303 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, mask, cr1); 304 if (ret < 0) 305 dev_err(&sai->pdev->dev, "Failed to update CR1 register\n"); 306 307 return ret; 308 } 309 310 static long stm32_sai_mclk_round_rate(struct clk_hw *hw, unsigned long rate, 311 unsigned long *prate) 312 { 313 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw); 314 struct stm32_sai_sub_data *sai = mclk->sai_data; 315 int div; 316 317 div = stm32_sai_get_clk_div(sai, *prate, rate); 318 if (div < 0) 319 return div; 320 321 mclk->freq = *prate / div; 322 323 return mclk->freq; 324 } 325 326 static unsigned long stm32_sai_mclk_recalc_rate(struct clk_hw *hw, 327 unsigned long parent_rate) 328 { 329 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw); 330 331 return mclk->freq; 332 } 333 334 static int stm32_sai_mclk_set_rate(struct clk_hw *hw, unsigned long rate, 335 unsigned long parent_rate) 336 { 337 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw); 338 struct stm32_sai_sub_data *sai = mclk->sai_data; 339 unsigned int div; 340 int ret; 341 342 div = stm32_sai_get_clk_div(sai, parent_rate, rate); 343 if (div < 0) 344 return div; 345 346 ret = stm32_sai_set_clk_div(sai, div); 347 if (ret) 348 return ret; 349 350 mclk->freq = rate; 351 352 return 0; 353 } 354 355 static int stm32_sai_mclk_enable(struct clk_hw *hw) 356 { 357 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw); 358 struct stm32_sai_sub_data *sai = mclk->sai_data; 359 360 dev_dbg(&sai->pdev->dev, "Enable master clock\n"); 361 362 return regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, 363 SAI_XCR1_MCKEN, SAI_XCR1_MCKEN); 364 } 365 366 static void stm32_sai_mclk_disable(struct clk_hw *hw) 367 { 368 struct stm32_sai_mclk_data *mclk = to_mclk_data(hw); 369 struct stm32_sai_sub_data *sai = mclk->sai_data; 370 371 dev_dbg(&sai->pdev->dev, "Disable master clock\n"); 372 373 regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, SAI_XCR1_MCKEN, 0); 374 } 375 376 static const struct clk_ops mclk_ops = { 377 .enable = stm32_sai_mclk_enable, 378 .disable = stm32_sai_mclk_disable, 379 .recalc_rate = stm32_sai_mclk_recalc_rate, 380 .round_rate = stm32_sai_mclk_round_rate, 381 .set_rate = stm32_sai_mclk_set_rate, 382 }; 383 384 static int stm32_sai_add_mclk_provider(struct stm32_sai_sub_data *sai) 385 { 386 struct clk_hw *hw; 387 struct stm32_sai_mclk_data *mclk; 388 struct device *dev = &sai->pdev->dev; 389 const char *pname = __clk_get_name(sai->sai_ck); 390 char *mclk_name, *p, *s = (char *)pname; 391 int ret, i = 0; 392 393 mclk = devm_kzalloc(dev, sizeof(mclk), GFP_KERNEL); 394 if (!mclk) 395 return -ENOMEM; 396 397 mclk_name = devm_kcalloc(dev, sizeof(char), 398 SAI_MCLK_NAME_LEN, GFP_KERNEL); 399 if (!mclk_name) 400 return -ENOMEM; 401 402 /* 403 * Forge mclk clock name from parent clock name and suffix. 404 * String after "_" char is stripped in parent name. 405 */ 406 p = mclk_name; 407 while (*s && *s != '_' && (i < (SAI_MCLK_NAME_LEN - 7))) { 408 *p++ = *s++; 409 i++; 410 } 411 STM_SAI_IS_SUB_A(sai) ? strcat(p, "a_mclk") : strcat(p, "b_mclk"); 412 413 mclk->hw.init = CLK_HW_INIT(mclk_name, pname, &mclk_ops, 0); 414 mclk->sai_data = sai; 415 hw = &mclk->hw; 416 417 dev_dbg(dev, "Register master clock %s\n", mclk_name); 418 ret = devm_clk_hw_register(&sai->pdev->dev, hw); 419 if (ret) { 420 dev_err(dev, "mclk register returned %d\n", ret); 421 return ret; 422 } 423 sai->sai_mclk = hw->clk; 424 425 /* register mclk provider */ 426 return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw); 427 } 428 429 static irqreturn_t stm32_sai_isr(int irq, void *devid) 430 { 431 struct stm32_sai_sub_data *sai = (struct stm32_sai_sub_data *)devid; 432 struct platform_device *pdev = sai->pdev; 433 unsigned int sr, imr, flags; 434 snd_pcm_state_t status = SNDRV_PCM_STATE_RUNNING; 435 436 regmap_read(sai->regmap, STM_SAI_IMR_REGX, &imr); 437 regmap_read(sai->regmap, STM_SAI_SR_REGX, &sr); 438 439 flags = sr & imr; 440 if (!flags) 441 return IRQ_NONE; 442 443 regmap_update_bits(sai->regmap, STM_SAI_CLRFR_REGX, SAI_XCLRFR_MASK, 444 SAI_XCLRFR_MASK); 445 446 if (!sai->substream) { 447 dev_err(&pdev->dev, "Device stopped. Spurious IRQ 0x%x\n", sr); 448 return IRQ_NONE; 449 } 450 451 if (flags & SAI_XIMR_OVRUDRIE) { 452 dev_err(&pdev->dev, "IRQ %s\n", 453 STM_SAI_IS_PLAYBACK(sai) ? "underrun" : "overrun"); 454 status = SNDRV_PCM_STATE_XRUN; 455 } 456 457 if (flags & SAI_XIMR_MUTEDETIE) 458 dev_dbg(&pdev->dev, "IRQ mute detected\n"); 459 460 if (flags & SAI_XIMR_WCKCFGIE) { 461 dev_err(&pdev->dev, "IRQ wrong clock configuration\n"); 462 status = SNDRV_PCM_STATE_DISCONNECTED; 463 } 464 465 if (flags & SAI_XIMR_CNRDYIE) 466 dev_err(&pdev->dev, "IRQ Codec not ready\n"); 467 468 if (flags & SAI_XIMR_AFSDETIE) { 469 dev_err(&pdev->dev, "IRQ Anticipated frame synchro\n"); 470 status = SNDRV_PCM_STATE_XRUN; 471 } 472 473 if (flags & SAI_XIMR_LFSDETIE) { 474 dev_err(&pdev->dev, "IRQ Late frame synchro\n"); 475 status = SNDRV_PCM_STATE_XRUN; 476 } 477 478 if (status != SNDRV_PCM_STATE_RUNNING) 479 snd_pcm_stop_xrun(sai->substream); 480 481 return IRQ_HANDLED; 482 } 483 484 static int stm32_sai_set_sysclk(struct snd_soc_dai *cpu_dai, 485 int clk_id, unsigned int freq, int dir) 486 { 487 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 488 int ret; 489 490 if (dir == SND_SOC_CLOCK_OUT) { 491 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, 492 SAI_XCR1_NODIV, 493 (unsigned int)~SAI_XCR1_NODIV); 494 if (ret < 0) 495 return ret; 496 497 dev_dbg(cpu_dai->dev, "SAI MCLK frequency is %uHz\n", freq); 498 sai->mclk_rate = freq; 499 500 if (sai->sai_mclk) { 501 ret = clk_set_rate_exclusive(sai->sai_mclk, 502 sai->mclk_rate); 503 if (ret) { 504 dev_err(cpu_dai->dev, 505 "Could not set mclk rate\n"); 506 return ret; 507 } 508 } 509 } 510 511 return 0; 512 } 513 514 static int stm32_sai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask, 515 u32 rx_mask, int slots, int slot_width) 516 { 517 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 518 int slotr, slotr_mask, slot_size; 519 520 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { 521 dev_warn(cpu_dai->dev, "Slot setting relevant only for TDM\n"); 522 return 0; 523 } 524 525 dev_dbg(cpu_dai->dev, "Masks tx/rx:%#x/%#x, slots:%d, width:%d\n", 526 tx_mask, rx_mask, slots, slot_width); 527 528 switch (slot_width) { 529 case 16: 530 slot_size = SAI_SLOT_SIZE_16; 531 break; 532 case 32: 533 slot_size = SAI_SLOT_SIZE_32; 534 break; 535 default: 536 slot_size = SAI_SLOT_SIZE_AUTO; 537 break; 538 } 539 540 slotr = SAI_XSLOTR_SLOTSZ_SET(slot_size) | 541 SAI_XSLOTR_NBSLOT_SET(slots - 1); 542 slotr_mask = SAI_XSLOTR_SLOTSZ_MASK | SAI_XSLOTR_NBSLOT_MASK; 543 544 /* tx/rx mask set in machine init, if slot number defined in DT */ 545 if (STM_SAI_IS_PLAYBACK(sai)) { 546 sai->slot_mask = tx_mask; 547 slotr |= SAI_XSLOTR_SLOTEN_SET(tx_mask); 548 } 549 550 if (STM_SAI_IS_CAPTURE(sai)) { 551 sai->slot_mask = rx_mask; 552 slotr |= SAI_XSLOTR_SLOTEN_SET(rx_mask); 553 } 554 555 slotr_mask |= SAI_XSLOTR_SLOTEN_MASK; 556 557 regmap_update_bits(sai->regmap, STM_SAI_SLOTR_REGX, slotr_mask, slotr); 558 559 sai->slot_width = slot_width; 560 sai->slots = slots; 561 562 return 0; 563 } 564 565 static int stm32_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) 566 { 567 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 568 int cr1, frcr = 0; 569 int cr1_mask, frcr_mask = 0; 570 int ret; 571 572 dev_dbg(cpu_dai->dev, "fmt %x\n", fmt); 573 574 /* Do not generate master by default */ 575 cr1 = SAI_XCR1_NODIV; 576 cr1_mask = SAI_XCR1_NODIV; 577 578 cr1_mask |= SAI_XCR1_PRTCFG_MASK; 579 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { 580 cr1 |= SAI_XCR1_PRTCFG_SET(SAI_SPDIF_PROTOCOL); 581 goto conf_update; 582 } 583 584 cr1 |= SAI_XCR1_PRTCFG_SET(SAI_FREE_PROTOCOL); 585 586 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 587 /* SCK active high for all protocols */ 588 case SND_SOC_DAIFMT_I2S: 589 cr1 |= SAI_XCR1_CKSTR; 590 frcr |= SAI_XFRCR_FSOFF | SAI_XFRCR_FSDEF; 591 break; 592 /* Left justified */ 593 case SND_SOC_DAIFMT_MSB: 594 frcr |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSDEF; 595 break; 596 /* Right justified */ 597 case SND_SOC_DAIFMT_LSB: 598 frcr |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSDEF; 599 break; 600 case SND_SOC_DAIFMT_DSP_A: 601 frcr |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSOFF; 602 break; 603 case SND_SOC_DAIFMT_DSP_B: 604 frcr |= SAI_XFRCR_FSPOL; 605 break; 606 default: 607 dev_err(cpu_dai->dev, "Unsupported protocol %#x\n", 608 fmt & SND_SOC_DAIFMT_FORMAT_MASK); 609 return -EINVAL; 610 } 611 612 cr1_mask |= SAI_XCR1_CKSTR; 613 frcr_mask |= SAI_XFRCR_FSPOL | SAI_XFRCR_FSOFF | 614 SAI_XFRCR_FSDEF; 615 616 /* DAI clock strobing. Invert setting previously set */ 617 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 618 case SND_SOC_DAIFMT_NB_NF: 619 break; 620 case SND_SOC_DAIFMT_IB_NF: 621 cr1 ^= SAI_XCR1_CKSTR; 622 break; 623 case SND_SOC_DAIFMT_NB_IF: 624 frcr ^= SAI_XFRCR_FSPOL; 625 break; 626 case SND_SOC_DAIFMT_IB_IF: 627 /* Invert fs & sck */ 628 cr1 ^= SAI_XCR1_CKSTR; 629 frcr ^= SAI_XFRCR_FSPOL; 630 break; 631 default: 632 dev_err(cpu_dai->dev, "Unsupported strobing %#x\n", 633 fmt & SND_SOC_DAIFMT_INV_MASK); 634 return -EINVAL; 635 } 636 cr1_mask |= SAI_XCR1_CKSTR; 637 frcr_mask |= SAI_XFRCR_FSPOL; 638 639 regmap_update_bits(sai->regmap, STM_SAI_FRCR_REGX, frcr_mask, frcr); 640 641 /* DAI clock master masks */ 642 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 643 case SND_SOC_DAIFMT_CBM_CFM: 644 /* codec is master */ 645 cr1 |= SAI_XCR1_SLAVE; 646 sai->master = false; 647 break; 648 case SND_SOC_DAIFMT_CBS_CFS: 649 sai->master = true; 650 break; 651 default: 652 dev_err(cpu_dai->dev, "Unsupported mode %#x\n", 653 fmt & SND_SOC_DAIFMT_MASTER_MASK); 654 return -EINVAL; 655 } 656 657 /* Set slave mode if sub-block is synchronized with another SAI */ 658 if (sai->sync) { 659 dev_dbg(cpu_dai->dev, "Synchronized SAI configured as slave\n"); 660 cr1 |= SAI_XCR1_SLAVE; 661 sai->master = false; 662 } 663 664 cr1_mask |= SAI_XCR1_SLAVE; 665 666 conf_update: 667 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, cr1_mask, cr1); 668 if (ret < 0) { 669 dev_err(cpu_dai->dev, "Failed to update CR1 register\n"); 670 return ret; 671 } 672 673 sai->fmt = fmt; 674 675 return 0; 676 } 677 678 static int stm32_sai_startup(struct snd_pcm_substream *substream, 679 struct snd_soc_dai *cpu_dai) 680 { 681 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 682 int imr, cr2, ret; 683 684 sai->substream = substream; 685 686 ret = clk_prepare_enable(sai->sai_ck); 687 if (ret < 0) { 688 dev_err(cpu_dai->dev, "Failed to enable clock: %d\n", ret); 689 return ret; 690 } 691 692 /* Enable ITs */ 693 694 regmap_update_bits(sai->regmap, STM_SAI_CLRFR_REGX, 695 SAI_XCLRFR_MASK, SAI_XCLRFR_MASK); 696 697 imr = SAI_XIMR_OVRUDRIE; 698 if (STM_SAI_IS_CAPTURE(sai)) { 699 regmap_read(sai->regmap, STM_SAI_CR2_REGX, &cr2); 700 if (cr2 & SAI_XCR2_MUTECNT_MASK) 701 imr |= SAI_XIMR_MUTEDETIE; 702 } 703 704 if (sai->master) 705 imr |= SAI_XIMR_WCKCFGIE; 706 else 707 imr |= SAI_XIMR_AFSDETIE | SAI_XIMR_LFSDETIE; 708 709 regmap_update_bits(sai->regmap, STM_SAI_IMR_REGX, 710 SAI_XIMR_MASK, imr); 711 712 return 0; 713 } 714 715 static int stm32_sai_set_config(struct snd_soc_dai *cpu_dai, 716 struct snd_pcm_substream *substream, 717 struct snd_pcm_hw_params *params) 718 { 719 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 720 int cr1, cr1_mask, ret; 721 722 /* 723 * DMA bursts increment is set to 4 words. 724 * SAI fifo threshold is set to half fifo, to keep enough space 725 * for DMA incoming bursts. 726 */ 727 regmap_update_bits(sai->regmap, STM_SAI_CR2_REGX, 728 SAI_XCR2_FFLUSH | SAI_XCR2_FTH_MASK, 729 SAI_XCR2_FFLUSH | 730 SAI_XCR2_FTH_SET(STM_SAI_FIFO_TH_HALF)); 731 732 /* DS bits in CR1 not set for SPDIF (size forced to 24 bits).*/ 733 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { 734 sai->spdif_frm_cnt = 0; 735 return 0; 736 } 737 738 /* Mode, data format and channel config */ 739 cr1_mask = SAI_XCR1_DS_MASK; 740 switch (params_format(params)) { 741 case SNDRV_PCM_FORMAT_S8: 742 cr1 = SAI_XCR1_DS_SET(SAI_DATASIZE_8); 743 break; 744 case SNDRV_PCM_FORMAT_S16_LE: 745 cr1 = SAI_XCR1_DS_SET(SAI_DATASIZE_16); 746 break; 747 case SNDRV_PCM_FORMAT_S32_LE: 748 cr1 = SAI_XCR1_DS_SET(SAI_DATASIZE_32); 749 break; 750 default: 751 dev_err(cpu_dai->dev, "Data format not supported"); 752 return -EINVAL; 753 } 754 755 cr1_mask |= SAI_XCR1_MONO; 756 if ((sai->slots == 2) && (params_channels(params) == 1)) 757 cr1 |= SAI_XCR1_MONO; 758 759 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, cr1_mask, cr1); 760 if (ret < 0) { 761 dev_err(cpu_dai->dev, "Failed to update CR1 register\n"); 762 return ret; 763 } 764 765 return 0; 766 } 767 768 static int stm32_sai_set_slots(struct snd_soc_dai *cpu_dai) 769 { 770 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 771 int slotr, slot_sz; 772 773 regmap_read(sai->regmap, STM_SAI_SLOTR_REGX, &slotr); 774 775 /* 776 * If SLOTSZ is set to auto in SLOTR, align slot width on data size 777 * By default slot width = data size, if not forced from DT 778 */ 779 slot_sz = slotr & SAI_XSLOTR_SLOTSZ_MASK; 780 if (slot_sz == SAI_XSLOTR_SLOTSZ_SET(SAI_SLOT_SIZE_AUTO)) 781 sai->slot_width = sai->data_size; 782 783 if (sai->slot_width < sai->data_size) { 784 dev_err(cpu_dai->dev, 785 "Data size %d larger than slot width\n", 786 sai->data_size); 787 return -EINVAL; 788 } 789 790 /* Slot number is set to 2, if not specified in DT */ 791 if (!sai->slots) 792 sai->slots = 2; 793 794 /* The number of slots in the audio frame is equal to NBSLOT[3:0] + 1*/ 795 regmap_update_bits(sai->regmap, STM_SAI_SLOTR_REGX, 796 SAI_XSLOTR_NBSLOT_MASK, 797 SAI_XSLOTR_NBSLOT_SET((sai->slots - 1))); 798 799 /* Set default slots mask if not already set from DT */ 800 if (!(slotr & SAI_XSLOTR_SLOTEN_MASK)) { 801 sai->slot_mask = (1 << sai->slots) - 1; 802 regmap_update_bits(sai->regmap, 803 STM_SAI_SLOTR_REGX, SAI_XSLOTR_SLOTEN_MASK, 804 SAI_XSLOTR_SLOTEN_SET(sai->slot_mask)); 805 } 806 807 dev_dbg(cpu_dai->dev, "Slots %d, slot width %d\n", 808 sai->slots, sai->slot_width); 809 810 return 0; 811 } 812 813 static void stm32_sai_set_frame(struct snd_soc_dai *cpu_dai) 814 { 815 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 816 int fs_active, offset, format; 817 int frcr, frcr_mask; 818 819 format = sai->fmt & SND_SOC_DAIFMT_FORMAT_MASK; 820 sai->fs_length = sai->slot_width * sai->slots; 821 822 fs_active = sai->fs_length / 2; 823 if ((format == SND_SOC_DAIFMT_DSP_A) || 824 (format == SND_SOC_DAIFMT_DSP_B)) 825 fs_active = 1; 826 827 frcr = SAI_XFRCR_FRL_SET((sai->fs_length - 1)); 828 frcr |= SAI_XFRCR_FSALL_SET((fs_active - 1)); 829 frcr_mask = SAI_XFRCR_FRL_MASK | SAI_XFRCR_FSALL_MASK; 830 831 dev_dbg(cpu_dai->dev, "Frame length %d, frame active %d\n", 832 sai->fs_length, fs_active); 833 834 regmap_update_bits(sai->regmap, STM_SAI_FRCR_REGX, frcr_mask, frcr); 835 836 if ((sai->fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_LSB) { 837 offset = sai->slot_width - sai->data_size; 838 839 regmap_update_bits(sai->regmap, STM_SAI_SLOTR_REGX, 840 SAI_XSLOTR_FBOFF_MASK, 841 SAI_XSLOTR_FBOFF_SET(offset)); 842 } 843 } 844 845 static void stm32_sai_init_iec958_status(struct stm32_sai_sub_data *sai) 846 { 847 unsigned char *cs = sai->iec958.status; 848 849 cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; 850 cs[1] = IEC958_AES1_CON_GENERAL; 851 cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; 852 cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | IEC958_AES3_CON_FS_NOTID; 853 } 854 855 static void stm32_sai_set_iec958_status(struct stm32_sai_sub_data *sai, 856 struct snd_pcm_runtime *runtime) 857 { 858 if (!runtime) 859 return; 860 861 /* Force the sample rate according to runtime rate */ 862 mutex_lock(&sai->ctrl_lock); 863 switch (runtime->rate) { 864 case 22050: 865 sai->iec958.status[3] = IEC958_AES3_CON_FS_22050; 866 break; 867 case 44100: 868 sai->iec958.status[3] = IEC958_AES3_CON_FS_44100; 869 break; 870 case 88200: 871 sai->iec958.status[3] = IEC958_AES3_CON_FS_88200; 872 break; 873 case 176400: 874 sai->iec958.status[3] = IEC958_AES3_CON_FS_176400; 875 break; 876 case 24000: 877 sai->iec958.status[3] = IEC958_AES3_CON_FS_24000; 878 break; 879 case 48000: 880 sai->iec958.status[3] = IEC958_AES3_CON_FS_48000; 881 break; 882 case 96000: 883 sai->iec958.status[3] = IEC958_AES3_CON_FS_96000; 884 break; 885 case 192000: 886 sai->iec958.status[3] = IEC958_AES3_CON_FS_192000; 887 break; 888 case 32000: 889 sai->iec958.status[3] = IEC958_AES3_CON_FS_32000; 890 break; 891 default: 892 sai->iec958.status[3] = IEC958_AES3_CON_FS_NOTID; 893 break; 894 } 895 mutex_unlock(&sai->ctrl_lock); 896 } 897 898 static int stm32_sai_configure_clock(struct snd_soc_dai *cpu_dai, 899 struct snd_pcm_hw_params *params) 900 { 901 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 902 int cr1, mask, div = 0; 903 int sai_clk_rate, mclk_ratio, den; 904 unsigned int rate = params_rate(params); 905 906 if (!(rate % 11025)) 907 clk_set_parent(sai->sai_ck, sai->pdata->clk_x11k); 908 else 909 clk_set_parent(sai->sai_ck, sai->pdata->clk_x8k); 910 sai_clk_rate = clk_get_rate(sai->sai_ck); 911 912 if (STM_SAI_IS_F4(sai->pdata)) { 913 /* mclk on (NODIV=0) 914 * mclk_rate = 256 * fs 915 * MCKDIV = 0 if sai_ck < 3/2 * mclk_rate 916 * MCKDIV = sai_ck / (2 * mclk_rate) otherwise 917 * mclk off (NODIV=1) 918 * MCKDIV ignored. sck = sai_ck 919 */ 920 if (!sai->mclk_rate) 921 return 0; 922 923 if (2 * sai_clk_rate >= 3 * sai->mclk_rate) { 924 div = stm32_sai_get_clk_div(sai, sai_clk_rate, 925 2 * sai->mclk_rate); 926 if (div < 0) 927 return div; 928 } 929 } else { 930 /* 931 * TDM mode : 932 * mclk on 933 * MCKDIV = sai_ck / (ws x 256) (NOMCK=0. OSR=0) 934 * MCKDIV = sai_ck / (ws x 512) (NOMCK=0. OSR=1) 935 * mclk off 936 * MCKDIV = sai_ck / (frl x ws) (NOMCK=1) 937 * Note: NOMCK/NODIV correspond to same bit. 938 */ 939 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { 940 div = stm32_sai_get_clk_div(sai, sai_clk_rate, 941 rate * 128); 942 if (div < 0) 943 return div; 944 } else { 945 if (sai->mclk_rate) { 946 mclk_ratio = sai->mclk_rate / rate; 947 if (mclk_ratio == 512) { 948 mask = SAI_XCR1_OSR; 949 cr1 = SAI_XCR1_OSR; 950 } else if (mclk_ratio != 256) { 951 dev_err(cpu_dai->dev, 952 "Wrong mclk ratio %d\n", 953 mclk_ratio); 954 return -EINVAL; 955 } 956 div = stm32_sai_get_clk_div(sai, sai_clk_rate, 957 sai->mclk_rate); 958 if (div < 0) 959 return div; 960 } else { 961 /* mclk-fs not set, master clock not active */ 962 den = sai->fs_length * params_rate(params); 963 div = stm32_sai_get_clk_div(sai, sai_clk_rate, 964 den); 965 if (div < 0) 966 return div; 967 } 968 } 969 } 970 971 return stm32_sai_set_clk_div(sai, div); 972 } 973 974 static int stm32_sai_hw_params(struct snd_pcm_substream *substream, 975 struct snd_pcm_hw_params *params, 976 struct snd_soc_dai *cpu_dai) 977 { 978 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 979 int ret; 980 981 sai->data_size = params_width(params); 982 983 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { 984 /* Rate not already set in runtime structure */ 985 substream->runtime->rate = params_rate(params); 986 stm32_sai_set_iec958_status(sai, substream->runtime); 987 } else { 988 ret = stm32_sai_set_slots(cpu_dai); 989 if (ret < 0) 990 return ret; 991 stm32_sai_set_frame(cpu_dai); 992 } 993 994 ret = stm32_sai_set_config(cpu_dai, substream, params); 995 if (ret) 996 return ret; 997 998 if (sai->master) 999 ret = stm32_sai_configure_clock(cpu_dai, params); 1000 1001 return ret; 1002 } 1003 1004 static int stm32_sai_trigger(struct snd_pcm_substream *substream, int cmd, 1005 struct snd_soc_dai *cpu_dai) 1006 { 1007 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 1008 int ret; 1009 1010 switch (cmd) { 1011 case SNDRV_PCM_TRIGGER_START: 1012 case SNDRV_PCM_TRIGGER_RESUME: 1013 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 1014 dev_dbg(cpu_dai->dev, "Enable DMA and SAI\n"); 1015 1016 regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, 1017 SAI_XCR1_DMAEN, SAI_XCR1_DMAEN); 1018 1019 /* Enable SAI */ 1020 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, 1021 SAI_XCR1_SAIEN, SAI_XCR1_SAIEN); 1022 if (ret < 0) 1023 dev_err(cpu_dai->dev, "Failed to update CR1 register\n"); 1024 break; 1025 case SNDRV_PCM_TRIGGER_SUSPEND: 1026 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 1027 case SNDRV_PCM_TRIGGER_STOP: 1028 dev_dbg(cpu_dai->dev, "Disable DMA and SAI\n"); 1029 1030 regmap_update_bits(sai->regmap, STM_SAI_IMR_REGX, 1031 SAI_XIMR_MASK, 0); 1032 1033 regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, 1034 SAI_XCR1_SAIEN, 1035 (unsigned int)~SAI_XCR1_SAIEN); 1036 1037 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, 1038 SAI_XCR1_DMAEN, 1039 (unsigned int)~SAI_XCR1_DMAEN); 1040 if (ret < 0) 1041 dev_err(cpu_dai->dev, "Failed to update CR1 register\n"); 1042 1043 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) 1044 sai->spdif_frm_cnt = 0; 1045 break; 1046 default: 1047 return -EINVAL; 1048 } 1049 1050 return ret; 1051 } 1052 1053 static void stm32_sai_shutdown(struct snd_pcm_substream *substream, 1054 struct snd_soc_dai *cpu_dai) 1055 { 1056 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); 1057 1058 regmap_update_bits(sai->regmap, STM_SAI_IMR_REGX, SAI_XIMR_MASK, 0); 1059 1060 regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, SAI_XCR1_NODIV, 1061 SAI_XCR1_NODIV); 1062 1063 clk_disable_unprepare(sai->sai_ck); 1064 1065 clk_rate_exclusive_put(sai->sai_mclk); 1066 1067 sai->substream = NULL; 1068 } 1069 1070 static int stm32_sai_pcm_new(struct snd_soc_pcm_runtime *rtd, 1071 struct snd_soc_dai *cpu_dai) 1072 { 1073 struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev); 1074 1075 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { 1076 dev_dbg(&sai->pdev->dev, "%s: register iec controls", __func__); 1077 return snd_ctl_add(rtd->pcm->card, 1078 snd_ctl_new1(&iec958_ctls, sai)); 1079 } 1080 1081 return 0; 1082 } 1083 1084 static int stm32_sai_dai_probe(struct snd_soc_dai *cpu_dai) 1085 { 1086 struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev); 1087 int cr1 = 0, cr1_mask; 1088 1089 sai->cpu_dai = cpu_dai; 1090 1091 sai->dma_params.addr = (dma_addr_t)(sai->phys_addr + STM_SAI_DR_REGX); 1092 /* 1093 * DMA supports 4, 8 or 16 burst sizes. Burst size 4 is the best choice, 1094 * as it allows bytes, half-word and words transfers. (See DMA fifos 1095 * constraints). 1096 */ 1097 sai->dma_params.maxburst = 4; 1098 /* Buswidth will be set by framework at runtime */ 1099 sai->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_UNDEFINED; 1100 1101 if (STM_SAI_IS_PLAYBACK(sai)) 1102 snd_soc_dai_init_dma_data(cpu_dai, &sai->dma_params, NULL); 1103 else 1104 snd_soc_dai_init_dma_data(cpu_dai, NULL, &sai->dma_params); 1105 1106 /* Next settings are not relevant for spdif mode */ 1107 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) 1108 return 0; 1109 1110 cr1_mask = SAI_XCR1_RX_TX; 1111 if (STM_SAI_IS_CAPTURE(sai)) 1112 cr1 |= SAI_XCR1_RX_TX; 1113 1114 /* Configure synchronization */ 1115 if (sai->sync == SAI_SYNC_EXTERNAL) { 1116 /* Configure synchro client and provider */ 1117 sai->pdata->set_sync(sai->pdata, sai->np_sync_provider, 1118 sai->synco, sai->synci); 1119 } 1120 1121 cr1_mask |= SAI_XCR1_SYNCEN_MASK; 1122 cr1 |= SAI_XCR1_SYNCEN_SET(sai->sync); 1123 1124 return regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, cr1_mask, cr1); 1125 } 1126 1127 static const struct snd_soc_dai_ops stm32_sai_pcm_dai_ops = { 1128 .set_sysclk = stm32_sai_set_sysclk, 1129 .set_fmt = stm32_sai_set_dai_fmt, 1130 .set_tdm_slot = stm32_sai_set_dai_tdm_slot, 1131 .startup = stm32_sai_startup, 1132 .hw_params = stm32_sai_hw_params, 1133 .trigger = stm32_sai_trigger, 1134 .shutdown = stm32_sai_shutdown, 1135 }; 1136 1137 static int stm32_sai_pcm_process_spdif(struct snd_pcm_substream *substream, 1138 int channel, unsigned long hwoff, 1139 void *buf, unsigned long bytes) 1140 { 1141 struct snd_pcm_runtime *runtime = substream->runtime; 1142 struct snd_soc_pcm_runtime *rtd = substream->private_data; 1143 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1144 struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev); 1145 int *ptr = (int *)(runtime->dma_area + hwoff + 1146 channel * (runtime->dma_bytes / runtime->channels)); 1147 ssize_t cnt = bytes_to_samples(runtime, bytes); 1148 unsigned int frm_cnt = sai->spdif_frm_cnt; 1149 unsigned int byte; 1150 unsigned int mask; 1151 1152 do { 1153 *ptr = ((*ptr >> 8) & 0x00ffffff); 1154 1155 /* Set channel status bit */ 1156 byte = frm_cnt >> 3; 1157 mask = 1 << (frm_cnt - (byte << 3)); 1158 if (sai->iec958.status[byte] & mask) 1159 *ptr |= 0x04000000; 1160 ptr++; 1161 1162 if (!(cnt % 2)) 1163 frm_cnt++; 1164 1165 if (frm_cnt == SAI_IEC60958_BLOCK_FRAMES) 1166 frm_cnt = 0; 1167 } while (--cnt); 1168 sai->spdif_frm_cnt = frm_cnt; 1169 1170 return 0; 1171 } 1172 1173 static const struct snd_pcm_hardware stm32_sai_pcm_hw = { 1174 .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP, 1175 .buffer_bytes_max = 8 * PAGE_SIZE, 1176 .period_bytes_min = 1024, /* 5ms at 48kHz */ 1177 .period_bytes_max = PAGE_SIZE, 1178 .periods_min = 2, 1179 .periods_max = 8, 1180 }; 1181 1182 static struct snd_soc_dai_driver stm32_sai_playback_dai[] = { 1183 { 1184 .probe = stm32_sai_dai_probe, 1185 .pcm_new = stm32_sai_pcm_new, 1186 .id = 1, /* avoid call to fmt_single_name() */ 1187 .playback = { 1188 .channels_min = 1, 1189 .channels_max = 2, 1190 .rate_min = 8000, 1191 .rate_max = 192000, 1192 .rates = SNDRV_PCM_RATE_CONTINUOUS, 1193 /* DMA does not support 24 bits transfers */ 1194 .formats = 1195 SNDRV_PCM_FMTBIT_S8 | 1196 SNDRV_PCM_FMTBIT_S16_LE | 1197 SNDRV_PCM_FMTBIT_S32_LE, 1198 }, 1199 .ops = &stm32_sai_pcm_dai_ops, 1200 } 1201 }; 1202 1203 static struct snd_soc_dai_driver stm32_sai_capture_dai[] = { 1204 { 1205 .probe = stm32_sai_dai_probe, 1206 .id = 1, /* avoid call to fmt_single_name() */ 1207 .capture = { 1208 .channels_min = 1, 1209 .channels_max = 2, 1210 .rate_min = 8000, 1211 .rate_max = 192000, 1212 .rates = SNDRV_PCM_RATE_CONTINUOUS, 1213 /* DMA does not support 24 bits transfers */ 1214 .formats = 1215 SNDRV_PCM_FMTBIT_S8 | 1216 SNDRV_PCM_FMTBIT_S16_LE | 1217 SNDRV_PCM_FMTBIT_S32_LE, 1218 }, 1219 .ops = &stm32_sai_pcm_dai_ops, 1220 } 1221 }; 1222 1223 static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config = { 1224 .pcm_hardware = &stm32_sai_pcm_hw, 1225 .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, 1226 }; 1227 1228 static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config_spdif = { 1229 .pcm_hardware = &stm32_sai_pcm_hw, 1230 .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, 1231 .process = stm32_sai_pcm_process_spdif, 1232 }; 1233 1234 static const struct snd_soc_component_driver stm32_component = { 1235 .name = "stm32-sai", 1236 }; 1237 1238 static const struct of_device_id stm32_sai_sub_ids[] = { 1239 { .compatible = "st,stm32-sai-sub-a", 1240 .data = (void *)STM_SAI_A_ID}, 1241 { .compatible = "st,stm32-sai-sub-b", 1242 .data = (void *)STM_SAI_B_ID}, 1243 {} 1244 }; 1245 MODULE_DEVICE_TABLE(of, stm32_sai_sub_ids); 1246 1247 static int stm32_sai_sub_parse_of(struct platform_device *pdev, 1248 struct stm32_sai_sub_data *sai) 1249 { 1250 struct device_node *np = pdev->dev.of_node; 1251 struct resource *res; 1252 void __iomem *base; 1253 struct of_phandle_args args; 1254 int ret; 1255 1256 if (!np) 1257 return -ENODEV; 1258 1259 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1260 base = devm_ioremap_resource(&pdev->dev, res); 1261 if (IS_ERR(base)) 1262 return PTR_ERR(base); 1263 1264 sai->phys_addr = res->start; 1265 1266 sai->regmap_config = &stm32_sai_sub_regmap_config_f4; 1267 /* Note: PDM registers not available for H7 sub-block B */ 1268 if (STM_SAI_IS_H7(sai->pdata) && STM_SAI_IS_SUB_A(sai)) 1269 sai->regmap_config = &stm32_sai_sub_regmap_config_h7; 1270 1271 sai->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "sai_ck", 1272 base, sai->regmap_config); 1273 if (IS_ERR(sai->regmap)) { 1274 dev_err(&pdev->dev, "Failed to initialize MMIO\n"); 1275 return PTR_ERR(sai->regmap); 1276 } 1277 1278 /* Get direction property */ 1279 if (of_property_match_string(np, "dma-names", "tx") >= 0) { 1280 sai->dir = SNDRV_PCM_STREAM_PLAYBACK; 1281 } else if (of_property_match_string(np, "dma-names", "rx") >= 0) { 1282 sai->dir = SNDRV_PCM_STREAM_CAPTURE; 1283 } else { 1284 dev_err(&pdev->dev, "Unsupported direction\n"); 1285 return -EINVAL; 1286 } 1287 1288 /* Get spdif iec60958 property */ 1289 sai->spdif = false; 1290 if (of_get_property(np, "st,iec60958", NULL)) { 1291 if (!STM_SAI_HAS_SPDIF(sai) || 1292 sai->dir == SNDRV_PCM_STREAM_CAPTURE) { 1293 dev_err(&pdev->dev, "S/PDIF IEC60958 not supported\n"); 1294 return -EINVAL; 1295 } 1296 stm32_sai_init_iec958_status(sai); 1297 sai->spdif = true; 1298 sai->master = true; 1299 } 1300 1301 /* Get synchronization property */ 1302 args.np = NULL; 1303 ret = of_parse_phandle_with_fixed_args(np, "st,sync", 1, 0, &args); 1304 if (ret < 0 && ret != -ENOENT) { 1305 dev_err(&pdev->dev, "Failed to get st,sync property\n"); 1306 return ret; 1307 } 1308 1309 sai->sync = SAI_SYNC_NONE; 1310 if (args.np) { 1311 if (args.np == np) { 1312 dev_err(&pdev->dev, "%pOFn sync own reference\n", np); 1313 of_node_put(args.np); 1314 return -EINVAL; 1315 } 1316 1317 sai->np_sync_provider = of_get_parent(args.np); 1318 if (!sai->np_sync_provider) { 1319 dev_err(&pdev->dev, "%pOFn parent node not found\n", 1320 np); 1321 of_node_put(args.np); 1322 return -ENODEV; 1323 } 1324 1325 sai->sync = SAI_SYNC_INTERNAL; 1326 if (sai->np_sync_provider != sai->pdata->pdev->dev.of_node) { 1327 if (!STM_SAI_HAS_EXT_SYNC(sai)) { 1328 dev_err(&pdev->dev, 1329 "External synchro not supported\n"); 1330 of_node_put(args.np); 1331 return -EINVAL; 1332 } 1333 sai->sync = SAI_SYNC_EXTERNAL; 1334 1335 sai->synci = args.args[0]; 1336 if (sai->synci < 1 || 1337 (sai->synci > (SAI_GCR_SYNCIN_MAX + 1))) { 1338 dev_err(&pdev->dev, "Wrong SAI index\n"); 1339 of_node_put(args.np); 1340 return -EINVAL; 1341 } 1342 1343 if (of_property_match_string(args.np, "compatible", 1344 "st,stm32-sai-sub-a") >= 0) 1345 sai->synco = STM_SAI_SYNC_OUT_A; 1346 1347 if (of_property_match_string(args.np, "compatible", 1348 "st,stm32-sai-sub-b") >= 0) 1349 sai->synco = STM_SAI_SYNC_OUT_B; 1350 1351 if (!sai->synco) { 1352 dev_err(&pdev->dev, "Unknown SAI sub-block\n"); 1353 of_node_put(args.np); 1354 return -EINVAL; 1355 } 1356 } 1357 1358 dev_dbg(&pdev->dev, "%s synchronized with %s\n", 1359 pdev->name, args.np->full_name); 1360 } 1361 1362 of_node_put(args.np); 1363 sai->sai_ck = devm_clk_get(&pdev->dev, "sai_ck"); 1364 if (IS_ERR(sai->sai_ck)) { 1365 dev_err(&pdev->dev, "Missing kernel clock sai_ck\n"); 1366 return PTR_ERR(sai->sai_ck); 1367 } 1368 1369 if (STM_SAI_IS_F4(sai->pdata)) 1370 return 0; 1371 1372 /* Register mclk provider if requested */ 1373 if (of_find_property(np, "#clock-cells", NULL)) { 1374 ret = stm32_sai_add_mclk_provider(sai); 1375 if (ret < 0) 1376 return ret; 1377 } else { 1378 sai->sai_mclk = devm_clk_get(&pdev->dev, "MCLK"); 1379 if (IS_ERR(sai->sai_mclk)) { 1380 if (PTR_ERR(sai->sai_mclk) != -ENOENT) 1381 return PTR_ERR(sai->sai_mclk); 1382 sai->sai_mclk = NULL; 1383 } 1384 } 1385 1386 return 0; 1387 } 1388 1389 static int stm32_sai_sub_dais_init(struct platform_device *pdev, 1390 struct stm32_sai_sub_data *sai) 1391 { 1392 sai->cpu_dai_drv = devm_kzalloc(&pdev->dev, 1393 sizeof(struct snd_soc_dai_driver), 1394 GFP_KERNEL); 1395 if (!sai->cpu_dai_drv) 1396 return -ENOMEM; 1397 1398 sai->cpu_dai_drv->name = dev_name(&pdev->dev); 1399 if (STM_SAI_IS_PLAYBACK(sai)) { 1400 memcpy(sai->cpu_dai_drv, &stm32_sai_playback_dai, 1401 sizeof(stm32_sai_playback_dai)); 1402 sai->cpu_dai_drv->playback.stream_name = sai->cpu_dai_drv->name; 1403 } else { 1404 memcpy(sai->cpu_dai_drv, &stm32_sai_capture_dai, 1405 sizeof(stm32_sai_capture_dai)); 1406 sai->cpu_dai_drv->capture.stream_name = sai->cpu_dai_drv->name; 1407 } 1408 1409 return 0; 1410 } 1411 1412 static int stm32_sai_sub_probe(struct platform_device *pdev) 1413 { 1414 struct stm32_sai_sub_data *sai; 1415 const struct of_device_id *of_id; 1416 const struct snd_dmaengine_pcm_config *conf = &stm32_sai_pcm_config; 1417 int ret; 1418 1419 sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL); 1420 if (!sai) 1421 return -ENOMEM; 1422 1423 of_id = of_match_device(stm32_sai_sub_ids, &pdev->dev); 1424 if (!of_id) 1425 return -EINVAL; 1426 sai->id = (uintptr_t)of_id->data; 1427 1428 sai->pdev = pdev; 1429 mutex_init(&sai->ctrl_lock); 1430 platform_set_drvdata(pdev, sai); 1431 1432 sai->pdata = dev_get_drvdata(pdev->dev.parent); 1433 if (!sai->pdata) { 1434 dev_err(&pdev->dev, "Parent device data not available\n"); 1435 return -EINVAL; 1436 } 1437 1438 ret = stm32_sai_sub_parse_of(pdev, sai); 1439 if (ret) 1440 return ret; 1441 1442 ret = stm32_sai_sub_dais_init(pdev, sai); 1443 if (ret) 1444 return ret; 1445 1446 ret = devm_request_irq(&pdev->dev, sai->pdata->irq, stm32_sai_isr, 1447 IRQF_SHARED, dev_name(&pdev->dev), sai); 1448 if (ret) { 1449 dev_err(&pdev->dev, "IRQ request returned %d\n", ret); 1450 return ret; 1451 } 1452 1453 ret = devm_snd_soc_register_component(&pdev->dev, &stm32_component, 1454 sai->cpu_dai_drv, 1); 1455 if (ret) 1456 return ret; 1457 1458 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) 1459 conf = &stm32_sai_pcm_config_spdif; 1460 1461 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, conf, 0); 1462 if (ret) { 1463 dev_err(&pdev->dev, "Could not register pcm dma\n"); 1464 return ret; 1465 } 1466 1467 return 0; 1468 } 1469 1470 static struct platform_driver stm32_sai_sub_driver = { 1471 .driver = { 1472 .name = "st,stm32-sai-sub", 1473 .of_match_table = stm32_sai_sub_ids, 1474 }, 1475 .probe = stm32_sai_sub_probe, 1476 }; 1477 1478 module_platform_driver(stm32_sai_sub_driver); 1479 1480 MODULE_DESCRIPTION("STM32 Soc SAI sub-block Interface"); 1481 MODULE_AUTHOR("Olivier Moysan <olivier.moysan@st.com>"); 1482 MODULE_ALIAS("platform:st,stm32-sai-sub"); 1483 MODULE_LICENSE("GPL v2"); 1484