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

Merge tag 'sound-fix2-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull more sound fixes from Takashi Iwai:
"The remaining fixes for 6.9-rc1 that have been gathered in this week.

More about ASoC at this time (one long-standing fix for compress
offload, SOF, AMD ACP, Rockchip, Cirrus and tlv320 stuff) while
another regression fix in ALSA core and a couple of HD-audio quirks as
usual are included"

* tag 'sound-fix2-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: control: Fix unannotated kfree() cleanup
ALSA: hda/realtek: Add quirks for some Clevo laptops
ALSA: hda/realtek: Add quirk for HP Spectre x360 14 eu0000
ALSA: hda/realtek: fix the hp playback volume issue for LG machines
ASoC: soc-compress: Fix and add DPCM locking
ASoC: SOF: amd: Skip IRAM/DRAM size modification for Steam Deck OLED
ASoC: SOF: amd: Move signed_fw_image to struct acp_quirk_entry
ASoC: amd: yc: Revert "add new YC platform variant (0x63) support"
ASoC: amd: yc: Revert "Fix non-functional mic on Lenovo 21J2"
ASoC: soc-core.c: Skip dummy codec when adding platforms
ASoC: rockchip: i2s-tdm: Fix inaccurate sampling rates
ASoC: dt-bindings: cirrus,cs42l43: Fix 'gpio-ranges' schema
ASoC: amd: yc: Fix non-functional mic on ASUS M7600RE
ASoC: tlv320adc3xxx: Don't strip remove function when driver is builtin

