mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-30 00:03:27 -04:00
Merge tag 'sound-7.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
"This became slightly big partly due to my time off in the last week.
But all changes are about device-specific fixes, so it should be
safely applicable.
ASoC:
- Fix double free in sma1307
- Fix uninitialized variables in simple-card-utils/imx-card
- Address clock leaks and error propagation in ADAU1372
- Add DMI quirks and ACP/SDW support for ASUS
- Fix Intel CATPT DMA mask
- Fix SOF topology parsing
- Fix DT bindings for RK3576 SPDIF, STM32 SAI and WCD934x
HD-audio:
- Quirks for Lenovo, ASUS, and various HP models, as well as
a speaker pop fix on Star Labs StarFighter
- Revert MSI X870E Tomahawk denylist again
USB-Audio:
- Fix distorted audio on Focusrite Scarlett 2i2/2i4 1st Gen
- Add iface reset quirk for AB17X
- Update Qualcomm USB audio Kconfig dependencies and license
Misc:
- Fix minor compile warnings for firewire and asihpi drivers"
* tag 'sound-7.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (35 commits)
Revert "ALSA: hda/intel: Add MSI X870E Tomahawk to denylist"
ALSA: usb-audio: Add iface reset and delay quirk for AB17X USB Audio
ALSA: hda/realtek: add HP Laptop 15-fd0xxx mute LED quirk
ALSA: usb-audio: Exclude Scarlett 2i4 1st Gen from SKIP_IFACE_SETUP
ALSA: hda/realtek: Add mute LED quirk for HP Pavilion 15-eg0xxx
ALSA: hda/realtek - Fixed Speaker Mute LED for HP EliteBoard G1a platform
ASoC: SOF: ipc4-topology: Allow bytes controls without initial payload
ASoC: adau1372: Fix clock leak on PLL lock failure
ASoC: adau1372: Fix unchecked clk_prepare_enable() return value
ASoC: SDCA: fix finding wrong entity
ASoC: SDCA: remove the max count of initialization table
ASoC: codecs: wcd934x: fix typo in dt parsing
ASoC: dt-bindings: stm32: Fix incorrect compatible string in stm32h7-sai match
ASoC: Intel: catpt: Fix the device initialization
ASoC: amd: acp: add ASUS HN7306EA quirk for legacy SDW machine
ASoC: SOF: topology: reject invalid vendor array size in token parser
ASoC: tas2781: Add null check for calibration data
ALSA: asihpi: avoid write overflow check warning
ASoC: fsl: imx-card: initialize playback_only and capture_only
ASoC: simple-card-utils: Check value of is_playback_only and is_capture_only
...
This commit is contained in:
@@ -33,6 +33,7 @@ properties:
|
||||
- const: rockchip,rk3066-spdif
|
||||
- items:
|
||||
- enum:
|
||||
- rockchip,rk3576-spdif
|
||||
- rockchip,rk3588-spdif
|
||||
- const: rockchip,rk3568-spdif
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ allOf:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: st,stm32mph7-sai
|
||||
const: st,stm32h7-sai
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
|
||||
@@ -26,11 +26,6 @@ struct sdca_function_desc;
|
||||
*/
|
||||
#define SDCA_MAX_ENTITY_COUNT 128
|
||||
|
||||
/*
|
||||
* Sanity check on number of initialization writes, can be expanded if needed.
|
||||
*/
|
||||
#define SDCA_MAX_INIT_COUNT 2048
|
||||
|
||||
/*
|
||||
* The Cluster IDs are 16-bit, so a maximum of 65535 Clusters per
|
||||
* function can be represented, however limit this to a slightly
|
||||
|
||||
@@ -1164,7 +1164,7 @@ static void process_rx_packets(struct fw_iso_context *context, u32 tstamp, size_
|
||||
struct pkt_desc *desc = s->packet_descs_cursor;
|
||||
unsigned int pkt_header_length;
|
||||
unsigned int packets;
|
||||
u32 curr_cycle_time;
|
||||
u32 curr_cycle_time = 0;
|
||||
bool need_hw_irq;
|
||||
int i;
|
||||
|
||||
|
||||
@@ -1017,12 +1017,30 @@ static int alc269_resume(struct hda_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define STARLABS_STARFIGHTER_SHUTUP_DELAY_MS 30
|
||||
#define ALC233_STARFIGHTER_SPK_PIN 0x1b
|
||||
#define ALC233_STARFIGHTER_GPIO2 0x04
|
||||
|
||||
static void starlabs_starfighter_shutup(struct hda_codec *codec)
|
||||
static void alc233_starfighter_update_amp(struct hda_codec *codec, bool on)
|
||||
{
|
||||
if (snd_hda_gen_shutup_speakers(codec))
|
||||
msleep(STARLABS_STARFIGHTER_SHUTUP_DELAY_MS);
|
||||
snd_hda_codec_write(codec, ALC233_STARFIGHTER_SPK_PIN, 0,
|
||||
AC_VERB_SET_EAPD_BTLENABLE,
|
||||
on ? AC_EAPDBTL_EAPD : 0);
|
||||
alc_update_gpio_data(codec, ALC233_STARFIGHTER_GPIO2, on);
|
||||
}
|
||||
|
||||
static void alc233_starfighter_pcm_hook(struct hda_pcm_stream *hinfo,
|
||||
struct hda_codec *codec,
|
||||
struct snd_pcm_substream *substream,
|
||||
int action)
|
||||
{
|
||||
switch (action) {
|
||||
case HDA_GEN_PCM_ACT_PREPARE:
|
||||
alc233_starfighter_update_amp(codec, true);
|
||||
break;
|
||||
case HDA_GEN_PCM_ACT_CLEANUP:
|
||||
alc233_starfighter_update_amp(codec, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void alc233_fixup_starlabs_starfighter(struct hda_codec *codec,
|
||||
@@ -1031,8 +1049,16 @@ static void alc233_fixup_starlabs_starfighter(struct hda_codec *codec,
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
||||
spec->shutup = starlabs_starfighter_shutup;
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
spec->gpio_mask |= ALC233_STARFIGHTER_GPIO2;
|
||||
spec->gpio_dir |= ALC233_STARFIGHTER_GPIO2;
|
||||
spec->gpio_data &= ~ALC233_STARFIGHTER_GPIO2;
|
||||
break;
|
||||
case HDA_FIXUP_ACT_PROBE:
|
||||
spec->gen.pcm_playback_hook = alc233_starfighter_pcm_hook;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
|
||||
@@ -3699,22 +3725,42 @@ static void alc245_tas2781_spi_hp_fixup_muteled(struct hda_codec *codec,
|
||||
alc_fixup_hp_gpio_led(codec, action, 0x04, 0x0);
|
||||
alc285_fixup_hp_coef_micmute_led(codec, fix, action);
|
||||
}
|
||||
|
||||
static void alc245_hp_spk_mute_led_update(void *private_data, int enabled)
|
||||
{
|
||||
struct hda_codec *codec = private_data;
|
||||
unsigned int val;
|
||||
|
||||
val = enabled ? 0x08 : 0x04; /* 0x08 led on, 0x04 led off */
|
||||
alc_update_coef_idx(codec, 0x0b, 0x0c, val);
|
||||
}
|
||||
|
||||
/* JD2: mute led GPIO3: micmute led */
|
||||
static void alc245_tas2781_i2c_hp_fixup_muteled(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
static const hda_nid_t conn[] = { 0x02 };
|
||||
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
if (!hp_pin) {
|
||||
spec->gen.vmaster_mute.hook = alc245_hp_spk_mute_led_update;
|
||||
spec->gen.vmaster_mute_led = 1;
|
||||
}
|
||||
spec->gen.auto_mute_via_amp = 1;
|
||||
snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
|
||||
break;
|
||||
case HDA_FIXUP_ACT_INIT:
|
||||
if (!hp_pin)
|
||||
alc245_hp_spk_mute_led_update(codec, !spec->gen.master_mute);
|
||||
break;
|
||||
}
|
||||
|
||||
tas2781_fixup_txnw_i2c(codec, fix, action);
|
||||
alc245_fixup_hp_mute_led_coefbit(codec, fix, action);
|
||||
if (hp_pin)
|
||||
alc245_fixup_hp_mute_led_coefbit(codec, fix, action);
|
||||
alc285_fixup_hp_coef_micmute_led(codec, fix, action);
|
||||
}
|
||||
/*
|
||||
@@ -6854,6 +6900,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8756, "HP ENVY Laptop 13-ba0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
|
||||
SND_PCI_QUIRK(0x103c, 0x8760, "HP EliteBook 8{4,5}5 G7", ALC285_FIXUP_HP_BEEP_MICMUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
|
||||
SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
|
||||
@@ -6867,6 +6914,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87cb, "HP Pavilion 15-eg0xxx", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87cc, "HP Pavilion 15-eg0xxx", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87d3, "HP Laptop 15-gw0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x87df, "HP ProBook 430 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
@@ -7098,6 +7146,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8da7, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8da8, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8dd4, "HP EliteStudio 8 AIO", ALC274_FIXUP_HP_AIO_BIND_DACS),
|
||||
SND_PCI_QUIRK(0x103c, 0x8dd7, "HP Laptop 15-fd0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8de8, "HP Gemtree", ALC245_FIXUP_TAS2781_SPI_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8de9, "HP Gemtree", ALC245_FIXUP_TAS2781_SPI_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8dec, "HP EliteBook 640 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||
@@ -7177,6 +7226,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x1043, 0x1194, "ASUS UM3406KA", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
HDA_CODEC_QUIRK(0x1043, 0x1204, "ASUS Strix G16 G615JMR", ALC287_FIXUP_TXNW2781_I2C_ASUS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1204, "ASUS Strix G615JHR_JMR_JPR", ALC287_FIXUP_TAS2781_I2C),
|
||||
SND_PCI_QUIRK(0x1043, 0x1214, "ASUS Strix G615LH_LM_LP", ALC287_FIXUP_TAS2781_I2C),
|
||||
SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
@@ -7206,6 +7256,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS G513PI/PU/PV", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x14f2, "ASUS VivoBook X515JA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1503, "ASUS G733PY/PZ/PZV/PYV", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1514, "ASUS ROG Flow Z13 GZ302EAC", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
|
||||
SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA/XJ/XQ/XU/XV/XI", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301VV/VQ/VU/VJ/VA/VC/VE/VVC/VQC/VUC/VJC/VEC/VCC", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
@@ -7575,6 +7626,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x38ab, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38b4, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
HDA_CODEC_QUIRK(0x17aa, 0x391c, "Lenovo Yoga 7 2-in-1 14AKP10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
|
||||
HDA_CODEC_QUIRK(0x17aa, 0x391d, "Lenovo Yoga 7 2-in-1 16AKP10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38b5, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38b6, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38b7, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
|
||||
@@ -2077,7 +2077,6 @@ static const struct pci_device_id driver_denylist[] = {
|
||||
{ PCI_DEVICE_SUB(0x1022, 0x1487, 0x1043, 0x874f) }, /* ASUS ROG Zenith II / Strix */
|
||||
{ PCI_DEVICE_SUB(0x1022, 0x1487, 0x1462, 0xcb59) }, /* MSI TRX40 Creator */
|
||||
{ PCI_DEVICE_SUB(0x1022, 0x1487, 0x1462, 0xcb60) }, /* MSI TRX40 */
|
||||
{ PCI_DEVICE_SUB(0x1022, 0x15e3, 0x1462, 0xee59) }, /* MSI X870E Tomahawk WiFi */
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -581,8 +581,10 @@ static u16 adapter_prepare(u16 adapter)
|
||||
HPI_ADAPTER_OPEN);
|
||||
hm.adapter_index = adapter;
|
||||
hw_entry_point(&hm, &hr);
|
||||
memcpy(&rESP_HPI_ADAPTER_OPEN[adapter], &hr,
|
||||
sizeof(rESP_HPI_ADAPTER_OPEN[0]));
|
||||
memcpy(&rESP_HPI_ADAPTER_OPEN[adapter].h, &hr,
|
||||
sizeof(rESP_HPI_ADAPTER_OPEN[adapter].h));
|
||||
memcpy(&rESP_HPI_ADAPTER_OPEN[adapter].a, &hr.u.ax.info,
|
||||
sizeof(rESP_HPI_ADAPTER_OPEN[adapter].a));
|
||||
if (hr.error)
|
||||
return hr.error;
|
||||
|
||||
|
||||
@@ -23,6 +23,16 @@
|
||||
|
||||
static int acp_quirk_data;
|
||||
|
||||
static const struct dmi_system_id acp70_acpi_flag_override_table[] = {
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HN7306EA"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct config_entry config_table[] = {
|
||||
{
|
||||
.flags = FLAG_AMD_SOF,
|
||||
@@ -186,8 +196,11 @@ int snd_amd_acp_find_config(struct pci_dev *pci)
|
||||
*/
|
||||
if (!pci->revision)
|
||||
return 0;
|
||||
else if (pci->revision >= ACP_7_0_REV)
|
||||
else if (pci->revision >= ACP_7_0_REV) {
|
||||
if (dmi_check_system(acp70_acpi_flag_override_table))
|
||||
return 0;
|
||||
return snd_amd_acp_acpi_find_config(pci);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(config_table); i++, table++) {
|
||||
if (table->device != device)
|
||||
|
||||
@@ -111,6 +111,14 @@ static const struct dmi_system_id soc_sdw_quirk_table[] = {
|
||||
},
|
||||
.driver_data = (void *)(ASOC_SDW_CODEC_SPKR),
|
||||
},
|
||||
{
|
||||
.callback = soc_sdw_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HN7306EA"),
|
||||
},
|
||||
.driver_data = (void *)(ASOC_SDW_ACP_DMIC),
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -69,6 +69,28 @@ static const struct snd_soc_acpi_endpoint jack_amp_g1_dmic_endpoints[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_endpoint jack_dmic_endpoints[] = {
|
||||
/* Jack Endpoint */
|
||||
{
|
||||
.num = 0,
|
||||
.aggregated = 0,
|
||||
.group_position = 0,
|
||||
.group_id = 0,
|
||||
},
|
||||
/* DMIC Endpoint */
|
||||
{
|
||||
/*
|
||||
* rt721 endpoint #2 maps to AIF3 (internal DMIC capture).
|
||||
* Endpoint #1 is AIF2 amp path and is handled by external amps
|
||||
* on this platform.
|
||||
*/
|
||||
.num = 2,
|
||||
.aggregated = 0,
|
||||
.group_position = 0,
|
||||
.group_id = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device rt712_vb_1_group1_adr[] = {
|
||||
{
|
||||
.adr = 0x000130025D071201ull,
|
||||
@@ -563,6 +585,40 @@ static const struct snd_soc_acpi_link_adr acp70_rt1320_l0_rt722_l1[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device rt721_l1u0_tas2783x2_l1u8b_adr[] = {
|
||||
{
|
||||
.adr = 0x000130025D072101ull,
|
||||
/*
|
||||
* On this platform speakers are provided by two TAS2783 amps.
|
||||
* Keep rt721 as UAJ + DMIC only.
|
||||
*/
|
||||
.num_endpoints = ARRAY_SIZE(jack_dmic_endpoints),
|
||||
.endpoints = jack_dmic_endpoints,
|
||||
.name_prefix = "rt721",
|
||||
},
|
||||
{
|
||||
.adr = 0x0001380102000001ull,
|
||||
.num_endpoints = 1,
|
||||
.endpoints = &spk_l_endpoint,
|
||||
.name_prefix = "tas2783-1",
|
||||
},
|
||||
{
|
||||
.adr = 0x00013B0102000001ull,
|
||||
.num_endpoints = 1,
|
||||
.endpoints = &spk_r_endpoint,
|
||||
.name_prefix = "tas2783-2",
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr acp70_rt721_l1u0_tas2783x2_l1u8b[] = {
|
||||
{
|
||||
.mask = BIT(1),
|
||||
.num_adr = ARRAY_SIZE(rt721_l1u0_tas2783x2_l1u8b_adr),
|
||||
.adr_d = rt721_l1u0_tas2783x2_l1u8b_adr,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
struct snd_soc_acpi_mach snd_soc_acpi_amd_acp70_sdw_machines[] = {
|
||||
{
|
||||
.link_mask = BIT(0) | BIT(1),
|
||||
@@ -650,6 +706,11 @@ struct snd_soc_acpi_mach snd_soc_acpi_amd_acp70_sdw_machines[] = {
|
||||
.machine_check = snd_soc_acpi_amd_sdca_is_device_rt712_vb,
|
||||
.drv_name = "amd_sdw",
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(1),
|
||||
.links = acp70_rt721_l1u0_tas2783x2_l1u8b,
|
||||
.drv_name = "amd_sdw",
|
||||
},
|
||||
{},
|
||||
};
|
||||
EXPORT_SYMBOL(snd_soc_acpi_amd_acp70_sdw_machines);
|
||||
|
||||
@@ -717,6 +717,20 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "PM1503CDA"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "BM1403CDA"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Micro-Star International Co., Ltd."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Thin A15 B7VE"),
|
||||
}
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -762,7 +762,7 @@ static int adau1372_startup(struct snd_pcm_substream *substream, struct snd_soc_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void adau1372_enable_pll(struct adau1372 *adau1372)
|
||||
static int adau1372_enable_pll(struct adau1372 *adau1372)
|
||||
{
|
||||
unsigned int val, timeout = 0;
|
||||
int ret;
|
||||
@@ -778,19 +778,26 @@ static void adau1372_enable_pll(struct adau1372 *adau1372)
|
||||
timeout++;
|
||||
} while (!(val & 1) && timeout < 3);
|
||||
|
||||
if (ret < 0 || !(val & 1))
|
||||
if (ret < 0 || !(val & 1)) {
|
||||
dev_err(adau1372->dev, "Failed to lock PLL\n");
|
||||
return ret < 0 ? ret : -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void adau1372_set_power(struct adau1372 *adau1372, bool enable)
|
||||
static int adau1372_set_power(struct adau1372 *adau1372, bool enable)
|
||||
{
|
||||
if (adau1372->enabled == enable)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (enable) {
|
||||
unsigned int clk_ctrl = ADAU1372_CLK_CTRL_MCLK_EN;
|
||||
int ret;
|
||||
|
||||
clk_prepare_enable(adau1372->mclk);
|
||||
ret = clk_prepare_enable(adau1372->mclk);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (adau1372->pd_gpio)
|
||||
gpiod_set_value(adau1372->pd_gpio, 0);
|
||||
|
||||
@@ -804,7 +811,14 @@ static void adau1372_set_power(struct adau1372 *adau1372, bool enable)
|
||||
* accessed.
|
||||
*/
|
||||
if (adau1372->use_pll) {
|
||||
adau1372_enable_pll(adau1372);
|
||||
ret = adau1372_enable_pll(adau1372);
|
||||
if (ret) {
|
||||
regcache_cache_only(adau1372->regmap, true);
|
||||
if (adau1372->pd_gpio)
|
||||
gpiod_set_value(adau1372->pd_gpio, 1);
|
||||
clk_disable_unprepare(adau1372->mclk);
|
||||
return ret;
|
||||
}
|
||||
clk_ctrl |= ADAU1372_CLK_CTRL_CLKSRC;
|
||||
}
|
||||
|
||||
@@ -829,6 +843,8 @@ static void adau1372_set_power(struct adau1372 *adau1372, bool enable)
|
||||
}
|
||||
|
||||
adau1372->enabled = enable;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adau1372_set_bias_level(struct snd_soc_component *component,
|
||||
@@ -842,11 +858,9 @@ static int adau1372_set_bias_level(struct snd_soc_component *component,
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
break;
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
adau1372_set_power(adau1372, true);
|
||||
break;
|
||||
return adau1372_set_power(adau1372, true);
|
||||
case SND_SOC_BIAS_OFF:
|
||||
adau1372_set_power(adau1372, false);
|
||||
break;
|
||||
return adau1372_set_power(adau1372, false);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1759,8 +1759,10 @@ static void sma1307_setting_loaded(struct sma1307_priv *sma1307, const char *fil
|
||||
sma1307->set.mode_size * 2 * sizeof(int),
|
||||
GFP_KERNEL);
|
||||
if (!sma1307->set.mode_set[i]) {
|
||||
for (int j = 0; j < i; j++)
|
||||
kfree(sma1307->set.mode_set[j]);
|
||||
for (int j = 0; j < i; j++) {
|
||||
devm_kfree(sma1307->dev, sma1307->set.mode_set[j]);
|
||||
sma1307->set.mode_set[j] = NULL;
|
||||
}
|
||||
sma1307->set.status = false;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2550,6 +2550,9 @@ static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i)
|
||||
int k = i * (cali_data->cali_dat_sz_per_dev + 1);
|
||||
int rc;
|
||||
|
||||
if (!data || !cali_data->total_sz)
|
||||
return;
|
||||
|
||||
if (data[k] != i) {
|
||||
dev_err(priv->dev, "%s: no cal-data for dev %d from usr-spc\n",
|
||||
__func__, i);
|
||||
|
||||
@@ -2172,7 +2172,7 @@ static int wcd934x_init_dmic(struct snd_soc_component *comp)
|
||||
u32 def_dmic_rate, dmic_clk_drv;
|
||||
int ret;
|
||||
|
||||
ret = wcd_dt_parse_mbhc_data(comp->dev, &wcd->mbhc_cfg);
|
||||
ret = wcd_dt_parse_micbias_info(&wcd->common);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -710,6 +710,8 @@ static int imx_card_parse_of(struct imx_card_data *data)
|
||||
link->ops = &imx_aif_ops;
|
||||
}
|
||||
|
||||
playback_only = false;
|
||||
capture_only = false;
|
||||
graph_util_parse_link_direction(np, &playback_only, &capture_only);
|
||||
link->playback_only = playback_only;
|
||||
link->capture_only = capture_only;
|
||||
|
||||
@@ -1183,9 +1183,9 @@ void graph_util_parse_link_direction(struct device_node *np,
|
||||
bool is_playback_only = of_property_read_bool(np, "playback-only");
|
||||
bool is_capture_only = of_property_read_bool(np, "capture-only");
|
||||
|
||||
if (np && playback_only)
|
||||
if (playback_only && is_playback_only)
|
||||
*playback_only = is_playback_only;
|
||||
if (np && capture_only)
|
||||
if (capture_only && is_capture_only)
|
||||
*capture_only = is_capture_only;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(graph_util_parse_link_direction);
|
||||
|
||||
@@ -281,7 +281,15 @@ static int catpt_acpi_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(cdev->pci_ba))
|
||||
return PTR_ERR(cdev->pci_ba);
|
||||
|
||||
/* alloc buffer for storing DRAM context during dx transitions */
|
||||
/*
|
||||
* As per design HOST is responsible for preserving firmware's runtime
|
||||
* context during D0 -> D3 -> D0 transitions. Addresses used for DMA
|
||||
* to/from HOST memory shall be outside the reserved range of 0xFFFxxxxx.
|
||||
*/
|
||||
ret = dma_coerce_mask_and_coherent(cdev->dev, DMA_BIT_MASK(31));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
cdev->dxbuf_vaddr = dmam_alloc_coherent(dev, catpt_dram_size(cdev),
|
||||
&cdev->dxbuf_paddr, GFP_KERNEL);
|
||||
if (!cdev->dxbuf_vaddr)
|
||||
|
||||
@@ -125,9 +125,6 @@ int catpt_dmac_probe(struct catpt_dev *cdev)
|
||||
dmac->dev = cdev->dev;
|
||||
dmac->irq = cdev->irq;
|
||||
|
||||
ret = dma_coerce_mask_and_coherent(cdev->dev, DMA_BIT_MASK(31));
|
||||
if (ret)
|
||||
return ret;
|
||||
/*
|
||||
* Caller is responsible for putting device in D0 to allow
|
||||
* for I/O and memory access before probing DW.
|
||||
|
||||
@@ -216,9 +216,6 @@ static int find_sdca_init_table(struct device *dev,
|
||||
} else if (num_init_writes % sizeof(*raw) != 0) {
|
||||
dev_err(dev, "%pfwP: init table size invalid\n", function_node);
|
||||
return -EINVAL;
|
||||
} else if ((num_init_writes / sizeof(*raw)) > SDCA_MAX_INIT_COUNT) {
|
||||
dev_err(dev, "%pfwP: maximum init table size exceeded\n", function_node);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
raw = kzalloc(num_init_writes, GFP_KERNEL);
|
||||
@@ -1604,10 +1601,19 @@ static int find_sdca_entities(struct device *dev, struct sdw_slave *sdw,
|
||||
static struct sdca_entity *find_sdca_entity_by_label(struct sdca_function_data *function,
|
||||
const char *entity_label)
|
||||
{
|
||||
struct sdca_entity *entity = NULL;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < function->num_entities; i++) {
|
||||
struct sdca_entity *entity = &function->entities[i];
|
||||
entity = &function->entities[i];
|
||||
|
||||
/* check whole string first*/
|
||||
if (!strcmp(entity->label, entity_label))
|
||||
return entity;
|
||||
}
|
||||
|
||||
for (i = 0; i < function->num_entities; i++) {
|
||||
entity = &function->entities[i];
|
||||
|
||||
if (!strncmp(entity->label, entity_label, strlen(entity_label)))
|
||||
return entity;
|
||||
|
||||
@@ -2950,7 +2950,7 @@ static int sof_ipc4_control_load_bytes(struct snd_sof_dev *sdev, struct snd_sof_
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (scontrol->priv_size < sizeof(struct sof_abi_hdr)) {
|
||||
if (scontrol->priv_size && scontrol->priv_size < sizeof(struct sof_abi_hdr)) {
|
||||
dev_err(sdev->dev,
|
||||
"bytes control %s initial data size %zu is insufficient.\n",
|
||||
scontrol->name, scontrol->priv_size);
|
||||
|
||||
@@ -736,7 +736,7 @@ static int sof_parse_token_sets(struct snd_soc_component *scomp,
|
||||
asize = le32_to_cpu(array->size);
|
||||
|
||||
/* validate asize */
|
||||
if (asize < 0) { /* FIXME: A zero-size array makes no sense */
|
||||
if (asize < sizeof(*array)) {
|
||||
dev_err(scomp->dev, "error: invalid array size 0x%x\n",
|
||||
asize);
|
||||
return -EINVAL;
|
||||
|
||||
@@ -192,6 +192,7 @@ config SND_USB_AUDIO_QMI
|
||||
tristate "Qualcomm Audio Offload driver"
|
||||
depends on QCOM_QMI_HELPERS && SND_USB_AUDIO && SND_SOC_USB
|
||||
depends on USB_XHCI_HCD && USB_XHCI_SIDEBAND
|
||||
select AUXILIARY_BUS
|
||||
help
|
||||
Say Y here to enable the Qualcomm USB audio offloading feature.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <linux/auxiliary_bus.h>
|
||||
|
||||
@@ -2148,6 +2148,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
|
||||
/* Device matches */
|
||||
DEVICE_FLG(0x001f, 0x0b21, /* AB13X USB Audio */
|
||||
QUIRK_FLAG_FORCE_IFACE_RESET | QUIRK_FLAG_IFACE_DELAY),
|
||||
DEVICE_FLG(0x001f, 0x0b23, /* AB17X USB Audio */
|
||||
QUIRK_FLAG_FORCE_IFACE_RESET | QUIRK_FLAG_IFACE_DELAY),
|
||||
DEVICE_FLG(0x0020, 0x0b21, /* GHW-123P */
|
||||
QUIRK_FLAG_FORCE_IFACE_RESET | QUIRK_FLAG_IFACE_DELAY),
|
||||
DEVICE_FLG(0x03f0, 0x654a, /* HP 320 FHD Webcam */
|
||||
@@ -2429,6 +2431,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
|
||||
QUIRK_FLAG_CTL_MSG_DELAY | QUIRK_FLAG_IFACE_DELAY),
|
||||
VENDOR_FLG(0x07fd, /* MOTU */
|
||||
QUIRK_FLAG_VALIDATE_RATES),
|
||||
DEVICE_FLG(0x1235, 0x8006, 0), /* Focusrite Scarlett 2i2 1st Gen */
|
||||
DEVICE_FLG(0x1235, 0x800a, 0), /* Focusrite Scarlett 2i4 1st Gen */
|
||||
VENDOR_FLG(0x1235, /* Focusrite Novation */
|
||||
QUIRK_FLAG_SKIP_CLOCK_SELECTOR |
|
||||
QUIRK_FLAG_SKIP_IFACE_SETUP),
|
||||
|
||||
Reference in New Issue
Block a user