提交 d8ed516f 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  ALSA: hda - add quirk for Ordissimo EVE using a realtek ALC662
  ALSA: hrtimer: remove superfluous tasklet invocation
  ALSA: hrtimer: handle delayed timer interrupts
  ALSA: HDA: Add subwoofer quirk for Acer Aspire 8942G
  ALSA: hda - Don't handle empty patch files
  ALSA: hda - Fix missing CA initialization for HDMI/DP
  ALSA: usbaudio - Enable the E-MU 0204 USB
  ALSA: hda - switch lfe with side in mixer for 4930g
  ASoC: Improve WM8994 digital power sequencing
  ASoC: Create an AIF1ADCDAT signal widget to match AIF2
  asoc: davinci: da830/omap-l137: correct cpu_dai_name
  ASoC: fill in snd_soc_pcm_runtime.card before calling snd_soc_dai_link.init()
...@@ -45,12 +45,13 @@ static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt) ...@@ -45,12 +45,13 @@ static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt)
{ {
struct snd_hrtimer *stime = container_of(hrt, struct snd_hrtimer, hrt); struct snd_hrtimer *stime = container_of(hrt, struct snd_hrtimer, hrt);
struct snd_timer *t = stime->timer; struct snd_timer *t = stime->timer;
unsigned long oruns;
if (!atomic_read(&stime->running)) if (!atomic_read(&stime->running))
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
hrtimer_forward_now(hrt, ns_to_ktime(t->sticks * resolution)); oruns = hrtimer_forward_now(hrt, ns_to_ktime(t->sticks * resolution));
snd_timer_interrupt(stime->timer, t->sticks); snd_timer_interrupt(stime->timer, t->sticks * oruns);
if (!atomic_read(&stime->running)) if (!atomic_read(&stime->running))
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
...@@ -104,7 +105,7 @@ static int snd_hrtimer_stop(struct snd_timer *t) ...@@ -104,7 +105,7 @@ static int snd_hrtimer_stop(struct snd_timer *t)
} }
static struct snd_timer_hardware hrtimer_hw = { static struct snd_timer_hardware hrtimer_hw = {
.flags = SNDRV_TIMER_HW_AUTO, .flags = SNDRV_TIMER_HW_AUTO | SNDRV_TIMER_HW_TASKLET,
.open = snd_hrtimer_open, .open = snd_hrtimer_open,
.close = snd_hrtimer_close, .close = snd_hrtimer_close,
.start = snd_hrtimer_start, .start = snd_hrtimer_start,
......
...@@ -2703,7 +2703,7 @@ static int __devinit azx_probe(struct pci_dev *pci, ...@@ -2703,7 +2703,7 @@ static int __devinit azx_probe(struct pci_dev *pci,
if (err < 0) if (err < 0)
goto out_free; goto out_free;
#ifdef CONFIG_SND_HDA_PATCH_LOADER #ifdef CONFIG_SND_HDA_PATCH_LOADER
if (patch[dev]) { if (patch[dev] && *patch[dev]) {
snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n", snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n",
patch[dev]); patch[dev]);
err = snd_hda_load_patch(chip->bus, patch[dev]); err = snd_hda_load_patch(chip->bus, patch[dev]);
......
...@@ -642,6 +642,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, ...@@ -642,6 +642,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
hdmi_ai->ver = 0x01; hdmi_ai->ver = 0x01;
hdmi_ai->len = 0x0a; hdmi_ai->len = 0x0a;
hdmi_ai->CC02_CT47 = channels - 1; hdmi_ai->CC02_CT47 = channels - 1;
hdmi_ai->CA = ca;
hdmi_checksum_audio_infoframe(hdmi_ai); hdmi_checksum_audio_infoframe(hdmi_ai);
} else if (spec->sink_eld[i].conn_type == 1) { /* DisplayPort */ } else if (spec->sink_eld[i].conn_type == 1) { /* DisplayPort */
struct dp_audio_infoframe *dp_ai; struct dp_audio_infoframe *dp_ai;
...@@ -651,6 +652,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, ...@@ -651,6 +652,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
dp_ai->len = 0x1b; dp_ai->len = 0x1b;
dp_ai->ver = 0x11 << 2; dp_ai->ver = 0x11 << 2;
dp_ai->CC02_CT47 = channels - 1; dp_ai->CC02_CT47 = channels - 1;
dp_ai->CA = ca;
} else { } else {
snd_printd("HDMI: unknown connection type at pin %d\n", snd_printd("HDMI: unknown connection type at pin %d\n",
pin_nid); pin_nid);
......
...@@ -2290,6 +2290,29 @@ static struct snd_kcontrol_new alc888_base_mixer[] = { ...@@ -2290,6 +2290,29 @@ static struct snd_kcontrol_new alc888_base_mixer[] = {
{ } /* end */ { } /* end */
}; };
static struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = {
HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0f, 2, 0x0,
HDA_OUTPUT),
HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0f, 2, 2, HDA_INPUT),
HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0f, 1, 0x0, HDA_OUTPUT),
HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0f, 1, 2, HDA_INPUT),
HDA_CODEC_VOLUME("Side Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
HDA_BIND_MUTE("Side Playback Switch", 0x0e, 2, HDA_INPUT),
HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
{ } /* end */
};
static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = { static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
...@@ -10359,7 +10382,7 @@ static struct alc_config_preset alc882_presets[] = { ...@@ -10359,7 +10382,7 @@ static struct alc_config_preset alc882_presets[] = {
.init_hook = alc_automute_amp, .init_hook = alc_automute_amp,
}, },
[ALC888_ACER_ASPIRE_4930G] = { [ALC888_ACER_ASPIRE_4930G] = {
.mixers = { alc888_base_mixer, .mixers = { alc888_acer_aspire_4930g_mixer,
alc883_chmode_mixer }, alc883_chmode_mixer },
.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
alc888_acer_aspire_4930g_verbs }, alc888_acer_aspire_4930g_verbs },
...@@ -18802,6 +18825,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { ...@@ -18802,6 +18825,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
ALC662_3ST_6ch_DIG), ALC662_3ST_6ch_DIG),
SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
ALC663_ASUS_H13), ALC663_ASUS_H13),
SND_PCI_QUIRK(0x1991, 0x5628, "Ordissimo EVE", ALC662_LENOVO_101E),
{} {}
}; };
...@@ -19494,6 +19518,7 @@ static const struct alc_fixup alc662_fixups[] = { ...@@ -19494,6 +19518,7 @@ static const struct alc_fixup alc662_fixups[] = {
}; };
static struct snd_pci_quirk alc662_fixup_tbl[] = { static struct snd_pci_quirk alc662_fixup_tbl[] = {
SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
......
...@@ -1287,9 +1287,9 @@ SND_SOC_DAPM_SUPPLY("DSPINTCLK", WM8994_CLOCKING_1, 1, 0, NULL, 0), ...@@ -1287,9 +1287,9 @@ SND_SOC_DAPM_SUPPLY("DSPINTCLK", WM8994_CLOCKING_1, 1, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("AIF1CLK", WM8994_AIF1_CLOCKING_1, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("AIF1CLK", WM8994_AIF1_CLOCKING_1, 0, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("AIF2CLK", WM8994_AIF2_CLOCKING_1, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("AIF2CLK", WM8994_AIF2_CLOCKING_1, 0, 0, NULL, 0),
SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", "AIF1 Capture", SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", NULL,
0, WM8994_POWER_MANAGEMENT_4, 9, 0), 0, WM8994_POWER_MANAGEMENT_4, 9, 0),
SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", "AIF1 Capture", SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", NULL,
0, WM8994_POWER_MANAGEMENT_4, 8, 0), 0, WM8994_POWER_MANAGEMENT_4, 8, 0),
SND_SOC_DAPM_AIF_IN_E("AIF1DAC1L", NULL, 0, SND_SOC_DAPM_AIF_IN_E("AIF1DAC1L", NULL, 0,
WM8994_POWER_MANAGEMENT_5, 9, 0, wm8958_aif_ev, WM8994_POWER_MANAGEMENT_5, 9, 0, wm8958_aif_ev,
...@@ -1298,9 +1298,9 @@ SND_SOC_DAPM_AIF_IN_E("AIF1DAC1R", NULL, 0, ...@@ -1298,9 +1298,9 @@ SND_SOC_DAPM_AIF_IN_E("AIF1DAC1R", NULL, 0,
WM8994_POWER_MANAGEMENT_5, 8, 0, wm8958_aif_ev, WM8994_POWER_MANAGEMENT_5, 8, 0, wm8958_aif_ev,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", "AIF1 Capture", SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", NULL,
0, WM8994_POWER_MANAGEMENT_4, 11, 0), 0, WM8994_POWER_MANAGEMENT_4, 11, 0),
SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", "AIF1 Capture", SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", NULL,
0, WM8994_POWER_MANAGEMENT_4, 10, 0), 0, WM8994_POWER_MANAGEMENT_4, 10, 0),
SND_SOC_DAPM_AIF_IN_E("AIF1DAC2L", NULL, 0, SND_SOC_DAPM_AIF_IN_E("AIF1DAC2L", NULL, 0,
WM8994_POWER_MANAGEMENT_5, 11, 0, wm8958_aif_ev, WM8994_POWER_MANAGEMENT_5, 11, 0, wm8958_aif_ev,
...@@ -1345,6 +1345,7 @@ SND_SOC_DAPM_AIF_IN_E("AIF2DACR", NULL, 0, ...@@ -1345,6 +1345,7 @@ SND_SOC_DAPM_AIF_IN_E("AIF2DACR", NULL, 0,
SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("AIF1ADCDAT", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("AIF2ADCDAT", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_AIF_OUT("AIF2ADCDAT", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_MUX("AIF1DAC Mux", SND_SOC_NOPM, 0, 0, &aif1dac_mux), SND_SOC_DAPM_MUX("AIF1DAC Mux", SND_SOC_NOPM, 0, 0, &aif1dac_mux),
...@@ -1546,6 +1547,11 @@ static const struct snd_soc_dapm_route intercon[] = { ...@@ -1546,6 +1547,11 @@ static const struct snd_soc_dapm_route intercon[] = {
{ "AIF2DAC2R Mixer", "Left Sidetone Switch", "Left Sidetone" }, { "AIF2DAC2R Mixer", "Left Sidetone Switch", "Left Sidetone" },
{ "AIF2DAC2R Mixer", "Right Sidetone Switch", "Right Sidetone" }, { "AIF2DAC2R Mixer", "Right Sidetone Switch", "Right Sidetone" },
{ "AIF1ADCDAT", NULL, "AIF1ADC1L" },
{ "AIF1ADCDAT", NULL, "AIF1ADC1R" },
{ "AIF1ADCDAT", NULL, "AIF1ADC2L" },
{ "AIF1ADCDAT", NULL, "AIF1ADC2R" },
{ "AIF2ADCDAT", NULL, "AIF2ADC Mux" }, { "AIF2ADCDAT", NULL, "AIF2ADC Mux" },
/* AIF3 output */ /* AIF3 output */
...@@ -1578,6 +1584,13 @@ static const struct snd_soc_dapm_route intercon[] = { ...@@ -1578,6 +1584,13 @@ static const struct snd_soc_dapm_route intercon[] = {
{ "Right Headphone Mux", "DAC", "DAC1R" }, { "Right Headphone Mux", "DAC", "DAC1R" },
}; };
static const struct snd_soc_dapm_route wm8994_revd_intercon[] = {
{ "AIF1DACDAT", NULL, "AIF2DACDAT" },
{ "AIF2DACDAT", NULL, "AIF1DACDAT" },
{ "AIF1ADCDAT", NULL, "AIF2ADCDAT" },
{ "AIF2ADCDAT", NULL, "AIF1ADCDAT" },
};
static const struct snd_soc_dapm_route wm8994_intercon[] = { static const struct snd_soc_dapm_route wm8994_intercon[] = {
{ "AIF2DACL", NULL, "AIF2DAC Mux" }, { "AIF2DACL", NULL, "AIF2DAC Mux" },
{ "AIF2DACR", NULL, "AIF2DAC Mux" }, { "AIF2DACR", NULL, "AIF2DAC Mux" },
...@@ -3129,6 +3142,11 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec) ...@@ -3129,6 +3142,11 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
case WM8994: case WM8994:
snd_soc_dapm_add_routes(dapm, wm8994_intercon, snd_soc_dapm_add_routes(dapm, wm8994_intercon,
ARRAY_SIZE(wm8994_intercon)); ARRAY_SIZE(wm8994_intercon));
if (wm8994->revision < 4)
snd_soc_dapm_add_routes(dapm, wm8994_revd_intercon,
ARRAY_SIZE(wm8994_revd_intercon));
break; break;
case WM8958: case WM8958:
snd_soc_dapm_add_routes(dapm, wm8958_intercon, snd_soc_dapm_add_routes(dapm, wm8958_intercon,
......
...@@ -218,7 +218,19 @@ static struct snd_soc_dai_link dm6467_evm_dai[] = { ...@@ -218,7 +218,19 @@ static struct snd_soc_dai_link dm6467_evm_dai[] = {
.ops = &evm_spdif_ops, .ops = &evm_spdif_ops,
}, },
}; };
static struct snd_soc_dai_link da8xx_evm_dai = {
static struct snd_soc_dai_link da830_evm_dai = {
.name = "TLV320AIC3X",
.stream_name = "AIC3X",
.cpu_dai_name = "davinci-mcasp.1",
.codec_dai_name = "tlv320aic3x-hifi",
.codec_name = "tlv320aic3x-codec.1-0018",
.platform_name = "davinci-pcm-audio",
.init = evm_aic3x_init,
.ops = &evm_ops,
};
static struct snd_soc_dai_link da850_evm_dai = {
.name = "TLV320AIC3X", .name = "TLV320AIC3X",
.stream_name = "AIC3X", .stream_name = "AIC3X",
.cpu_dai_name= "davinci-mcasp.0", .cpu_dai_name= "davinci-mcasp.0",
...@@ -259,13 +271,13 @@ static struct snd_soc_card dm6467_snd_soc_card_evm = { ...@@ -259,13 +271,13 @@ static struct snd_soc_card dm6467_snd_soc_card_evm = {
static struct snd_soc_card da830_snd_soc_card = { static struct snd_soc_card da830_snd_soc_card = {
.name = "DA830/OMAP-L137 EVM", .name = "DA830/OMAP-L137 EVM",
.dai_link = &da8xx_evm_dai, .dai_link = &da830_evm_dai,
.num_links = 1, .num_links = 1,
}; };
static struct snd_soc_card da850_snd_soc_card = { static struct snd_soc_card da850_snd_soc_card = {
.name = "DA850/OMAP-L138 EVM", .name = "DA850/OMAP-L138 EVM",
.dai_link = &da8xx_evm_dai, .dai_link = &da850_evm_dai,
.num_links = 1, .num_links = 1,
}; };
......
...@@ -1449,6 +1449,7 @@ static int soc_post_component_init(struct snd_soc_card *card, ...@@ -1449,6 +1449,7 @@ static int soc_post_component_init(struct snd_soc_card *card,
rtd = &card->rtd_aux[num]; rtd = &card->rtd_aux[num];
name = aux_dev->name; name = aux_dev->name;
} }
rtd->card = card;
/* machine controls, routes and widgets are not prefixed */ /* machine controls, routes and widgets are not prefixed */
temp = codec->name_prefix; temp = codec->name_prefix;
...@@ -1471,7 +1472,6 @@ static int soc_post_component_init(struct snd_soc_card *card, ...@@ -1471,7 +1472,6 @@ static int soc_post_component_init(struct snd_soc_card *card,
/* register the rtd device */ /* register the rtd device */
rtd->codec = codec; rtd->codec = codec;
rtd->card = card;
rtd->dev.parent = card->dev; rtd->dev.parent = card->dev;
rtd->dev.release = rtd_release; rtd->dev.release = rtd_release;
rtd->dev.init_name = name; rtd->dev.init_name = name;
......
...@@ -95,7 +95,7 @@ enum { ...@@ -95,7 +95,7 @@ enum {
}; };
/*E-mu 0202(0404) eXtension Unit(XU) control*/ /*E-mu 0202/0404/0204 eXtension Unit(XU) control*/
enum { enum {
USB_XU_CLOCK_RATE = 0xe301, USB_XU_CLOCK_RATE = 0xe301,
USB_XU_CLOCK_SOURCE = 0xe302, USB_XU_CLOCK_SOURCE = 0xe302,
...@@ -1566,7 +1566,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, void *raw ...@@ -1566,7 +1566,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, void *raw
cval->initialized = 1; cval->initialized = 1;
} else { } else {
if (type == USB_XU_CLOCK_RATE) { if (type == USB_XU_CLOCK_RATE) {
/* E-Mu USB 0404/0202/TrackerPre /* E-Mu USB 0404/0202/TrackerPre/0204
* samplerate control quirk * samplerate control quirk
*/ */
cval->min = 0; cval->min = 0;
......
...@@ -79,6 +79,13 @@ ...@@ -79,6 +79,13 @@
.idProduct = 0x3f0a, .idProduct = 0x3f0a,
.bInterfaceClass = USB_CLASS_AUDIO, .bInterfaceClass = USB_CLASS_AUDIO,
}, },
{
/* E-Mu 0204 USB */
.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
.idVendor = 0x041e,
.idProduct = 0x3f19,
.bInterfaceClass = USB_CLASS_AUDIO,
},
/* /*
* Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
......
...@@ -532,7 +532,7 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, struct audioformat ...@@ -532,7 +532,7 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, struct audioformat
} }
/* /*
* For E-Mu 0404USB/0202USB/TrackerPre sample rate should be set for device, * For E-Mu 0404USB/0202USB/TrackerPre/0204 sample rate should be set for device,
* not for interface. * not for interface.
*/ */
...@@ -589,6 +589,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs, ...@@ -589,6 +589,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */ case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */
case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */ case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */
case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */ case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */
case USB_ID(0x041e, 0x3f19): /* E-Mu 0204 USB */
set_format_emu_quirk(subs, fmt); set_format_emu_quirk(subs, fmt);
break; break;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册