+137 -390
+6 -5
Documentation/devicetree/bindings/sound/cirrus,cs42l43.yaml
··· 185 185 186 186 gpio-ranges: 187 187 items: 188 - - description: A phandle to the CODEC pinctrl node 189 - minimum: 0 190 - - const: 0 191 - - const: 0 192 - - const: 3 188 + - items: 189 + - description: A phandle to the CODEC pinctrl node 190 + minimum: 0 191 + - const: 0 192 + - const: 0 193 + - const: 3 193 194 194 195 patternProperties: 195 196 "-state$":
+2 -2
sound/core/control.c
··· 1275 1275 static int snd_ctl_elem_read_user(struct snd_card *card, 1276 1276 struct snd_ctl_elem_value __user *_control) 1277 1277 { 1278 - struct snd_ctl_elem_value *control; 1278 + struct snd_ctl_elem_value *control __free(kfree) = NULL; 1279 1279 int result; 1280 1280 1281 1281 control = memdup_user(_control, sizeof(*control)); 1282 1282 if (IS_ERR(control)) 1283 - return PTR_ERR(control); 1283 + return PTR_ERR(no_free_ptr(control)); 1284 1284 1285 1285 result = snd_ctl_elem_read(card, control); 1286 1286 if (result < 0)
+67 -1
sound/pci/hda/patch_realtek.c
··· 2645 2645 SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 2646 2646 SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 2647 2647 SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 2648 + SND_PCI_QUIRK(0x1558, 0x66a6, "Clevo PE60SN[CDE]-[GS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 2648 2649 SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 2649 2650 SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), 2650 2651 SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS), ··· 6965 6964 } 6966 6965 } 6967 6966 6967 + static void alc256_decrease_headphone_amp_val(struct hda_codec *codec, 6968 + const struct hda_fixup *fix, int action) 6969 + { 6970 + u32 caps; 6971 + u8 nsteps, offs; 6972 + 6973 + if (action != HDA_FIXUP_ACT_PRE_PROBE) 6974 + return; 6975 + 6976 + caps = query_amp_caps(codec, 0x3, HDA_OUTPUT); 6977 + nsteps = ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) - 10; 6978 + offs = ((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT) - 10; 6979 + caps &= ~AC_AMPCAP_NUM_STEPS & ~AC_AMPCAP_OFFSET; 6980 + caps |= (nsteps << AC_AMPCAP_NUM_STEPS_SHIFT) | (offs << AC_AMPCAP_OFFSET_SHIFT); 6981 + 6982 + if (snd_hda_override_amp_caps(codec, 0x3, HDA_OUTPUT, caps)) 6983 + codec_warn(codec, "failed to override amp caps for NID 0x3\n"); 6984 + } 6985 + 6968 6986 static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec, 6969 6987 const struct hda_fixup *fix, 6970 6988 int action) ··· 7122 7102 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; 7123 7103 break; 7124 7104 } 7105 + } 7106 + 7107 + static void alc245_fixup_hp_spectre_x360_eu0xxx(struct hda_codec *codec, 7108 + const struct hda_fixup *fix, int action) 7109 + { 7110 + /* 7111 + * The Pin Complex 0x14 for the treble speakers is wrongly reported as 7112 + * unconnected. 7113 + * The Pin Complex 0x17 for the bass speakers has the lowest association 7114 + * and sequence values so shift it up a bit to squeeze 0x14 in. 7115 + */ 7116 + static const struct hda_pintbl pincfgs[] = { 7117 + { 0x14, 0x90170110 }, // top/treble 7118 + { 0x17, 0x90170111 }, // bottom/bass 7119 + { } 7120 + }; 7121 + 7122 + /* 7123 + * Force DAC 0x02 for the bass speakers 0x17. 7124 + */ 7125 + static const hda_nid_t conn[] = { 0x02 }; 7126 + 7127 + switch (action) { 7128 + case HDA_FIXUP_ACT_PRE_PROBE: 7129 + snd_hda_apply_pincfgs(codec, pincfgs); 7130 + snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); 7131 + break; 7132 + } 7133 + 7134 + cs35l41_fixup_i2c_two(codec, fix, action); 7135 + alc245_fixup_hp_mute_led_coefbit(codec, fix, action); 7136 + alc245_fixup_hp_gpio_led(codec, fix, action); 7125 7137 } 7126 7138 7127 7139 ··· 7434 7382 ALC294_FIXUP_CS35L41_I2C_2, 7435 7383 ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED, 7436 7384 ALC256_FIXUP_ACER_SFG16_MICMUTE_LED, 7385 + ALC256_FIXUP_HEADPHONE_AMP_VOL, 7386 + ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX, 7437 7387 }; 7438 7388 7439 7389 /* A special fixup for Lenovo C940 and Yoga Duet 7; ··· 9635 9581 .type = HDA_FIXUP_FUNC, 9636 9582 .v.func = alc256_fixup_acer_sfg16_micmute_led, 9637 9583 }, 9584 + [ALC256_FIXUP_HEADPHONE_AMP_VOL] = { 9585 + .type = HDA_FIXUP_FUNC, 9586 + .v.func = alc256_decrease_headphone_amp_val, 9587 + }, 9588 + [ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX] = { 9589 + .type = HDA_FIXUP_FUNC, 9590 + .v.func = alc245_fixup_hp_spectre_x360_eu0xxx, 9591 + }, 9638 9592 }; 9639 9593 9640 9594 static const struct snd_pci_quirk alc269_fixup_tbl[] = { ··· 10006 9944 SND_PCI_QUIRK(0x103c, 0x8be8, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2), 10007 9945 SND_PCI_QUIRK(0x103c, 0x8be9, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2), 10008 9946 SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED), 10009 - SND_PCI_QUIRK(0x103c, 0x8c15, "HP Spectre 14", ALC287_FIXUP_CS35L41_I2C_2), 9947 + SND_PCI_QUIRK(0x103c, 0x8c15, "HP Spectre x360 2-in-1 Laptop 14-eu0xxx", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX), 10010 9948 SND_PCI_QUIRK(0x103c, 0x8c16, "HP Spectre 16", ALC287_FIXUP_CS35L41_I2C_2), 10011 9949 SND_PCI_QUIRK(0x103c, 0x8c17, "HP Spectre 16", ALC287_FIXUP_CS35L41_I2C_2), 10012 9950 SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), ··· 10177 10115 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC), 10178 10116 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC), 10179 10117 SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK), 10118 + SND_PCI_QUIRK(0x1558, 0x0353, "Clevo V35[05]SN[CDE]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10180 10119 SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10181 10120 SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10182 10121 SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10183 10122 SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10184 10123 SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10185 10124 SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10125 + SND_PCI_QUIRK(0x1558, 0x2624, "Clevo L240TU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10186 10126 SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10187 10127 SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), 10188 10128 SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), ··· 10383 10319 SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE), 10384 10320 SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK), 10385 10321 SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC), 10322 + SND_PCI_QUIRK(0x1854, 0x0440, "LG CQ6", ALC256_FIXUP_HEADPHONE_AMP_VOL), 10323 + SND_PCI_QUIRK(0x1854, 0x0441, "LG CQ6 AIO", ALC256_FIXUP_HEADPHONE_AMP_VOL), 10386 10324 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS), 10387 10325 SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), 10388 10326 SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
+7 -7
sound/soc/amd/yc/acp6x-mach.c
··· 203 203 .driver_data = &acp6x_card, 204 204 .matches = { 205 205 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), 206 - DMI_MATCH(DMI_PRODUCT_NAME, "21J2"), 207 - } 208 - }, 209 - { 210 - .driver_data = &acp6x_card, 211 - .matches = { 212 - DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), 213 206 DMI_MATCH(DMI_PRODUCT_NAME, "21J0"), 214 207 } 215 208 }, ··· 309 316 .matches = { 310 317 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), 311 318 DMI_MATCH(DMI_PRODUCT_NAME, "E1504FA"), 319 + } 320 + }, 321 + { 322 + .driver_data = &acp6x_card, 323 + .matches = { 324 + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), 325 + DMI_MATCH(DMI_PRODUCT_NAME, "M7600RE"), 312 326 } 313 327 }, 314 328 {
-1
sound/soc/amd/yc/pci-acp6x.c
··· 162 162 /* Yellow Carp device check */ 163 163 switch (pci->revision) { 164 164 case 0x60: 165 - case 0x63: 166 165 case 0x6f: 167 166 break; 168 167 default:
+2 -2
sound/soc/codecs/tlv320adc3xxx.c
··· 1429 1429 return ret; 1430 1430 } 1431 1431 1432 - static void __exit adc3xxx_i2c_remove(struct i2c_client *client) 1432 + static void adc3xxx_i2c_remove(struct i2c_client *client) 1433 1433 { 1434 1434 struct adc3xxx *adc3xxx = i2c_get_clientdata(client); 1435 1435 ··· 1452 1452 .of_match_table = tlv320adc3xxx_of_match, 1453 1453 }, 1454 1454 .probe = adc3xxx_i2c_probe, 1455 - .remove = __exit_p(adc3xxx_i2c_remove), 1455 + .remove = adc3xxx_i2c_remove, 1456 1456 .id_table = adc3xxx_i2c_id, 1457 1457 }; 1458 1458
+6 -346
sound/soc/rockchip/rockchip_i2s_tdm.c
··· 25 25 #define DEFAULT_MCLK_FS 256 26 26 #define CH_GRP_MAX 4 /* The max channel 8 / 2 */ 27 27 #define MULTIPLEX_CH_MAX 10 28 - #define CLK_PPM_MIN -1000 29 - #define CLK_PPM_MAX 1000 30 28 31 29 #define TRCM_TXRX 0 32 30 #define TRCM_TX 1 ··· 51 53 struct clk *hclk; 52 54 struct clk *mclk_tx; 53 55 struct clk *mclk_rx; 54 - /* The mclk_tx_src is parent of mclk_tx */ 55 - struct clk *mclk_tx_src; 56 - /* The mclk_rx_src is parent of mclk_rx */ 57 - struct clk *mclk_rx_src; 58 - /* 59 - * The mclk_root0 and mclk_root1 are root parent and supplies for 60 - * the different FS. 61 - * 62 - * e.g: 63 - * mclk_root0 is VPLL0, used for FS=48000Hz 64 - * mclk_root1 is VPLL1, used for FS=44100Hz 65 - */ 66 - struct clk *mclk_root0; 67 - struct clk *mclk_root1; 68 56 struct regmap *regmap; 69 57 struct regmap *grf; 70 58 struct snd_dmaengine_dai_dma_data capture_dma_data; ··· 60 76 const struct rk_i2s_soc_data *soc_data; 61 77 bool is_master_mode; 62 78 bool io_multiplex; 63 - bool mclk_calibrate; 64 79 bool tdm_mode; 65 - unsigned int mclk_rx_freq; 66 - unsigned int mclk_tx_freq; 67 - unsigned int mclk_root0_freq; 68 - unsigned int mclk_root1_freq; 69 - unsigned int mclk_root0_initial_freq; 70 - unsigned int mclk_root1_initial_freq; 71 80 unsigned int frame_width; 72 81 unsigned int clk_trcm; 73 82 unsigned int i2s_sdis[CH_GRP_MAX]; 74 83 unsigned int i2s_sdos[CH_GRP_MAX]; 75 - int clk_ppm; 76 84 int refcount; 77 85 spinlock_t lock; /* xfer lock */ 78 86 bool has_playback; ··· 90 114 { 91 115 clk_disable_unprepare(i2s_tdm->mclk_tx); 92 116 clk_disable_unprepare(i2s_tdm->mclk_rx); 93 - if (i2s_tdm->mclk_calibrate) { 94 - clk_disable_unprepare(i2s_tdm->mclk_tx_src); 95 - clk_disable_unprepare(i2s_tdm->mclk_rx_src); 96 - clk_disable_unprepare(i2s_tdm->mclk_root0); 97 - clk_disable_unprepare(i2s_tdm->mclk_root1); 98 - } 99 117 } 100 118 101 119 /** ··· 112 142 ret = clk_prepare_enable(i2s_tdm->mclk_rx); 113 143 if (ret) 114 144 goto err_mclk_rx; 115 - if (i2s_tdm->mclk_calibrate) { 116 - ret = clk_prepare_enable(i2s_tdm->mclk_tx_src); 117 - if (ret) 118 - goto err_mclk_rx; 119 - ret = clk_prepare_enable(i2s_tdm->mclk_rx_src); 120 - if (ret) 121 - goto err_mclk_rx_src; 122 - ret = clk_prepare_enable(i2s_tdm->mclk_root0); 123 - if (ret) 124 - goto err_mclk_root0; 125 - ret = clk_prepare_enable(i2s_tdm->mclk_root1); 126 - if (ret) 127 - goto err_mclk_root1; 128 - } 129 145 130 146 return 0; 131 147 132 - err_mclk_root1: 133 - clk_disable_unprepare(i2s_tdm->mclk_root0); 134 - err_mclk_root0: 135 - clk_disable_unprepare(i2s_tdm->mclk_rx_src); 136 - err_mclk_rx_src: 137 - clk_disable_unprepare(i2s_tdm->mclk_tx_src); 138 148 err_mclk_rx: 139 149 clk_disable_unprepare(i2s_tdm->mclk_tx); 140 150 err_mclk_tx: ··· 514 564 I2S_XFER_RXS_START); 515 565 } 516 566 517 - static int rockchip_i2s_tdm_clk_set_rate(struct rk_i2s_tdm_dev *i2s_tdm, 518 - struct clk *clk, unsigned long rate, 519 - int ppm) 520 - { 521 - unsigned long rate_target; 522 - int delta, ret; 523 - 524 - if (ppm == i2s_tdm->clk_ppm) 525 - return 0; 526 - 527 - if (ppm < 0) 528 - delta = -1; 529 - else 530 - delta = 1; 531 - 532 - delta *= (int)div64_u64((u64)rate * (u64)abs(ppm) + 500000, 533 - 1000000); 534 - 535 - rate_target = rate + delta; 536 - 537 - if (!rate_target) 538 - return -EINVAL; 539 - 540 - ret = clk_set_rate(clk, rate_target); 541 - if (ret) 542 - return ret; 543 - 544 - i2s_tdm->clk_ppm = ppm; 545 - 546 - return 0; 547 - } 548 - 549 - static int rockchip_i2s_tdm_calibrate_mclk(struct rk_i2s_tdm_dev *i2s_tdm, 550 - struct snd_pcm_substream *substream, 551 - unsigned int lrck_freq) 552 - { 553 - struct clk *mclk_root; 554 - struct clk *mclk_parent; 555 - unsigned int mclk_root_freq; 556 - unsigned int mclk_root_initial_freq; 557 - unsigned int mclk_parent_freq; 558 - unsigned int div, delta; 559 - u64 ppm; 560 - int ret; 561 - 562 - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 563 - mclk_parent = i2s_tdm->mclk_tx_src; 564 - else 565 - mclk_parent = i2s_tdm->mclk_rx_src; 566 - 567 - switch (lrck_freq) { 568 - case 8000: 569 - case 16000: 570 - case 24000: 571 - case 32000: 572 - case 48000: 573 - case 64000: 574 - case 96000: 575 - case 192000: 576 - mclk_root = i2s_tdm->mclk_root0; 577 - mclk_root_freq = i2s_tdm->mclk_root0_freq; 578 - mclk_root_initial_freq = i2s_tdm->mclk_root0_initial_freq; 579 - mclk_parent_freq = DEFAULT_MCLK_FS * 192000; 580 - break; 581 - case 11025: 582 - case 22050: 583 - case 44100: 584 - case 88200: 585 - case 176400: 586 - mclk_root = i2s_tdm->mclk_root1; 587 - mclk_root_freq = i2s_tdm->mclk_root1_freq; 588 - mclk_root_initial_freq = i2s_tdm->mclk_root1_initial_freq; 589 - mclk_parent_freq = DEFAULT_MCLK_FS * 176400; 590 - break; 591 - default: 592 - dev_err(i2s_tdm->dev, "Invalid LRCK frequency: %u Hz\n", 593 - lrck_freq); 594 - return -EINVAL; 595 - } 596 - 597 - ret = clk_set_parent(mclk_parent, mclk_root); 598 - if (ret) 599 - return ret; 600 - 601 - ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, mclk_root, 602 - mclk_root_freq, 0); 603 - if (ret) 604 - return ret; 605 - 606 - delta = abs(mclk_root_freq % mclk_parent_freq - mclk_parent_freq); 607 - ppm = div64_u64((uint64_t)delta * 1000000, (uint64_t)mclk_root_freq); 608 - 609 - if (ppm) { 610 - div = DIV_ROUND_CLOSEST(mclk_root_initial_freq, mclk_parent_freq); 611 - if (!div) 612 - return -EINVAL; 613 - 614 - mclk_root_freq = mclk_parent_freq * round_up(div, 2); 615 - 616 - ret = clk_set_rate(mclk_root, mclk_root_freq); 617 - if (ret) 618 - return ret; 619 - 620 - i2s_tdm->mclk_root0_freq = clk_get_rate(i2s_tdm->mclk_root0); 621 - i2s_tdm->mclk_root1_freq = clk_get_rate(i2s_tdm->mclk_root1); 622 - } 623 - 624 - return clk_set_rate(mclk_parent, mclk_parent_freq); 625 - } 626 - 627 - static int rockchip_i2s_tdm_set_mclk(struct rk_i2s_tdm_dev *i2s_tdm, 628 - struct snd_pcm_substream *substream, 629 - struct clk **mclk) 630 - { 631 - unsigned int mclk_freq; 632 - int ret; 633 - 634 - if (i2s_tdm->clk_trcm) { 635 - if (i2s_tdm->mclk_tx_freq != i2s_tdm->mclk_rx_freq) { 636 - dev_err(i2s_tdm->dev, 637 - "clk_trcm, tx: %d and rx: %d should be the same\n", 638 - i2s_tdm->mclk_tx_freq, 639 - i2s_tdm->mclk_rx_freq); 640 - return -EINVAL; 641 - } 642 - 643 - ret = clk_set_rate(i2s_tdm->mclk_tx, i2s_tdm->mclk_tx_freq); 644 - if (ret) 645 - return ret; 646 - 647 - ret = clk_set_rate(i2s_tdm->mclk_rx, i2s_tdm->mclk_rx_freq); 648 - if (ret) 649 - return ret; 650 - 651 - /* mclk_rx is also ok. */ 652 - *mclk = i2s_tdm->mclk_tx; 653 - } else { 654 - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 655 - *mclk = i2s_tdm->mclk_tx; 656 - mclk_freq = i2s_tdm->mclk_tx_freq; 657 - } else { 658 - *mclk = i2s_tdm->mclk_rx; 659 - mclk_freq = i2s_tdm->mclk_rx_freq; 660 - } 661 - 662 - ret = clk_set_rate(*mclk, mclk_freq); 663 - if (ret) 664 - return ret; 665 - } 666 - 667 - return 0; 668 - } 669 - 670 567 static int rockchip_i2s_ch_to_io(unsigned int ch, bool substream_capture) 671 568 { 672 569 if (substream_capture) { ··· 650 853 struct snd_soc_dai *dai) 651 854 { 652 855 struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai); 653 - struct clk *mclk; 654 - int ret = 0; 655 856 unsigned int val = 0; 656 857 unsigned int mclk_rate, bclk_rate, div_bclk = 4, div_lrck = 64; 858 + int err; 657 859 658 860 if (i2s_tdm->is_master_mode) { 659 - if (i2s_tdm->mclk_calibrate) 660 - rockchip_i2s_tdm_calibrate_mclk(i2s_tdm, substream, 661 - params_rate(params)); 861 + struct clk *mclk = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? 862 + i2s_tdm->mclk_tx : i2s_tdm->mclk_rx; 662 863 663 - ret = rockchip_i2s_tdm_set_mclk(i2s_tdm, substream, &mclk); 664 - if (ret) 665 - return ret; 864 + err = clk_set_rate(mclk, DEFAULT_MCLK_FS * params_rate(params)); 865 + if (err) 866 + return err; 666 867 667 868 mclk_rate = clk_get_rate(mclk); 668 869 bclk_rate = i2s_tdm->frame_width * params_rate(params); ··· 768 973 return 0; 769 974 } 770 975 771 - static int rockchip_i2s_tdm_set_sysclk(struct snd_soc_dai *cpu_dai, int stream, 772 - unsigned int freq, int dir) 773 - { 774 - struct rk_i2s_tdm_dev *i2s_tdm = to_info(cpu_dai); 775 - 776 - /* Put set mclk rate into rockchip_i2s_tdm_set_mclk() */ 777 - if (i2s_tdm->clk_trcm) { 778 - i2s_tdm->mclk_tx_freq = freq; 779 - i2s_tdm->mclk_rx_freq = freq; 780 - } else { 781 - if (stream == SNDRV_PCM_STREAM_PLAYBACK) 782 - i2s_tdm->mclk_tx_freq = freq; 783 - else 784 - i2s_tdm->mclk_rx_freq = freq; 785 - } 786 - 787 - dev_dbg(i2s_tdm->dev, "The target mclk_%s freq is: %d\n", 788 - stream ? "rx" : "tx", freq); 789 - 790 - return 0; 791 - } 792 - 793 - static int rockchip_i2s_tdm_clk_compensation_info(struct snd_kcontrol *kcontrol, 794 - struct snd_ctl_elem_info *uinfo) 795 - { 796 - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 797 - uinfo->count = 1; 798 - uinfo->value.integer.min = CLK_PPM_MIN; 799 - uinfo->value.integer.max = CLK_PPM_MAX; 800 - uinfo->value.integer.step = 1; 801 - 802 - return 0; 803 - } 804 - 805 - static int rockchip_i2s_tdm_clk_compensation_get(struct snd_kcontrol *kcontrol, 806 - struct snd_ctl_elem_value *ucontrol) 807 - { 808 - struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); 809 - struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai); 810 - 811 - ucontrol->value.integer.value[0] = i2s_tdm->clk_ppm; 812 - 813 - return 0; 814 - } 815 - 816 - static int rockchip_i2s_tdm_clk_compensation_put(struct snd_kcontrol *kcontrol, 817 - struct snd_ctl_elem_value *ucontrol) 818 - { 819 - struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); 820 - struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai); 821 - int ret = 0, ppm = 0; 822 - int changed = 0; 823 - unsigned long old_rate; 824 - 825 - if (ucontrol->value.integer.value[0] < CLK_PPM_MIN || 826 - ucontrol->value.integer.value[0] > CLK_PPM_MAX) 827 - return -EINVAL; 828 - 829 - ppm = ucontrol->value.integer.value[0]; 830 - 831 - old_rate = clk_get_rate(i2s_tdm->mclk_root0); 832 - ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, i2s_tdm->mclk_root0, 833 - i2s_tdm->mclk_root0_freq, ppm); 834 - if (ret) 835 - return ret; 836 - if (old_rate != clk_get_rate(i2s_tdm->mclk_root0)) 837 - changed = 1; 838 - 839 - if (clk_is_match(i2s_tdm->mclk_root0, i2s_tdm->mclk_root1)) 840 - return changed; 841 - 842 - old_rate = clk_get_rate(i2s_tdm->mclk_root1); 843 - ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, i2s_tdm->mclk_root1, 844 - i2s_tdm->mclk_root1_freq, ppm); 845 - if (ret) 846 - return ret; 847 - if (old_rate != clk_get_rate(i2s_tdm->mclk_root1)) 848 - changed = 1; 849 - 850 - return changed; 851 - } 852 - 853 - static struct snd_kcontrol_new rockchip_i2s_tdm_compensation_control = { 854 - .iface = SNDRV_CTL_ELEM_IFACE_PCM, 855 - .name = "PCM Clock Compensation in PPM", 856 - .info = rockchip_i2s_tdm_clk_compensation_info, 857 - .get = rockchip_i2s_tdm_clk_compensation_get, 858 - .put = rockchip_i2s_tdm_clk_compensation_put, 859 - }; 860 - 861 976 static int rockchip_i2s_tdm_dai_probe(struct snd_soc_dai *dai) 862 977 { 863 978 struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai); ··· 776 1071 snd_soc_dai_dma_data_set_capture(dai, &i2s_tdm->capture_dma_data); 777 1072 if (i2s_tdm->has_playback) 778 1073 snd_soc_dai_dma_data_set_playback(dai, &i2s_tdm->playback_dma_data); 779 - 780 - if (i2s_tdm->mclk_calibrate) 781 - snd_soc_add_dai_controls(dai, &rockchip_i2s_tdm_compensation_control, 1); 782 1074 783 1075 return 0; 784 1076 } ··· 817 1115 .probe = rockchip_i2s_tdm_dai_probe, 818 1116 .hw_params = rockchip_i2s_tdm_hw_params, 819 1117 .set_bclk_ratio = rockchip_i2s_tdm_set_bclk_ratio, 820 - .set_sysclk = rockchip_i2s_tdm_set_sysclk, 821 1118 .set_fmt = rockchip_i2s_tdm_set_fmt, 822 1119 .set_tdm_slot = rockchip_dai_tdm_slot, 823 1120 .trigger = rockchip_i2s_tdm_trigger, ··· 1145 1444 rockchip_i2s_tdm_tx_path_config(i2s_tdm, num); 1146 1445 } 1147 1446 1148 - static int rockchip_i2s_tdm_get_calibrate_mclks(struct rk_i2s_tdm_dev *i2s_tdm) 1149 - { 1150 - int num_mclks = 0; 1151 - 1152 - i2s_tdm->mclk_tx_src = devm_clk_get(i2s_tdm->dev, "mclk_tx_src"); 1153 - if (!IS_ERR(i2s_tdm->mclk_tx_src)) 1154 - num_mclks++; 1155 - 1156 - i2s_tdm->mclk_rx_src = devm_clk_get(i2s_tdm->dev, "mclk_rx_src"); 1157 - if (!IS_ERR(i2s_tdm->mclk_rx_src)) 1158 - num_mclks++; 1159 - 1160 - i2s_tdm->mclk_root0 = devm_clk_get(i2s_tdm->dev, "mclk_root0"); 1161 - if (!IS_ERR(i2s_tdm->mclk_root0)) 1162 - num_mclks++; 1163 - 1164 - i2s_tdm->mclk_root1 = devm_clk_get(i2s_tdm->dev, "mclk_root1"); 1165 - if (!IS_ERR(i2s_tdm->mclk_root1)) 1166 - num_mclks++; 1167 - 1168 - if (num_mclks < 4 && num_mclks != 0) 1169 - return -ENOENT; 1170 - 1171 - if (num_mclks == 4) 1172 - i2s_tdm->mclk_calibrate = 1; 1173 - 1174 - return 0; 1175 - } 1176 - 1177 1447 static int rockchip_i2s_tdm_path_prepare(struct rk_i2s_tdm_dev *i2s_tdm, 1178 1448 struct device_node *np, 1179 1449 bool is_rx_path) ··· 1282 1610 i2s_tdm->io_multiplex = 1283 1611 of_property_read_bool(node, "rockchip,io-multiplex"); 1284 1612 1285 - ret = rockchip_i2s_tdm_get_calibrate_mclks(i2s_tdm); 1286 - if (ret) 1287 - return dev_err_probe(i2s_tdm->dev, ret, 1288 - "mclk-calibrate clocks missing"); 1289 - 1290 1613 regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); 1291 1614 if (IS_ERR(regs)) { 1292 1615 return dev_err_probe(i2s_tdm->dev, PTR_ERR(regs), ··· 1332 1665 ret = dev_err_probe(i2s_tdm->dev, ret, 1333 1666 "Failed to enable one or more mclks\n"); 1334 1667 goto err_disable_hclk; 1335 - } 1336 - 1337 - if (i2s_tdm->mclk_calibrate) { 1338 - i2s_tdm->mclk_root0_initial_freq = clk_get_rate(i2s_tdm->mclk_root0); 1339 - i2s_tdm->mclk_root1_initial_freq = clk_get_rate(i2s_tdm->mclk_root1); 1340 - i2s_tdm->mclk_root0_freq = i2s_tdm->mclk_root0_initial_freq; 1341 - i2s_tdm->mclk_root1_freq = i2s_tdm->mclk_root1_initial_freq; 1342 1668 } 1343 1669 1344 1670 pm_runtime_enable(&pdev->dev);
+4
sound/soc/soc-compress.c
··· 385 385 386 386 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; 387 387 388 + snd_soc_dpcm_mutex_lock(fe); 388 389 ret = dpcm_be_dai_hw_params(fe, stream); 390 + snd_soc_dpcm_mutex_unlock(fe); 389 391 if (ret < 0) 390 392 goto out; 391 393 394 + snd_soc_dpcm_mutex_lock(fe); 392 395 ret = dpcm_be_dai_prepare(fe, stream); 396 + snd_soc_dpcm_mutex_unlock(fe); 393 397 if (ret < 0) 394 398 goto out; 395 399
+3
sound/soc/soc-core.c
··· 1219 1219 if (!snd_soc_is_matching_component(platform, component)) 1220 1220 continue; 1221 1221 1222 + if (snd_soc_component_is_dummy(component) && component->num_dai) 1223 + continue; 1224 + 1222 1225 snd_soc_rtd_add_component(rtd, component); 1223 1226 } 1224 1227 }
+1 -1
sound/soc/sof/amd/acp-loader.c
··· 173 173 174 174 adata = sdev->pdata->hw_pdata; 175 175 176 - if (adata->signed_fw_image) 176 + if (adata->quirks && adata->quirks->signed_fw_image) 177 177 size_fw = adata->fw_bin_size - ACP_FIRMWARE_SIGNATURE; 178 178 else 179 179 size_fw = adata->fw_bin_size;
+26 -22
sound/soc/sof/amd/acp.c
··· 20 20 #include "acp.h" 21 21 #include "acp-dsp-offset.h" 22 22 23 - #define SECURED_FIRMWARE 1 24 - 25 23 static bool enable_fw_debug; 26 24 module_param(enable_fw_debug, bool, 0444); 27 25 MODULE_PARM_DESC(enable_fw_debug, "Enable Firmware debug"); 26 + 27 + static struct acp_quirk_entry quirk_valve_galileo = { 28 + .signed_fw_image = true, 29 + .skip_iram_dram_size_mod = true, 30 + }; 28 31 29 32 const struct dmi_system_id acp_sof_quirk_table[] = { 30 33 { ··· 36 33 DMI_MATCH(DMI_SYS_VENDOR, "Valve"), 37 34 DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"), 38 35 }, 39 - .driver_data = (void *)SECURED_FIRMWARE, 36 + .driver_data = &quirk_valve_galileo, 40 37 }, 41 38 {} 42 39 }; ··· 257 254 } 258 255 } 259 256 260 - if (adata->signed_fw_image) 257 + if (adata->quirks && adata->quirks->signed_fw_image) 261 258 snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_SHA_DMA_INCLUDE_HDR, ACP_SHA_HEADER); 262 259 263 260 snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_SHA_DMA_STRT_ADDR, start_addr); ··· 281 278 } 282 279 283 280 /* psp_send_cmd only required for vangogh platform (rev - 5) */ 284 - if (desc->rev == 5) { 281 + if (desc->rev == 5 && !(adata->quirks && adata->quirks->skip_iram_dram_size_mod)) { 285 282 /* Modify IRAM and DRAM size */ 286 283 ret = psp_send_cmd(adata, MBOX_ACP_IRAM_DRAM_FENCE_COMMAND | IRAM_DRAM_FENCE_2); 287 284 if (ret) ··· 741 738 sdev->debug_box.offset = sdev->host_box.offset + sdev->host_box.size; 742 739 sdev->debug_box.size = BOX_SIZE_1024; 743 740 744 - adata->signed_fw_image = false; 745 741 dmi_id = dmi_first_match(acp_sof_quirk_table); 746 - if (dmi_id && dmi_id->driver_data) { 747 - adata->fw_code_bin = devm_kasprintf(sdev->dev, GFP_KERNEL, 748 - "sof-%s-code.bin", 749 - chip->name); 750 - if (!adata->fw_code_bin) { 751 - ret = -ENOMEM; 752 - goto free_ipc_irq; 753 - } 742 + if (dmi_id) { 743 + adata->quirks = dmi_id->driver_data; 754 744 755 - adata->fw_data_bin = devm_kasprintf(sdev->dev, GFP_KERNEL, 756 - "sof-%s-data.bin", 757 - chip->name); 758 - if (!adata->fw_data_bin) { 759 - ret = -ENOMEM; 760 - goto free_ipc_irq; 761 - } 745 + if (adata->quirks->signed_fw_image) { 746 + adata->fw_code_bin = devm_kasprintf(sdev->dev, GFP_KERNEL, 747 + "sof-%s-code.bin", 748 + chip->name); 749 + if (!adata->fw_code_bin) { 750 + ret = -ENOMEM; 751 + goto free_ipc_irq; 752 + } 762 753 763 - adata->signed_fw_image = dmi_id->driver_data; 754 + adata->fw_data_bin = devm_kasprintf(sdev->dev, GFP_KERNEL, 755 + "sof-%s-data.bin", 756 + chip->name); 757 + if (!adata->fw_data_bin) { 758 + ret = -ENOMEM; 759 + goto free_ipc_irq; 760 + } 761 + } 764 762 } 765 763 766 764 adata->enable_fw_debug = enable_fw_debug;
+6 -1
sound/soc/sof/amd/acp.h
··· 207 207 u64 sdw_acpi_dev_addr; 208 208 }; 209 209 210 + struct acp_quirk_entry { 211 + bool signed_fw_image; 212 + bool skip_iram_dram_size_mod; 213 + }; 214 + 210 215 /* Common device data struct for ACP devices */ 211 216 struct acp_dev_data { 212 217 struct snd_sof_dev *dev; ··· 241 236 u8 *data_buf; 242 237 dma_addr_t sram_dma_addr; 243 238 u8 *sram_data_buf; 244 - bool signed_fw_image; 239 + struct acp_quirk_entry *quirks; 245 240 struct dma_descriptor dscr_info[ACP_MAX_DESC]; 246 241 struct acp_dsp_stream stream_buf[ACP_MAX_STREAM]; 247 242 struct acp_dsp_stream *dtrace_stream;
+7 -2
sound/soc/sof/amd/vangogh.c
··· 143 143 int sof_vangogh_ops_init(struct snd_sof_dev *sdev) 144 144 { 145 145 const struct dmi_system_id *dmi_id; 146 + struct acp_quirk_entry *quirks; 146 147 147 148 /* common defaults */ 148 149 memcpy(&sof_vangogh_ops, &sof_acp_common_ops, sizeof(struct snd_sof_dsp_ops)); ··· 152 151 sof_vangogh_ops.num_drv = ARRAY_SIZE(vangogh_sof_dai); 153 152 154 153 dmi_id = dmi_first_match(acp_sof_quirk_table); 155 - if (dmi_id && dmi_id->driver_data) 156 - sof_vangogh_ops.load_firmware = acp_sof_load_signed_firmware; 154 + if (dmi_id) { 155 + quirks = dmi_id->driver_data; 156 + 157 + if (quirks->signed_fw_image) 158 + sof_vangogh_ops.load_firmware = acp_sof_load_signed_firmware; 159 + } 157 160 158 161 return 0; 159 162 }