Commit 02d5e016 authored by Linus Torvalds's avatar Linus Torvalds

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
  ...
parents 6e439bbd f2ff7147
...@@ -17883,7 +17883,8 @@ M: Olivier Moysan <olivier.moysan@foss.st.com> ...@@ -17883,7 +17883,8 @@ M: Olivier Moysan <olivier.moysan@foss.st.com>
M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com> M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
S: Maintained 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/ F: sound/soc/stm/
STM32 TIMER/LPTIMER DRIVERS STM32 TIMER/LPTIMER DRIVERS
......
...@@ -98,6 +98,7 @@ struct snd_rawmidi_file { ...@@ -98,6 +98,7 @@ struct snd_rawmidi_file {
struct snd_rawmidi *rmidi; struct snd_rawmidi *rmidi;
struct snd_rawmidi_substream *input; struct snd_rawmidi_substream *input;
struct snd_rawmidi_substream *output; struct snd_rawmidi_substream *output;
unsigned int user_pversion; /* supported protocol version */
}; };
struct snd_rawmidi_str { struct snd_rawmidi_str {
......
...@@ -784,6 +784,7 @@ struct snd_rawmidi_status { ...@@ -784,6 +784,7 @@ struct snd_rawmidi_status {
#define SNDRV_RAWMIDI_IOCTL_PVERSION _IOR('W', 0x00, int) #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_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_PARAMS _IOWR('W', 0x10, struct snd_rawmidi_params)
#define SNDRV_RAWMIDI_IOCTL_STATUS _IOWR('W', 0x20, struct snd_rawmidi_status) #define SNDRV_RAWMIDI_IOCTL_STATUS _IOWR('W', 0x20, struct snd_rawmidi_status)
#define SNDRV_RAWMIDI_IOCTL_DROP _IOW('W', 0x30, int) #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 ...@@ -873,12 +873,21 @@ static long snd_rawmidi_ioctl(struct file *file, unsigned int cmd, unsigned long
return -EINVAL; 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: case SNDRV_RAWMIDI_IOCTL_PARAMS:
{ {
struct snd_rawmidi_params params; struct snd_rawmidi_params params;
if (copy_from_user(&params, argp, sizeof(struct snd_rawmidi_params))) if (copy_from_user(&params, argp, sizeof(struct snd_rawmidi_params)))
return -EFAULT; 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) { switch (params.stream) {
case SNDRV_RAWMIDI_STREAM_OUTPUT: case SNDRV_RAWMIDI_STREAM_OUTPUT:
if (rfile->output == NULL) if (rfile->output == NULL)
......
...@@ -143,7 +143,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) ...@@ -143,7 +143,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
if (pointer_update) if (pointer_update)
pcsp_pointer_update(chip); 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; return HRTIMER_RESTART;
} }
......
...@@ -276,10 +276,11 @@ static void __maybe_unused copy_message(u64 *frames, __be32 *buffer, ...@@ -276,10 +276,11 @@ static void __maybe_unused copy_message(u64 *frames, __be32 *buffer,
/* This is just for v2/v3 protocol. */ /* This is just for v2/v3 protocol. */
for (i = 0; i < data_blocks; ++i) { for (i = 0; i < data_blocks; ++i) {
*frames = (be32_to_cpu(buffer[1]) << 16) | *frames = be32_to_cpu(buffer[1]);
(be32_to_cpu(buffer[2]) >> 16); *frames <<= 16;
*frames |= be32_to_cpu(buffer[2]) >> 16;
++frames;
buffer += data_block_quadlets; buffer += data_block_quadlets;
frames++;
} }
} }
......
...@@ -184,13 +184,16 @@ static int detect_quirks(struct snd_oxfw *oxfw, const struct ieee1394_device_id ...@@ -184,13 +184,16 @@ static int detect_quirks(struct snd_oxfw *oxfw, const struct ieee1394_device_id
model = val; model = val;
} }
/* if (vendor == VENDOR_LOUD) {
* Mackie Onyx Satellite with base station has a quirk to report a wrong // Mackie Onyx Satellite with base station has a quirk to report a wrong
* value in 'dbs' field of CIP header against its format information. // value in 'dbs' field of CIP header against its format information.
*/
if (vendor == VENDOR_LOUD && model == MODEL_SATELLITE)
oxfw->quirks |= SND_OXFW_QUIRK_WRONG_DBS; 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; return 0;
} }
......
...@@ -883,10 +883,11 @@ static unsigned int azx_get_pos_skl(struct azx *chip, struct azx_dev *azx_dev) ...@@ -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); 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_stop_chip(chip);
azx_enter_link_reset(chip); if (!skip_link_reset)
azx_enter_link_reset(chip);
azx_clear_irq_pending(chip); azx_clear_irq_pending(chip);
display_power(chip, false); display_power(chip, false);
} }
...@@ -895,6 +896,11 @@ static void azx_shutdown_chip(struct azx *chip) ...@@ -895,6 +896,11 @@ static void azx_shutdown_chip(struct azx *chip)
static DEFINE_MUTEX(card_list_lock); static DEFINE_MUTEX(card_list_lock);
static LIST_HEAD(card_list); 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) static void azx_add_card_list(struct azx *chip)
{ {
struct hda_intel *hda = container_of(chip, struct hda_intel, chip); struct hda_intel *hda = container_of(chip, struct hda_intel, chip);
...@@ -2357,7 +2363,7 @@ static void azx_shutdown(struct pci_dev *pci) ...@@ -2357,7 +2363,7 @@ static void azx_shutdown(struct pci_dev *pci)
return; return;
chip = card->private_data; chip = card->private_data;
if (chip && chip->running) if (chip && chip->running)
azx_shutdown_chip(chip); __azx_shutdown_chip(chip, true);
} }
/* PCI IDs */ /* PCI IDs */
......
...@@ -1207,6 +1207,9 @@ void dolphin_fixups(struct hda_codec *codec, const struct hda_fixup *fix, int ac ...@@ -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_hda_jack_add_kctl(codec, DOLPHIN_LO_PIN_NID, "Line Out", true,
SND_JACK_HEADPHONE, NULL); 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_HP_PIN_NID);
cs8409_fix_caps(codec, DOLPHIN_LO_PIN_NID); cs8409_fix_caps(codec, DOLPHIN_LO_PIN_NID);
cs8409_fix_caps(codec, DOLPHIN_AMIC_PIN_NID); cs8409_fix_caps(codec, DOLPHIN_AMIC_PIN_NID);
......
...@@ -6429,6 +6429,20 @@ static void alc_fixup_thinkpad_acpi(struct hda_codec *codec, ...@@ -6429,6 +6429,20 @@ static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
hda_fixup_thinkpad_acpi(codec, fix, action); 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 */ /* for alc295_fixup_hp_top_speakers */
#include "hp_x360_helper.c" #include "hp_x360_helper.c"
...@@ -6646,6 +6660,10 @@ enum { ...@@ -6646,6 +6660,10 @@ enum {
ALC623_FIXUP_LENOVO_THINKSTATION_P340, ALC623_FIXUP_LENOVO_THINKSTATION_P340,
ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST, 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[] = { static const struct hda_fixup alc269_fixups[] = {
...@@ -8236,6 +8254,113 @@ static const struct hda_fixup alc269_fixups[] = { ...@@ -8236,6 +8254,113 @@ static const struct hda_fixup alc269_fixups[] = {
.chained = true, .chained = true,
.chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF, .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[] = { static const struct snd_pci_quirk alc269_fixup_tbl[] = {
...@@ -8630,6 +8755,10 @@ 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, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME),
SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF), 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, 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, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI), SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
#define PCXHR_DSP 2 #define PCXHR_DSP 2
#if (PCXHR_DSP_OFFSET_MAX > PCXHR_PLX_OFFSET_MIN) #if (PCXHR_DSP_OFFSET_MAX > PCXHR_PLX_OFFSET_MIN)
#undef PCXHR_REG_TO_PORT(x) #error PCXHR_REG_TO_PORT(x)
#else #else
#define PCXHR_REG_TO_PORT(x) ((x)>PCXHR_DSP_OFFSET_MAX ? PCXHR_PLX : PCXHR_DSP) #define PCXHR_REG_TO_PORT(x) ((x)>PCXHR_DSP_OFFSET_MAX ? PCXHR_PLX : PCXHR_DSP)
#endif #endif
......
...@@ -1073,6 +1073,16 @@ static int fsl_esai_probe(struct platform_device *pdev) ...@@ -1073,6 +1073,16 @@ static int fsl_esai_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto err_pm_get_sync; 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, ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component,
&fsl_esai_dai, 1); &fsl_esai_dai, 1);
if (ret) { if (ret) {
...@@ -1082,12 +1092,6 @@ static int fsl_esai_probe(struct platform_device *pdev) ...@@ -1082,12 +1092,6 @@ static int fsl_esai_probe(struct platform_device *pdev)
INIT_WORK(&esai_priv->work, fsl_esai_hw_reset); 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; return ret;
err_pm_get_sync: err_pm_get_sync:
......
...@@ -737,18 +737,23 @@ static int fsl_micfil_probe(struct platform_device *pdev) ...@@ -737,18 +737,23 @@ static int fsl_micfil_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
regcache_cache_only(micfil->regmap, true); 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, ret = devm_snd_soc_register_component(&pdev->dev, &fsl_micfil_component,
&fsl_micfil_dai, 1); &fsl_micfil_dai, 1);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register component %s\n", dev_err(&pdev->dev, "failed to register component %s\n",
fsl_micfil_component.name); 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; return ret;
} }
......
...@@ -1152,11 +1152,10 @@ static int fsl_sai_probe(struct platform_device *pdev) ...@@ -1152,11 +1152,10 @@ static int fsl_sai_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto err_pm_get_sync; goto err_pm_get_sync;
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, /*
&sai->cpu_dai_drv, 1); * Register platform component before registering cpu dai for there
if (ret) * is not defer probe for platform component in snd_soc_add_pcm_runtime().
goto err_pm_get_sync; */
if (sai->soc_data->use_imx_pcm) { if (sai->soc_data->use_imx_pcm) {
ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE); ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
if (ret) if (ret)
...@@ -1167,6 +1166,11 @@ static int fsl_sai_probe(struct platform_device *pdev) ...@@ -1167,6 +1166,11 @@ static int fsl_sai_probe(struct platform_device *pdev)
goto err_pm_get_sync; 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; return ret;
err_pm_get_sync: err_pm_get_sync:
......
...@@ -1434,16 +1434,20 @@ static int fsl_spdif_probe(struct platform_device *pdev) ...@@ -1434,16 +1434,20 @@ static int fsl_spdif_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
regcache_cache_only(spdif_priv->regmap, true); regcache_cache_only(spdif_priv->regmap, true);
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_spdif_component, /*
&spdif_priv->cpu_dai_drv, 1); * 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) { if (ret) {
dev_err(&pdev->dev, "failed to register DAI: %d\n", ret); dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n");
goto err_pm_disable; goto err_pm_disable;
} }
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE); ret = devm_snd_soc_register_component(&pdev->dev, &fsl_spdif_component,
&spdif_priv->cpu_dai_drv, 1);
if (ret) { if (ret) {
dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n"); dev_err(&pdev->dev, "failed to register DAI: %d\n", ret);
goto err_pm_disable; goto err_pm_disable;
} }
......
...@@ -1215,18 +1215,23 @@ static int fsl_xcvr_probe(struct platform_device *pdev) ...@@ -1215,18 +1215,23 @@ static int fsl_xcvr_probe(struct platform_device *pdev)
pm_runtime_enable(dev); pm_runtime_enable(dev);
regcache_cache_only(xcvr->regmap, true); 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, ret = devm_snd_soc_register_component(dev, &fsl_xcvr_comp,
&fsl_xcvr_dai, 1); &fsl_xcvr_dai, 1);
if (ret) { if (ret) {
dev_err(dev, "failed to register component %s\n", dev_err(dev, "failed to register component %s\n",
fsl_xcvr_comp.name); 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; return ret;
} }
......
...@@ -929,6 +929,11 @@ static int create_sdw_dailink(struct snd_soc_card *card, ...@@ -929,6 +929,11 @@ static int create_sdw_dailink(struct snd_soc_card *card,
cpus + *cpu_id, cpu_dai_num, cpus + *cpu_id, cpu_dai_num,
codecs, codec_num, codecs, codec_num,
NULL, &sdw_ops); 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)++, ret = set_codec_init_func(card, link, dai_links + (*be_index)++,
playback, group_id); playback, group_id);
......
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
config SND_SOC_MEDIATEK config SND_SOC_MEDIATEK
tristate tristate
select REGMAP_MMIO
config SND_SOC_MT2701 config SND_SOC_MT2701
tristate "ASoC support for Mediatek MT2701 chip" tristate "ASoC support for Mediatek MT2701 chip"
...@@ -188,7 +189,9 @@ config SND_SOC_MT8192_MT6359_RT1015_RT5682 ...@@ -188,7 +189,9 @@ config SND_SOC_MT8192_MT6359_RT1015_RT5682
config SND_SOC_MT8195 config SND_SOC_MT8195
tristate "ASoC support for Mediatek MT8195 chip" tristate "ASoC support for Mediatek MT8195 chip"
depends on ARCH_MEDIATEK || COMPILE_TEST depends on ARCH_MEDIATEK || COMPILE_TEST
depends on COMMON_CLK
select SND_SOC_MEDIATEK select SND_SOC_MEDIATEK
select MFD_SYSCON if SND_SOC_MT6359
help help
This adds ASoC platform driver support for Mediatek MT8195 chip This adds ASoC platform driver support for Mediatek MT8195 chip
that can be used with other codecs. that can be used with other codecs.
......
...@@ -334,9 +334,11 @@ int mtk_afe_suspend(struct snd_soc_component *component) ...@@ -334,9 +334,11 @@ int mtk_afe_suspend(struct snd_soc_component *component)
devm_kcalloc(dev, afe->reg_back_up_list_num, devm_kcalloc(dev, afe->reg_back_up_list_num,
sizeof(unsigned int), GFP_KERNEL); sizeof(unsigned int), GFP_KERNEL);
for (i = 0; i < afe->reg_back_up_list_num; i++) if (afe->reg_back_up) {
regmap_read(regmap, afe->reg_back_up_list[i], for (i = 0; i < afe->reg_back_up_list_num; i++)
&afe->reg_back_up[i]); regmap_read(regmap, afe->reg_back_up_list[i],
&afe->reg_back_up[i]);
}
afe->suspended = true; afe->suspended = true;
afe->runtime_suspend(dev); afe->runtime_suspend(dev);
...@@ -356,12 +358,13 @@ int mtk_afe_resume(struct snd_soc_component *component) ...@@ -356,12 +358,13 @@ int mtk_afe_resume(struct snd_soc_component *component)
afe->runtime_resume(dev); afe->runtime_resume(dev);
if (!afe->reg_back_up) if (!afe->reg_back_up) {
dev_dbg(dev, "%s no reg_backup\n", __func__); dev_dbg(dev, "%s no reg_backup\n", __func__);
} else {
for (i = 0; i < afe->reg_back_up_list_num; i++) for (i = 0; i < afe->reg_back_up_list_num; i++)
mtk_regmap_write(regmap, afe->reg_back_up_list[i], mtk_regmap_write(regmap, afe->reg_back_up_list[i],
afe->reg_back_up[i]); afe->reg_back_up[i]);
}
afe->suspended = false; afe->suspended = false;
return 0; return 0;
......
...@@ -424,8 +424,8 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd) ...@@ -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); 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, static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params) struct snd_pcm_hw_params *params)
{ {
/* fix BE i2s format to 32bit, clean param mask first */ /* 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[] = { ...@@ -902,7 +902,7 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
.no_pcm = 1, .no_pcm = 1,
.dpcm_playback = 1, .dpcm_playback = 1,
.ops = &mt8195_dptx_ops, .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), SND_SOC_DAILINK_REG(DPTX_BE),
}, },
[DAI_LINK_ETDM1_IN_BE] = { [DAI_LINK_ETDM1_IN_BE] = {
...@@ -953,7 +953,6 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = { ...@@ -953,7 +953,6 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS, SND_SOC_DAIFMT_CBS_CFS,
.dpcm_playback = 1, .dpcm_playback = 1,
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup,
SND_SOC_DAILINK_REG(ETDM3_OUT_BE), SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
}, },
[DAI_LINK_PCM1_BE] = { [DAI_LINK_PCM1_BE] = {
......
...@@ -371,7 +371,6 @@ int snd_sof_device_remove(struct device *dev) ...@@ -371,7 +371,6 @@ int snd_sof_device_remove(struct device *dev)
dev_warn(dev, "error: %d failed to prepare DSP for device removal", dev_warn(dev, "error: %d failed to prepare DSP for device removal",
ret); ret);
snd_sof_fw_unload(sdev);
snd_sof_ipc_free(sdev); snd_sof_ipc_free(sdev);
snd_sof_free_debug(sdev); snd_sof_free_debug(sdev);
snd_sof_free_trace(sdev); snd_sof_free_trace(sdev);
...@@ -394,8 +393,7 @@ int snd_sof_device_remove(struct device *dev) ...@@ -394,8 +393,7 @@ int snd_sof_device_remove(struct device *dev)
snd_sof_remove(sdev); snd_sof_remove(sdev);
/* release firmware */ /* release firmware */
release_firmware(pdata->fw); snd_sof_fw_unload(sdev);
pdata->fw = NULL;
return 0; return 0;
} }
......
...@@ -365,7 +365,14 @@ static int imx8_remove(struct snd_sof_dev *sdev) ...@@ -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 */ /* 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) 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, static void imx8_ipc_msg_data(struct snd_sof_dev *sdev,
......
...@@ -228,7 +228,14 @@ static int imx8m_remove(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 */ /* 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) 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, 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) ...@@ -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); ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev);
if (ret < 0) { if (ret < 0) {
dev_err(sdev->dev, "error: request firmware %s failed err: %d\n",
fw_filename, ret);
dev_err(sdev->dev, 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; goto err;
} else { } else {
dev_dbg(sdev->dev, "request_firmware %s successful\n", dev_dbg(sdev->dev, "request_firmware %s successful\n",
...@@ -880,5 +880,7 @@ EXPORT_SYMBOL(snd_sof_run_firmware); ...@@ -880,5 +880,7 @@ EXPORT_SYMBOL(snd_sof_run_firmware);
void snd_sof_fw_unload(struct snd_sof_dev *sdev) void snd_sof_fw_unload(struct snd_sof_dev *sdev)
{ {
/* TODO: support module unloading at runtime */ /* TODO: support module unloading at runtime */
release_firmware(sdev->pdata->fw);
sdev->pdata->fw = NULL;
} }
EXPORT_SYMBOL(snd_sof_fw_unload); EXPORT_SYMBOL(snd_sof_fw_unload);
...@@ -530,7 +530,6 @@ void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev) ...@@ -530,7 +530,6 @@ void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev)
return; return;
if (sdev->dtrace_is_enabled) { if (sdev->dtrace_is_enabled) {
dev_err(sdev->dev, "error: waking up any trace sleepers\n");
sdev->dtrace_error = true; sdev->dtrace_error = true;
wake_up(&sdev->trace_sleep); wake_up(&sdev->trace_sleep);
} }
......
...@@ -122,9 +122,9 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack, ...@@ -122,9 +122,9 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
* 0x0049fbb0: 8000f2d0 0049fc00 6f6c6c61 00632e63 * 0x0049fbb0: 8000f2d0 0049fc00 6f6c6c61 00632e63
*/ */
for (i = 0; i < stack_words; i += 4) { 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); 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) ...@@ -1054,7 +1054,7 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
return 0; 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_audio *chip = usb_get_intfdata(intf);
struct snd_usb_stream *as; struct snd_usb_stream *as;
...@@ -1080,7 +1080,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume) ...@@ -1080,7 +1080,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
* we just notify and restart the mixers * we just notify and restart the mixers
*/ */
list_for_each_entry(mixer, &chip->mixer_list, list) { 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) if (err < 0)
goto err_out; goto err_out;
} }
...@@ -1100,20 +1100,10 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume) ...@@ -1100,20 +1100,10 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
atomic_dec(&chip->active); /* allow autopm after this point */ atomic_dec(&chip->active); /* allow autopm after this point */
return err; 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 #else
#define usb_audio_suspend NULL #define usb_audio_suspend NULL
#define usb_audio_resume NULL #define usb_audio_resume NULL
#define usb_audio_reset_resume NULL #define usb_audio_resume NULL
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
static const struct usb_device_id usb_audio_ids [] = { static const struct usb_device_id usb_audio_ids [] = {
...@@ -1135,7 +1125,7 @@ static struct usb_driver usb_audio_driver = { ...@@ -1135,7 +1125,7 @@ static struct usb_driver usb_audio_driver = {
.disconnect = usb_audio_disconnect, .disconnect = usb_audio_disconnect,
.suspend = usb_audio_suspend, .suspend = usb_audio_suspend,
.resume = usb_audio_resume, .resume = usb_audio_resume,
.reset_resume = usb_audio_reset_resume, .reset_resume = usb_audio_resume,
.id_table = usb_audio_ids, .id_table = usb_audio_ids,
.supports_autosuspend = 1, .supports_autosuspend = 1,
}; };
......
...@@ -3653,33 +3653,16 @@ static int restore_mixer_value(struct usb_mixer_elem_list *list) ...@@ -3653,33 +3653,16 @@ static int restore_mixer_value(struct usb_mixer_elem_list *list)
return 0; return 0;
} }
static int default_mixer_reset_resume(struct usb_mixer_elem_list *list) int snd_usb_mixer_resume(struct usb_mixer_interface *mixer)
{
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)
{ {
struct usb_mixer_elem_list *list; struct usb_mixer_elem_list *list;
usb_mixer_elem_resume_func_t f;
int id, err; int id, err;
/* restore cached mixer values */ /* restore cached mixer values */
for (id = 0; id < MAX_ID_ELEMS; id++) { for (id = 0; id < MAX_ID_ELEMS; id++) {
for_each_mixer_elem(list, mixer, id) { for_each_mixer_elem(list, mixer, id) {
if (reset_resume) if (list->resume) {
f = list->reset_resume; err = list->resume(list);
else
f = list->resume;
if (f) {
err = f(list);
if (err < 0) if (err < 0)
return err; return err;
} }
...@@ -3700,7 +3683,6 @@ void snd_usb_mixer_elem_init_std(struct usb_mixer_elem_list *list, ...@@ -3700,7 +3683,6 @@ void snd_usb_mixer_elem_init_std(struct usb_mixer_elem_list *list,
list->id = unitid; list->id = unitid;
list->dump = snd_usb_mixer_dump_cval; list->dump = snd_usb_mixer_dump_cval;
#ifdef CONFIG_PM #ifdef CONFIG_PM
list->resume = NULL; list->resume = restore_mixer_value;
list->reset_resume = default_mixer_reset_resume;
#endif #endif
} }
...@@ -70,7 +70,6 @@ struct usb_mixer_elem_list { ...@@ -70,7 +70,6 @@ struct usb_mixer_elem_list {
bool is_std_info; bool is_std_info;
usb_mixer_elem_dump_func_t dump; usb_mixer_elem_dump_func_t dump;
usb_mixer_elem_resume_func_t resume; 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 */ /* 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, ...@@ -121,7 +120,7 @@ int snd_usb_mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
#ifdef CONFIG_PM #ifdef CONFIG_PM
int snd_usb_mixer_suspend(struct usb_mixer_interface *mixer); 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 #endif
int snd_usb_set_cur_mix_value(struct usb_mixer_elem_info *cval, int channel, 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, ...@@ -151,7 +151,7 @@ static int add_single_ctl_with_resume(struct usb_mixer_interface *mixer,
*listp = list; *listp = list;
list->mixer = mixer; list->mixer = mixer;
list->id = id; list->id = id;
list->reset_resume = resume; list->resume = resume;
kctl = snd_ctl_new1(knew, list); kctl = snd_ctl_new1(knew, list);
if (!kctl) { if (!kctl) {
kfree(list); kfree(list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment