mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
sound fixes for 6.15-rc5
A bunch of small fixes. Mostly driver specific. - An OOB access fix in core UMP rawmidi conversion code - Fix for ASoC DAPM hw_params widget sequence - Make retry of usb_set_interface() errors for flaky devices - Fix redundant USB MIDI name strings - Quirks for various HP and ASUS models with HD-audio, and Jabra Evolve 65 USB-audio - Cirrus Kunit test fixes - Various fixes for ASoC Intel, stm32, renesas, imx-card, and simple-card -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmgWIxcOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+mNxAAor5bPSJZqFJSH5JV1MKPPqSpw37LZY6ia7vY ieeDtFvQlaAn5gOfuwertTYtbPqsUG9npBKeB//mxqA9JAEgjfup5jKfgQiBJAOB jwFy1fPQFVJqfZzS6FZVy3UF+jBJZMPe7GqlLxeELVxw0QY81KquDc15aeMmUR+k XY8C19c98DX95/VaIzo8m9CQmYnTz+wujc2D7yMbiYkK9US+tuL4tKjPwu5i1b3R 74cfFF+LGU0BOZ+6X7bnUj0SYGs9jCKCZD2L4L2HnqQ1DvgYumTRtScrN8lVJeyv GEg9OC/VR55myurd3lYcAQYkW4lm6d9MK8UmOl1o+6+FymRBRH+7wtnKRARdxcKL DKhKIfKRtb2CivzGit6mScgoQI8xh/ZXPHRrQ9OPfqomYl6ez5WNdZREKV/1/f+W 8lHjcFkOvn0PHPhdKDVY8Fhfsb4eaMzcJGrhHOZD6CtvCNLT9oAwZxlzMFlNf1gp E3J1HYDjrzYArUVwRw8KTx4eRss5uUFxxLie29b6asSiLlaOIOZUxwC6VhbPbxjm 3xXGGMC5IItH+UH4HV0TidLnaA7DhycvT6B9BU4RivDVC76ZVUw98RL0RbI/ljk+ Wf1oPTsrbQYdaNjodVW0LukGrLGCs0MT7v+oC0KK65F1yyblwrecpdOHml1Q1tOC 9T9uZNw= =sF2D -----END PGP SIGNATURE----- Merge tag 'sound-6.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A bunch of small fixes. Mostly driver specific. - An OOB access fix in core UMP rawmidi conversion code - Fix for ASoC DAPM hw_params widget sequence - Make retry of usb_set_interface() errors for flaky devices - Fix redundant USB MIDI name strings - Quirks for various HP and ASUS models with HD-audio, and Jabra Evolve 65 USB-audio - Cirrus Kunit test fixes - Various fixes for ASoC Intel, stm32, renesas, imx-card, and simple-card" * tag 'sound-6.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (30 commits) ASoC: amd: ps: fix for irq handler return status ASoC: simple-card-utils: Fix pointer check in graph_util_parse_link_direction ASoC: intel/sdw_utils: Add volume limit to cs35l56 speakers ASoC: intel/sdw_utils: Add volume limit to cs42l43 speakers ASoC: stm32: sai: add a check on minimal kernel frequency ASoC: stm32: sai: skip useless iterations on kernel rate loop ALSA: hda/realtek - Add more HP laptops which need mute led fixup ALSA: hda/realtek: Fix built-mic regression on other ASUS models ASoC: Intel: catpt: avoid type mismatch in dev_dbg() format ALSA: usb-audio: Fix duplicated name in MIDI substream names ALSA: ump: Fix buffer overflow at UMP SysEx message conversion ALSA: usb-audio: Add second USB ID for Jabra Evolve 65 headset ALSA: hda/realtek: Add quirk for HP Spectre x360 15-df1xxx ALSA: hda: Apply volume control on speaker+lineout for HP EliteStudio AIO ASoC: Intel: bytcr_rt5640: Add DMI quirk for Acer Aspire SW3-013 ASoC: amd: acp: Fix devm_snd_soc_register_card(acp-pdm-mach) failure ASoC: amd: acp: Fix NULL pointer deref in acp_i2s_set_tdm_slot ASoC: amd: acp: Fix NULL pointer deref on acp resume path ASoC: renesas: rz-ssi: Use NOIRQ_SYSTEM_SLEEP_PM_OPS() ASoC: soc-acpi-intel-ptl-match: add empty item to ptl_cs42l43_l3[] ...
This commit is contained in:
commit
2a239ffbeb
@ -22738,9 +22738,15 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
|
|||||||
F: Documentation/devicetree/bindings/sound/
|
F: Documentation/devicetree/bindings/sound/
|
||||||
F: Documentation/sound/soc/
|
F: Documentation/sound/soc/
|
||||||
F: include/dt-bindings/sound/
|
F: include/dt-bindings/sound/
|
||||||
|
F: include/sound/cs-amp-lib.h
|
||||||
|
F: include/sound/cs35l*
|
||||||
|
F: include/sound/cs4271.h
|
||||||
|
F: include/sound/cs42l*
|
||||||
|
F: include/sound/madera-pdata.h
|
||||||
F: include/sound/soc*
|
F: include/sound/soc*
|
||||||
F: include/sound/sof.h
|
F: include/sound/sof.h
|
||||||
F: include/sound/sof/
|
F: include/sound/sof/
|
||||||
|
F: include/sound/wm*.h
|
||||||
F: include/trace/events/sof*.h
|
F: include/trace/events/sof*.h
|
||||||
F: include/uapi/sound/asoc.h
|
F: include/uapi/sound/asoc.h
|
||||||
F: sound/soc/
|
F: sound/soc/
|
||||||
|
@ -6,14 +6,11 @@ config FW_CS_DSP
|
|||||||
|
|
||||||
config FW_CS_DSP_KUNIT_TEST_UTILS
|
config FW_CS_DSP_KUNIT_TEST_UTILS
|
||||||
tristate
|
tristate
|
||||||
depends on KUNIT && REGMAP
|
|
||||||
select FW_CS_DSP
|
|
||||||
|
|
||||||
config FW_CS_DSP_KUNIT_TEST
|
config FW_CS_DSP_KUNIT_TEST
|
||||||
tristate "KUnit tests for Cirrus Logic cs_dsp" if !KUNIT_ALL_TESTS
|
tristate "KUnit tests for Cirrus Logic cs_dsp" if !KUNIT_ALL_TESTS
|
||||||
depends on KUNIT && REGMAP
|
depends on KUNIT && REGMAP && FW_CS_DSP
|
||||||
default KUNIT_ALL_TESTS
|
default KUNIT_ALL_TESTS
|
||||||
select FW_CS_DSP
|
|
||||||
select FW_CS_DSP_KUNIT_TEST_UTILS
|
select FW_CS_DSP_KUNIT_TEST_UTILS
|
||||||
help
|
help
|
||||||
This builds KUnit tests for cs_dsp.
|
This builds KUnit tests for cs_dsp.
|
||||||
|
@ -226,6 +226,7 @@ int asoc_sdw_cs_amp_init(struct snd_soc_card *card,
|
|||||||
bool playback);
|
bool playback);
|
||||||
int asoc_sdw_cs_spk_feedback_rtd_init(struct snd_soc_pcm_runtime *rtd,
|
int asoc_sdw_cs_spk_feedback_rtd_init(struct snd_soc_pcm_runtime *rtd,
|
||||||
struct snd_soc_dai *dai);
|
struct snd_soc_dai *dai);
|
||||||
|
int asoc_sdw_cs35l56_volume_limit(struct snd_soc_card *card, const char *name_prefix);
|
||||||
|
|
||||||
/* MAXIM codec support */
|
/* MAXIM codec support */
|
||||||
int asoc_sdw_maxim_init(struct snd_soc_card *card,
|
int asoc_sdw_maxim_init(struct snd_soc_card *card,
|
||||||
|
@ -19,7 +19,7 @@ struct ump_cvt_to_ump_bank {
|
|||||||
/* context for converting from MIDI1 byte stream to UMP packet */
|
/* context for converting from MIDI1 byte stream to UMP packet */
|
||||||
struct ump_cvt_to_ump {
|
struct ump_cvt_to_ump {
|
||||||
/* MIDI1 intermediate buffer */
|
/* MIDI1 intermediate buffer */
|
||||||
unsigned char buf[4];
|
unsigned char buf[6]; /* up to 6 bytes for SysEx */
|
||||||
int len;
|
int len;
|
||||||
int cmd_bytes;
|
int cmd_bytes;
|
||||||
|
|
||||||
|
@ -441,6 +441,10 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
|||||||
alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
|
alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
|
||||||
fallthrough;
|
fallthrough;
|
||||||
case 0x10ec0215:
|
case 0x10ec0215:
|
||||||
|
case 0x10ec0236:
|
||||||
|
case 0x10ec0245:
|
||||||
|
case 0x10ec0256:
|
||||||
|
case 0x10ec0257:
|
||||||
case 0x10ec0285:
|
case 0x10ec0285:
|
||||||
case 0x10ec0289:
|
case 0x10ec0289:
|
||||||
alc_update_coef_idx(codec, 0x36, 1<<13, 0);
|
alc_update_coef_idx(codec, 0x36, 1<<13, 0);
|
||||||
@ -448,12 +452,8 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
|||||||
case 0x10ec0230:
|
case 0x10ec0230:
|
||||||
case 0x10ec0233:
|
case 0x10ec0233:
|
||||||
case 0x10ec0235:
|
case 0x10ec0235:
|
||||||
case 0x10ec0236:
|
|
||||||
case 0x10ec0245:
|
|
||||||
case 0x10ec0255:
|
case 0x10ec0255:
|
||||||
case 0x10ec0256:
|
|
||||||
case 0x19e58326:
|
case 0x19e58326:
|
||||||
case 0x10ec0257:
|
|
||||||
case 0x10ec0282:
|
case 0x10ec0282:
|
||||||
case 0x10ec0283:
|
case 0x10ec0283:
|
||||||
case 0x10ec0286:
|
case 0x10ec0286:
|
||||||
@ -6742,6 +6742,25 @@ static void alc274_fixup_bind_dacs(struct hda_codec *codec,
|
|||||||
codec->power_save_node = 0;
|
codec->power_save_node = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* avoid DAC 0x06 for speaker switch 0x17; it has no volume control */
|
||||||
|
static void alc274_fixup_hp_aio_bind_dacs(struct hda_codec *codec,
|
||||||
|
const struct hda_fixup *fix, int action)
|
||||||
|
{
|
||||||
|
static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
|
||||||
|
/* The speaker is routed to the Node 0x06 by a mistake, thus the
|
||||||
|
* speaker's volume can't be adjusted since the node doesn't have
|
||||||
|
* Amp-out capability. Assure the speaker and lineout pin to be
|
||||||
|
* coupled with DAC NID 0x02.
|
||||||
|
*/
|
||||||
|
static const hda_nid_t preferred_pairs[] = {
|
||||||
|
0x16, 0x02, 0x17, 0x02, 0x21, 0x03, 0
|
||||||
|
};
|
||||||
|
struct alc_spec *spec = codec->spec;
|
||||||
|
|
||||||
|
snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
|
||||||
|
spec->gen.preferred_dacs = preferred_pairs;
|
||||||
|
}
|
||||||
|
|
||||||
/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
|
/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
|
||||||
static void alc289_fixup_asus_ga401(struct hda_codec *codec,
|
static void alc289_fixup_asus_ga401(struct hda_codec *codec,
|
||||||
const struct hda_fixup *fix, int action)
|
const struct hda_fixup *fix, int action)
|
||||||
@ -6963,6 +6982,41 @@ static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* GPIO1 = amplifier on/off */
|
||||||
|
static void alc285_fixup_hp_spectre_x360_df1(struct hda_codec *codec,
|
||||||
|
const struct hda_fixup *fix,
|
||||||
|
int action)
|
||||||
|
{
|
||||||
|
struct alc_spec *spec = codec->spec;
|
||||||
|
static const hda_nid_t conn[] = { 0x02 };
|
||||||
|
static const struct hda_pintbl pincfgs[] = {
|
||||||
|
{ 0x14, 0x90170110 }, /* front/high speakers */
|
||||||
|
{ 0x17, 0x90170130 }, /* back/bass speakers */
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
// enable mute led
|
||||||
|
alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||||
|
/* needed for amp of back speakers */
|
||||||
|
spec->gpio_mask |= 0x01;
|
||||||
|
spec->gpio_dir |= 0x01;
|
||||||
|
snd_hda_apply_pincfgs(codec, pincfgs);
|
||||||
|
/* share DAC to have unified volume control */
|
||||||
|
snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
|
||||||
|
snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
|
||||||
|
break;
|
||||||
|
case HDA_FIXUP_ACT_INIT:
|
||||||
|
/* need to toggle GPIO to enable the amp of back speakers */
|
||||||
|
alc_update_gpio_data(codec, 0x01, true);
|
||||||
|
msleep(100);
|
||||||
|
alc_update_gpio_data(codec, 0x01, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
|
static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
|
||||||
const struct hda_fixup *fix, int action)
|
const struct hda_fixup *fix, int action)
|
||||||
{
|
{
|
||||||
@ -7761,6 +7815,7 @@ enum {
|
|||||||
ALC280_FIXUP_HP_9480M,
|
ALC280_FIXUP_HP_9480M,
|
||||||
ALC245_FIXUP_HP_X360_AMP,
|
ALC245_FIXUP_HP_X360_AMP,
|
||||||
ALC285_FIXUP_HP_SPECTRE_X360_EB1,
|
ALC285_FIXUP_HP_SPECTRE_X360_EB1,
|
||||||
|
ALC285_FIXUP_HP_SPECTRE_X360_DF1,
|
||||||
ALC285_FIXUP_HP_ENVY_X360,
|
ALC285_FIXUP_HP_ENVY_X360,
|
||||||
ALC288_FIXUP_DELL_HEADSET_MODE,
|
ALC288_FIXUP_DELL_HEADSET_MODE,
|
||||||
ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
|
ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||||
@ -7970,6 +8025,7 @@ enum {
|
|||||||
ALC294_FIXUP_BASS_SPEAKER_15,
|
ALC294_FIXUP_BASS_SPEAKER_15,
|
||||||
ALC283_FIXUP_DELL_HP_RESUME,
|
ALC283_FIXUP_DELL_HP_RESUME,
|
||||||
ALC294_FIXUP_ASUS_CS35L41_SPI_2,
|
ALC294_FIXUP_ASUS_CS35L41_SPI_2,
|
||||||
|
ALC274_FIXUP_HP_AIO_BIND_DACS,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A special fixup for Lenovo C940 and Yoga Duet 7;
|
/* A special fixup for Lenovo C940 and Yoga Duet 7;
|
||||||
@ -9837,6 +9893,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = alc285_fixup_hp_spectre_x360_eb1
|
.v.func = alc285_fixup_hp_spectre_x360_eb1
|
||||||
},
|
},
|
||||||
|
[ALC285_FIXUP_HP_SPECTRE_X360_DF1] = {
|
||||||
|
.type = HDA_FIXUP_FUNC,
|
||||||
|
.v.func = alc285_fixup_hp_spectre_x360_df1
|
||||||
|
},
|
||||||
[ALC285_FIXUP_HP_ENVY_X360] = {
|
[ALC285_FIXUP_HP_ENVY_X360] = {
|
||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = alc285_fixup_hp_envy_x360,
|
.v.func = alc285_fixup_hp_envy_x360,
|
||||||
@ -10340,6 +10400,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||||||
.chained = true,
|
.chained = true,
|
||||||
.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC,
|
.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC,
|
||||||
},
|
},
|
||||||
|
[ALC274_FIXUP_HP_AIO_BIND_DACS] = {
|
||||||
|
.type = HDA_FIXUP_FUNC,
|
||||||
|
.v.func = alc274_fixup_hp_aio_bind_dacs,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct hda_quirk alc269_fixup_tbl[] = {
|
static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||||
@ -10564,6 +10628,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x103c, 0x86c1, "HP Laptop 15-da3001TU", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
SND_PCI_QUIRK(0x103c, 0x86c1, "HP Laptop 15-da3001TU", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||||
SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
|
SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
|
||||||
SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
|
SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
|
||||||
|
SND_PCI_QUIRK(0x103c, 0x863e, "HP Spectre x360 15-df1xxx", ALC285_FIXUP_HP_SPECTRE_X360_DF1),
|
||||||
SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
|
SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
|
||||||
SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
|
SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||||
@ -10768,12 +10833,13 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8caf, "HP Elite mt645 G8 Mobile Thin Client", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
SND_PCI_QUIRK(0x103c, 0x8caf, "HP Elite mt645 G8 Mobile Thin Client", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8cbd, "HP Pavilion Aero Laptop 13-bg0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
|
SND_PCI_QUIRK(0x103c, 0x8cbd, "HP Pavilion Aero Laptop 13-bg0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8cdd, "HP Spectre", ALC287_FIXUP_CS35L41_I2C_2),
|
SND_PCI_QUIRK(0x103c, 0x8cdd, "HP Spectre", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8cde, "HP Spectre", ALC287_FIXUP_CS35L41_I2C_2),
|
SND_PCI_QUIRK(0x103c, 0x8cde, "HP OmniBook Ultra Flip Laptop 14t", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8cdf, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8cdf, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8ce0, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8ce0, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8d01, "HP ZBook Power 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8d01, "HP ZBook Power 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||||
|
SND_PCI_QUIRK(0x103c, 0x8d18, "HP EliteStudio 8 AIO", ALC274_FIXUP_HP_AIO_BIND_DACS),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8d84, "HP EliteBook X G1i", ALC285_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8d84, "HP EliteBook X G1i", ALC285_FIXUP_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8d85, "HP EliteBook 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8d85, "HP EliteBook 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8d86, "HP Elite X360 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8d86, "HP Elite X360 14 G12", ALC285_FIXUP_HP_GPIO_LED),
|
||||||
@ -10793,11 +10859,15 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x103c, 0x8da1, "HP 16 Clipper OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
|
SND_PCI_QUIRK(0x103c, 0x8da1, "HP 16 Clipper OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8da7, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
|
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, 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, 0x8de8, "HP Gemtree", ALC245_FIXUP_TAS2781_SPI_2),
|
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, 0x8de9, "HP Gemtree", ALC245_FIXUP_TAS2781_SPI_2),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8dec, "HP EliteBook 640 G12", ALC236_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8dec, "HP EliteBook 640 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||||
|
SND_PCI_QUIRK(0x103c, 0x8ded, "HP EliteBook 640 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8dee, "HP EliteBook 660 G12", ALC236_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8dee, "HP EliteBook 660 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||||
|
SND_PCI_QUIRK(0x103c, 0x8def, "HP EliteBook 660 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8df0, "HP EliteBook 630 G12", ALC236_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8df0, "HP EliteBook 630 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||||
|
SND_PCI_QUIRK(0x103c, 0x8df1, "HP EliteBook 630 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8dfc, "HP EliteBook 645 G12", ALC236_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8dfc, "HP EliteBook 645 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8dfe, "HP EliteBook 665 G12", ALC236_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x8dfe, "HP EliteBook 665 G12", ALC236_FIXUP_HP_GPIO_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8e11, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2),
|
SND_PCI_QUIRK(0x103c, 0x8e11, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2),
|
||||||
@ -10843,10 +10913,10 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
|
SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12b4, "ASUS B3405CCA / P3405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x12b4, "ASUS B3405CCA / P3405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
|
SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1460, "Asus VivoBook 15", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1043, 0x1460, "Asus VivoBook 15", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||||
@ -10900,7 +10970,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
|
SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JU/JV/JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JU/JV/JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JY/JZ/JI/JG", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JY/JZ/JI/JG", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1ccf, "ASUS G814JU/JV/JI", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x1ccf, "ASUS G814JU/JV/JI", ALC245_FIXUP_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1cdf, "ASUS G814JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x1cdf, "ASUS G814JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1cef, "ASUS G834JY/JZ/JI/JG", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
SND_PCI_QUIRK(0x1043, 0x1cef, "ASUS G834JY/JZ/JI/JG", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||||
@ -11494,6 +11564,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
|||||||
{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
|
{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
|
||||||
{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
|
{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
|
||||||
{.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
|
{.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
|
||||||
|
{.id = ALC285_FIXUP_HP_SPECTRE_X360_DF1, .name = "alc285-hp-spectre-x360-df1"},
|
||||||
{.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},
|
{.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},
|
||||||
{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
|
{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
|
||||||
{.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
|
{.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
|
||||||
|
@ -97,7 +97,7 @@ static int acp_i2s_set_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, u32 rx_mas
|
|||||||
struct acp_stream *stream;
|
struct acp_stream *stream;
|
||||||
int slot_len, no_of_slots;
|
int slot_len, no_of_slots;
|
||||||
|
|
||||||
chip = dev_get_platdata(dev);
|
chip = dev_get_drvdata(dev->parent);
|
||||||
switch (slot_width) {
|
switch (slot_width) {
|
||||||
case SLOT_WIDTH_8:
|
case SLOT_WIDTH_8:
|
||||||
slot_len = 8;
|
slot_len = 8;
|
||||||
|
@ -450,7 +450,7 @@ int acp_machine_select(struct acp_chip_info *chip)
|
|||||||
struct snd_soc_acpi_mach *mach;
|
struct snd_soc_acpi_mach *mach;
|
||||||
int size, platform;
|
int size, platform;
|
||||||
|
|
||||||
if (chip->flag == FLAG_AMD_LEGACY_ONLY_DMIC) {
|
if (chip->flag == FLAG_AMD_LEGACY_ONLY_DMIC && chip->is_pdm_dev) {
|
||||||
platform = chip->acp_rev;
|
platform = chip->acp_rev;
|
||||||
chip->mach_dev = platform_device_register_data(chip->dev, "acp-pdm-mach",
|
chip->mach_dev = platform_device_register_data(chip->dev, "acp-pdm-mach",
|
||||||
PLATFORM_DEVID_NONE, &platform,
|
PLATFORM_DEVID_NONE, &platform,
|
||||||
|
@ -199,7 +199,7 @@ static void rembrandt_audio_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
static int rmb_pcm_resume(struct device *dev)
|
static int rmb_pcm_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct acp_chip_info *chip = dev_get_platdata(dev);
|
struct acp_chip_info *chip = dev_get_drvdata(dev->parent);
|
||||||
struct acp_stream *stream;
|
struct acp_stream *stream;
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
snd_pcm_uframes_t buf_in_frames;
|
snd_pcm_uframes_t buf_in_frames;
|
||||||
|
@ -146,7 +146,7 @@ static void renoir_audio_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
static int rn_pcm_resume(struct device *dev)
|
static int rn_pcm_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct acp_chip_info *chip = dev_get_platdata(dev);
|
struct acp_chip_info *chip = dev_get_drvdata(dev->parent);
|
||||||
struct acp_stream *stream;
|
struct acp_stream *stream;
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
snd_pcm_uframes_t buf_in_frames;
|
snd_pcm_uframes_t buf_in_frames;
|
||||||
|
@ -250,7 +250,7 @@ static void acp63_audio_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
static int acp63_pcm_resume(struct device *dev)
|
static int acp63_pcm_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct acp_chip_info *chip = dev_get_platdata(dev);
|
struct acp_chip_info *chip = dev_get_drvdata(dev->parent);
|
||||||
struct acp_stream *stream;
|
struct acp_stream *stream;
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
snd_pcm_uframes_t buf_in_frames;
|
snd_pcm_uframes_t buf_in_frames;
|
||||||
|
@ -182,7 +182,7 @@ static void acp_acp70_audio_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
static int acp70_pcm_resume(struct device *dev)
|
static int acp70_pcm_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct acp_chip_info *chip = dev_get_platdata(dev);
|
struct acp_chip_info *chip = dev_get_drvdata(dev->parent);
|
||||||
struct acp_stream *stream;
|
struct acp_stream *stream;
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
snd_pcm_uframes_t buf_in_frames;
|
snd_pcm_uframes_t buf_in_frames;
|
||||||
|
@ -193,6 +193,7 @@ static irqreturn_t acp63_irq_handler(int irq, void *dev_id)
|
|||||||
struct amd_sdw_manager *amd_manager;
|
struct amd_sdw_manager *amd_manager;
|
||||||
u32 ext_intr_stat, ext_intr_stat1;
|
u32 ext_intr_stat, ext_intr_stat1;
|
||||||
u16 irq_flag = 0;
|
u16 irq_flag = 0;
|
||||||
|
u16 wake_irq_flag = 0;
|
||||||
u16 sdw_dma_irq_flag = 0;
|
u16 sdw_dma_irq_flag = 0;
|
||||||
|
|
||||||
adata = dev_id;
|
adata = dev_id;
|
||||||
@ -231,7 +232,7 @@ static irqreturn_t acp63_irq_handler(int irq, void *dev_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (adata->acp_rev >= ACP70_PCI_REV)
|
if (adata->acp_rev >= ACP70_PCI_REV)
|
||||||
irq_flag = check_and_handle_acp70_sdw_wake_irq(adata);
|
wake_irq_flag = check_and_handle_acp70_sdw_wake_irq(adata);
|
||||||
|
|
||||||
if (ext_intr_stat & BIT(PDM_DMA_STAT)) {
|
if (ext_intr_stat & BIT(PDM_DMA_STAT)) {
|
||||||
ps_pdm_data = dev_get_drvdata(&adata->pdm_dev->dev);
|
ps_pdm_data = dev_get_drvdata(&adata->pdm_dev->dev);
|
||||||
@ -245,7 +246,7 @@ static irqreturn_t acp63_irq_handler(int irq, void *dev_id)
|
|||||||
if (sdw_dma_irq_flag)
|
if (sdw_dma_irq_flag)
|
||||||
return IRQ_WAKE_THREAD;
|
return IRQ_WAKE_THREAD;
|
||||||
|
|
||||||
if (irq_flag)
|
if (irq_flag | wake_irq_flag)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
else
|
else
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
@ -776,10 +776,9 @@ config SND_SOC_CS_AMP_LIB
|
|||||||
tristate
|
tristate
|
||||||
|
|
||||||
config SND_SOC_CS_AMP_LIB_TEST
|
config SND_SOC_CS_AMP_LIB_TEST
|
||||||
tristate "KUnit test for Cirrus Logic cs-amp-lib"
|
tristate "KUnit test for Cirrus Logic cs-amp-lib" if !KUNIT_ALL_TESTS
|
||||||
depends on KUNIT
|
depends on SND_SOC_CS_AMP_LIB && KUNIT
|
||||||
default KUNIT_ALL_TESTS
|
default KUNIT_ALL_TESTS
|
||||||
select SND_SOC_CS_AMP_LIB
|
|
||||||
help
|
help
|
||||||
This builds KUnit tests for the Cirrus Logic common
|
This builds KUnit tests for the Cirrus Logic common
|
||||||
amplifier library.
|
amplifier library.
|
||||||
|
@ -654,6 +654,10 @@ static int cs42l43_run_type_detect(struct cs42l43_codec *priv)
|
|||||||
|
|
||||||
reinit_completion(&priv->type_detect);
|
reinit_completion(&priv->type_detect);
|
||||||
|
|
||||||
|
regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
|
||||||
|
CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
|
||||||
|
CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK);
|
||||||
|
|
||||||
cs42l43_start_hs_bias(priv, true);
|
cs42l43_start_hs_bias(priv, true);
|
||||||
regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
|
regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
|
||||||
CS42L43_HSDET_MODE_MASK, 0x3 << CS42L43_HSDET_MODE_SHIFT);
|
CS42L43_HSDET_MODE_MASK, 0x3 << CS42L43_HSDET_MODE_SHIFT);
|
||||||
@ -665,6 +669,9 @@ static int cs42l43_run_type_detect(struct cs42l43_codec *priv)
|
|||||||
CS42L43_HSDET_MODE_MASK, 0x2 << CS42L43_HSDET_MODE_SHIFT);
|
CS42L43_HSDET_MODE_MASK, 0x2 << CS42L43_HSDET_MODE_SHIFT);
|
||||||
cs42l43_stop_hs_bias(priv);
|
cs42l43_stop_hs_bias(priv);
|
||||||
|
|
||||||
|
regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
|
||||||
|
CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK, 0);
|
||||||
|
|
||||||
if (!time_left)
|
if (!time_left)
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
|
@ -544,7 +544,7 @@ static int imx_card_parse_of(struct imx_card_data *data)
|
|||||||
if (!card->dai_link)
|
if (!card->dai_link)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
data->link_data = devm_kcalloc(dev, num_links, sizeof(*link), GFP_KERNEL);
|
data->link_data = devm_kcalloc(dev, num_links, sizeof(*link_data), GFP_KERNEL);
|
||||||
if (!data->link_data)
|
if (!data->link_data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -1174,9 +1174,9 @@ void graph_util_parse_link_direction(struct device_node *np,
|
|||||||
bool is_playback_only = of_property_read_bool(np, "playback-only");
|
bool is_playback_only = of_property_read_bool(np, "playback-only");
|
||||||
bool is_capture_only = of_property_read_bool(np, "capture-only");
|
bool is_capture_only = of_property_read_bool(np, "capture-only");
|
||||||
|
|
||||||
if (is_playback_only)
|
if (playback_only)
|
||||||
*playback_only = is_playback_only;
|
*playback_only = is_playback_only;
|
||||||
if (is_capture_only)
|
if (capture_only)
|
||||||
*capture_only = is_capture_only;
|
*capture_only = is_capture_only;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(graph_util_parse_link_direction);
|
EXPORT_SYMBOL_GPL(graph_util_parse_link_direction);
|
||||||
|
@ -576,6 +576,19 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
|||||||
BYT_RT5640_SSP0_AIF2 |
|
BYT_RT5640_SSP0_AIF2 |
|
||||||
BYT_RT5640_MCLK_EN),
|
BYT_RT5640_MCLK_EN),
|
||||||
},
|
},
|
||||||
|
{ /* Acer Aspire SW3-013 */
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW3-013"),
|
||||||
|
},
|
||||||
|
.driver_data = (void *)(BYT_RT5640_DMIC1_MAP |
|
||||||
|
BYT_RT5640_JD_SRC_JD2_IN4N |
|
||||||
|
BYT_RT5640_OVCD_TH_2000UA |
|
||||||
|
BYT_RT5640_OVCD_SF_0P75 |
|
||||||
|
BYT_RT5640_DIFF_MIC |
|
||||||
|
BYT_RT5640_SSP0_AIF1 |
|
||||||
|
BYT_RT5640_MCLK_EN),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||||
|
@ -156,7 +156,7 @@ static void catpt_dsp_set_srampge(struct catpt_dev *cdev, struct resource *sram,
|
|||||||
{
|
{
|
||||||
unsigned long old;
|
unsigned long old;
|
||||||
u32 off = sram->start;
|
u32 off = sram->start;
|
||||||
u32 b = __ffs(mask);
|
unsigned long b = __ffs(mask);
|
||||||
|
|
||||||
old = catpt_readl_pci(cdev, VDRTCTL0) & mask;
|
old = catpt_readl_pci(cdev, VDRTCTL0) & mask;
|
||||||
dev_dbg(cdev->dev, "SRAMPGE [0x%08lx] 0x%08lx -> 0x%08lx",
|
dev_dbg(cdev->dev, "SRAMPGE [0x%08lx] 0x%08lx -> 0x%08lx",
|
||||||
|
@ -431,7 +431,8 @@ static const struct snd_soc_acpi_link_adr ptl_cs42l43_l3[] = {
|
|||||||
.mask = BIT(3),
|
.mask = BIT(3),
|
||||||
.num_adr = ARRAY_SIZE(cs42l43_3_adr),
|
.num_adr = ARRAY_SIZE(cs42l43_3_adr),
|
||||||
.adr_d = cs42l43_3_adr,
|
.adr_d = cs42l43_3_adr,
|
||||||
}
|
},
|
||||||
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_soc_acpi_link_adr ptl_rt722_only[] = {
|
static const struct snd_soc_acpi_link_adr ptl_rt722_only[] = {
|
||||||
|
@ -1244,7 +1244,7 @@ static int rz_ssi_runtime_resume(struct device *dev)
|
|||||||
|
|
||||||
static const struct dev_pm_ops rz_ssi_pm_ops = {
|
static const struct dev_pm_ops rz_ssi_pm_ops = {
|
||||||
RUNTIME_PM_OPS(rz_ssi_runtime_suspend, rz_ssi_runtime_resume, NULL)
|
RUNTIME_PM_OPS(rz_ssi_runtime_suspend, rz_ssi_runtime_resume, NULL)
|
||||||
SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
|
NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_driver rz_ssi_driver = {
|
static struct platform_driver rz_ssi_driver = {
|
||||||
|
@ -60,6 +60,10 @@ static int asoc_sdw_bridge_cs35l56_asp_init(struct snd_soc_pcm_runtime *rtd)
|
|||||||
|
|
||||||
/* 4 x 16-bit sample slots and FSYNC=48000, BCLK=3.072 MHz */
|
/* 4 x 16-bit sample slots and FSYNC=48000, BCLK=3.072 MHz */
|
||||||
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
||||||
|
ret = asoc_sdw_cs35l56_volume_limit(card, codec_dai->component->name_prefix);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = snd_soc_dai_set_tdm_slot(codec_dai, tx_mask, rx_mask, 4, 16);
|
ret = snd_soc_dai_set_tdm_slot(codec_dai, tx_mask, rx_mask, 4, 16);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
#include <sound/soc-dapm.h>
|
#include <sound/soc-dapm.h>
|
||||||
#include <sound/soc_sdw_utils.h>
|
#include <sound/soc_sdw_utils.h>
|
||||||
|
|
||||||
|
#define CS42L43_SPK_VOLUME_0DB 128 /* 0dB Max */
|
||||||
|
|
||||||
static const struct snd_soc_dapm_route cs42l43_hs_map[] = {
|
static const struct snd_soc_dapm_route cs42l43_hs_map[] = {
|
||||||
{ "Headphone", NULL, "cs42l43 AMP3_OUT" },
|
{ "Headphone", NULL, "cs42l43 AMP3_OUT" },
|
||||||
{ "Headphone", NULL, "cs42l43 AMP4_OUT" },
|
{ "Headphone", NULL, "cs42l43 AMP4_OUT" },
|
||||||
@ -117,6 +119,14 @@ int asoc_sdw_cs42l43_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_so
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = snd_soc_limit_volume(card, "cs42l43 Speaker Digital Volume",
|
||||||
|
CS42L43_SPK_VOLUME_0DB);
|
||||||
|
if (ret)
|
||||||
|
dev_err(card->dev, "cs42l43 speaker volume limit failed: %d\n", ret);
|
||||||
|
else
|
||||||
|
dev_info(card->dev, "Setting CS42L43 Speaker volume limit to %d\n",
|
||||||
|
CS42L43_SPK_VOLUME_0DB);
|
||||||
|
|
||||||
ret = snd_soc_dapm_add_routes(&card->dapm, cs42l43_spk_map,
|
ret = snd_soc_dapm_add_routes(&card->dapm, cs42l43_spk_map,
|
||||||
ARRAY_SIZE(cs42l43_spk_map));
|
ARRAY_SIZE(cs42l43_spk_map));
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -16,6 +16,25 @@
|
|||||||
|
|
||||||
#define CODEC_NAME_SIZE 8
|
#define CODEC_NAME_SIZE 8
|
||||||
#define CS_AMP_CHANNELS_PER_AMP 4
|
#define CS_AMP_CHANNELS_PER_AMP 4
|
||||||
|
#define CS35L56_SPK_VOLUME_0DB 400 /* 0dB Max */
|
||||||
|
|
||||||
|
int asoc_sdw_cs35l56_volume_limit(struct snd_soc_card *card, const char *name_prefix)
|
||||||
|
{
|
||||||
|
char *volume_ctl_name;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
volume_ctl_name = kasprintf(GFP_KERNEL, "%s Speaker Volume", name_prefix);
|
||||||
|
if (!volume_ctl_name)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = snd_soc_limit_volume(card, volume_ctl_name, CS35L56_SPK_VOLUME_0DB);
|
||||||
|
if (ret)
|
||||||
|
dev_err(card->dev, "%s limit set failed: %d\n", volume_ctl_name, ret);
|
||||||
|
|
||||||
|
kfree(volume_ctl_name);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_NS(asoc_sdw_cs35l56_volume_limit, "SND_SOC_SDW_UTILS");
|
||||||
|
|
||||||
int asoc_sdw_cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai)
|
int asoc_sdw_cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
@ -40,6 +59,11 @@ int asoc_sdw_cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai
|
|||||||
|
|
||||||
snprintf(widget_name, sizeof(widget_name), "%s SPK",
|
snprintf(widget_name, sizeof(widget_name), "%s SPK",
|
||||||
codec_dai->component->name_prefix);
|
codec_dai->component->name_prefix);
|
||||||
|
|
||||||
|
ret = asoc_sdw_cs35l56_volume_limit(card, codec_dai->component->name_prefix);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = snd_soc_dapm_add_routes(&card->dapm, &route, 1);
|
ret = snd_soc_dapm_add_routes(&card->dapm, &route, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -29,6 +29,8 @@ int asoc_sdw_rt_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_da
|
|||||||
mic_name = devm_kasprintf(card->dev, GFP_KERNEL, "rt715-sdca");
|
mic_name = devm_kasprintf(card->dev, GFP_KERNEL, "rt715-sdca");
|
||||||
else
|
else
|
||||||
mic_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s", component->name_prefix);
|
mic_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s", component->name_prefix);
|
||||||
|
if (!mic_name)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
|
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
|
||||||
"%s mic:%s", card->components,
|
"%s mic:%s", card->components,
|
||||||
|
@ -1584,10 +1584,13 @@ int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,
|
|||||||
/*
|
/*
|
||||||
* Filter for systems with 'component_chaining' enabled.
|
* Filter for systems with 'component_chaining' enabled.
|
||||||
* This helps to avoid unnecessary re-configuration of an
|
* This helps to avoid unnecessary re-configuration of an
|
||||||
* already active BE on such systems.
|
* already active BE on such systems and ensures the BE DAI
|
||||||
|
* widget is powered ON after hw_params() BE DAI callback.
|
||||||
*/
|
*/
|
||||||
if (fe->card->component_chaining &&
|
if (fe->card->component_chaining &&
|
||||||
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
|
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) &&
|
||||||
|
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) &&
|
||||||
|
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
|
||||||
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
|
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -409,11 +409,11 @@ static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai,
|
|||||||
unsigned int rate)
|
unsigned int rate)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = sai->pdev;
|
struct platform_device *pdev = sai->pdev;
|
||||||
unsigned int sai_ck_rate, sai_ck_max_rate, sai_curr_rate, sai_new_rate;
|
unsigned int sai_ck_rate, sai_ck_max_rate, sai_ck_min_rate, sai_curr_rate, sai_new_rate;
|
||||||
int div, ret;
|
int div, ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set maximum expected kernel clock frequency
|
* Set minimum and maximum expected kernel clock frequency
|
||||||
* - mclk on or spdif:
|
* - mclk on or spdif:
|
||||||
* f_sai_ck = MCKDIV * mclk-fs * fs
|
* f_sai_ck = MCKDIV * mclk-fs * fs
|
||||||
* Here typical 256 ratio is assumed for mclk-fs
|
* Here typical 256 ratio is assumed for mclk-fs
|
||||||
@ -423,13 +423,16 @@ static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai,
|
|||||||
* Set constraint MCKDIV * FRL <= 256, to ensure MCKDIV is in available range
|
* Set constraint MCKDIV * FRL <= 256, to ensure MCKDIV is in available range
|
||||||
* f_sai_ck = sai_ck_max_rate * pow_of_two(FRL) / 256
|
* f_sai_ck = sai_ck_max_rate * pow_of_two(FRL) / 256
|
||||||
*/
|
*/
|
||||||
|
sai_ck_min_rate = rate * 256;
|
||||||
if (!(rate % SAI_RATE_11K))
|
if (!(rate % SAI_RATE_11K))
|
||||||
sai_ck_max_rate = SAI_MAX_SAMPLE_RATE_11K * 256;
|
sai_ck_max_rate = SAI_MAX_SAMPLE_RATE_11K * 256;
|
||||||
else
|
else
|
||||||
sai_ck_max_rate = SAI_MAX_SAMPLE_RATE_8K * 256;
|
sai_ck_max_rate = SAI_MAX_SAMPLE_RATE_8K * 256;
|
||||||
|
|
||||||
if (!sai->sai_mclk && !STM_SAI_PROTOCOL_IS_SPDIF(sai))
|
if (!sai->sai_mclk && !STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
|
||||||
|
sai_ck_min_rate = rate * sai->fs_length;
|
||||||
sai_ck_max_rate /= DIV_ROUND_CLOSEST(256, roundup_pow_of_two(sai->fs_length));
|
sai_ck_max_rate /= DIV_ROUND_CLOSEST(256, roundup_pow_of_two(sai->fs_length));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Request exclusivity, as the clock is shared by SAI sub-blocks and by
|
* Request exclusivity, as the clock is shared by SAI sub-blocks and by
|
||||||
@ -444,7 +447,10 @@ static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai,
|
|||||||
* return immediately.
|
* return immediately.
|
||||||
*/
|
*/
|
||||||
sai_curr_rate = clk_get_rate(sai->sai_ck);
|
sai_curr_rate = clk_get_rate(sai->sai_ck);
|
||||||
if (stm32_sai_rate_accurate(sai_ck_max_rate, sai_curr_rate))
|
dev_dbg(&pdev->dev, "kernel clock rate: min [%u], max [%u], current [%u]",
|
||||||
|
sai_ck_min_rate, sai_ck_max_rate, sai_curr_rate);
|
||||||
|
if (stm32_sai_rate_accurate(sai_ck_max_rate, sai_curr_rate) &&
|
||||||
|
sai_curr_rate >= sai_ck_min_rate)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -472,7 +478,7 @@ static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai,
|
|||||||
/* Try a lower frequency */
|
/* Try a lower frequency */
|
||||||
div++;
|
div++;
|
||||||
sai_ck_rate = sai_ck_max_rate / div;
|
sai_ck_rate = sai_ck_max_rate / div;
|
||||||
} while (sai_ck_rate > rate);
|
} while (sai_ck_rate >= sai_ck_min_rate);
|
||||||
|
|
||||||
/* No accurate rate found */
|
/* No accurate rate found */
|
||||||
dev_err(&pdev->dev, "Failed to find an accurate rate");
|
dev_err(&pdev->dev, "Failed to find an accurate rate");
|
||||||
|
@ -926,6 +926,8 @@ static int endpoint_set_interface(struct snd_usb_audio *chip,
|
|||||||
{
|
{
|
||||||
int altset = set ? ep->altsetting : 0;
|
int altset = set ? ep->altsetting : 0;
|
||||||
int err;
|
int err;
|
||||||
|
int retries = 0;
|
||||||
|
const int max_retries = 5;
|
||||||
|
|
||||||
if (ep->iface_ref->altset == altset)
|
if (ep->iface_ref->altset == altset)
|
||||||
return 0;
|
return 0;
|
||||||
@ -935,8 +937,13 @@ static int endpoint_set_interface(struct snd_usb_audio *chip,
|
|||||||
|
|
||||||
usb_audio_dbg(chip, "Setting usb interface %d:%d for EP 0x%x\n",
|
usb_audio_dbg(chip, "Setting usb interface %d:%d for EP 0x%x\n",
|
||||||
ep->iface, altset, ep->ep_num);
|
ep->iface, altset, ep->ep_num);
|
||||||
|
retry:
|
||||||
err = usb_set_interface(chip->dev, ep->iface, altset);
|
err = usb_set_interface(chip->dev, ep->iface, altset);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
|
if (err == -EPROTO && ++retries <= max_retries) {
|
||||||
|
msleep(5 * (1 << (retries - 1)));
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
usb_audio_err_ratelimited(
|
usb_audio_err_ratelimited(
|
||||||
chip, "%d:%d: usb_set_interface failed (%d)\n",
|
chip, "%d:%d: usb_set_interface failed (%d)\n",
|
||||||
ep->iface, altset, err);
|
ep->iface, altset, err);
|
||||||
|
@ -260,7 +260,8 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Jabra Evolve 65 headset */
|
/* Jabra Evolve 65 headset */
|
||||||
if (chip->usb_id == USB_ID(0x0b0e, 0x030b)) {
|
if (chip->usb_id == USB_ID(0x0b0e, 0x030b) ||
|
||||||
|
chip->usb_id == USB_ID(0x0b0e, 0x030c)) {
|
||||||
/* only 48kHz for playback while keeping 16kHz for capture */
|
/* only 48kHz for playback while keeping 16kHz for capture */
|
||||||
if (fp->nr_rates != 1)
|
if (fp->nr_rates != 1)
|
||||||
return set_fixed_rate(fp, 48000, SNDRV_PCM_RATE_48000);
|
return set_fixed_rate(fp, 48000, SNDRV_PCM_RATE_48000);
|
||||||
|
@ -1885,10 +1885,18 @@ static void snd_usbmidi_init_substream(struct snd_usb_midi *umidi,
|
|||||||
}
|
}
|
||||||
|
|
||||||
port_info = find_port_info(umidi, number);
|
port_info = find_port_info(umidi, number);
|
||||||
name_format = port_info ? port_info->name :
|
if (port_info || jack_name == default_jack_name ||
|
||||||
(jack_name != default_jack_name ? "%s %s" : "%s %s %d");
|
strncmp(umidi->card->shortname, jack_name, strlen(umidi->card->shortname)) != 0) {
|
||||||
snprintf(substream->name, sizeof(substream->name),
|
name_format = port_info ? port_info->name :
|
||||||
name_format, umidi->card->shortname, jack_name, number + 1);
|
(jack_name != default_jack_name ? "%s %s" : "%s %s %d");
|
||||||
|
snprintf(substream->name, sizeof(substream->name),
|
||||||
|
name_format, umidi->card->shortname, jack_name, number + 1);
|
||||||
|
} else {
|
||||||
|
/* The manufacturer included the iProduct name in the jack
|
||||||
|
* name, do not use both
|
||||||
|
*/
|
||||||
|
strscpy(substream->name, jack_name);
|
||||||
|
}
|
||||||
|
|
||||||
*rsubstream = substream;
|
*rsubstream = substream;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ CONFIG_VFAT_FS=y
|
|||||||
|
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_USB4=y
|
CONFIG_USB4=y
|
||||||
|
CONFIG_I2C=y
|
||||||
|
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
CONFIG_MCTP=y
|
CONFIG_MCTP=y
|
||||||
@ -53,3 +54,4 @@ CONFIG_SOUND=y
|
|||||||
CONFIG_SND=y
|
CONFIG_SND=y
|
||||||
CONFIG_SND_SOC=y
|
CONFIG_SND_SOC=y
|
||||||
CONFIG_SND_SOC_TOPOLOGY_BUILD=y
|
CONFIG_SND_SOC_TOPOLOGY_BUILD=y
|
||||||
|
CONFIG_SND_SOC_CS35L56_I2C=y
|
||||||
|
Loading…
Reference in New Issue
Block a user