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

Merge branch 'for-linus' into for-next

Pull 6.17-devel branch for applying further changes cleanly.

Signed-off-by: Taksahi Iwai <tiwai@suse.de>

+294 -134
+1 -1
Documentation/sound/alsa-configuration.rst
··· 2293 2293 notice the need. 2294 2294 skip_validation 2295 2295 Skip unit descriptor validation (default: no). 2296 - The option is used to ignores the validation errors with the hexdump 2296 + The option is used to ignore the validation errors with the hexdump 2297 2297 of the unit descriptor instead of a driver probe error, so that we 2298 2298 can check its details. 2299 2299 quirk_flags
+1
include/sound/sdca.h
··· 46 46 47 47 enum sdca_quirk { 48 48 SDCA_QUIRKS_RT712_VB, 49 + SDCA_QUIRKS_SKIP_FUNC_TYPE_PATCHING, 49 50 }; 50 51 51 52 #if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SDCA)
+12 -9
include/sound/sdca_function.h
··· 1063 1063 /** 1064 1064 * struct sdca_entity_hide - information specific to HIDE Entities 1065 1065 * @hid: HID device structure 1066 - * @hidtx_ids: HIDTx Report ID 1067 1066 * @num_hidtx_ids: number of HIDTx Report ID 1068 - * @hidrx_ids: HIDRx Report ID 1069 1067 * @num_hidrx_ids: number of HIDRx Report ID 1070 - * @hide_reside_function_num: indicating which Audio Function Numbers within this Device 1071 - * @max_delay: the maximum time in microseconds allowed for the Device to change the ownership from Device to Host 1072 - * @af_number_list: which Audio Function Numbers within this Device are sending/receiving the messages in this HIDE 1073 - * @hid_desc: HID descriptor for the HIDE Entity 1068 + * @hidtx_ids: HIDTx Report ID 1069 + * @hidrx_ids: HIDRx Report ID 1070 + * @af_number_list: which Audio Function Numbers within this Device are 1071 + * sending/receiving the messages in this HIDE 1072 + * @hide_reside_function_num: indicating which Audio Function Numbers 1073 + * within this Device 1074 + * @max_delay: the maximum time in microseconds allowed for the Device 1075 + * to change the ownership from Device to Host 1074 1076 * @hid_report_desc: HID Report Descriptor for the HIDE Entity 1077 + * @hid_desc: HID descriptor for the HIDE Entity 1075 1078 */ 1076 1079 struct sdca_entity_hide { 1077 1080 struct hid_device *hid; 1078 1081 unsigned int *hidtx_ids; 1079 - int num_hidtx_ids; 1080 1082 unsigned int *hidrx_ids; 1083 + int num_hidtx_ids; 1081 1084 int num_hidrx_ids; 1085 + unsigned int af_number_list[SDCA_MAX_FUNCTION_COUNT]; 1082 1086 unsigned int hide_reside_function_num; 1083 1087 unsigned int max_delay; 1084 - unsigned int af_number_list[SDCA_MAX_FUNCTION_COUNT]; 1085 - struct hid_descriptor hid_desc; 1086 1088 unsigned char *hid_report_desc; 1089 + struct hid_descriptor hid_desc; 1087 1090 }; 1088 1091 1089 1092 /**
+15 -4
sound/hda/codecs/realtek/alc269.c
··· 3700 3700 ALC236_FIXUP_DELL_DUAL_CODECS, 3701 3701 ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI, 3702 3702 ALC287_FIXUP_TAS2781_I2C, 3703 + ALC295_FIXUP_DELL_TAS2781_I2C, 3703 3704 ALC245_FIXUP_TAS2781_SPI_2, 3704 3705 ALC287_FIXUP_TXNW2781_I2C, 3705 3706 ALC287_FIXUP_YOGA7_14ARB7_I2C, ··· 5166 5165 .type = HDA_FIXUP_FUNC, 5167 5166 .v.func = alc294_fixup_gx502_hp, 5168 5167 }, 5168 + [ALC295_FIXUP_DELL_TAS2781_I2C] = { 5169 + .type = HDA_FIXUP_FUNC, 5170 + .v.func = tas2781_fixup_tias_i2c, 5171 + .chained = true, 5172 + .chain_id = ALC289_FIXUP_DUAL_SPK 5173 + }, 5169 5174 [ALC294_FIXUP_ASUS_GU502_PINS] = { 5170 5175 .type = HDA_FIXUP_PINS, 5171 5176 .v.pins = (const struct hda_pintbl[]) { ··· 6294 6287 SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS), 6295 6288 SND_PCI_QUIRK(0x1028, 0x0c28, "Dell Inspiron 16 Plus 7630", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS), 6296 6289 SND_PCI_QUIRK(0x1028, 0x0c4d, "Dell", ALC287_FIXUP_CS35L41_I2C_4), 6297 - SND_PCI_QUIRK(0x1028, 0x0c94, "Dell Polaris 3 metal", ALC287_FIXUP_TAS2781_I2C), 6298 - SND_PCI_QUIRK(0x1028, 0x0c96, "Dell Polaris 2in1", ALC287_FIXUP_TAS2781_I2C), 6290 + SND_PCI_QUIRK(0x1028, 0x0c94, "Dell Polaris 3 metal", ALC295_FIXUP_DELL_TAS2781_I2C), 6291 + SND_PCI_QUIRK(0x1028, 0x0c96, "Dell Polaris 2in1", ALC295_FIXUP_DELL_TAS2781_I2C), 6299 6292 SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2), 6300 6293 SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2), 6301 6294 SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2), ··· 6474 6467 SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2), 6475 6468 SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), 6476 6469 SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2), 6470 + SND_PCI_QUIRK(0x103c, 0x89a0, "HP Laptop 15-dw4xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), 6477 6471 SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED), 6478 6472 SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED), 6479 6473 SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED), ··· 6485 6477 SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 6486 6478 SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 6487 6479 SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 6480 + SND_PCI_QUIRK(0x103c, 0x89da, "HP Spectre x360 14t-ea100", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX), 6488 6481 SND_PCI_QUIRK(0x103c, 0x89e7, "HP Elite x2 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), 6489 6482 SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED), 6490 6483 SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), ··· 7078 7069 SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C), 7079 7070 SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C), 7080 7071 SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C), 7081 - SND_PCI_QUIRK(0x17aa, 0x38c7, "Thinkbook 13x Gen 4", ALC287_FIXUP_CS35L41_I2C_4), 7082 - SND_PCI_QUIRK(0x17aa, 0x38c8, "Thinkbook 13x Gen 4", ALC287_FIXUP_CS35L41_I2C_4), 7072 + SND_PCI_QUIRK(0x17aa, 0x38c7, "Thinkbook 13x Gen 4", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 7073 + SND_PCI_QUIRK(0x17aa, 0x38c8, "Thinkbook 13x Gen 4", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 7083 7074 SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C), 7084 7075 SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C), 7085 7076 SND_PCI_QUIRK(0x17aa, 0x38d2, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN), ··· 7100 7091 SND_PCI_QUIRK(0x17aa, 0x3913, "Lenovo 145", ALC236_FIXUP_LENOVO_INV_DMIC), 7101 7092 SND_PCI_QUIRK(0x17aa, 0x391f, "Yoga S990-16 pro Quad YC Quad", ALC287_FIXUP_TXNW2781_I2C), 7102 7093 SND_PCI_QUIRK(0x17aa, 0x3920, "Yoga S990-16 pro Quad VECO Quad", ALC287_FIXUP_TXNW2781_I2C), 7094 + SND_PCI_QUIRK(0x17aa, 0x3929, "Thinkbook 13x Gen 5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 7095 + SND_PCI_QUIRK(0x17aa, 0x392b, "Thinkbook 13x Gen 5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), 7103 7096 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), 7104 7097 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI), 7105 7098 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
+4
sound/hda/codecs/side-codecs/cs35l41_hda_property.c
··· 135 135 { "17AA38C8", 4, INTERNAL, { CS35L41_RIGHT, CS35L41_LEFT, CS35L41_RIGHT, CS35L41_LEFT }, 0, 2, -1, 1000, 4500, 24 }, 136 136 { "17AA38F9", 2, EXTERNAL, { CS35L41_RIGHT, CS35L41_LEFT, 0, 0 }, 0, 2, -1, 0, 0, 0 }, 137 137 { "17AA38FA", 2, EXTERNAL, { CS35L41_RIGHT, CS35L41_LEFT, 0, 0 }, 0, 2, -1, 0, 0, 0 }, 138 + { "17AA3929", 4, INTERNAL, { CS35L41_RIGHT, CS35L41_LEFT, CS35L41_RIGHT, CS35L41_LEFT }, 0, 2, -1, 1000, 4500, 24 }, 139 + { "17AA392B", 4, INTERNAL, { CS35L41_RIGHT, CS35L41_LEFT, CS35L41_RIGHT, CS35L41_LEFT }, 0, 2, -1, 1000, 4500, 24 }, 138 140 {} 139 141 }; 140 142 ··· 560 558 { "CSC3551", "17AA38C8", generic_dsd_config }, 561 559 { "CSC3551", "17AA38F9", generic_dsd_config }, 562 560 { "CSC3551", "17AA38FA", generic_dsd_config }, 561 + { "CSC3551", "17AA3929", generic_dsd_config }, 562 + { "CSC3551", "17AA392B", generic_dsd_config }, 563 563 {} 564 564 }; 565 565
+25 -5
sound/hda/codecs/side-codecs/tas2781_hda.c
··· 33 33 }; 34 34 EXPORT_SYMBOL_NS_GPL(tasdev_fct_efi_guid, "SND_HDA_SCODEC_TAS2781"); 35 35 36 + /* 37 + * The order of calibrated-data writing function is a bit different from the 38 + * order in UEFI. Here is the conversion to match the order of calibrated-data 39 + * writing function. 40 + */ 41 + static void cali_cnv(unsigned char *data, unsigned int base, int offset) 42 + { 43 + struct cali_reg reg_data; 44 + 45 + memcpy(&reg_data, &data[base], sizeof(reg_data)); 46 + /* the data order has to be swapped between r0_low_reg and inv0_reg */ 47 + swap(reg_data.r0_low_reg, reg_data.invr0_reg); 48 + 49 + cpu_to_be32_array((__force __be32 *)(data + offset + 1), 50 + (u32 *)&reg_data, TASDEV_CALIB_N); 51 + } 52 + 36 53 static void tas2781_apply_calib(struct tasdevice_priv *p) 37 54 { 38 55 struct calidata *cali_data = &p->cali_data; ··· 120 103 121 104 data[l] = k; 122 105 oft++; 123 - for (i = 0; i < TASDEV_CALIB_N * 4; i++) 124 - data[l + i + 1] = data[4 * oft + i]; 106 + cali_cnv(data, 4 * oft, l); 125 107 k++; 126 108 } 127 109 } ··· 146 130 147 131 for (j = p->ndev - 1; j >= 0; j--) { 148 132 l = j * (cali_data->cali_dat_sz_per_dev + 1); 149 - for (i = TASDEV_CALIB_N * 4; i > 0 ; i--) 150 - data[l + i] = data[p->index * 5 + i]; 151 - data[l+i] = j; 133 + cali_cnv(data, cali_data->cali_dat_sz_per_dev * j, l); 134 + data[l] = j; 152 135 } 153 136 } 154 137 ··· 192 177 unsigned char *data; 193 178 efi_status_t status; 194 179 int i; 180 + 181 + if (!efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE)) { 182 + dev_err(p->dev, "%s: NO EFI FOUND!\n", __func__); 183 + return -EINVAL; 184 + } 195 185 196 186 if (hda->catlog_id < LENOVO) 197 187 efi_guid = tasdev_fct_efi_guid[hda->catlog_id];
+5
sound/hda/codecs/side-codecs/tas2781_hda_i2c.c
··· 317 317 unsigned int attr; 318 318 int ret, i, j, k; 319 319 320 + if (!efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE)) { 321 + dev_err(p->dev, "%s: NO EFI FOUND!\n", __func__); 322 + return -EINVAL; 323 + } 324 + 320 325 cd->cali_dat_sz_per_dev = TAS2563_CAL_DATA_SIZE * TASDEV_CALIB_N; 321 326 322 327 /* extra byte for each device is the device number */
+2
sound/hda/core/intel-dsp-config.c
··· 650 650 int ret; 651 651 652 652 handle = ACPI_HANDLE(&pci->dev); 653 + if (!handle) 654 + return -ENODEV; 653 655 654 656 ret = sdw_intel_acpi_scan(handle, &info); 655 657 if (ret < 0)
+5 -6
sound/soc/amd/acp/acp-i2s.c
··· 73 73 unsigned int fmt) 74 74 { 75 75 struct device *dev = cpu_dai->component->dev; 76 - struct acp_chip_info *chip = dev_get_platdata(dev); 76 + struct acp_chip_info *chip = dev_get_drvdata(dev->parent); 77 77 int mode; 78 78 79 79 mode = fmt & SND_SOC_DAIFMT_FORMAT_MASK; ··· 199 199 u32 reg_val, fmt_reg, tdm_fmt; 200 200 u32 lrclk_div_val, bclk_div_val; 201 201 202 - chip = dev_get_platdata(dev); 202 + chip = dev_get_drvdata(dev->parent); 203 203 rsrc = chip->rsrc; 204 204 205 205 /* These values are as per Hardware Spec */ ··· 386 386 { 387 387 struct acp_stream *stream = substream->runtime->private_data; 388 388 struct device *dev = dai->component->dev; 389 - struct acp_chip_info *chip = dev_get_platdata(dev); 389 + struct acp_chip_info *chip = dev_get_drvdata(dev->parent); 390 390 struct acp_resource *rsrc = chip->rsrc; 391 391 u32 val, period_bytes, reg_val, ier_val, water_val, buf_size, buf_reg; 392 392 ··· 516 516 static int acp_i2s_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 517 517 { 518 518 struct device *dev = dai->component->dev; 519 - struct acp_chip_info *chip = dev_get_platdata(dev); 519 + struct acp_chip_info *chip = dev_get_drvdata(dev->parent); 520 520 struct acp_resource *rsrc = chip->rsrc; 521 521 struct acp_stream *stream = substream->runtime->private_data; 522 522 u32 reg_dma_size = 0, reg_fifo_size = 0, reg_fifo_addr = 0; 523 523 u32 phy_addr = 0, acp_fifo_addr = 0, ext_int_ctrl; 524 524 unsigned int dir = substream->stream; 525 525 526 - chip = dev_get_platdata(dev); 527 526 switch (dai->driver->id) { 528 527 case I2S_SP_INSTANCE: 529 528 if (dir == SNDRV_PCM_STREAM_PLAYBACK) { ··· 631 632 { 632 633 struct acp_stream *stream = substream->runtime->private_data; 633 634 struct device *dev = dai->component->dev; 634 - struct acp_chip_info *chip = dev_get_platdata(dev); 635 + struct acp_chip_info *chip = dev_get_drvdata(dev->parent); 635 636 struct acp_resource *rsrc = chip->rsrc; 636 637 unsigned int dir = substream->stream; 637 638 unsigned int irq_bit = 0;
+16
sound/soc/amd/acp/acp-sdw-legacy-mach.c
··· 79 79 }, 80 80 .driver_data = (void *)(ASOC_SDW_CODEC_SPKR), 81 81 }, 82 + { 83 + .callback = soc_sdw_quirk_cb, 84 + .matches = { 85 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), 86 + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0DD3"), 87 + }, 88 + .driver_data = (void *)(ASOC_SDW_CODEC_SPKR), 89 + }, 90 + { 91 + .callback = soc_sdw_quirk_cb, 92 + .matches = { 93 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), 94 + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0DD4"), 95 + }, 96 + .driver_data = (void *)(ASOC_SDW_CODEC_SPKR), 97 + }, 82 98 {} 83 99 }; 84 100
+1 -1
sound/soc/amd/acp/amd.h
··· 130 130 #define PDM_DMA_INTR_MASK 0x10000 131 131 #define PDM_DEC_64 0x2 132 132 #define PDM_CLK_FREQ_MASK 0x07 133 - #define PDM_MISC_CTRL_MASK 0x10 133 + #define PDM_MISC_CTRL_MASK 0x18 134 134 #define PDM_ENABLE 0x01 135 135 #define PDM_DISABLE 0x00 136 136 #define DMA_EN_MASK 0x02
+15 -7
sound/soc/codecs/lpass-rx-macro.c
··· 618 618 {176400, 0xB}, {352800, 0xC}, 619 619 }; 620 620 621 + /* Matches also rx_macro_mux_text */ 621 622 enum { 622 623 RX_MACRO_AIF1_PB, 623 624 RX_MACRO_AIF2_PB, ··· 723 722 "ZERO", "RX INT2_2 MUX", 724 723 }; 725 724 725 + /* Order must match RX_MACRO_MAX_DAIS enum (offset by 1) */ 726 726 static const char *const rx_macro_mux_text[] = { 727 727 "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB" 728 728 }; ··· 2476 2474 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2477 2475 struct snd_soc_dapm_update *update = NULL; 2478 2476 u32 rx_port_value = ucontrol->value.enumerated.item[0]; 2477 + unsigned int dai_id; 2479 2478 u32 aif_rst; 2480 2479 struct rx_macro *rx = snd_soc_component_get_drvdata(component); 2481 2480 ··· 2493 2490 2494 2491 switch (rx_port_value) { 2495 2492 case 0: 2496 - if (rx->active_ch_cnt[aif_rst]) { 2497 - clear_bit(widget->shift, 2498 - &rx->active_ch_mask[aif_rst]); 2499 - rx->active_ch_cnt[aif_rst]--; 2493 + /* 2494 + * active_ch_cnt and active_ch_mask use DAI IDs (RX_MACRO_MAX_DAIS). 2495 + * active_ch_cnt == 0 was tested in if() above. 2496 + */ 2497 + dai_id = aif_rst - 1; 2498 + if (rx->active_ch_cnt[dai_id]) { 2499 + clear_bit(widget->shift, &rx->active_ch_mask[dai_id]); 2500 + rx->active_ch_cnt[dai_id]--; 2500 2501 } 2501 2502 break; 2502 2503 case 1: 2503 2504 case 2: 2504 2505 case 3: 2505 2506 case 4: 2506 - set_bit(widget->shift, 2507 - &rx->active_ch_mask[rx_port_value]); 2508 - rx->active_ch_cnt[rx_port_value]++; 2507 + /* active_ch_cnt and active_ch_mask use DAI IDs (WSA_MACRO_MAX_DAIS). */ 2508 + dai_id = rx_port_value - 1; 2509 + set_bit(widget->shift, &rx->active_ch_mask[dai_id]); 2510 + rx->active_ch_cnt[dai_id]++; 2509 2511 break; 2510 2512 default: 2511 2513 dev_err(component->dev,
+15 -7
sound/soc/codecs/lpass-wsa-macro.c
··· 368 368 {192000, 0x6}, /* 192K */ 369 369 }; 370 370 371 + /* Matches also rx_mux_text */ 371 372 enum { 372 373 WSA_MACRO_AIF1_PB, 373 374 WSA_MACRO_AIF_MIX1_PB, ··· 466 465 "ZERO", "RX_MIX_TX0", "RX_MIX_TX1" 467 466 }; 468 467 468 + /* Order must match WSA_MACRO_MAX_DAIS enum (offset by 1) */ 469 469 static const char *const rx_mux_text[] = { 470 470 "ZERO", "AIF1_PB", "AIF_MIX1_PB" 471 471 }; ··· 2209 2207 u32 rx_port_value = ucontrol->value.integer.value[0]; 2210 2208 u32 bit_input; 2211 2209 u32 aif_rst; 2210 + unsigned int dai_id; 2212 2211 struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 2213 2212 2214 2213 aif_rst = wsa->rx_port_value[widget->shift]; ··· 2227 2224 2228 2225 switch (rx_port_value) { 2229 2226 case 0: 2230 - if (wsa->active_ch_cnt[aif_rst]) { 2231 - clear_bit(bit_input, 2232 - &wsa->active_ch_mask[aif_rst]); 2233 - wsa->active_ch_cnt[aif_rst]--; 2227 + /* 2228 + * active_ch_cnt and active_ch_mask use DAI IDs (WSA_MACRO_MAX_DAIS). 2229 + * active_ch_cnt == 0 was tested in if() above. 2230 + */ 2231 + dai_id = aif_rst - 1; 2232 + if (wsa->active_ch_cnt[dai_id]) { 2233 + clear_bit(bit_input, &wsa->active_ch_mask[dai_id]); 2234 + wsa->active_ch_cnt[dai_id]--; 2234 2235 } 2235 2236 break; 2236 2237 case 1: 2237 2238 case 2: 2238 - set_bit(bit_input, 2239 - &wsa->active_ch_mask[rx_port_value]); 2240 - wsa->active_ch_cnt[rx_port_value]++; 2239 + /* active_ch_cnt and active_ch_mask use DAI IDs (WSA_MACRO_MAX_DAIS). */ 2240 + dai_id = rx_port_value - 1; 2241 + set_bit(bit_input, &wsa->active_ch_mask[dai_id]); 2242 + wsa->active_ch_cnt[dai_id]++; 2241 2243 break; 2242 2244 default: 2243 2245 dev_err(component->dev,
+9 -8
sound/soc/codecs/rt5682s.c
··· 653 653 switch (mode) { 654 654 case SAR_PWR_SAVING: 655 655 snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3, 656 - RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_DIS); 656 + RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_EN); 657 657 snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1, 658 - RT5682S_MB1_PATH_MASK | RT5682S_MB2_PATH_MASK, 659 - RT5682S_CTRL_MB1_REG | RT5682S_CTRL_MB2_REG); 658 + RT5682S_MB1_PATH_MASK | RT5682S_MB2_PATH_MASK | 659 + RT5682S_VREF_POW_MASK, RT5682S_CTRL_MB1_FSM | 660 + RT5682S_CTRL_MB2_FSM | RT5682S_VREF_POW_FSM); 660 661 snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1, 661 662 RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK | 662 663 RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS | 663 - RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU); 664 + RT5682S_SAR_BUTDET_POW_NORM | RT5682S_SAR_SEL_MB1_2_MANU); 664 665 usleep_range(5000, 5500); 665 666 snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1, 666 667 RT5682S_SAR_BUTDET_MASK, RT5682S_SAR_BUTDET_EN); ··· 689 688 snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1, 690 689 RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK | 691 690 RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS | 692 - RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU); 691 + RT5682S_SAR_BUTDET_POW_NORM | RT5682S_SAR_SEL_MB1_2_MANU); 693 692 break; 694 693 default: 695 694 dev_err(component->dev, "Invalid SAR Power mode: %d\n", mode); ··· 726 725 snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1, 727 726 RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK | 728 727 RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS | 729 - RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU); 728 + RT5682S_SAR_BUTDET_POW_NORM | RT5682S_SAR_SEL_MB1_2_MANU); 730 729 } 731 730 732 731 /** ··· 787 786 jack_type = SND_JACK_HEADSET; 788 787 snd_soc_component_write(component, RT5682S_SAR_IL_CMD_3, 0x024c); 789 788 snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1, 790 - RT5682S_FAST_OFF_MASK, RT5682S_FAST_OFF_EN); 789 + RT5682S_FAST_OFF_MASK, RT5682S_FAST_OFF_DIS); 791 790 snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1, 792 791 RT5682S_SAR_SEL_MB1_2_MASK, val << RT5682S_SAR_SEL_MB1_2_SFT); 793 792 rt5682s_enable_push_button_irq(component); ··· 967 966 RT5682S_EMB_JD_MASK | RT5682S_DET_TYPE | 968 967 RT5682S_POL_FAST_OFF_MASK | RT5682S_MIC_CAP_MASK, 969 968 RT5682S_EMB_JD_EN | RT5682S_DET_TYPE | 970 - RT5682S_POL_FAST_OFF_HIGH | RT5682S_MIC_CAP_HS); 969 + RT5682S_POL_FAST_OFF_LOW | RT5682S_MIC_CAP_HS); 971 970 regmap_update_bits(rt5682s->regmap, RT5682S_SAR_IL_CMD_1, 972 971 RT5682S_SAR_POW_MASK, RT5682S_SAR_POW_EN); 973 972 regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,
+2 -4
sound/soc/codecs/rt712-sdca.c
··· 1890 1890 1891 1891 rt712_sdca_va_io_init(rt712); 1892 1892 } else { 1893 - if (!rt712->dmic_function_found) { 1894 - dev_err(&slave->dev, "%s RT712 VB detected but no SMART_MIC function exposed in ACPI\n", 1893 + if (!rt712->dmic_function_found) 1894 + dev_warn(&slave->dev, "%s RT712 VB detected but no SMART_MIC function exposed in ACPI\n", 1895 1895 __func__); 1896 - goto suspend; 1897 - } 1898 1896 1899 1897 /* multilanes and DMIC are supported by rt712vb */ 1900 1898 prop->lane_control_support = true;
+4 -3
sound/soc/codecs/sma1307.c
··· 1737 1737 sma1307->set.checksum = data[sma1307->set.header_size - 2]; 1738 1738 sma1307->set.num_mode = data[sma1307->set.header_size - 1]; 1739 1739 num_mode = sma1307->set.num_mode; 1740 - sma1307->set.header = devm_kzalloc(sma1307->dev, 1741 - sma1307->set.header_size, 1742 - GFP_KERNEL); 1740 + sma1307->set.header = devm_kmalloc_array(sma1307->dev, 1741 + sma1307->set.header_size, 1742 + sizeof(int), 1743 + GFP_KERNEL); 1743 1744 if (!sma1307->set.header) { 1744 1745 sma1307->set.status = false; 1745 1746 return;
+7 -2
sound/soc/codecs/wm8940.c
··· 220 220 SOC_SINGLE_TLV("Digital Capture Volume", WM8940_ADCVOL, 221 221 0, 255, 0, wm8940_adc_tlv), 222 222 SOC_ENUM("Mic Bias Level", wm8940_mic_bias_level_enum), 223 - SOC_SINGLE_TLV("Capture Boost Volue", WM8940_ADCBOOST, 223 + SOC_SINGLE_TLV("Capture Boost Volume", WM8940_ADCBOOST, 224 224 8, 1, 0, wm8940_capture_boost_vol_tlv), 225 225 SOC_SINGLE_TLV("Speaker Playback Volume", WM8940_SPKVOL, 226 226 0, 63, 0, wm8940_spk_vol_tlv), ··· 693 693 f = wm8940_get_mclkdiv(priv->mclk, fs256, &mclkdiv); 694 694 if (f != priv->mclk) { 695 695 /* The PLL performs best around 90MHz */ 696 - fpll = wm8940_get_mclkdiv(22500000, fs256, &mclkdiv); 696 + if (fs256 % 8000) 697 + f = 22579200; 698 + else 699 + f = 24576000; 700 + 701 + fpll = wm8940_get_mclkdiv(f, fs256, &mclkdiv); 697 702 } 698 703 699 704 wm8940_set_dai_pll(dai, 0, 0, priv->mclk, fpll);
+6 -2
sound/soc/codecs/wm8974.c
··· 419 419 fs256 = 256 * priv->fs; 420 420 421 421 f = wm8974_get_mclkdiv(priv->mclk, fs256, &mclkdiv); 422 - 423 422 if (f != priv->mclk) { 424 423 /* The PLL performs best around 90MHz */ 425 - fpll = wm8974_get_mclkdiv(22500000, fs256, &mclkdiv); 424 + if (fs256 % 8000) 425 + f = 22579200; 426 + else 427 + f = 24576000; 428 + 429 + fpll = wm8974_get_mclkdiv(f, fs256, &mclkdiv); 426 430 } 427 431 428 432 wm8974_set_dai_pll(dai, 0, 0, priv->mclk, fpll);
+1 -1
sound/soc/intel/boards/sof_sdw.c
··· 761 761 .callback = sof_sdw_quirk_cb, 762 762 .matches = { 763 763 DMI_MATCH(DMI_SYS_VENDOR, "Google"), 764 - DMI_MATCH(DMI_PRODUCT_NAME, "Fatcat"), 764 + DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Fatcat"), 765 765 }, 766 766 .driver_data = (void *)(SOC_SDW_PCH_DMIC | 767 767 SOF_BT_OFFLOAD_SSP(2) |
+6
sound/soc/intel/boards/sof_ssp_amp.c
··· 216 216 /* SSP 0 and SSP 2 are used for HDMI IN */ 217 217 SOF_HDMI_PLAYBACK_PRESENT), 218 218 }, 219 + { 220 + .name = "ptl_lt6911_hdmi_ssp", 221 + .driver_data = (kernel_ulong_t)(SOF_SSP_MASK_HDMI_CAPTURE(0x5) | 222 + /* SSP 0 and SSP 2 are used for HDMI IN */ 223 + SOF_HDMI_PLAYBACK_PRESENT), 224 + }, 219 225 { } 220 226 }; 221 227 MODULE_DEVICE_TABLE(platform, board_ids);
+17 -6
sound/soc/intel/catpt/pcm.c
··· 568 568 SNDRV_PCM_INFO_RESUME | 569 569 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, 570 570 .formats = SNDRV_PCM_FMTBIT_S16_LE | 571 - SNDRV_PCM_FMTBIT_S24_LE | 572 571 SNDRV_PCM_FMTBIT_S32_LE, 572 + .subformats = SNDRV_PCM_SUBFMTBIT_MSBITS_24 | 573 + SNDRV_PCM_SUBFMTBIT_MSBITS_MAX, 573 574 .period_bytes_min = PAGE_SIZE, 574 575 .period_bytes_max = CATPT_BUFFER_MAX_SIZE / CATPT_PCM_PERIODS_MIN, 575 576 .periods_min = CATPT_PCM_PERIODS_MIN, ··· 699 698 .channels_min = 2, 700 699 .channels_max = 2, 701 700 .rates = SNDRV_PCM_RATE_48000, 702 - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, 701 + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, 702 + .subformats = SNDRV_PCM_SUBFMTBIT_MSBITS_24 | 703 + SNDRV_PCM_SUBFMTBIT_MSBITS_MAX, 703 704 }, 704 705 .capture = { 705 706 .stream_name = "Analog Capture", 706 707 .channels_min = 2, 707 708 .channels_max = 4, 708 709 .rates = SNDRV_PCM_RATE_48000, 709 - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, 710 + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, 711 + .subformats = SNDRV_PCM_SUBFMTBIT_MSBITS_24 | 712 + SNDRV_PCM_SUBFMTBIT_MSBITS_MAX, 710 713 }, 711 714 }, 712 715 { ··· 722 717 .channels_min = 2, 723 718 .channels_max = 2, 724 719 .rates = SNDRV_PCM_RATE_8000_192000, 725 - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, 720 + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, 721 + .subformats = SNDRV_PCM_SUBFMTBIT_MSBITS_24 | 722 + SNDRV_PCM_SUBFMTBIT_MSBITS_MAX, 726 723 }, 727 724 }, 728 725 { ··· 736 729 .channels_min = 2, 737 730 .channels_max = 2, 738 731 .rates = SNDRV_PCM_RATE_8000_192000, 739 - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, 732 + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, 733 + .subformats = SNDRV_PCM_SUBFMTBIT_MSBITS_24 | 734 + SNDRV_PCM_SUBFMTBIT_MSBITS_MAX, 740 735 }, 741 736 }, 742 737 { ··· 750 741 .channels_min = 2, 751 742 .channels_max = 2, 752 743 .rates = SNDRV_PCM_RATE_48000, 753 - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, 744 + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, 745 + .subformats = SNDRV_PCM_SUBFMTBIT_MSBITS_24 | 746 + SNDRV_PCM_SUBFMTBIT_MSBITS_MAX, 754 747 }, 755 748 }, 756 749 {
+6
sound/soc/intel/common/soc-acpi-intel-ptl-match.c
··· 61 61 SND_SOC_ACPI_TPLG_INTEL_SSP_MSB | 62 62 SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER, 63 63 }, 64 + /* place amp-only boards in the end of table */ 65 + { 66 + .id = "INTC10B0", 67 + .drv_name = "ptl_lt6911_hdmi_ssp", 68 + .sof_tplg_filename = "sof-ptl-hdmi-ssp02.tplg", 69 + }, 64 70 {}, 65 71 }; 66 72 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_ptl_machines);
+1
sound/soc/qcom/qdsp6/audioreach.c
··· 1022 1022 param_data->param_id = PARAM_ID_I2S_INTF_CFG; 1023 1023 param_data->param_size = ic_sz - APM_MODULE_PARAM_DATA_SIZE; 1024 1024 1025 + intf_cfg->cfg.lpaif_type = module->hw_interface_type; 1025 1026 intf_cfg->cfg.intf_idx = module->hw_interface_idx; 1026 1027 intf_cfg->cfg.sd_line_idx = module->sd_line_idx; 1027 1028
+5 -2
sound/soc/qcom/qdsp6/q6apm-lpass-dais.c
··· 213 213 214 214 return 0; 215 215 err: 216 - q6apm_graph_close(dai_data->graph[dai->id]); 217 - dai_data->graph[dai->id] = NULL; 216 + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 217 + q6apm_graph_close(dai_data->graph[dai->id]); 218 + dai_data->graph[dai->id] = NULL; 219 + } 218 220 return rc; 219 221 } 220 222 ··· 262 260 .shutdown = q6apm_lpass_dai_shutdown, 263 261 .set_channel_map = q6dma_set_channel_map, 264 262 .hw_params = q6dma_hw_params, 263 + .set_fmt = q6i2s_set_fmt, 265 264 }; 266 265 267 266 static const struct snd_soc_dai_ops q6hdmi_ops = {
+5 -1
sound/soc/qcom/sc8280xp.c
··· 33 33 int dp_pcm_id = 0; 34 34 35 35 switch (cpu_dai->id) { 36 + case PRIMARY_MI2S_RX...QUATERNARY_MI2S_TX: 37 + case QUINARY_MI2S_RX...QUINARY_MI2S_TX: 38 + snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_BP_FP); 39 + break; 36 40 case WSA_CODEC_DMA_RX_0: 37 41 case WSA_CODEC_DMA_RX_1: 38 42 /* ··· 193 189 static const struct of_device_id snd_sc8280xp_dt_match[] = { 194 190 {.compatible = "qcom,qcm6490-idp-sndcard", "qcm6490"}, 195 191 {.compatible = "qcom,qcs6490-rb3gen2-sndcard", "qcs6490"}, 196 - {.compatible = "qcom,qcs8275-sndcard", "qcs8275"}, 192 + {.compatible = "qcom,qcs8275-sndcard", "qcs8300"}, 197 193 {.compatible = "qcom,qcs9075-sndcard", "qcs9075"}, 198 194 {.compatible = "qcom,qcs9100-sndcard", "qcs9100"}, 199 195 {.compatible = "qcom,sc8280xp-sndcard", "sc8280xp"},
+20
sound/soc/sdca/sdca_device.c
··· 7 7 */ 8 8 9 9 #include <linux/acpi.h> 10 + #include <linux/dmi.h> 10 11 #include <linux/module.h> 11 12 #include <linux/property.h> 12 13 #include <linux/soundwire/sdw.h> ··· 56 55 return false; 57 56 } 58 57 58 + static bool sdca_device_quirk_skip_func_type_patching(struct sdw_slave *slave) 59 + { 60 + const char *vendor, *sku; 61 + 62 + vendor = dmi_get_system_info(DMI_SYS_VENDOR); 63 + sku = dmi_get_system_info(DMI_PRODUCT_SKU); 64 + 65 + if (vendor && sku && 66 + !strcmp(vendor, "Dell Inc.") && 67 + (!strcmp(sku, "0C62") || !strcmp(sku, "0C63") || !strcmp(sku, "0C6B")) && 68 + slave->sdca_data.interface_revision == 0x061c && 69 + slave->id.mfg_id == 0x01fa && slave->id.part_id == 0x4243) 70 + return true; 71 + 72 + return false; 73 + } 74 + 59 75 bool sdca_device_quirk_match(struct sdw_slave *slave, enum sdca_quirk quirk) 60 76 { 61 77 switch (quirk) { 62 78 case SDCA_QUIRKS_RT712_VB: 63 79 return sdca_device_quirk_rt712_vb(slave); 80 + case SDCA_QUIRKS_SKIP_FUNC_TYPE_PATCHING: 81 + return sdca_device_quirk_skip_func_type_patching(slave); 64 82 default: 65 83 break; 66 84 }
+8 -5
sound/soc/sdca/sdca_functions.c
··· 90 90 { 91 91 struct fwnode_handle *function_node = acpi_fwnode_handle(adev); 92 92 struct sdca_device_data *sdca_data = data; 93 + struct sdw_slave *slave = container_of(sdca_data, struct sdw_slave, sdca_data); 93 94 struct device *dev = &adev->dev; 94 95 struct fwnode_handle *control5; /* used to identify function type */ 95 96 const char *function_name; ··· 138 137 return ret; 139 138 } 140 139 141 - ret = patch_sdca_function_type(sdca_data->interface_revision, &function_type); 142 - if (ret < 0) { 143 - dev_err(dev, "SDCA version %#x invalid function type %d\n", 144 - sdca_data->interface_revision, function_type); 145 - return ret; 140 + if (!sdca_device_quirk_match(slave, SDCA_QUIRKS_SKIP_FUNC_TYPE_PATCHING)) { 141 + ret = patch_sdca_function_type(sdca_data->interface_revision, &function_type); 142 + if (ret < 0) { 143 + dev_err(dev, "SDCA version %#x invalid function type %d\n", 144 + sdca_data->interface_revision, function_type); 145 + return ret; 146 + } 146 147 } 147 148 148 149 function_name = get_sdca_function_name(function_type);
+1 -1
sound/soc/sdca/sdca_interrupts.c
··· 155 155 SDCA_CTL_SELECTED_MODE_NAME); 156 156 157 157 if (!name) 158 - return -ENOMEM; 158 + return IRQ_NONE; 159 159 160 160 kctl = snd_soc_component_get_kcontrol(component, name); 161 161 if (!kctl) {
+1 -1
sound/soc/sdca/sdca_regmap.c
··· 196 196 197 197 control = function_find_control(function, reg); 198 198 if (!control) 199 - return false; 199 + return -EINVAL; 200 200 201 201 return clamp_val(control->nbits / BITS_PER_BYTE, sizeof(u8), sizeof(u32)); 202 202 }
+2 -2
sound/soc/sof/imx/imx-common.c
··· 316 316 } 317 317 318 318 sdev->bar[blk_type] = devm_ioremap_resource(sdev->dev, res); 319 - if (!sdev->bar[blk_type]) 319 + if (IS_ERR(sdev->bar[blk_type])) 320 320 return dev_err_probe(sdev->dev, 321 - -ENOMEM, 321 + PTR_ERR(sdev->bar[blk_type]), 322 322 "failed to ioremap %s region\n", 323 323 chip_info->memory[i].name); 324 324 }
+1 -1
sound/soc/sof/intel/hda-stream.c
··· 890 890 891 891 if (num_capture >= SOF_HDA_CAPTURE_STREAMS) { 892 892 dev_err(sdev->dev, "error: too many capture streams %d\n", 893 - num_playback); 893 + num_capture); 894 894 return -EINVAL; 895 895 } 896 896
+4 -5
sound/usb/midi.c
··· 1511 1511 { 1512 1512 int i; 1513 1513 1514 + if (!umidi->disconnected) 1515 + snd_usbmidi_disconnect(&umidi->list); 1516 + 1514 1517 for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { 1515 1518 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; 1516 - if (ep->out) 1517 - snd_usbmidi_out_endpoint_delete(ep->out); 1518 - if (ep->in) 1519 - snd_usbmidi_in_endpoint_delete(ep->in); 1519 + kfree(ep->out); 1520 1520 } 1521 1521 mutex_destroy(&umidi->mutex); 1522 - timer_shutdown_sync(&umidi->error_timer); 1523 1522 kfree(umidi); 1524 1523 } 1525 1524
+23 -3
sound/usb/mixer_s1810c.c
··· 93 93 94 94 #define SC1810C_CTL_LINE_SW 0 95 95 #define SC1810C_CTL_MUTE_SW 1 96 + #define SC1824C_CTL_MONO_SW 2 96 97 #define SC1810C_CTL_AB_SW 3 97 98 #define SC1810C_CTL_48V_SW 4 98 99 ··· 124 123 #define SC1810C_STATE_48V_SW 58 125 124 #define SC1810C_STATE_LINE_SW 59 126 125 #define SC1810C_STATE_MUTE_SW 60 126 + #define SC1824C_STATE_MONO_SW 61 127 127 #define SC1810C_STATE_AB_SW 62 128 128 129 129 struct s1810_mixer_state { ··· 495 493 .private_value = (SC1810C_STATE_MUTE_SW | SC1810C_CTL_MUTE_SW << 8) 496 494 }; 497 495 496 + static const struct snd_kcontrol_new snd_s1824c_mono_sw = { 497 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 498 + .name = "Mono Main Out Switch", 499 + .info = snd_ctl_boolean_mono_info, 500 + .get = snd_s1810c_switch_get, 501 + .put = snd_s1810c_switch_set, 502 + .private_value = (SC1824C_STATE_MONO_SW | SC1824C_CTL_MONO_SW << 8) 503 + }; 504 + 498 505 static const struct snd_kcontrol_new snd_s1810c_48v_sw = { 499 506 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 500 507 .name = "48V Phantom Power On Mic Inputs Switch", ··· 590 579 if (ret < 0) 591 580 return ret; 592 581 593 - ret = snd_s1810c_switch_init(mixer, &snd_s1810c_ab_sw); 594 - if (ret < 0) 595 - return ret; 582 + // The 1824c has a Mono Main switch instead of a 583 + // A/B select switch. 584 + if (mixer->chip->usb_id == USB_ID(0x194f, 0x010d)) { 585 + ret = snd_s1810c_switch_init(mixer, &snd_s1824c_mono_sw); 586 + if (ret < 0) 587 + return ret; 588 + } else if (mixer->chip->usb_id == USB_ID(0x194f, 0x010c)) { 589 + ret = snd_s1810c_switch_init(mixer, &snd_s1810c_ab_sw); 590 + if (ret < 0) 591 + return ret; 592 + } 593 + 596 594 return ret; 597 595 }
+48 -44
sound/usb/qcom/qc_audio_offload.c
··· 538 538 umap_size, iova, mapped_iova_size); 539 539 } 540 540 541 + static int uaudio_iommu_map_prot(bool dma_coherent) 542 + { 543 + int prot = IOMMU_READ | IOMMU_WRITE; 544 + 545 + if (dma_coherent) 546 + prot |= IOMMU_CACHE; 547 + return prot; 548 + } 549 + 541 550 /** 542 - * uaudio_iommu_map() - maps iommu memory for adsp 551 + * uaudio_iommu_map_pa() - maps iommu memory for adsp 543 552 * @mtype: ring type 544 553 * @dma_coherent: dma coherent 545 554 * @pa: physical address for ring/buffer 546 555 * @size: size of memory region 547 - * @sgt: sg table for memory region 548 556 * 549 557 * Maps the XHCI related resources to a memory region that is assigned to be 550 558 * used by the adsp. This will be mapped to the domain, which is created by 551 559 * the ASoC USB backend driver. 552 560 * 553 561 */ 554 - static unsigned long uaudio_iommu_map(enum mem_type mtype, bool dma_coherent, 555 - phys_addr_t pa, size_t size, 556 - struct sg_table *sgt) 562 + static unsigned long uaudio_iommu_map_pa(enum mem_type mtype, bool dma_coherent, 563 + phys_addr_t pa, size_t size) 557 564 { 558 - struct scatterlist *sg; 559 565 unsigned long iova = 0; 560 - size_t total_len = 0; 561 - unsigned long iova_sg; 562 - phys_addr_t pa_sg; 563 566 bool map = true; 564 - size_t sg_len; 565 - int prot; 566 - int ret; 567 - int i; 568 - 569 - prot = IOMMU_READ | IOMMU_WRITE; 570 - 571 - if (dma_coherent) 572 - prot |= IOMMU_CACHE; 567 + int prot = uaudio_iommu_map_prot(dma_coherent); 573 568 574 569 switch (mtype) { 575 570 case MEM_EVENT_RING: ··· 578 583 &uaudio_qdev->xfer_ring_iova_size, 579 584 &uaudio_qdev->xfer_ring_list, size); 580 585 break; 581 - case MEM_XFER_BUF: 582 - iova = uaudio_get_iova(&uaudio_qdev->curr_xfer_buf_iova, 583 - &uaudio_qdev->xfer_buf_iova_size, 584 - &uaudio_qdev->xfer_buf_list, size); 585 - break; 586 586 default: 587 587 dev_err(uaudio_qdev->data->dev, "unknown mem type %d\n", mtype); 588 588 } 589 589 590 590 if (!iova || !map) 591 - goto done; 591 + return 0; 592 592 593 - if (!sgt) 594 - goto skip_sgt_map; 593 + iommu_map(uaudio_qdev->data->domain, iova, pa, size, prot, GFP_KERNEL); 594 + 595 + return iova; 596 + } 597 + 598 + static unsigned long uaudio_iommu_map_xfer_buf(bool dma_coherent, size_t size, 599 + struct sg_table *sgt) 600 + { 601 + struct scatterlist *sg; 602 + unsigned long iova = 0; 603 + size_t total_len = 0; 604 + unsigned long iova_sg; 605 + phys_addr_t pa_sg; 606 + size_t sg_len; 607 + int prot = uaudio_iommu_map_prot(dma_coherent); 608 + int ret; 609 + int i; 610 + 611 + prot = IOMMU_READ | IOMMU_WRITE; 612 + 613 + if (dma_coherent) 614 + prot |= IOMMU_CACHE; 615 + 616 + iova = uaudio_get_iova(&uaudio_qdev->curr_xfer_buf_iova, 617 + &uaudio_qdev->xfer_buf_iova_size, 618 + &uaudio_qdev->xfer_buf_list, size); 619 + if (!iova) 620 + goto done; 595 621 596 622 iova_sg = iova; 597 623 for_each_sg(sgt->sgl, sg, sgt->nents, i) { ··· 634 618 uaudio_iommu_unmap(MEM_XFER_BUF, iova, size, total_len); 635 619 iova = 0; 636 620 } 637 - return iova; 638 - 639 - skip_sgt_map: 640 - iommu_map(uaudio_qdev->data->domain, iova, pa, size, prot, GFP_KERNEL); 641 - 642 621 done: 643 622 return iova; 644 623 } ··· 1023 1012 struct sg_table xfer_buf_sgt; 1024 1013 dma_addr_t xfer_buf_dma; 1025 1014 void *xfer_buf; 1026 - phys_addr_t xfer_buf_pa; 1027 1015 u32 len = xfer_buf_len; 1028 1016 bool dma_coherent; 1029 1017 dma_addr_t xfer_buf_dma_sysdev; ··· 1053 1043 if (!xfer_buf) 1054 1044 return -ENOMEM; 1055 1045 1056 - /* Remapping is not possible if xfer_buf is outside of linear map */ 1057 - xfer_buf_pa = virt_to_phys(xfer_buf); 1058 - if (WARN_ON(!page_is_ram(PFN_DOWN(xfer_buf_pa)))) { 1059 - ret = -ENXIO; 1060 - goto unmap_sync; 1061 - } 1062 1046 dma_get_sgtable(subs->dev->bus->sysdev, &xfer_buf_sgt, xfer_buf, 1063 1047 xfer_buf_dma, len); 1064 1048 1065 1049 /* map the physical buffer into sysdev as well */ 1066 - xfer_buf_dma_sysdev = uaudio_iommu_map(MEM_XFER_BUF, dma_coherent, 1067 - xfer_buf_pa, len, &xfer_buf_sgt); 1050 + xfer_buf_dma_sysdev = uaudio_iommu_map_xfer_buf(dma_coherent, 1051 + len, &xfer_buf_sgt); 1068 1052 if (!xfer_buf_dma_sysdev) { 1069 1053 ret = -ENOMEM; 1070 1054 goto unmap_sync; ··· 1139 1135 sg_free_table(sgt); 1140 1136 1141 1137 /* data transfer ring */ 1142 - iova = uaudio_iommu_map(MEM_XFER_RING, dma_coherent, tr_pa, 1143 - PAGE_SIZE, NULL); 1138 + iova = uaudio_iommu_map_pa(MEM_XFER_RING, dma_coherent, tr_pa, 1139 + PAGE_SIZE); 1144 1140 if (!iova) { 1145 1141 ret = -ENOMEM; 1146 1142 goto clear_pa; ··· 1203 1199 mem_info->dma = sg_dma_address(sgt->sgl); 1204 1200 sg_free_table(sgt); 1205 1201 1206 - iova = uaudio_iommu_map(MEM_EVENT_RING, dma_coherent, er_pa, 1207 - PAGE_SIZE, NULL); 1202 + iova = uaudio_iommu_map_pa(MEM_EVENT_RING, dma_coherent, er_pa, 1203 + PAGE_SIZE); 1208 1204 if (!iova) { 1209 1205 ret = -ENOMEM; 1210 1206 goto clear_pa;
-3
sound/usb/quirks.c
··· 1599 1599 /* presonus studio 1810c: skip altsets incompatible with device_setup */ 1600 1600 if (chip->usb_id == USB_ID(0x194f, 0x010c)) 1601 1601 return s1810c_skip_setting_quirk(chip, iface, altno); 1602 - /* presonus studio 1824c: skip altsets incompatible with device_setup */ 1603 - if (chip->usb_id == USB_ID(0x194f, 0x010d)) 1604 - return s1810c_skip_setting_quirk(chip, iface, altno); 1605 1602 1606 1603 return 0; 1607 1604 }