sound fixes for 5.15-rc4
It became a slightly large collection of changes, partly because I've been off in the last weeks. Most of changes are small and scattered while a bit big change is found in HD-audio Realtek codec driver; it's a very device-specific fix that has been long wanted, so I decided to pick up although it's in the middle RC. Some highlights: * A new guard ioctl for ALSA rawmidi API to avoid the misuse of the new timestamp framing mode; it's for a regression fix * HD-audio: a revert of the 5.15 change that might work badly, new quirks for Lenovo Legion & co, a follow-up fix for CS8409 * ASoC: lots of SOF-related fixes, fsl component fixes, corrections of mediatek drivers * USB-audio: fix for the PM resume * FireWire: oxfw and motu fixes -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmFS9DcOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+ejg/9FUVIviYT3VJgWiWKwt5pSZbodSXSR4/OI/XC QsVkFfq0WZHuCC3PcYbLCpGYSU10a31J9tIEL5NuyCqaRQtyfylZmccv8BGCQclX Ma9zP7eOZ+Ysmd4MHNKRTtjrMxBXkChJvxTMn7HWfsRra75RmIOcDhU7hEIzZDd2 TNY41gwWCR4ZxeVFwwGa8L6iOiAknN6b3TFTWEb34sY3FqnTxCIti29kDUl2ldkb yNZaPJIyrl9rJZ2gVoRFvcYCkUymnS9u7m/tQW4TDyuITaYynie65217k8v1LPBY ygTT7eQd9UKD+NxQI3z/XJhnJOezB8plLR3AD3GC1mXEWCq7QhD3qQXr64uVeUK4 EnUp03Kdp3kdGK6FylGqWuQJRdaIMNuy+T7DWp+Uaa2jU5XKZggpzMeoQlAHBg3d iial5V5ugSO0qcX0jv+m2Uwgx1kvS/U9Zqsw/oxdCClhwL9JFeaAMcDN5ZwWYF1g 6WQGR3Tv6iZSEV4ELh+h2ZsrjCShPNytWzI23apTf4vIhvpPLJWJSQU2E5cQVAyW 4OlY7qiCsTjrz6R8KzbWTxwqw0vBl/RXXhDFhRY/MBpHIs1aD6Gyxv3DaeSF8tXW /nPZBoU6o0vG155qVhQyf1+1ib7Whx6RJZfnVqdpH9VbWy6y7miss+0g1ZV9Ve6o 4/UPz1Y= =BWpv -----END PGP SIGNATURE----- Merge tag 'sound-5.15-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "This became a slightly large collection of changes, partly because I've been off in the last weeks. Most of changes are small and scattered while a bit big change is found in HD-audio Realtek codec driver; it's a very device-specific fix that has been long wanted, so I decided to pick up although it's in the middle RC. Some highlights: - A new guard ioctl for ALSA rawmidi API to avoid the misuse of the new timestamp framing mode; it's for a regression fix - HD-audio: a revert of the 5.15 change that might work badly, new quirks for Lenovo Legion & co, a follow-up fix for CS8409 - ASoC: lots of SOF-related fixes, fsl component fixes, corrections of mediatek drivers - USB-audio: fix for the PM resume - FireWire: oxfw and motu fixes" * tag 'sound-5.15-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (25 commits) ALSA: pcsp: Make hrtimer forwarding more robust ALSA: rawmidi: introduce SNDRV_RAWMIDI_IOCTL_USER_PVERSION ALSA: firewire-motu: fix truncated bytes in message tracepoints ASoC: SOF: trace: Omit error print when waking up trace sleepers ASoC: mediatek: mt8195: remove wrong fixup assignment on HDMITX ASoC: SOF: loader: Re-phrase the missing firmware error to avoid duplication ASoC: SOF: loader: release_firmware() on load failure to avoid batching ALSA: hda/cs8409: Setup Dolphin Headset Mic as Phantom Jack ALSA: pcxhr: "fix" PCXHR_REG_TO_PORT definition ASoC: SOF: imx: imx8m: Bar index is only valid for IRAM and SRAM types ASoC: SOF: imx: imx8: Bar index is only valid for IRAM and SRAM types ASoC: SOF: Fix DSP oops stack dump output contents ALSA: hda/realtek: Quirks to enable speaker output for Lenovo Legion 7i 15IMHG05, Yoga 7i 14ITL5/15ITL5, and 13s Gen2 laptops. ALSA: usb-audio: Unify mixer resume and reset_resume procedure Revert "ALSA: hda: Drop workaround for a hang at shutdown again" ALSA: oxfw: fix transmission method for Loud models based on OXFW971 ASoC: mediatek: common: handle NULL case in suspend/resume function ASoC: fsl_xcvr: register platform component before registering cpu dai ASoC: fsl_spdif: register platform component before registering cpu dai ASoC: fsl_micfil: register platform component before registering cpu dai ...
This commit is contained in:
commit
02d5e01680
@ -17883,7 +17883,8 @@ M: Olivier Moysan <olivier.moysan@foss.st.com>
|
||||
M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/iio/adc/st,stm32-*.yaml
|
||||
F: Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml
|
||||
F: Documentation/devicetree/bindings/sound/st,stm32-*.yaml
|
||||
F: sound/soc/stm/
|
||||
|
||||
STM32 TIMER/LPTIMER DRIVERS
|
||||
|
@ -98,6 +98,7 @@ struct snd_rawmidi_file {
|
||||
struct snd_rawmidi *rmidi;
|
||||
struct snd_rawmidi_substream *input;
|
||||
struct snd_rawmidi_substream *output;
|
||||
unsigned int user_pversion; /* supported protocol version */
|
||||
};
|
||||
|
||||
struct snd_rawmidi_str {
|
||||
|
@ -784,6 +784,7 @@ struct snd_rawmidi_status {
|
||||
|
||||
#define SNDRV_RAWMIDI_IOCTL_PVERSION _IOR('W', 0x00, int)
|
||||
#define SNDRV_RAWMIDI_IOCTL_INFO _IOR('W', 0x01, struct snd_rawmidi_info)
|
||||
#define SNDRV_RAWMIDI_IOCTL_USER_PVERSION _IOW('W', 0x02, int)
|
||||
#define SNDRV_RAWMIDI_IOCTL_PARAMS _IOWR('W', 0x10, struct snd_rawmidi_params)
|
||||
#define SNDRV_RAWMIDI_IOCTL_STATUS _IOWR('W', 0x20, struct snd_rawmidi_status)
|
||||
#define SNDRV_RAWMIDI_IOCTL_DROP _IOW('W', 0x30, int)
|
||||
|
@ -873,12 +873,21 @@ static long snd_rawmidi_ioctl(struct file *file, unsigned int cmd, unsigned long
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
case SNDRV_RAWMIDI_IOCTL_USER_PVERSION:
|
||||
if (get_user(rfile->user_pversion, (unsigned int __user *)arg))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
|
||||
case SNDRV_RAWMIDI_IOCTL_PARAMS:
|
||||
{
|
||||
struct snd_rawmidi_params params;
|
||||
|
||||
if (copy_from_user(¶ms, argp, sizeof(struct snd_rawmidi_params)))
|
||||
return -EFAULT;
|
||||
if (rfile->user_pversion < SNDRV_PROTOCOL_VERSION(2, 0, 2)) {
|
||||
params.mode = 0;
|
||||
memset(params.reserved, 0, sizeof(params.reserved));
|
||||
}
|
||||
switch (params.stream) {
|
||||
case SNDRV_RAWMIDI_STREAM_OUTPUT:
|
||||
if (rfile->output == NULL)
|
||||
|
@ -143,7 +143,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
|
||||
if (pointer_update)
|
||||
pcsp_pointer_update(chip);
|
||||
|
||||
hrtimer_forward(handle, hrtimer_get_expires(handle), ns_to_ktime(ns));
|
||||
hrtimer_forward_now(handle, ns_to_ktime(ns));
|
||||
|
||||
return HRTIMER_RESTART;
|
||||
}
|
||||
|
@ -276,10 +276,11 @@ static void __maybe_unused copy_message(u64 *frames, __be32 *buffer,
|
||||
|
||||
/* This is just for v2/v3 protocol. */
|
||||
for (i = 0; i < data_blocks; ++i) {
|
||||
*frames = (be32_to_cpu(buffer[1]) << 16) |
|
||||
(be32_to_cpu(buffer[2]) >> 16);
|
||||
*frames = be32_to_cpu(buffer[1]);
|
||||
*frames <<= 16;
|
||||
*frames |= be32_to_cpu(buffer[2]) >> 16;
|
||||
++frames;
|
||||
buffer += data_block_quadlets;
|
||||
frames++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -184,13 +184,16 @@ static int detect_quirks(struct snd_oxfw *oxfw, const struct ieee1394_device_id
|
||||
model = val;
|
||||
}
|
||||
|
||||
/*
|
||||
* Mackie Onyx Satellite with base station has a quirk to report a wrong
|
||||
* value in 'dbs' field of CIP header against its format information.
|
||||
*/
|
||||
if (vendor == VENDOR_LOUD && model == MODEL_SATELLITE)
|
||||
if (vendor == VENDOR_LOUD) {
|
||||
// Mackie Onyx Satellite with base station has a quirk to report a wrong
|
||||
// value in 'dbs' field of CIP header against its format information.
|
||||
oxfw->quirks |= SND_OXFW_QUIRK_WRONG_DBS;
|
||||
|
||||
// OXFW971-based models may transfer events by blocking method.
|
||||
if (!(oxfw->quirks & SND_OXFW_QUIRK_JUMBO_PAYLOAD))
|
||||
oxfw->quirks |= SND_OXFW_QUIRK_BLOCKING_TRANSMISSION;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -883,10 +883,11 @@ static unsigned int azx_get_pos_skl(struct azx *chip, struct azx_dev *azx_dev)
|
||||
return azx_get_pos_posbuf(chip, azx_dev);
|
||||
}
|
||||
|
||||
static void azx_shutdown_chip(struct azx *chip)
|
||||
static void __azx_shutdown_chip(struct azx *chip, bool skip_link_reset)
|
||||
{
|
||||
azx_stop_chip(chip);
|
||||
azx_enter_link_reset(chip);
|
||||
if (!skip_link_reset)
|
||||
azx_enter_link_reset(chip);
|
||||
azx_clear_irq_pending(chip);
|
||||
display_power(chip, false);
|
||||
}
|
||||
@ -895,6 +896,11 @@ static void azx_shutdown_chip(struct azx *chip)
|
||||
static DEFINE_MUTEX(card_list_lock);
|
||||
static LIST_HEAD(card_list);
|
||||
|
||||
static void azx_shutdown_chip(struct azx *chip)
|
||||
{
|
||||
__azx_shutdown_chip(chip, false);
|
||||
}
|
||||
|
||||
static void azx_add_card_list(struct azx *chip)
|
||||
{
|
||||
struct hda_intel *hda = container_of(chip, struct hda_intel, chip);
|
||||
@ -2357,7 +2363,7 @@ static void azx_shutdown(struct pci_dev *pci)
|
||||
return;
|
||||
chip = card->private_data;
|
||||
if (chip && chip->running)
|
||||
azx_shutdown_chip(chip);
|
||||
__azx_shutdown_chip(chip, true);
|
||||
}
|
||||
|
||||
/* PCI IDs */
|
||||
|
@ -1207,6 +1207,9 @@ void dolphin_fixups(struct hda_codec *codec, const struct hda_fixup *fix, int ac
|
||||
snd_hda_jack_add_kctl(codec, DOLPHIN_LO_PIN_NID, "Line Out", true,
|
||||
SND_JACK_HEADPHONE, NULL);
|
||||
|
||||
snd_hda_jack_add_kctl(codec, DOLPHIN_AMIC_PIN_NID, "Microphone", true,
|
||||
SND_JACK_MICROPHONE, NULL);
|
||||
|
||||
cs8409_fix_caps(codec, DOLPHIN_HP_PIN_NID);
|
||||
cs8409_fix_caps(codec, DOLPHIN_LO_PIN_NID);
|
||||
cs8409_fix_caps(codec, DOLPHIN_AMIC_PIN_NID);
|
||||
|
@ -6429,6 +6429,20 @@ static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
|
||||
hda_fixup_thinkpad_acpi(codec, fix, action);
|
||||
}
|
||||
|
||||
/* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
|
||||
static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix,
|
||||
int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
spec->gen.suppress_auto_mute = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* for alc295_fixup_hp_top_speakers */
|
||||
#include "hp_x360_helper.c"
|
||||
|
||||
@ -6646,6 +6660,10 @@ enum {
|
||||
ALC623_FIXUP_LENOVO_THINKSTATION_P340,
|
||||
ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
|
||||
ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
|
||||
ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
|
||||
ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
|
||||
ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
|
||||
ALC287_FIXUP_13S_GEN2_SPEAKERS
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
@ -8236,6 +8254,113 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
|
||||
},
|
||||
[ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
//.v.verbs = legion_15imhg05_coefs,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
// set left speaker Legion 7i.
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
|
||||
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
|
||||
// set right speaker Legion 7i.
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
|
||||
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
{}
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
|
||||
},
|
||||
[ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc287_fixup_legion_15imhg05_speakers,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE,
|
||||
},
|
||||
[ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
// set left speaker Yoga 7i.
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
|
||||
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
|
||||
// set right speaker Yoga 7i.
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
|
||||
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
{}
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE,
|
||||
},
|
||||
[ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
|
||||
{}
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
@ -8630,6 +8755,10 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
|
||||
|
@ -52,7 +52,7 @@
|
||||
#define PCXHR_DSP 2
|
||||
|
||||
#if (PCXHR_DSP_OFFSET_MAX > PCXHR_PLX_OFFSET_MIN)
|
||||
#undef PCXHR_REG_TO_PORT(x)
|
||||
#error PCXHR_REG_TO_PORT(x)
|
||||
#else
|
||||
#define PCXHR_REG_TO_PORT(x) ((x)>PCXHR_DSP_OFFSET_MAX ? PCXHR_PLX : PCXHR_DSP)
|
||||
#endif
|
||||
|
@ -1073,6 +1073,16 @@ static int fsl_esai_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
goto err_pm_get_sync;
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
|
||||
goto err_pm_get_sync;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component,
|
||||
&fsl_esai_dai, 1);
|
||||
if (ret) {
|
||||
@ -1082,12 +1092,6 @@ static int fsl_esai_probe(struct platform_device *pdev)
|
||||
|
||||
INIT_WORK(&esai_priv->work, fsl_esai_hw_reset);
|
||||
|
||||
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
|
||||
goto err_pm_get_sync;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err_pm_get_sync:
|
||||
|
@ -737,18 +737,23 @@ static int fsl_micfil_probe(struct platform_device *pdev)
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
regcache_cache_only(micfil->regmap, true);
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to pcm register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_micfil_component,
|
||||
&fsl_micfil_dai, 1);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register component %s\n",
|
||||
fsl_micfil_component.name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "failed to pcm register\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1152,11 +1152,10 @@ static int fsl_sai_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
goto err_pm_get_sync;
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
|
||||
&sai->cpu_dai_drv, 1);
|
||||
if (ret)
|
||||
goto err_pm_get_sync;
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
if (sai->soc_data->use_imx_pcm) {
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
|
||||
if (ret)
|
||||
@ -1167,6 +1166,11 @@ static int fsl_sai_probe(struct platform_device *pdev)
|
||||
goto err_pm_get_sync;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
|
||||
&sai->cpu_dai_drv, 1);
|
||||
if (ret)
|
||||
goto err_pm_get_sync;
|
||||
|
||||
return ret;
|
||||
|
||||
err_pm_get_sync:
|
||||
|
@ -1434,6 +1434,16 @@ static int fsl_spdif_probe(struct platform_device *pdev)
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
regcache_cache_only(spdif_priv->regmap, true);
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
|
||||
if (ret) {
|
||||
dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n");
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_spdif_component,
|
||||
&spdif_priv->cpu_dai_drv, 1);
|
||||
if (ret) {
|
||||
@ -1441,12 +1451,6 @@ static int fsl_spdif_probe(struct platform_device *pdev)
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
|
||||
if (ret) {
|
||||
dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n");
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err_pm_disable:
|
||||
|
@ -1215,18 +1215,23 @@ static int fsl_xcvr_probe(struct platform_device *pdev)
|
||||
pm_runtime_enable(dev);
|
||||
regcache_cache_only(xcvr->regmap, true);
|
||||
|
||||
/*
|
||||
* Register platform component before registering cpu dai for there
|
||||
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
|
||||
*/
|
||||
ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to pcm register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_component(dev, &fsl_xcvr_comp,
|
||||
&fsl_xcvr_dai, 1);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to register component %s\n",
|
||||
fsl_xcvr_comp.name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0);
|
||||
if (ret)
|
||||
dev_err(dev, "failed to pcm register\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -929,6 +929,11 @@ static int create_sdw_dailink(struct snd_soc_card *card,
|
||||
cpus + *cpu_id, cpu_dai_num,
|
||||
codecs, codec_num,
|
||||
NULL, &sdw_ops);
|
||||
/*
|
||||
* SoundWire DAILINKs use 'stream' functions and Bank Switch operations
|
||||
* based on wait_for_completion(), tag them as 'nonatomic'.
|
||||
*/
|
||||
dai_links[*be_index].nonatomic = true;
|
||||
|
||||
ret = set_codec_init_func(card, link, dai_links + (*be_index)++,
|
||||
playback, group_id);
|
||||
|
@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config SND_SOC_MEDIATEK
|
||||
tristate
|
||||
select REGMAP_MMIO
|
||||
|
||||
config SND_SOC_MT2701
|
||||
tristate "ASoC support for Mediatek MT2701 chip"
|
||||
@ -188,7 +189,9 @@ config SND_SOC_MT8192_MT6359_RT1015_RT5682
|
||||
config SND_SOC_MT8195
|
||||
tristate "ASoC support for Mediatek MT8195 chip"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
depends on COMMON_CLK
|
||||
select SND_SOC_MEDIATEK
|
||||
select MFD_SYSCON if SND_SOC_MT6359
|
||||
help
|
||||
This adds ASoC platform driver support for Mediatek MT8195 chip
|
||||
that can be used with other codecs.
|
||||
|
@ -334,9 +334,11 @@ int mtk_afe_suspend(struct snd_soc_component *component)
|
||||
devm_kcalloc(dev, afe->reg_back_up_list_num,
|
||||
sizeof(unsigned int), GFP_KERNEL);
|
||||
|
||||
for (i = 0; i < afe->reg_back_up_list_num; i++)
|
||||
regmap_read(regmap, afe->reg_back_up_list[i],
|
||||
&afe->reg_back_up[i]);
|
||||
if (afe->reg_back_up) {
|
||||
for (i = 0; i < afe->reg_back_up_list_num; i++)
|
||||
regmap_read(regmap, afe->reg_back_up_list[i],
|
||||
&afe->reg_back_up[i]);
|
||||
}
|
||||
|
||||
afe->suspended = true;
|
||||
afe->runtime_suspend(dev);
|
||||
@ -356,12 +358,13 @@ int mtk_afe_resume(struct snd_soc_component *component)
|
||||
|
||||
afe->runtime_resume(dev);
|
||||
|
||||
if (!afe->reg_back_up)
|
||||
if (!afe->reg_back_up) {
|
||||
dev_dbg(dev, "%s no reg_backup\n", __func__);
|
||||
|
||||
for (i = 0; i < afe->reg_back_up_list_num; i++)
|
||||
mtk_regmap_write(regmap, afe->reg_back_up_list[i],
|
||||
afe->reg_back_up[i]);
|
||||
} else {
|
||||
for (i = 0; i < afe->reg_back_up_list_num; i++)
|
||||
mtk_regmap_write(regmap, afe->reg_back_up_list[i],
|
||||
afe->reg_back_up[i]);
|
||||
}
|
||||
|
||||
afe->suspended = false;
|
||||
return 0;
|
||||
|
@ -424,8 +424,8 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
|
||||
return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
|
||||
}
|
||||
|
||||
static int mt8195_hdmitx_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params)
|
||||
static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params)
|
||||
|
||||
{
|
||||
/* fix BE i2s format to 32bit, clean param mask first */
|
||||
@ -902,7 +902,7 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
|
||||
.no_pcm = 1,
|
||||
.dpcm_playback = 1,
|
||||
.ops = &mt8195_dptx_ops,
|
||||
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup,
|
||||
.be_hw_params_fixup = mt8195_dptx_hw_params_fixup,
|
||||
SND_SOC_DAILINK_REG(DPTX_BE),
|
||||
},
|
||||
[DAI_LINK_ETDM1_IN_BE] = {
|
||||
@ -953,7 +953,6 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
|
||||
SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.dpcm_playback = 1,
|
||||
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup,
|
||||
SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
|
||||
},
|
||||
[DAI_LINK_PCM1_BE] = {
|
||||
|
@ -371,7 +371,6 @@ int snd_sof_device_remove(struct device *dev)
|
||||
dev_warn(dev, "error: %d failed to prepare DSP for device removal",
|
||||
ret);
|
||||
|
||||
snd_sof_fw_unload(sdev);
|
||||
snd_sof_ipc_free(sdev);
|
||||
snd_sof_free_debug(sdev);
|
||||
snd_sof_free_trace(sdev);
|
||||
@ -394,8 +393,7 @@ int snd_sof_device_remove(struct device *dev)
|
||||
snd_sof_remove(sdev);
|
||||
|
||||
/* release firmware */
|
||||
release_firmware(pdata->fw);
|
||||
pdata->fw = NULL;
|
||||
snd_sof_fw_unload(sdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -365,7 +365,14 @@ static int imx8_remove(struct snd_sof_dev *sdev)
|
||||
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
||||
static int imx8_get_bar_index(struct snd_sof_dev *sdev, u32 type)
|
||||
{
|
||||
return type;
|
||||
/* Only IRAM and SRAM bars are valid */
|
||||
switch (type) {
|
||||
case SOF_FW_BLK_TYPE_IRAM:
|
||||
case SOF_FW_BLK_TYPE_SRAM:
|
||||
return type;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static void imx8_ipc_msg_data(struct snd_sof_dev *sdev,
|
||||
|
@ -228,7 +228,14 @@ static int imx8m_remove(struct snd_sof_dev *sdev)
|
||||
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
||||
static int imx8m_get_bar_index(struct snd_sof_dev *sdev, u32 type)
|
||||
{
|
||||
return type;
|
||||
/* Only IRAM and SRAM bars are valid */
|
||||
switch (type) {
|
||||
case SOF_FW_BLK_TYPE_IRAM:
|
||||
case SOF_FW_BLK_TYPE_SRAM:
|
||||
return type;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static void imx8m_ipc_msg_data(struct snd_sof_dev *sdev,
|
||||
|
@ -729,10 +729,10 @@ int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev)
|
||||
ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev);
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev, "error: request firmware %s failed err: %d\n",
|
||||
fw_filename, ret);
|
||||
dev_err(sdev->dev,
|
||||
"you may need to download the firmware from https://github.com/thesofproject/sof-bin/\n");
|
||||
"error: sof firmware file is missing, you might need to\n");
|
||||
dev_err(sdev->dev,
|
||||
" download it from https://github.com/thesofproject/sof-bin/\n");
|
||||
goto err;
|
||||
} else {
|
||||
dev_dbg(sdev->dev, "request_firmware %s successful\n",
|
||||
@ -880,5 +880,7 @@ EXPORT_SYMBOL(snd_sof_run_firmware);
|
||||
void snd_sof_fw_unload(struct snd_sof_dev *sdev)
|
||||
{
|
||||
/* TODO: support module unloading at runtime */
|
||||
release_firmware(sdev->pdata->fw);
|
||||
sdev->pdata->fw = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_sof_fw_unload);
|
||||
|
@ -530,7 +530,6 @@ void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev)
|
||||
return;
|
||||
|
||||
if (sdev->dtrace_is_enabled) {
|
||||
dev_err(sdev->dev, "error: waking up any trace sleepers\n");
|
||||
sdev->dtrace_error = true;
|
||||
wake_up(&sdev->trace_sleep);
|
||||
}
|
||||
|
@ -122,9 +122,9 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
|
||||
* 0x0049fbb0: 8000f2d0 0049fc00 6f6c6c61 00632e63
|
||||
*/
|
||||
for (i = 0; i < stack_words; i += 4) {
|
||||
hex_dump_to_buffer(stack + i * 4, 16, 16, 4,
|
||||
hex_dump_to_buffer(stack + i, 16, 16, 4,
|
||||
buf, sizeof(buf), false);
|
||||
dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i, buf);
|
||||
dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i * 4, buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1054,7 +1054,7 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
|
||||
static int usb_audio_resume(struct usb_interface *intf)
|
||||
{
|
||||
struct snd_usb_audio *chip = usb_get_intfdata(intf);
|
||||
struct snd_usb_stream *as;
|
||||
@ -1080,7 +1080,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
|
||||
* we just notify and restart the mixers
|
||||
*/
|
||||
list_for_each_entry(mixer, &chip->mixer_list, list) {
|
||||
err = snd_usb_mixer_resume(mixer, reset_resume);
|
||||
err = snd_usb_mixer_resume(mixer);
|
||||
if (err < 0)
|
||||
goto err_out;
|
||||
}
|
||||
@ -1100,20 +1100,10 @@ err_out:
|
||||
atomic_dec(&chip->active); /* allow autopm after this point */
|
||||
return err;
|
||||
}
|
||||
|
||||
static int usb_audio_resume(struct usb_interface *intf)
|
||||
{
|
||||
return __usb_audio_resume(intf, false);
|
||||
}
|
||||
|
||||
static int usb_audio_reset_resume(struct usb_interface *intf)
|
||||
{
|
||||
return __usb_audio_resume(intf, true);
|
||||
}
|
||||
#else
|
||||
#define usb_audio_suspend NULL
|
||||
#define usb_audio_resume NULL
|
||||
#define usb_audio_reset_resume NULL
|
||||
#define usb_audio_resume NULL
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static const struct usb_device_id usb_audio_ids [] = {
|
||||
@ -1135,7 +1125,7 @@ static struct usb_driver usb_audio_driver = {
|
||||
.disconnect = usb_audio_disconnect,
|
||||
.suspend = usb_audio_suspend,
|
||||
.resume = usb_audio_resume,
|
||||
.reset_resume = usb_audio_reset_resume,
|
||||
.reset_resume = usb_audio_resume,
|
||||
.id_table = usb_audio_ids,
|
||||
.supports_autosuspend = 1,
|
||||
};
|
||||
|
@ -3653,33 +3653,16 @@ static int restore_mixer_value(struct usb_mixer_elem_list *list)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int default_mixer_reset_resume(struct usb_mixer_elem_list *list)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (list->resume) {
|
||||
err = list->resume(list);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
return restore_mixer_value(list);
|
||||
}
|
||||
|
||||
int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume)
|
||||
int snd_usb_mixer_resume(struct usb_mixer_interface *mixer)
|
||||
{
|
||||
struct usb_mixer_elem_list *list;
|
||||
usb_mixer_elem_resume_func_t f;
|
||||
int id, err;
|
||||
|
||||
/* restore cached mixer values */
|
||||
for (id = 0; id < MAX_ID_ELEMS; id++) {
|
||||
for_each_mixer_elem(list, mixer, id) {
|
||||
if (reset_resume)
|
||||
f = list->reset_resume;
|
||||
else
|
||||
f = list->resume;
|
||||
if (f) {
|
||||
err = f(list);
|
||||
if (list->resume) {
|
||||
err = list->resume(list);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
@ -3700,7 +3683,6 @@ void snd_usb_mixer_elem_init_std(struct usb_mixer_elem_list *list,
|
||||
list->id = unitid;
|
||||
list->dump = snd_usb_mixer_dump_cval;
|
||||
#ifdef CONFIG_PM
|
||||
list->resume = NULL;
|
||||
list->reset_resume = default_mixer_reset_resume;
|
||||
list->resume = restore_mixer_value;
|
||||
#endif
|
||||
}
|
||||
|
@ -70,7 +70,6 @@ struct usb_mixer_elem_list {
|
||||
bool is_std_info;
|
||||
usb_mixer_elem_dump_func_t dump;
|
||||
usb_mixer_elem_resume_func_t resume;
|
||||
usb_mixer_elem_resume_func_t reset_resume;
|
||||
};
|
||||
|
||||
/* iterate over mixer element list of the given unit id */
|
||||
@ -121,7 +120,7 @@ int snd_usb_mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
int snd_usb_mixer_suspend(struct usb_mixer_interface *mixer);
|
||||
int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume);
|
||||
int snd_usb_mixer_resume(struct usb_mixer_interface *mixer);
|
||||
#endif
|
||||
|
||||
int snd_usb_set_cur_mix_value(struct usb_mixer_elem_info *cval, int channel,
|
||||
|
@ -151,7 +151,7 @@ static int add_single_ctl_with_resume(struct usb_mixer_interface *mixer,
|
||||
*listp = list;
|
||||
list->mixer = mixer;
|
||||
list->id = id;
|
||||
list->reset_resume = resume;
|
||||
list->resume = resume;
|
||||
kctl = snd_ctl_new1(knew, list);
|
||||
if (!kctl) {
|
||||
kfree(list);
|
||||
|
Loading…
Reference in New Issue
Block a user