Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge remote-tracking branches 'asoc/topic/rk3036', 'asoc/topic/rockchip', 'asoc/topic/rt274' and 'asoc/topic/rt5514' into asoc-next

+444 -201
+5 -2
Documentation/devicetree/bindings/sound/rockchip,pdm.txt
··· 29 29 dma-names = "rx"; 30 30 pinctrl-names = "default", "sleep"; 31 31 pinctrl-0 = <&pdmm0_clk 32 - &pdmm0_fsync 33 32 &pdmm0_sdi0 34 33 &pdmm0_sdi1 35 34 &pdmm0_sdi2 36 35 &pdmm0_sdi3>; 37 - pinctrl-1 = <&pdmm0_sleep>; 36 + pinctrl-1 = <&pdmm0_clk_sleep 37 + &pdmm0_sdi0_sleep 38 + &pdmm0_sdi1_sleep 39 + &pdmm0_sdi2_sleep 40 + &pdmm0_sdi3_sleep>; 38 41 status = "disabled"; 39 42 };
+1 -1
Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
··· 4 4 - compatible: "rockchip,rk3399-gru-sound" 5 5 - rockchip,cpu: The phandle of the Rockchip I2S controller that's 6 6 connected to the codecs 7 - - rockchip,codec: The phandle of the MAX98357A/RT5514/DA7219 codecs 7 + - rockchip,codec: The phandle of the audio codecs 8 8 9 9 Optional properties: 10 10 - dmic-wakeup-delay-ms : specify delay time (ms) for DMIC ready.
+4
Documentation/devicetree/bindings/sound/rockchip-i2s.txt
··· 7 7 8 8 - compatible: should be one of the following: 9 9 - "rockchip,rk3066-i2s": for rk3066 10 + - "rockchip,rk3036-i2s", "rockchip,rk3066-i2s": for rk3036 10 11 - "rockchip,rk3188-i2s", "rockchip,rk3066-i2s": for rk3188 12 + - "rockchip,rk3228-i2s", "rockchip,rk3066-i2s": for rk3228 11 13 - "rockchip,rk3288-i2s", "rockchip,rk3066-i2s": for rk3288 14 + - "rockchip,rk3328-i2s", "rockchip,rk3066-i2s": for rk3328 15 + - "rockchip,rk3366-i2s", "rockchip,rk3066-i2s": for rk3366 12 16 - "rockchip,rk3368-i2s", "rockchip,rk3066-i2s": for rk3368 13 17 - "rockchip,rk3399-i2s", "rockchip,rk3066-i2s": for rk3399 14 18 - reg: physical base address of the controller and length of memory mapped
+1
sound/soc/codecs/rt274.c
··· 1102 1102 1103 1103 static const struct acpi_device_id rt274_acpi_match[] = { 1104 1104 { "10EC0274", 0 }, 1105 + { "INT34C2", 0 }, 1105 1106 {}, 1106 1107 }; 1107 1108 MODULE_DEVICE_TABLE(acpi, rt274_acpi_match);
+78 -66
sound/soc/codecs/rt5514-spi.c
··· 43 43 struct mutex dma_lock; 44 44 struct snd_pcm_substream *substream; 45 45 unsigned int buf_base, buf_limit, buf_rp; 46 - size_t buf_size; 47 - size_t dma_offset; 48 - size_t dsp_offset; 46 + size_t buf_size, get_size, dma_offset; 49 47 }; 50 48 51 49 static const struct snd_pcm_hardware rt5514_spi_pcm_hardware = { ··· 78 80 container_of(work, struct rt5514_dsp, copy_work.work); 79 81 struct snd_pcm_runtime *runtime; 80 82 size_t period_bytes, truncated_bytes = 0; 83 + unsigned int cur_wp, remain_data; 84 + u8 buf[8]; 81 85 82 86 mutex_lock(&rt5514_dsp->dma_lock); 83 87 if (!rt5514_dsp->substream) { ··· 90 90 runtime = rt5514_dsp->substream->runtime; 91 91 period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream); 92 92 93 - if (rt5514_dsp->buf_size - rt5514_dsp->dsp_offset < period_bytes) 94 - period_bytes = rt5514_dsp->buf_size - rt5514_dsp->dsp_offset; 93 + if (rt5514_dsp->get_size >= rt5514_dsp->buf_size) { 94 + rt5514_spi_burst_read(RT5514_BUFFER_VOICE_WP, (u8 *)&buf, 95 + sizeof(buf)); 96 + cur_wp = buf[0] | buf[1] << 8 | buf[2] << 16 | 97 + buf[3] << 24; 98 + 99 + if (cur_wp >= rt5514_dsp->buf_rp) 100 + remain_data = (cur_wp - rt5514_dsp->buf_rp); 101 + else 102 + remain_data = 103 + (rt5514_dsp->buf_limit - rt5514_dsp->buf_rp) + 104 + (cur_wp - rt5514_dsp->buf_base); 105 + 106 + if (remain_data < period_bytes) { 107 + schedule_delayed_work(&rt5514_dsp->copy_work, 5); 108 + goto done; 109 + } 110 + } 95 111 96 112 if (rt5514_dsp->buf_rp + period_bytes <= rt5514_dsp->buf_limit) { 97 113 rt5514_spi_burst_read(rt5514_dsp->buf_rp, ··· 128 112 runtime->dma_area + rt5514_dsp->dma_offset + 129 113 truncated_bytes, period_bytes - truncated_bytes); 130 114 131 - rt5514_dsp->buf_rp = rt5514_dsp->buf_base + 132 - period_bytes - truncated_bytes; 115 + rt5514_dsp->buf_rp = rt5514_dsp->buf_base + period_bytes - 116 + truncated_bytes; 133 117 } 134 118 119 + rt5514_dsp->get_size += period_bytes; 135 120 rt5514_dsp->dma_offset += period_bytes; 136 121 if (rt5514_dsp->dma_offset >= runtime->dma_bytes) 137 122 rt5514_dsp->dma_offset = 0; 138 123 139 - rt5514_dsp->dsp_offset += period_bytes; 140 - 141 124 snd_pcm_period_elapsed(rt5514_dsp->substream); 142 125 143 - if (rt5514_dsp->dsp_offset < rt5514_dsp->buf_size) 144 - schedule_delayed_work(&rt5514_dsp->copy_work, 5); 126 + schedule_delayed_work(&rt5514_dsp->copy_work, 5); 127 + 145 128 done: 146 129 mutex_unlock(&rt5514_dsp->dma_lock); 130 + } 131 + 132 + static irqreturn_t rt5514_spi_irq(int irq, void *data) 133 + { 134 + struct rt5514_dsp *rt5514_dsp = data; 135 + u8 buf[8]; 136 + 137 + rt5514_dsp->get_size = 0; 138 + 139 + /** 140 + * The address area x1800XXXX is the register address, and it cannot 141 + * support spi burst read perfectly. So we use the spi burst read 142 + * individually to make sure the data correctly. 143 + */ 144 + rt5514_spi_burst_read(RT5514_BUFFER_VOICE_BASE, (u8 *)&buf, 145 + sizeof(buf)); 146 + rt5514_dsp->buf_base = buf[0] | buf[1] << 8 | buf[2] << 16 | 147 + buf[3] << 24; 148 + 149 + rt5514_spi_burst_read(RT5514_BUFFER_VOICE_LIMIT, (u8 *)&buf, 150 + sizeof(buf)); 151 + rt5514_dsp->buf_limit = buf[0] | buf[1] << 8 | buf[2] << 16 | 152 + buf[3] << 24; 153 + 154 + rt5514_spi_burst_read(RT5514_BUFFER_VOICE_WP, (u8 *)&buf, 155 + sizeof(buf)); 156 + rt5514_dsp->buf_rp = buf[0] | buf[1] << 8 | buf[2] << 16 | 157 + buf[3] << 24; 158 + 159 + if (rt5514_dsp->buf_rp % 8) 160 + rt5514_dsp->buf_rp = (rt5514_dsp->buf_rp / 8) * 8; 161 + 162 + rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base; 163 + 164 + if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit && 165 + rt5514_dsp->buf_rp && rt5514_dsp->buf_size) 166 + schedule_delayed_work(&rt5514_dsp->copy_work, 0); 167 + 168 + return IRQ_HANDLED; 147 169 } 148 170 149 171 /* PCM for streaming audio from the DSP buffer */ ··· 204 150 ret = snd_pcm_lib_alloc_vmalloc_buffer(substream, 205 151 params_buffer_bytes(hw_params)); 206 152 rt5514_dsp->substream = substream; 153 + rt5514_dsp->dma_offset = 0; 207 154 mutex_unlock(&rt5514_dsp->dma_lock); 208 155 209 156 return ret; ··· 225 170 return snd_pcm_lib_free_vmalloc_buffer(substream); 226 171 } 227 172 228 - static int rt5514_spi_prepare(struct snd_pcm_substream *substream) 229 - { 230 - struct snd_soc_pcm_runtime *rtd = substream->private_data; 231 - struct rt5514_dsp *rt5514_dsp = 232 - snd_soc_platform_get_drvdata(rtd->platform); 233 - u8 buf[8]; 234 - 235 - rt5514_dsp->dma_offset = 0; 236 - rt5514_dsp->dsp_offset = 0; 237 - 238 - /** 239 - * The address area x1800XXXX is the register address, and it cannot 240 - * support spi burst read perfectly. So we use the spi burst read 241 - * individually to make sure the data correctly. 242 - */ 243 - rt5514_spi_burst_read(RT5514_BUFFER_VOICE_BASE, (u8 *)&buf, 244 - sizeof(buf)); 245 - rt5514_dsp->buf_base = buf[0] | buf[1] << 8 | buf[2] << 16 | 246 - buf[3] << 24; 247 - 248 - rt5514_spi_burst_read(RT5514_BUFFER_VOICE_LIMIT, (u8 *)&buf, 249 - sizeof(buf)); 250 - rt5514_dsp->buf_limit = buf[0] | buf[1] << 8 | buf[2] << 16 | 251 - buf[3] << 24; 252 - 253 - rt5514_spi_burst_read(RT5514_BUFFER_VOICE_RP, (u8 *)&buf, 254 - sizeof(buf)); 255 - rt5514_dsp->buf_rp = buf[0] | buf[1] << 8 | buf[2] << 16 | 256 - buf[3] << 24; 257 - 258 - rt5514_spi_burst_read(RT5514_BUFFER_VOICE_SIZE, (u8 *)&buf, 259 - sizeof(buf)); 260 - rt5514_dsp->buf_size = buf[0] | buf[1] << 8 | buf[2] << 16 | 261 - buf[3] << 24; 262 - 263 - return 0; 264 - } 265 - 266 - static int rt5514_spi_trigger(struct snd_pcm_substream *substream, int cmd) 267 - { 268 - struct snd_soc_pcm_runtime *rtd = substream->private_data; 269 - struct rt5514_dsp *rt5514_dsp = 270 - snd_soc_platform_get_drvdata(rtd->platform); 271 - 272 - if (cmd == SNDRV_PCM_TRIGGER_START) { 273 - if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit && 274 - rt5514_dsp->buf_rp && rt5514_dsp->buf_size) 275 - schedule_delayed_work(&rt5514_dsp->copy_work, 0); 276 - } 277 - 278 - return 0; 279 - } 280 - 281 173 static snd_pcm_uframes_t rt5514_spi_pcm_pointer( 282 174 struct snd_pcm_substream *substream) 283 175 { ··· 240 238 .open = rt5514_spi_pcm_open, 241 239 .hw_params = rt5514_spi_hw_params, 242 240 .hw_free = rt5514_spi_hw_free, 243 - .trigger = rt5514_spi_trigger, 244 - .prepare = rt5514_spi_prepare, 245 241 .pointer = rt5514_spi_pcm_pointer, 246 242 .mmap = snd_pcm_lib_mmap_vmalloc, 247 243 .page = snd_pcm_lib_get_vmalloc_page, ··· 248 248 static int rt5514_spi_pcm_probe(struct snd_soc_platform *platform) 249 249 { 250 250 struct rt5514_dsp *rt5514_dsp; 251 + int ret; 251 252 252 253 rt5514_dsp = devm_kzalloc(platform->dev, sizeof(*rt5514_dsp), 253 254 GFP_KERNEL); ··· 257 256 mutex_init(&rt5514_dsp->dma_lock); 258 257 INIT_DELAYED_WORK(&rt5514_dsp->copy_work, rt5514_spi_copy_work); 259 258 snd_soc_platform_set_drvdata(platform, rt5514_dsp); 259 + 260 + if (rt5514_spi->irq) { 261 + ret = devm_request_threaded_irq(&rt5514_spi->dev, 262 + rt5514_spi->irq, NULL, rt5514_spi_irq, 263 + IRQF_TRIGGER_RISING | IRQF_ONESHOT, "rt5514-spi", 264 + rt5514_dsp); 265 + if (ret) 266 + dev_err(&rt5514_spi->dev, 267 + "%s Failed to reguest IRQ: %d\n", __func__, 268 + ret); 269 + } 260 270 261 271 return 0; 262 272 }
+3 -4
sound/soc/codecs/rt5514-spi.h
··· 17 17 */ 18 18 #define RT5514_SPI_BUF_LEN 240 19 19 20 - #define RT5514_BUFFER_VOICE_BASE 0x18001034 21 - #define RT5514_BUFFER_VOICE_LIMIT 0x18001038 22 - #define RT5514_BUFFER_VOICE_RP 0x1800103c 23 - #define RT5514_BUFFER_VOICE_SIZE 0x18001040 20 + #define RT5514_BUFFER_VOICE_BASE 0x18000200 21 + #define RT5514_BUFFER_VOICE_LIMIT 0x18000204 22 + #define RT5514_BUFFER_VOICE_WP 0x1800020c 24 23 25 24 /* SPI Command */ 26 25 enum {
+137 -35
sound/soc/codecs/rt5514.c
··· 31 31 32 32 #include "rl6231.h" 33 33 #include "rt5514.h" 34 - #if defined(CONFIG_SND_SOC_RT5514_SPI) 34 + #if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) 35 35 #include "rt5514-spi.h" 36 36 #endif 37 37 ··· 63 63 {RT5514_SRC_CTRL, 0x44000eee}, 64 64 {RT5514_ANA_CTRL_LDO10, 0x00028604}, 65 65 {RT5514_ANA_CTRL_ADCFED, 0x00000800}, 66 + {RT5514_ASRC_IN_CTRL1, 0x00000003}, 67 + {RT5514_DOWNFILTER0_CTRL3, 0x10000362}, 68 + {RT5514_DOWNFILTER1_CTRL3, 0x10000362}, 66 69 }; 67 70 68 71 static const struct reg_default rt5514_reg[] = { ··· 91 88 {RT5514_DELAY_BUF_CTRL3, 0x00000000}, 92 89 {RT5514_DOWNFILTER0_CTRL1, 0x00020c2f}, 93 90 {RT5514_DOWNFILTER0_CTRL2, 0x00020c2f}, 94 - {RT5514_DOWNFILTER0_CTRL3, 0x00000362}, 91 + {RT5514_DOWNFILTER0_CTRL3, 0x10000362}, 95 92 {RT5514_DOWNFILTER1_CTRL1, 0x00020c2f}, 96 93 {RT5514_DOWNFILTER1_CTRL2, 0x00020c2f}, 97 - {RT5514_DOWNFILTER1_CTRL3, 0x00000362}, 94 + {RT5514_DOWNFILTER1_CTRL3, 0x10000362}, 98 95 {RT5514_ANA_CTRL_LDO10, 0x00028604}, 99 96 {RT5514_ANA_CTRL_LDO18_16, 0x02000345}, 100 97 {RT5514_ANA_CTRL_ADC12, 0x0000a2a8}, ··· 314 311 315 312 request_firmware(&fw, RT5514_FIRMWARE1, codec->dev); 316 313 if (fw) { 317 - #if defined(CONFIG_SND_SOC_RT5514_SPI) 314 + #if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) 318 315 rt5514_spi_burst_write(0x4ff60000, fw->data, 319 316 ((fw->size/8)+1)*8); 320 317 #else ··· 327 324 328 325 request_firmware(&fw, RT5514_FIRMWARE2, codec->dev); 329 326 if (fw) { 330 - #if defined(CONFIG_SND_SOC_RT5514_SPI) 327 + #if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) 331 328 rt5514_spi_burst_write(0x4ffc0000, fw->data, 332 329 ((fw->size/8)+1)*8); 333 330 #else ··· 336 333 #endif 337 334 release_firmware(fw); 338 335 fw = NULL; 336 + } 337 + 338 + if (rt5514->model_buf && rt5514->model_len) { 339 + #if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) 340 + int ret; 341 + 342 + ret = rt5514_spi_burst_write(0x4ff80000, 343 + rt5514->model_buf, 344 + ((rt5514->model_len / 8) + 1) * 8); 345 + if (ret) { 346 + dev_err(codec->dev, 347 + "Model load failed %d\n", ret); 348 + return ret; 349 + } 350 + #else 351 + dev_err(codec->dev, 352 + "No SPI driver for loading firmware\n"); 353 + #endif 354 + } else { 355 + request_firmware(&fw, RT5514_FIRMWARE3, 356 + codec->dev); 357 + if (fw) { 358 + #if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) 359 + rt5514_spi_burst_write(0x4ff80000, 360 + fw->data, 361 + ((fw->size/8)+1)*8); 362 + #else 363 + dev_err(codec->dev, 364 + "No SPI driver to load fw\n"); 365 + #endif 366 + release_firmware(fw); 367 + fw = NULL; 368 + } 339 369 } 340 370 341 371 /* DSP run */ ··· 385 349 return 0; 386 350 } 387 351 352 + static int rt5514_hotword_model_put(struct snd_kcontrol *kcontrol, 353 + const unsigned int __user *bytes, unsigned int size) 354 + { 355 + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 356 + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); 357 + struct snd_soc_codec *codec = rt5514->codec; 358 + int ret = 0; 359 + 360 + if (rt5514->model_buf || rt5514->model_len < size) { 361 + if (rt5514->model_buf) 362 + devm_kfree(codec->dev, rt5514->model_buf); 363 + rt5514->model_buf = devm_kmalloc(codec->dev, size, GFP_KERNEL); 364 + if (!rt5514->model_buf) { 365 + ret = -ENOMEM; 366 + goto done; 367 + } 368 + } 369 + 370 + /* Skips the TLV header. */ 371 + bytes += 2; 372 + 373 + if (copy_from_user(rt5514->model_buf, bytes, size)) 374 + ret = -EFAULT; 375 + done: 376 + rt5514->model_len = (ret ? 0 : size); 377 + return ret; 378 + } 379 + 388 380 static const struct snd_kcontrol_new rt5514_snd_controls[] = { 389 381 SOC_DOUBLE_TLV("MIC Boost Volume", RT5514_ANA_CTRL_MICBST, 390 382 RT5514_SEL_BSTL_SFT, RT5514_SEL_BSTR_SFT, 8, 0, bst_tlv), ··· 424 360 adc_vol_tlv), 425 361 SOC_SINGLE_EXT("DSP Voice Wake Up", SND_SOC_NOPM, 0, 1, 0, 426 362 rt5514_dsp_voice_wake_up_get, rt5514_dsp_voice_wake_up_put), 363 + SND_SOC_BYTES_TLV("Hotword Model", 0x8504, 364 + NULL, rt5514_hotword_model_put), 427 365 }; 428 366 429 367 /* ADC Mixer*/ ··· 537 471 return 0; 538 472 } 539 473 540 - static int rt5514_pre_event(struct snd_soc_dapm_widget *w, 541 - struct snd_kcontrol *kcontrol, int event) 474 + static int rt5514_i2s_use_asrc(struct snd_soc_dapm_widget *source, 475 + struct snd_soc_dapm_widget *sink) 542 476 { 543 - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); 477 + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); 544 478 struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); 545 479 546 - switch (event) { 547 - case SND_SOC_DAPM_PRE_PMU: 548 - /** 549 - * If the DSP is enabled in start of recording, the DSP 550 - * should be disabled, and sync back to normal recording 551 - * settings to make sure recording properly. 552 - */ 553 - if (rt5514->dsp_enabled) { 554 - rt5514->dsp_enabled = 0; 555 - regmap_multi_reg_write(rt5514->i2c_regmap, 556 - rt5514_i2c_patch, ARRAY_SIZE(rt5514_i2c_patch)); 557 - regcache_mark_dirty(rt5514->regmap); 558 - regcache_sync(rt5514->regmap); 559 - } 560 - break; 561 - 562 - default: 563 - return 0; 564 - } 565 - 566 - return 0; 480 + return (rt5514->sysclk > rt5514->lrck * 384); 567 481 } 568 482 569 483 static const struct snd_soc_dapm_widget rt5514_dapm_widgets[] = { ··· 616 570 RT5514_POW_PLL1_LDO_BIT, 0, NULL, 0), 617 571 SND_SOC_DAPM_SUPPLY("PLL1", RT5514_PWR_ANA2, RT5514_POW_PLL1_BIT, 0, 618 572 NULL, 0), 573 + SND_SOC_DAPM_SUPPLY_S("ASRC AD1", 1, RT5514_CLK_CTRL2, 574 + RT5514_CLK_AD0_ASRC_EN_BIT, 0, NULL, 0), 575 + SND_SOC_DAPM_SUPPLY_S("ASRC AD2", 1, RT5514_CLK_CTRL2, 576 + RT5514_CLK_AD1_ASRC_EN_BIT, 0, NULL, 0), 619 577 620 578 /* ADC Mux */ 621 579 SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0, ··· 657 607 658 608 /* Audio Interface */ 659 609 SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), 660 - 661 - SND_SOC_DAPM_PRE("DAPM Pre", rt5514_pre_event), 662 610 }; 663 611 664 612 static const struct snd_soc_dapm_route rt5514_dapm_routes[] = { ··· 717 669 { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR" }, 718 670 { "Stereo1 ADC MIX", NULL, "adc stereo1 filter" }, 719 671 { "adc stereo1 filter", NULL, "PLL1", rt5514_is_sys_clk_from_pll }, 672 + { "adc stereo1 filter", NULL, "ASRC AD1", rt5514_i2s_use_asrc }, 720 673 721 674 { "Stereo2 DMIC Mux", "DMIC1", "DMIC1" }, 722 675 { "Stereo2 DMIC Mux", "DMIC2", "DMIC2" }, ··· 734 685 { "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXR" }, 735 686 { "Stereo2 ADC MIX", NULL, "adc stereo2 filter" }, 736 687 { "adc stereo2 filter", NULL, "PLL1", rt5514_is_sys_clk_from_pll }, 688 + { "adc stereo2 filter", NULL, "ASRC AD2", rt5514_i2s_use_asrc }, 737 689 738 690 { "AIF1TX", NULL, "Stereo1 ADC MIX"}, 739 691 { "AIF1TX", NULL, "Stereo2 ADC MIX"}, ··· 787 737 788 738 regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL1, RT5514_I2S_DL_MASK, 789 739 val_len); 740 + regmap_update_bits(rt5514->regmap, RT5514_CLK_CTRL1, 741 + RT5514_CLK_AD_ANA1_SEL_MASK, 742 + (pre_div + 1) << RT5514_CLK_AD_ANA1_SEL_SFT); 790 743 regmap_update_bits(rt5514->regmap, RT5514_CLK_CTRL2, 791 744 RT5514_CLK_SYS_DIV_OUT_MASK | RT5514_SEL_ADC_OSR_MASK, 792 745 pre_div << RT5514_CLK_SYS_DIV_OUT_SFT | ··· 955 902 { 956 903 struct snd_soc_codec *codec = dai->codec; 957 904 struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); 958 - unsigned int val = 0; 905 + unsigned int val = 0, val2 = 0; 959 906 960 907 if (rx_mask || tx_mask) 961 908 val |= RT5514_TDM_MODE; 909 + 910 + switch (tx_mask) { 911 + case 0x3: 912 + val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH2 | 913 + RT5514_TDM_DOCKING_START_SLOT0; 914 + break; 915 + 916 + case 0x30: 917 + val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH2 | 918 + RT5514_TDM_DOCKING_START_SLOT4; 919 + break; 920 + 921 + case 0xf: 922 + val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH4 | 923 + RT5514_TDM_DOCKING_START_SLOT0; 924 + break; 925 + 926 + case 0xf0: 927 + val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH4 | 928 + RT5514_TDM_DOCKING_START_SLOT4; 929 + break; 930 + 931 + default: 932 + break; 933 + } 934 + 935 + 962 936 963 937 switch (slots) { 964 938 case 4: ··· 1032 952 RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK | 1033 953 RT5514_TDM_MODE2, val); 1034 954 955 + regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL2, 956 + RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH_MASK | 957 + RT5514_TDM_DOCKING_START_MASK, val2); 958 + 1035 959 return 0; 1036 960 } 1037 961 ··· 1056 972 ret = clk_prepare_enable(rt5514->mclk); 1057 973 if (ret) 1058 974 return ret; 975 + } 976 + break; 977 + 978 + case SND_SOC_BIAS_STANDBY: 979 + if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { 980 + /* 981 + * If the DSP is enabled in start of recording, the DSP 982 + * should be disabled, and sync back to normal recording 983 + * settings to make sure recording properly. 984 + */ 985 + if (rt5514->dsp_enabled) { 986 + rt5514->dsp_enabled = 0; 987 + regmap_multi_reg_write(rt5514->i2c_regmap, 988 + rt5514_i2c_patch, 989 + ARRAY_SIZE(rt5514_i2c_patch)); 990 + regcache_mark_dirty(rt5514->regmap); 991 + regcache_sync(rt5514->regmap); 992 + } 1059 993 } 1060 994 break; 1061 995 ··· 1121 1019 #define RT5514_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 1122 1020 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8) 1123 1021 1124 - struct snd_soc_dai_ops rt5514_aif_dai_ops = { 1022 + static const struct snd_soc_dai_ops rt5514_aif_dai_ops = { 1125 1023 .hw_params = rt5514_hw_params, 1126 1024 .set_fmt = rt5514_set_dai_fmt, 1127 1025 .set_sysclk = rt5514_set_dai_sysclk, ··· 1129 1027 .set_tdm_slot = rt5514_set_tdm_slot, 1130 1028 }; 1131 1029 1132 - struct snd_soc_dai_driver rt5514_dai[] = { 1030 + static struct snd_soc_dai_driver rt5514_dai[] = { 1133 1031 { 1134 1032 .name = "rt5514-aif1", 1135 1033 .id = 0, ··· 1199 1097 #endif 1200 1098 1201 1099 #ifdef CONFIG_ACPI 1202 - static struct acpi_device_id rt5514_acpi_match[] = { 1100 + static const struct acpi_device_id rt5514_acpi_match[] = { 1203 1101 { "10EC5514", 0}, 1204 1102 {}, 1205 1103 };
+22
sound/soc/codecs/rt5514.h
··· 37 37 #define RT5514_PLL3_CALIB_CTRL5 0x2124 38 38 #define RT5514_DELAY_BUF_CTRL1 0x2140 39 39 #define RT5514_DELAY_BUF_CTRL3 0x2148 40 + #define RT5514_ASRC_IN_CTRL1 0x2180 40 41 #define RT5514_DOWNFILTER0_CTRL1 0x2190 41 42 #define RT5514_DOWNFILTER0_CTRL2 0x2194 42 43 #define RT5514_DOWNFILTER0_CTRL3 0x2198 ··· 165 164 #define RT5514_I2S_DL_24 (0x2 << 0) 166 165 #define RT5514_I2S_DL_8 (0x3 << 0) 167 166 167 + /* RT5514_I2S_CTRL2 (0x2014) */ 168 + #define RT5514_TDM_DOCKING_MODE (0x1 << 31) 169 + #define RT5514_TDM_DOCKING_MODE_SFT 31 170 + #define RT5514_TDM_DOCKING_VALID_CH_MASK (0x1 << 29) 171 + #define RT5514_TDM_DOCKING_VALID_CH_SFT 29 172 + #define RT5514_TDM_DOCKING_VALID_CH2 (0x0 << 29) 173 + #define RT5514_TDM_DOCKING_VALID_CH4 (0x1 << 29) 174 + #define RT5514_TDM_DOCKING_START_MASK (0x1 << 28) 175 + #define RT5514_TDM_DOCKING_START_SFT 28 176 + #define RT5514_TDM_DOCKING_START_SLOT0 (0x0 << 28) 177 + #define RT5514_TDM_DOCKING_START_SLOT4 (0x1 << 28) 178 + 168 179 /* RT5514_DIG_SOURCE_CTRL (0x20a4) */ 169 180 #define RT5514_AD1_DMIC_INPUT_SEL (0x1 << 1) 170 181 #define RT5514_AD1_DMIC_INPUT_SEL_SFT 1 ··· 198 185 #define RT5514_CLK_AD0_EN_BIT 23 199 186 #define RT5514_CLK_DMIC_OUT_SEL_MASK (0x7 << 8) 200 187 #define RT5514_CLK_DMIC_OUT_SEL_SFT 8 188 + #define RT5514_CLK_AD_ANA1_SEL_MASK (0xf << 0) 189 + #define RT5514_CLK_AD_ANA1_SEL_SFT 0 201 190 202 191 /* RT5514_CLK_CTRL2 (0x2108) */ 192 + #define RT5514_CLK_AD1_ASRC_EN (0x1 << 17) 193 + #define RT5514_CLK_AD1_ASRC_EN_BIT 17 194 + #define RT5514_CLK_AD0_ASRC_EN (0x1 << 16) 195 + #define RT5514_CLK_AD0_ASRC_EN_BIT 16 203 196 #define RT5514_CLK_SYS_DIV_OUT_MASK (0x7 << 8) 204 197 #define RT5514_CLK_SYS_DIV_OUT_SFT 8 205 198 #define RT5514_SEL_ADC_OSR_MASK (0x7 << 4) ··· 255 236 256 237 #define RT5514_FIRMWARE1 "rt5514_dsp_fw1.bin" 257 238 #define RT5514_FIRMWARE2 "rt5514_dsp_fw2.bin" 239 + #define RT5514_FIRMWARE3 "rt5514_dsp_fw3.bin" 258 240 259 241 /* System Clock Source */ 260 242 enum { ··· 282 262 int pll_in; 283 263 int pll_out; 284 264 int dsp_enabled; 265 + u8 *model_buf; 266 + unsigned int model_len; 285 267 }; 286 268 287 269 #endif /* __RT5514_H__ */
+2
sound/soc/rockchip/Kconfig
··· 68 68 select SND_SOC_RT5514 69 69 select SND_SOC_DA7219 70 70 select SND_SOC_RT5514_SPI 71 + select SND_SOC_HDMI_CODEC 72 + select SND_SOC_DMIC 71 73 help 72 74 Say Y or M here if you want to add support multiple codecs for SoC 73 75 audio on Rockchip RK3399 GRU boards.
+1 -3
sound/soc/rockchip/rk3288_hdmi_analog.c
··· 147 147 return 0; 148 148 } 149 149 150 - static struct snd_soc_ops rk_ops = { 150 + static const struct snd_soc_ops rk_ops = { 151 151 .hw_params = rk_hw_params, 152 152 }; 153 153 ··· 271 271 "Soc register card failed %d\n", ret); 272 272 return ret; 273 273 } 274 - 275 - platform_set_drvdata(pdev, card); 276 274 277 275 return ret; 278 276 }
+188 -86
sound/soc/rockchip/rk3399_gru_sound.c
··· 38 38 39 39 #define SOUND_FS 256 40 40 41 - static unsigned int rt5514_dmic_delay; 41 + static unsigned int dmic_wakeup_delay; 42 42 43 43 static struct snd_soc_jack rockchip_sound_jack; 44 44 ··· 126 126 } 127 127 128 128 /* Wait for DMIC stable */ 129 - msleep(rt5514_dmic_delay); 129 + msleep(dmic_wakeup_delay); 130 130 131 131 return 0; 132 132 } ··· 228 228 return 0; 229 229 } 230 230 231 + static int rockchip_sound_cdndp_hw_params(struct snd_pcm_substream *substream, 232 + struct snd_pcm_hw_params *params) 233 + { 234 + struct snd_soc_pcm_runtime *rtd = substream->private_data; 235 + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 236 + struct snd_soc_dai *codec_dai = rtd->codec_dai; 237 + int mclk, ret; 238 + 239 + /* in bypass mode, the mclk has to be one of the frequencies below */ 240 + switch (params_rate(params)) { 241 + case 8000: 242 + case 16000: 243 + case 24000: 244 + case 32000: 245 + case 48000: 246 + case 64000: 247 + case 96000: 248 + mclk = 12288000; 249 + break; 250 + case 11025: 251 + case 22050: 252 + case 44100: 253 + case 88200: 254 + mclk = 11289600; 255 + break; 256 + default: 257 + return -EINVAL; 258 + } 259 + 260 + ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk, 261 + SND_SOC_CLOCK_OUT); 262 + if (ret < 0) { 263 + dev_err(codec_dai->dev, "Can't set cpu clock out %d\n", ret); 264 + return ret; 265 + } 266 + 267 + return 0; 268 + } 269 + 270 + static int rockchip_sound_dmic_hw_params(struct snd_pcm_substream *substream, 271 + struct snd_pcm_hw_params *params) 272 + { 273 + struct snd_soc_pcm_runtime *rtd = substream->private_data; 274 + unsigned int mclk; 275 + int ret; 276 + 277 + mclk = params_rate(params) * SOUND_FS; 278 + 279 + ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, 0, mclk, 0); 280 + if (ret) { 281 + dev_err(rtd->card->dev, "%s() error setting sysclk to %u: %d\n", 282 + __func__, mclk, ret); 283 + return ret; 284 + } 285 + 286 + /* Wait for DMIC stable */ 287 + msleep(dmic_wakeup_delay); 288 + 289 + return 0; 290 + } 291 + 231 292 static const struct snd_soc_ops rockchip_sound_max98357a_ops = { 232 293 .hw_params = rockchip_sound_max98357a_hw_params, 233 294 }; ··· 301 240 .hw_params = rockchip_sound_da7219_hw_params, 302 241 }; 303 242 243 + static const struct snd_soc_ops rockchip_sound_cdndp_ops = { 244 + .hw_params = rockchip_sound_cdndp_hw_params, 245 + }; 246 + 247 + static const struct snd_soc_ops rockchip_sound_dmic_ops = { 248 + .hw_params = rockchip_sound_dmic_hw_params, 249 + }; 250 + 251 + static struct snd_soc_card rockchip_sound_card = { 252 + .name = "rk3399-gru-sound", 253 + .owner = THIS_MODULE, 254 + .dapm_widgets = rockchip_dapm_widgets, 255 + .num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets), 256 + .dapm_routes = rockchip_dapm_routes, 257 + .num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes), 258 + .controls = rockchip_controls, 259 + .num_controls = ARRAY_SIZE(rockchip_controls), 260 + }; 261 + 304 262 enum { 263 + DAILINK_CDNDP, 264 + DAILINK_DA7219, 265 + DAILINK_DMIC, 305 266 DAILINK_MAX98357A, 306 267 DAILINK_RT5514, 307 - DAILINK_DA7219, 308 268 DAILINK_RT5514_DSP, 309 269 }; 310 270 311 - #define DAILINK_ENTITIES (DAILINK_DA7219 + 1) 271 + static const char * const dailink_compat[] = { 272 + [DAILINK_CDNDP] = "rockchip,rk3399-cdn-dp", 273 + [DAILINK_DA7219] = "dlg,da7219", 274 + [DAILINK_DMIC] = "dmic-codec", 275 + [DAILINK_MAX98357A] = "maxim,max98357a", 276 + [DAILINK_RT5514] = "realtek,rt5514-i2c", 277 + [DAILINK_RT5514_DSP] = "realtek,rt5514-spi", 278 + }; 312 279 313 - static struct snd_soc_dai_link rockchip_dailinks[] = { 280 + static const struct snd_soc_dai_link rockchip_dais[] = { 281 + [DAILINK_CDNDP] = { 282 + .name = "DP", 283 + .stream_name = "DP PCM", 284 + .codec_dai_name = "i2s-hifi", 285 + .ops = &rockchip_sound_cdndp_ops, 286 + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 287 + SND_SOC_DAIFMT_CBS_CFS, 288 + }, 289 + [DAILINK_DA7219] = { 290 + .name = "DA7219", 291 + .stream_name = "DA7219 PCM", 292 + .codec_dai_name = "da7219-hifi", 293 + .init = rockchip_sound_da7219_init, 294 + .ops = &rockchip_sound_da7219_ops, 295 + /* set da7219 as slave */ 296 + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 297 + SND_SOC_DAIFMT_CBS_CFS, 298 + }, 299 + [DAILINK_DMIC] = { 300 + .name = "DMIC", 301 + .stream_name = "DMIC PCM", 302 + .codec_dai_name = "dmic-hifi", 303 + .ops = &rockchip_sound_dmic_ops, 304 + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 305 + SND_SOC_DAIFMT_CBS_CFS, 306 + }, 314 307 [DAILINK_MAX98357A] = { 315 308 .name = "MAX98357A", 316 309 .stream_name = "MAX98357A PCM", ··· 383 268 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 384 269 SND_SOC_DAIFMT_CBS_CFS, 385 270 }, 386 - [DAILINK_DA7219] = { 387 - .name = "DA7219", 388 - .stream_name = "DA7219 PCM", 389 - .codec_dai_name = "da7219-hifi", 390 - .init = rockchip_sound_da7219_init, 391 - .ops = &rockchip_sound_da7219_ops, 392 - /* set da7219 as slave */ 393 - .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 394 - SND_SOC_DAIFMT_CBS_CFS, 395 - }, 396 271 /* RT5514 DSP for voice wakeup via spi bus */ 397 272 [DAILINK_RT5514_DSP] = { 398 273 .name = "RT5514 DSP", 399 274 .stream_name = "Wake on Voice", 400 - .codec_name = "snd-soc-dummy", 401 - .codec_dai_name = "snd-soc-dummy-dai", 275 + .codec_dai_name = "rt5514-dsp-cpu-dai", 402 276 }, 403 277 }; 404 278 405 - static struct snd_soc_card rockchip_sound_card = { 406 - .name = "rk3399-gru-sound", 407 - .owner = THIS_MODULE, 408 - .dai_link = rockchip_dailinks, 409 - .num_links = ARRAY_SIZE(rockchip_dailinks), 410 - .dapm_widgets = rockchip_dapm_widgets, 411 - .num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets), 412 - .dapm_routes = rockchip_dapm_routes, 413 - .num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes), 414 - .controls = rockchip_controls, 415 - .num_controls = ARRAY_SIZE(rockchip_controls), 416 - }; 417 - 418 - static int rockchip_sound_match_stub(struct device *dev, void *data) 279 + static int rockchip_sound_codec_node_match(struct device_node *np_codec) 419 280 { 420 - return 1; 281 + int i; 282 + 283 + for (i = 0; i < ARRAY_SIZE(dailink_compat); i++) { 284 + if (of_device_is_compatible(np_codec, dailink_compat[i])) 285 + return i; 286 + } 287 + return -1; 288 + } 289 + 290 + static int rockchip_sound_of_parse_dais(struct device *dev, 291 + struct snd_soc_card *card) 292 + { 293 + struct device_node *np_cpu, *np_cpu0, *np_cpu1; 294 + struct device_node *np_codec; 295 + struct snd_soc_dai_link *dai; 296 + int i, index; 297 + 298 + card->dai_link = devm_kzalloc(dev, sizeof(rockchip_dais), 299 + GFP_KERNEL); 300 + if (!card->dai_link) 301 + return -ENOMEM; 302 + 303 + np_cpu0 = of_parse_phandle(dev->of_node, "rockchip,cpu", 0); 304 + np_cpu1 = of_parse_phandle(dev->of_node, "rockchip,cpu", 1); 305 + 306 + card->num_links = 0; 307 + for (i = 0; i < ARRAY_SIZE(rockchip_dais); i++) { 308 + np_codec = of_parse_phandle(dev->of_node, 309 + "rockchip,codec", i); 310 + if (!np_codec) 311 + break; 312 + 313 + if (!of_device_is_available(np_codec)) 314 + continue; 315 + 316 + index = rockchip_sound_codec_node_match(np_codec); 317 + if (index < 0) 318 + continue; 319 + 320 + np_cpu = (index == DAILINK_CDNDP) ? np_cpu1 : np_cpu0; 321 + if (!np_cpu) { 322 + dev_err(dev, "Missing 'rockchip,cpu' for %s\n", 323 + rockchip_dais[index].name); 324 + return -EINVAL; 325 + } 326 + 327 + dai = &card->dai_link[card->num_links++]; 328 + *dai = rockchip_dais[index]; 329 + 330 + dai->codec_of_node = np_codec; 331 + dai->platform_of_node = np_cpu; 332 + dai->cpu_of_node = np_cpu; 333 + } 334 + 335 + return 0; 421 336 } 422 337 423 338 static int rockchip_sound_probe(struct platform_device *pdev) 424 339 { 425 340 struct snd_soc_card *card = &rockchip_sound_card; 426 - struct device_node *cpu_node; 427 - struct device *dev; 428 - struct device_driver *drv; 429 - int i, ret; 341 + int ret; 430 342 431 - cpu_node = of_parse_phandle(pdev->dev.of_node, "rockchip,cpu", 0); 432 - if (!cpu_node) { 433 - dev_err(&pdev->dev, "Property 'rockchip,cpu' missing or invalid\n"); 434 - return -EINVAL; 343 + ret = rockchip_sound_of_parse_dais(&pdev->dev, card); 344 + if (ret < 0) { 345 + dev_err(&pdev->dev, "Failed to parse dais: %d\n", ret); 346 + return ret; 435 347 } 436 348 437 - for (i = 0; i < DAILINK_ENTITIES; i++) { 438 - rockchip_dailinks[i].platform_of_node = cpu_node; 439 - rockchip_dailinks[i].cpu_of_node = cpu_node; 440 - 441 - rockchip_dailinks[i].codec_of_node = 442 - of_parse_phandle(pdev->dev.of_node, "rockchip,codec", i); 443 - if (!rockchip_dailinks[i].codec_of_node) { 444 - dev_err(&pdev->dev, 445 - "Property[%d] 'rockchip,codec' missing or invalid\n", i); 446 - return -EINVAL; 447 - } 448 - } 449 - 450 - /** 451 - * To acquire the spi driver of the rt5514 and set the dai-links names 452 - * for soc_bind_dai_link 453 - */ 454 - drv = driver_find("rt5514", &spi_bus_type); 455 - if (!drv) { 456 - dev_err(&pdev->dev, "Can not find the rt5514 driver at the spi bus\n"); 457 - return -EINVAL; 458 - } 459 - 460 - dev = driver_find_device(drv, NULL, NULL, rockchip_sound_match_stub); 461 - if (!dev) { 462 - dev_err(&pdev->dev, "Can not find the rt5514 device\n"); 463 - return -ENODEV; 464 - } 465 - 466 - /* Set DMIC delay */ 467 - ret = device_property_read_u32(&pdev->dev, "dmic-delay", 468 - &rt5514_dmic_delay); 349 + /* Set DMIC wakeup delay */ 350 + ret = device_property_read_u32(&pdev->dev, "dmic-wakeup-delay-ms", 351 + &dmic_wakeup_delay); 469 352 if (ret) { 470 - rt5514_dmic_delay = 0; 353 + dmic_wakeup_delay = 0; 471 354 dev_dbg(&pdev->dev, 472 - "no optional property 'dmic-delay' found, default: no delay\n"); 355 + "no optional property 'dmic-wakeup-delay-ms' found, default: no delay\n"); 473 356 } 474 - 475 - rockchip_dailinks[DAILINK_RT5514_DSP].cpu_name = kstrdup_const(dev_name(dev), GFP_KERNEL); 476 - rockchip_dailinks[DAILINK_RT5514_DSP].cpu_dai_name = kstrdup_const(dev_name(dev), GFP_KERNEL); 477 - rockchip_dailinks[DAILINK_RT5514_DSP].platform_name = kstrdup_const(dev_name(dev), GFP_KERNEL); 478 357 479 358 card->dev = &pdev->dev; 480 - platform_set_drvdata(pdev, card); 481 - 482 - ret = devm_snd_soc_register_card(&pdev->dev, card); 483 - if (ret) 484 - dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n", 485 - __func__, ret); 486 - 487 - return ret; 359 + return devm_snd_soc_register_card(&pdev->dev, card); 488 360 } 489 361 490 362 static const struct of_device_id rockchip_sound_of_match[] = {
+1 -3
sound/soc/rockchip/rockchip_i2s.c
··· 579 579 int val; 580 580 581 581 i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL); 582 - if (!i2s) { 583 - dev_err(&pdev->dev, "Can't allocate rk_i2s_dev\n"); 582 + if (!i2s) 584 583 return -ENOMEM; 585 - } 586 584 587 585 i2s->dev = &pdev->dev; 588 586
+1 -1
sound/soc/rockchip/rockchip_pdm.c
··· 249 249 return 0; 250 250 } 251 251 252 - static struct snd_soc_dai_ops rockchip_pdm_dai_ops = { 252 + static const struct snd_soc_dai_ops rockchip_pdm_dai_ops = { 253 253 .set_fmt = rockchip_pdm_set_fmt, 254 254 .trigger = rockchip_pdm_trigger, 255 255 .hw_params = rockchip_pdm_hw_params,