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

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

Pull sound fixes from Takashi Iwai:
"A collection of small fixes for 6.10-rc1. Most of changes are various
device-specific fixes and quirks, while there are a few small changes
in ALSA core timer and module / built-in fixes"

* tag 'sound-fix-6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: hda/realtek: fix mute/micmute LEDs don't work for ProBook 440/460 G11.
ALSA: core: Enable proc module when CONFIG_MODULES=y
ALSA: core: Fix NULL module pointer assignment at card init
ALSA: hda/realtek: Enable headset mic of JP-IK LEAP W502 with ALC897
ASoC: dt-bindings: stm32: Ensure compatible pattern matches whole string
ASoC: tas2781: Fix wrong loading calibrated data sequence
ASoC: tas2552: Add TX path for capturing AUDIO-OUT data
ALSA: usb-audio: Fix for sampling rates support for Mbox3
Documentation: sound: Fix trailing whitespaces
ALSA: timer: Set lower bound of start tick time
ASoC: codecs: ES8326: solve hp and button detect issue
ASoC: rt5645: mic-in detection threshold modification
ASoC: Intel: sof_sdw_rt_sdca_jack_common: Use name_prefix for `-sdca` detection

+86 -106
+1 -1
Documentation/devicetree/bindings/sound/st,stm32-sai.yaml
··· 72 72 properties: 73 73 compatible: 74 74 description: Compatible for SAI sub-block A or B. 75 - pattern: "st,stm32-sai-sub-[ab]" 75 + pattern: "^st,stm32-sai-sub-[ab]$" 76 76 77 77 "#sound-dai-cells": 78 78 const: 0
+8 -8
Documentation/sound/hd-audio/notes.rst
··· 15 15 This document explains the brief trouble-shooting and debugging 16 16 methods for the HD-audio hardware. 17 17 18 - The HD-audio component consists of two parts: the controller chip and 18 + The HD-audio component consists of two parts: the controller chip and 19 19 the codec chips on the HD-audio bus. Linux provides a single driver 20 20 for all controllers, snd-hda-intel. Although the driver name contains 21 21 a word of a well-known hardware vendor, it's not specific to it but for ··· 81 81 processing the data on the buffer. This caused a lot of problems, for 82 82 example, with ALSA dmix or JACK. Since 2.6.27 kernel, the driver puts 83 83 an artificial delay to the wake up timing. This delay is controlled 84 - via ``bdl_pos_adj`` option. 84 + via ``bdl_pos_adj`` option. 85 85 86 86 When ``bdl_pos_adj`` is a negative value (as default), it's assigned to 87 87 an appropriate value depending on the controller chip. For Intel ··· 144 144 in the recent kernel, try to pass ``enable_msi=0`` option to disable 145 145 MSI. If it works, you can add the known bad device to the blacklist 146 146 defined in hda_intel.c. In such a case, please report and give the 147 - patch back to the upstream developer. 147 + patch back to the upstream developer. 148 148 149 149 150 150 HD-Audio Codec ··· 375 375 ------------------------ 376 376 This is an experimental feature to allow you re-configure the HD-audio 377 377 codec dynamically without reloading the driver. The following sysfs 378 - files are available under each codec-hwdep device directory (e.g. 378 + files are available under each codec-hwdep device directory (e.g. 379 379 /sys/class/sound/hwC0D0): 380 380 381 381 vendor_id ··· 433 433 :: 434 434 435 435 # echo 0x14 0x9993013f > /sys/class/sound/hwC0D0/user_pin_configs 436 - # echo 1 > /sys/class/sound/hwC0D0/reconfig 436 + # echo 1 > /sys/class/sound/hwC0D0/reconfig 437 437 438 438 439 439 Hint Strings ··· 494 494 mixer control, if available 495 495 add_stereo_mix_input (bool) 496 496 add the stereo mix (analog-loopback mix) to the input mux if 497 - available 497 + available 498 498 add_jack_modes (bool) 499 499 add "xxx Jack Mode" enum controls to each I/O jack for allowing to 500 500 change the headphone amp and mic bias VREF capabilities ··· 504 504 stream states 505 505 power_down_unused (bool) 506 506 power down the unused widgets, a subset of power_save_node, and 507 - will be dropped in future 507 + will be dropped in future 508 508 add_hp_mic (bool) 509 509 add the headphone to capture source if possible 510 510 hp_mic_detect (bool) ··· 603 603 604 604 The patch module option is specific to each card instance, and you 605 605 need to give one file name for each instance, separated by commas. 606 - For example, if you have two cards, one for an on-board analog and one 606 + For example, if you have two cards, one for an on-board analog and one 607 607 for an HDMI video board, you may pass patch option like below: 608 608 :: 609 609
+3 -4
include/sound/tas2781-dsp.h
··· 2 2 // 3 3 // ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier 4 4 // 5 - // Copyright (C) 2022 - 2023 Texas Instruments Incorporated 5 + // Copyright (C) 2022 - 2024 Texas Instruments Incorporated 6 6 // https://www.ti.com 7 7 // 8 8 // The TAS2781 driver implements a flexible and configurable ··· 13 13 // Author: Kevin Lu <kevin-lu@ti.com> 14 14 // 15 15 16 - #ifndef __TASDEVICE_DSP_H__ 17 - #define __TASDEVICE_DSP_H__ 16 + #ifndef __TAS2781_DSP_H__ 17 + #define __TAS2781_DSP_H__ 18 18 19 19 #define MAIN_ALL_DEVICES 0x0d 20 20 #define MAIN_DEVICE_A 0x01 ··· 180 180 int tasdevice_select_tuningprm_cfg(void *context, int prm, 181 181 int cfg_no, int rca_conf_no); 182 182 int tasdevice_prmg_load(void *context, int prm_no); 183 - int tasdevice_prmg_calibdata_load(void *context, int prm_no); 184 183 void tasdevice_tuning_switch(void *context, int state); 185 184 int tas2781_load_calibration(void *context, char *file_name, 186 185 unsigned short i);
+5 -7
sound/core/init.c
··· 50 50 static int module_slot_match(struct module *module, int idx) 51 51 { 52 52 int match = 1; 53 - #ifdef MODULE 53 + #ifdef CONFIG_MODULES 54 54 const char *s1, *s2; 55 55 56 56 if (!module || !*module->name || !slots[idx]) ··· 77 77 if (!c1) 78 78 break; 79 79 } 80 - #endif /* MODULE */ 80 + #endif /* CONFIG_MODULES */ 81 81 return match; 82 82 } 83 83 ··· 311 311 } 312 312 card->dev = parent; 313 313 card->number = idx; 314 - #ifdef MODULE 315 - WARN_ON(!module); 314 + WARN_ON(IS_MODULE(CONFIG_SND) && !module); 316 315 card->module = module; 317 - #endif 318 316 INIT_LIST_HEAD(&card->devices); 319 317 init_rwsem(&card->controls_rwsem); 320 318 rwlock_init(&card->ctl_files_rwlock); ··· 967 969 968 970 #endif 969 971 970 - #ifdef MODULE 972 + #ifdef CONFIG_MODULES 971 973 static void snd_card_module_info_read(struct snd_info_entry *entry, 972 974 struct snd_info_buffer *buffer) 973 975 { ··· 995 997 if (snd_info_register(entry) < 0) 996 998 return -ENOMEM; /* freed in error path */ 997 999 998 - #ifdef MODULE 1000 + #ifdef CONFIG_MODULES 999 1001 entry = snd_info_create_module_entry(THIS_MODULE, "modules", NULL); 1000 1002 if (!entry) 1001 1003 return -ENOMEM;
+8
sound/core/timer.c
··· 544 544 SNDRV_TIMER_IFLG_START)) 545 545 return -EBUSY; 546 546 547 + /* check the actual time for the start tick; 548 + * bail out as error if it's way too low (< 100us) 549 + */ 550 + if (start) { 551 + if ((u64)snd_timer_hw_resolution(timer) * ticks < 100000) 552 + return -EINVAL; 553 + } 554 + 547 555 if (start) 548 556 timeri->ticks = timeri->cticks = ticks; 549 557 else if (!timeri->cticks)
+12
sound/pci/hda/patch_realtek.c
··· 10194 10194 SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 10195 10195 SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 10196 10196 SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 10197 + SND_PCI_QUIRK(0x103c, 0x8c89, "HP ProBook 460 G11", ALC236_FIXUP_HP_GPIO_LED), 10197 10198 SND_PCI_QUIRK(0x103c, 0x8c8a, "HP EliteBook 630", ALC236_FIXUP_HP_GPIO_LED), 10198 10199 SND_PCI_QUIRK(0x103c, 0x8c8c, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED), 10200 + SND_PCI_QUIRK(0x103c, 0x8c8d, "HP ProBook 440 G11", ALC236_FIXUP_HP_GPIO_LED), 10201 + SND_PCI_QUIRK(0x103c, 0x8c8e, "HP ProBook 460 G11", ALC236_FIXUP_HP_GPIO_LED), 10199 10202 SND_PCI_QUIRK(0x103c, 0x8c90, "HP EliteBook 640", ALC236_FIXUP_HP_GPIO_LED), 10200 10203 SND_PCI_QUIRK(0x103c, 0x8c91, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED), 10201 10204 SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), ··· 12031 12028 ALC897_FIXUP_LENOVO_HEADSET_MODE, 12032 12029 ALC897_FIXUP_HEADSET_MIC_PIN2, 12033 12030 ALC897_FIXUP_UNIS_H3C_X500S, 12031 + ALC897_FIXUP_HEADSET_MIC_PIN3, 12034 12032 }; 12035 12033 12036 12034 static const struct hda_fixup alc662_fixups[] = { ··· 12478 12474 {} 12479 12475 }, 12480 12476 }, 12477 + [ALC897_FIXUP_HEADSET_MIC_PIN3] = { 12478 + .type = HDA_FIXUP_PINS, 12479 + .v.pins = (const struct hda_pintbl[]) { 12480 + { 0x19, 0x03a11050 }, /* use as headset mic */ 12481 + { } 12482 + }, 12483 + }, 12481 12484 }; 12482 12485 12483 12486 static const struct snd_pci_quirk alc662_fixup_tbl[] = { 12484 12487 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2), 12488 + SND_PCI_QUIRK(0x1019, 0x9859, "JP-IK LEAP W502", ALC897_FIXUP_HEADSET_MIC_PIN3), 12485 12489 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC), 12486 12490 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC), 12487 12491 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
+3 -3
sound/soc/codecs/es8326.c
··· 829 829 /* mute adc when mic path switch */ 830 830 regmap_write(es8326->regmap, ES8326_ADC1_SRC, 0x44); 831 831 regmap_write(es8326->regmap, ES8326_ADC2_SRC, 0x66); 832 - es8326->hp = 0; 833 832 } 833 + es8326->hp = 0; 834 834 regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x01); 835 835 regmap_write(es8326->regmap, ES8326_SYS_BIAS, 0x0a); 836 836 regmap_update_bits(es8326->regmap, ES8326_HP_DRIVER_REF, 0x0f, 0x03); ··· 981 981 regmap_write(es8326->regmap, ES8326_ANA_LP, 0xf0); 982 982 usleep_range(10000, 15000); 983 983 regmap_write(es8326->regmap, ES8326_HPJACK_TIMER, 0xd9); 984 - regmap_write(es8326->regmap, ES8326_ANA_MICBIAS, 0xcb); 984 + regmap_write(es8326->regmap, ES8326_ANA_MICBIAS, 0xd8); 985 985 /* set headphone default type and detect pin */ 986 986 regmap_write(es8326->regmap, ES8326_HPDET_TYPE, 0x83); 987 987 regmap_write(es8326->regmap, ES8326_CLK_RESAMPLE, 0x05); ··· 1018 1018 1019 1019 regmap_write(es8326->regmap, ES8326_ANA_VSEL, 0x7F); 1020 1020 /* select vdda as micbias source */ 1021 - regmap_write(es8326->regmap, ES8326_VMIDLOW, 0x23); 1021 + regmap_write(es8326->regmap, ES8326_VMIDLOW, 0x03); 1022 1022 /* set dac dsmclip = 1 */ 1023 1023 regmap_write(es8326->regmap, ES8326_DAC_DSM, 0x08); 1024 1024 regmap_write(es8326->regmap, ES8326_DAC_VPPSCALE, 0x15);
+1
sound/soc/codecs/rt5645.c
··· 81 81 static const struct reg_sequence rt5650_init_list[] = { 82 82 {0xf6, 0x0100}, 83 83 {RT5645_PWR_ANLG1, 0x02}, 84 + {RT5645_IL_CMD3, 0x0018}, 84 85 }; 85 86 86 87 static const struct reg_default rt5645_reg[] = {
+13 -2
sound/soc/codecs/tas2552.c
··· 2 2 /* 3 3 * tas2552.c - ALSA SoC Texas Instruments TAS2552 Mono Audio Amplifier 4 4 * 5 - * Copyright (C) 2014 Texas Instruments Incorporated - https://www.ti.com 5 + * Copyright (C) 2014 - 2024 Texas Instruments Incorporated - 6 + * https://www.ti.com 6 7 * 7 8 * Author: Dan Murphy <dmurphy@ti.com> 8 9 */ ··· 120 119 &tas2552_input_mux_control), 121 120 122 121 SND_SOC_DAPM_AIF_IN("DAC IN", "DAC Playback", 0, SND_SOC_NOPM, 0, 0), 122 + SND_SOC_DAPM_AIF_OUT("ASI OUT", "DAC Capture", 0, SND_SOC_NOPM, 0, 0), 123 123 SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0), 124 124 SND_SOC_DAPM_OUT_DRV("ClassD", TAS2552_CFG_2, 7, 0, NULL, 0), 125 125 SND_SOC_DAPM_SUPPLY("PLL", TAS2552_CFG_2, 3, 0, NULL, 0), 126 126 SND_SOC_DAPM_POST("Post Event", tas2552_post_event), 127 127 128 - SND_SOC_DAPM_OUTPUT("OUT") 128 + SND_SOC_DAPM_OUTPUT("OUT"), 129 + SND_SOC_DAPM_INPUT("DMIC") 129 130 }; 130 131 131 132 static const struct snd_soc_dapm_route tas2552_audio_map[] = { ··· 137 134 {"ClassD", NULL, "Input selection"}, 138 135 {"OUT", NULL, "ClassD"}, 139 136 {"ClassD", NULL, "PLL"}, 137 + {"ASI OUT", NULL, "DMIC"} 140 138 }; 141 139 142 140 #ifdef CONFIG_PM ··· 537 533 .name = "tas2552-amplifier", 538 534 .playback = { 539 535 .stream_name = "Playback", 536 + .channels_min = 2, 537 + .channels_max = 2, 538 + .rates = SNDRV_PCM_RATE_8000_192000, 539 + .formats = TAS2552_FORMATS, 540 + }, 541 + .capture = { 542 + .stream_name = "Capture", 540 543 .channels_min = 2, 541 544 .channels_max = 2, 542 545 .rates = SNDRV_PCM_RATE_8000_192000,
+27 -76
sound/soc/codecs/tas2781-fmwlib.c
··· 2151 2151 return ret; 2152 2152 } 2153 2153 2154 + static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i) 2155 + { 2156 + struct tasdevice_calibration *cal; 2157 + struct tasdevice_fw *cal_fmw; 2158 + 2159 + cal_fmw = priv->tasdevice[i].cali_data_fmw; 2160 + 2161 + /* No calibrated data for current devices, playback will go ahead. */ 2162 + if (!cal_fmw) 2163 + return; 2164 + 2165 + cal = cal_fmw->calibrations; 2166 + if (cal) 2167 + return; 2168 + 2169 + load_calib_data(priv, &cal->dev_data); 2170 + } 2171 + 2154 2172 int tasdevice_select_tuningprm_cfg(void *context, int prm_no, 2155 2173 int cfg_no, int rca_conf_no) 2156 2174 { ··· 2228 2210 for (i = 0; i < tas_priv->ndev; i++) { 2229 2211 if (tas_priv->tasdevice[i].is_loaderr == true) 2230 2212 continue; 2231 - else if (tas_priv->tasdevice[i].is_loaderr == false 2232 - && tas_priv->tasdevice[i].is_loading == true) { 2233 - struct tasdevice_fw *cal_fmw = 2234 - tas_priv->tasdevice[i].cali_data_fmw; 2235 - 2236 - if (cal_fmw) { 2237 - struct tasdevice_calibration 2238 - *cal = cal_fmw->calibrations; 2239 - 2240 - if (cal) 2241 - load_calib_data(tas_priv, 2242 - &(cal->dev_data)); 2243 - } 2213 + if (tas_priv->tasdevice[i].is_loaderr == false && 2214 + tas_priv->tasdevice[i].is_loading == true) 2244 2215 tas_priv->tasdevice[i].cur_prog = prm_no; 2245 - } 2246 2216 } 2247 2217 } 2248 2218 ··· 2251 2245 tasdevice_load_data(tas_priv, &(conf->dev_data)); 2252 2246 for (i = 0; i < tas_priv->ndev; i++) { 2253 2247 if (tas_priv->tasdevice[i].is_loaderr == true) { 2254 - status |= 1 << (i + 4); 2248 + status |= BIT(i + 4); 2255 2249 continue; 2256 - } else if (tas_priv->tasdevice[i].is_loaderr == false 2257 - && tas_priv->tasdevice[i].is_loading == true) 2250 + } 2251 + 2252 + if (tas_priv->tasdevice[i].is_loaderr == false && 2253 + tas_priv->tasdevice[i].is_loading == true) { 2254 + tasdev_load_calibrated_data(tas_priv, i); 2258 2255 tas_priv->tasdevice[i].cur_conf = cfg_no; 2256 + } 2259 2257 } 2260 2258 } else 2261 2259 dev_dbg(tas_priv->dev, "%s: Unneeded loading dsp conf %d\n", ··· 2317 2307 return prog_status; 2318 2308 } 2319 2309 EXPORT_SYMBOL_NS_GPL(tasdevice_prmg_load, SND_SOC_TAS2781_FMWLIB); 2320 - 2321 - int tasdevice_prmg_calibdata_load(void *context, int prm_no) 2322 - { 2323 - struct tasdevice_priv *tas_priv = (struct tasdevice_priv *) context; 2324 - struct tasdevice_fw *tas_fmw = tas_priv->fmw; 2325 - struct tasdevice_prog *program; 2326 - int prog_status = 0; 2327 - int i; 2328 - 2329 - if (!tas_fmw) { 2330 - dev_err(tas_priv->dev, "%s: Firmware is NULL\n", __func__); 2331 - goto out; 2332 - } 2333 - 2334 - if (prm_no >= tas_fmw->nr_programs) { 2335 - dev_err(tas_priv->dev, 2336 - "%s: prm(%d) is not in range of Programs %u\n", 2337 - __func__, prm_no, tas_fmw->nr_programs); 2338 - goto out; 2339 - } 2340 - 2341 - for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { 2342 - if (prm_no >= 0 && tas_priv->tasdevice[i].cur_prog != prm_no) { 2343 - tas_priv->tasdevice[i].cur_conf = -1; 2344 - tas_priv->tasdevice[i].is_loading = true; 2345 - prog_status++; 2346 - } 2347 - tas_priv->tasdevice[i].is_loaderr = false; 2348 - } 2349 - 2350 - if (prog_status) { 2351 - program = &(tas_fmw->programs[prm_no]); 2352 - tasdevice_load_data(tas_priv, &(program->dev_data)); 2353 - for (i = 0; i < tas_priv->ndev; i++) { 2354 - if (tas_priv->tasdevice[i].is_loaderr == true) 2355 - continue; 2356 - else if (tas_priv->tasdevice[i].is_loaderr == false 2357 - && tas_priv->tasdevice[i].is_loading == true) { 2358 - struct tasdevice_fw *cal_fmw = 2359 - tas_priv->tasdevice[i].cali_data_fmw; 2360 - 2361 - if (cal_fmw) { 2362 - struct tasdevice_calibration *cal = 2363 - cal_fmw->calibrations; 2364 - 2365 - if (cal) 2366 - load_calib_data(tas_priv, 2367 - &(cal->dev_data)); 2368 - } 2369 - tas_priv->tasdevice[i].cur_prog = prm_no; 2370 - } 2371 - } 2372 - } 2373 - 2374 - out: 2375 - return prog_status; 2376 - } 2377 - EXPORT_SYMBOL_NS_GPL(tasdevice_prmg_calibdata_load, 2378 - SND_SOC_TAS2781_FMWLIB); 2379 2310 2380 2311 void tasdevice_tuning_switch(void *context, int state) 2381 2312 {
+2 -2
sound/soc/codecs/tas2781-i2c.c
··· 2 2 // 3 3 // ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier 4 4 // 5 - // Copyright (C) 2022 - 2023 Texas Instruments Incorporated 5 + // Copyright (C) 2022 - 2024 Texas Instruments Incorporated 6 6 // https://www.ti.com 7 7 // 8 8 // The TAS2563/TAS2781 driver implements a flexible and configurable ··· 414 414 __func__, tas_priv->cal_binaryname[i]); 415 415 } 416 416 417 - tasdevice_prmg_calibdata_load(tas_priv, 0); 417 + tasdevice_prmg_load(tas_priv, 0); 418 418 tas_priv->cur_prog = 0; 419 419 out: 420 420 if (tas_priv->fw_state == TASDEVICE_DSP_FW_FAIL) {
+1 -1
sound/soc/intel/boards/sof_sdw_rt_sdca_jack_common.c
··· 109 109 return -ENOMEM; 110 110 111 111 for (i = 0; i < ARRAY_SIZE(need_sdca_suffix); i++) { 112 - if (strstr(codec_dai->name, need_sdca_suffix[i])) { 112 + if (strstr(component->name_prefix, need_sdca_suffix[i])) { 113 113 /* Add -sdca suffix for existing UCMs */ 114 114 card->components = devm_kasprintf(card->dev, GFP_KERNEL, 115 115 "%s-sdca", card->components);
+2 -2
sound/usb/quirks.c
··· 1740 1740 u32 current_rate; 1741 1741 1742 1742 // Get current rate from card and check if changing it is needed 1743 - snd_usb_ctl_msg(subs->dev, usb_sndctrlpipe(subs->dev, 0), 1743 + snd_usb_ctl_msg(subs->dev, usb_rcvctrlpipe(subs->dev, 0), 1744 1744 0x01, 0x21 | USB_DIR_IN, 0x0100, 0x8101, &buff4, 4); 1745 1745 current_rate = le32_to_cpu(buff4); 1746 1746 dev_dbg(&subs->dev->dev, ··· 1765 1765 1766 1766 // Check whether the change was successful 1767 1767 buff4 = 0; 1768 - snd_usb_ctl_msg(subs->dev, usb_sndctrlpipe(subs->dev, 0), 1768 + snd_usb_ctl_msg(subs->dev, usb_rcvctrlpipe(subs->dev, 0), 1769 1769 0x01, 0x21 | USB_DIR_IN, 0x0100, 0x8101, &buff4, 4); 1770 1770 if (new_rate != le32_to_cpu(buff4)) 1771 1771 dev_warn(&subs->dev->dev, "MBOX3: Couldn't set the sample rate");