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: ice1724: increase SPDIF and independent stereo buffer sizes ALSA: opl3: circular locking in the snd_opl3_note_on() and snd_opl3_note_off() ALSA: ICE1712/24 - Change the Multi Track Peak control (level meters) from MIXER to PCM type ALSA: hda - Fix yet another auto-mic bug in ALC268 ASoC: WM8350 capture PGA mutes are inverted ASoC: Remove absent SYNC and TDM DAI format options from i.MX SSI sound: via82xx: move DXS volume controls to PCM interface ALSA: hda - Don't pick up invalid HP pins in alc_subsystem_id() ALSA: hda - Add a workaround for ASUS A7K ALSA: hda - Fix invalid initializations for ALC861 auto mode ASoC: wm8940: Fix check on error code form snd_soc_codec_set_cache_io ASoC: Fix SND_SOC_DAPM_LINE handling
This commit is contained in:
Коммит
a888f96a15
|
@ -29,6 +29,8 @@ extern char snd_opl3_regmap[MAX_OPL2_VOICES][4];
|
|||
|
||||
extern int use_internal_drums;
|
||||
|
||||
static void snd_opl3_note_off_unsafe(void *p, int note, int vel,
|
||||
struct snd_midi_channel *chan);
|
||||
/*
|
||||
* The next table looks magical, but it certainly is not. Its values have
|
||||
* been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception
|
||||
|
@ -242,16 +244,20 @@ void snd_opl3_timer_func(unsigned long data)
|
|||
int again = 0;
|
||||
int i;
|
||||
|
||||
spin_lock_irqsave(&opl3->sys_timer_lock, flags);
|
||||
spin_lock_irqsave(&opl3->voice_lock, flags);
|
||||
for (i = 0; i < opl3->max_voices; i++) {
|
||||
struct snd_opl3_voice *vp = &opl3->voices[i];
|
||||
if (vp->state > 0 && vp->note_off_check) {
|
||||
if (vp->note_off == jiffies)
|
||||
snd_opl3_note_off(opl3, vp->note, 0, vp->chan);
|
||||
snd_opl3_note_off_unsafe(opl3, vp->note, 0,
|
||||
vp->chan);
|
||||
else
|
||||
again++;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&opl3->voice_lock, flags);
|
||||
|
||||
spin_lock_irqsave(&opl3->sys_timer_lock, flags);
|
||||
if (again) {
|
||||
opl3->tlist.expires = jiffies + 1; /* invoke again */
|
||||
add_timer(&opl3->tlist);
|
||||
|
@ -658,15 +664,14 @@ static void snd_opl3_kill_voice(struct snd_opl3 *opl3, int voice)
|
|||
/*
|
||||
* Release a note in response to a midi note off.
|
||||
*/
|
||||
void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan)
|
||||
static void snd_opl3_note_off_unsafe(void *p, int note, int vel,
|
||||
struct snd_midi_channel *chan)
|
||||
{
|
||||
struct snd_opl3 *opl3;
|
||||
|
||||
int voice;
|
||||
struct snd_opl3_voice *vp;
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
opl3 = p;
|
||||
|
||||
#ifdef DEBUG_MIDI
|
||||
|
@ -674,12 +679,9 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan
|
|||
chan->number, chan->midi_program, note);
|
||||
#endif
|
||||
|
||||
spin_lock_irqsave(&opl3->voice_lock, flags);
|
||||
|
||||
if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) {
|
||||
if (chan->drum_channel && use_internal_drums) {
|
||||
snd_opl3_drum_switch(opl3, note, vel, 0, chan);
|
||||
spin_unlock_irqrestore(&opl3->voice_lock, flags);
|
||||
return;
|
||||
}
|
||||
/* this loop will hopefully kill all extra voices, because
|
||||
|
@ -697,6 +699,16 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan
|
|||
snd_opl3_kill_voice(opl3, voice);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void snd_opl3_note_off(void *p, int note, int vel,
|
||||
struct snd_midi_channel *chan)
|
||||
{
|
||||
struct snd_opl3 *opl3 = p;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&opl3->voice_lock, flags);
|
||||
snd_opl3_note_off_unsafe(p, note, vel, chan);
|
||||
spin_unlock_irqrestore(&opl3->voice_lock, flags);
|
||||
}
|
||||
|
||||
|
|
|
@ -1332,15 +1332,20 @@ do_sku:
|
|||
* when the external headphone out jack is plugged"
|
||||
*/
|
||||
if (!spec->autocfg.hp_pins[0]) {
|
||||
hda_nid_t nid;
|
||||
tmp = (ass >> 11) & 0x3; /* HP to chassis */
|
||||
if (tmp == 0)
|
||||
spec->autocfg.hp_pins[0] = porta;
|
||||
nid = porta;
|
||||
else if (tmp == 1)
|
||||
spec->autocfg.hp_pins[0] = porte;
|
||||
nid = porte;
|
||||
else if (tmp == 2)
|
||||
spec->autocfg.hp_pins[0] = portd;
|
||||
nid = portd;
|
||||
else
|
||||
return 1;
|
||||
for (i = 0; i < spec->autocfg.line_outs; i++)
|
||||
if (spec->autocfg.line_out_pins[i] == nid)
|
||||
return 1;
|
||||
spec->autocfg.hp_pins[0] = nid;
|
||||
}
|
||||
|
||||
alc_init_auto_hp(codec);
|
||||
|
@ -1362,7 +1367,7 @@ static void alc_ssid_check(struct hda_codec *codec,
|
|||
}
|
||||
|
||||
/*
|
||||
* Fix-up pin default configurations
|
||||
* Fix-up pin default configurations and add default verbs
|
||||
*/
|
||||
|
||||
struct alc_pincfg {
|
||||
|
@ -1370,9 +1375,14 @@ struct alc_pincfg {
|
|||
u32 val;
|
||||
};
|
||||
|
||||
static void alc_fix_pincfg(struct hda_codec *codec,
|
||||
struct alc_fixup {
|
||||
const struct alc_pincfg *pins;
|
||||
const struct hda_verb *verbs;
|
||||
};
|
||||
|
||||
static void alc_pick_fixup(struct hda_codec *codec,
|
||||
const struct snd_pci_quirk *quirk,
|
||||
const struct alc_pincfg **pinfix)
|
||||
const struct alc_fixup *fix)
|
||||
{
|
||||
const struct alc_pincfg *cfg;
|
||||
|
||||
|
@ -1380,9 +1390,14 @@ static void alc_fix_pincfg(struct hda_codec *codec,
|
|||
if (!quirk)
|
||||
return;
|
||||
|
||||
cfg = pinfix[quirk->value];
|
||||
for (; cfg->nid; cfg++)
|
||||
snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
|
||||
fix += quirk->value;
|
||||
cfg = fix->pins;
|
||||
if (cfg) {
|
||||
for (; cfg->nid; cfg++)
|
||||
snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
|
||||
}
|
||||
if (fix->verbs)
|
||||
add_verb(codec->spec, fix->verbs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -9593,11 +9608,13 @@ static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static const struct alc_pincfg *alc882_pin_fixes[] = {
|
||||
[PINFIX_ABIT_AW9D_MAX] = alc882_abit_aw9d_pinfix,
|
||||
static const struct alc_fixup alc882_fixups[] = {
|
||||
[PINFIX_ABIT_AW9D_MAX] = {
|
||||
.pins = alc882_abit_aw9d_pinfix
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_pci_quirk alc882_pinfix_tbl[] = {
|
||||
static struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
|
||||
{}
|
||||
};
|
||||
|
@ -9869,7 +9886,7 @@ static int patch_alc882(struct hda_codec *codec)
|
|||
board_config = ALC882_AUTO;
|
||||
}
|
||||
|
||||
alc_fix_pincfg(codec, alc882_pinfix_tbl, alc882_pin_fixes);
|
||||
alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
|
||||
|
||||
if (board_config == ALC882_AUTO) {
|
||||
/* automatic parse from the BIOS config */
|
||||
|
@ -12842,12 +12859,15 @@ static int patch_alc268(struct hda_codec *codec)
|
|||
unsigned int wcap = get_wcaps(codec, 0x07);
|
||||
int i;
|
||||
|
||||
spec->capsrc_nids = alc268_capsrc_nids;
|
||||
/* get type */
|
||||
wcap = get_wcaps_type(wcap);
|
||||
if (spec->auto_mic ||
|
||||
wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
|
||||
spec->adc_nids = alc268_adc_nids_alt;
|
||||
spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
|
||||
if (spec->auto_mic)
|
||||
fixup_automic_adc(codec);
|
||||
if (spec->auto_mic || spec->input_mux->num_items == 1)
|
||||
add_mixer(spec, alc268_capture_nosrc_mixer);
|
||||
else
|
||||
|
@ -12857,7 +12877,6 @@ static int patch_alc268(struct hda_codec *codec)
|
|||
spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
|
||||
add_mixer(spec, alc268_capture_mixer);
|
||||
}
|
||||
spec->capsrc_nids = alc268_capsrc_nids;
|
||||
/* set default input source */
|
||||
for (i = 0; i < spec->num_adc_nids; i++)
|
||||
snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
|
||||
|
@ -14357,15 +14376,16 @@ static void alc861_auto_init_multi_out(struct hda_codec *codec)
|
|||
static void alc861_auto_init_hp_out(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t pin;
|
||||
|
||||
pin = spec->autocfg.hp_pins[0];
|
||||
if (pin)
|
||||
alc861_auto_set_output_and_unmute(codec, pin, PIN_HP,
|
||||
if (spec->autocfg.hp_outs)
|
||||
alc861_auto_set_output_and_unmute(codec,
|
||||
spec->autocfg.hp_pins[0],
|
||||
PIN_HP,
|
||||
spec->multiout.hp_nid);
|
||||
pin = spec->autocfg.speaker_pins[0];
|
||||
if (pin)
|
||||
alc861_auto_set_output_and_unmute(codec, pin, PIN_OUT,
|
||||
if (spec->autocfg.speaker_outs)
|
||||
alc861_auto_set_output_and_unmute(codec,
|
||||
spec->autocfg.speaker_pins[0],
|
||||
PIN_OUT,
|
||||
spec->multiout.dac_nids[0]);
|
||||
}
|
||||
|
||||
|
@ -15158,7 +15178,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
|
||||
SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
|
||||
SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
|
||||
SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),
|
||||
/*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
|
||||
SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
|
||||
SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
|
||||
SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
|
||||
|
@ -15551,6 +15571,29 @@ static void alc861vd_auto_init(struct hda_codec *codec)
|
|||
alc_inithook(codec);
|
||||
}
|
||||
|
||||
enum {
|
||||
ALC660VD_FIX_ASUS_GPIO1
|
||||
};
|
||||
|
||||
/* reset GPIO1 */
|
||||
static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
|
||||
{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
|
||||
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
|
||||
{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct alc_fixup alc861vd_fixups[] = {
|
||||
[ALC660VD_FIX_ASUS_GPIO1] = {
|
||||
.verbs = alc660vd_fix_asus_gpio1_verbs,
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
|
||||
{}
|
||||
};
|
||||
|
||||
static int patch_alc861vd(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec;
|
||||
|
@ -15572,6 +15615,8 @@ static int patch_alc861vd(struct hda_codec *codec)
|
|||
board_config = ALC861VD_AUTO;
|
||||
}
|
||||
|
||||
alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
|
||||
|
||||
if (board_config == ALC861VD_AUTO) {
|
||||
/* automatic parse from the BIOS config */
|
||||
err = alc861vd_parse_auto_config(codec);
|
||||
|
|
|
@ -2259,7 +2259,7 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol,
|
|||
}
|
||||
|
||||
static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = {
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||
.name = "Multi Track Peak",
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
|
||||
.info = snd_ice1712_pro_peak_info,
|
||||
|
|
|
@ -1294,7 +1294,7 @@ static int __devinit snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device)
|
|||
|
||||
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
|
||||
snd_dma_pci_data(ice->pci),
|
||||
64*1024, 64*1024);
|
||||
256*1024, 256*1024);
|
||||
|
||||
ice->pcm = pcm;
|
||||
|
||||
|
@ -1408,7 +1408,7 @@ static int __devinit snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device)
|
|||
|
||||
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
|
||||
snd_dma_pci_data(ice->pci),
|
||||
64*1024, 64*1024);
|
||||
256*1024, 256*1024);
|
||||
|
||||
ice->pcm_ds = pcm;
|
||||
|
||||
|
@ -2110,7 +2110,7 @@ static int snd_vt1724_pro_peak_get(struct snd_kcontrol *kcontrol,
|
|||
}
|
||||
|
||||
static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = {
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||
.name = "Multi Track Peak",
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
|
||||
.info = snd_vt1724_pro_peak_info,
|
||||
|
|
|
@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct via82xx *chip = snd_kcontrol_chip(kcontrol);
|
||||
unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
|
||||
unsigned int idx = kcontrol->id.subdevice;
|
||||
|
||||
ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0];
|
||||
ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1];
|
||||
|
@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct via82xx *chip = snd_kcontrol_chip(kcontrol);
|
||||
unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
|
||||
unsigned int idx = kcontrol->id.subdevice;
|
||||
unsigned long port = chip->port + 0x10 * idx;
|
||||
unsigned char val;
|
||||
int i, change = 0;
|
||||
|
@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata =
|
|||
};
|
||||
|
||||
static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = {
|
||||
.name = "VIA DXS Playback Volume",
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||
.device = 0,
|
||||
/* .subdevice set later */
|
||||
.name = "PCM Playback Volume",
|
||||
.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_READ),
|
||||
.count = 4,
|
||||
.info = snd_via8233_dxs_volume_info,
|
||||
.get = snd_via8233_dxs_volume_get,
|
||||
.put = snd_via8233_dxs_volume_put,
|
||||
|
@ -1936,10 +1937,18 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip)
|
|||
}
|
||||
else /* Using DXS when PCM emulation is enabled is really weird */
|
||||
{
|
||||
/* Standalone DXS controls */
|
||||
err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip));
|
||||
if (err < 0)
|
||||
return err;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
struct snd_kcontrol *kctl;
|
||||
|
||||
kctl = snd_ctl_new1(
|
||||
&snd_via8233_dxs_volume_control, chip);
|
||||
if (!kctl)
|
||||
return -ENOMEM;
|
||||
kctl->id.subdevice = i;
|
||||
err = snd_ctl_add(chip->card, kctl);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* select spdif data slot 10/11 */
|
||||
|
|
|
@ -579,7 +579,7 @@ static const struct snd_kcontrol_new wm8350_left_capt_mixer_controls[] = {
|
|||
SOC_DAPM_SINGLE_TLV("L3 Capture Volume",
|
||||
WM8350_INPUT_MIXER_VOLUME_L, 9, 7, 0, out_mix_tlv),
|
||||
SOC_DAPM_SINGLE("PGA Capture Switch",
|
||||
WM8350_LEFT_INPUT_VOLUME, 14, 1, 0),
|
||||
WM8350_LEFT_INPUT_VOLUME, 14, 1, 1),
|
||||
};
|
||||
|
||||
/* Right Input Mixer */
|
||||
|
@ -589,7 +589,7 @@ static const struct snd_kcontrol_new wm8350_right_capt_mixer_controls[] = {
|
|||
SOC_DAPM_SINGLE_TLV("L3 Capture Volume",
|
||||
WM8350_INPUT_MIXER_VOLUME_R, 13, 7, 0, out_mix_tlv),
|
||||
SOC_DAPM_SINGLE("PGA Capture Switch",
|
||||
WM8350_RIGHT_INPUT_VOLUME, 14, 1, 0),
|
||||
WM8350_RIGHT_INPUT_VOLUME, 14, 1, 1),
|
||||
};
|
||||
|
||||
/* Left Mic Mixer */
|
||||
|
|
|
@ -790,7 +790,7 @@ static int wm8940_register(struct wm8940_priv *wm8940,
|
|||
codec->reg_cache = &wm8940->reg_cache;
|
||||
|
||||
ret = snd_soc_codec_set_cache_io(codec, 8, 16, control);
|
||||
if (ret == 0) {
|
||||
if (ret < 0) {
|
||||
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -397,14 +397,6 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
|||
break;
|
||||
}
|
||||
|
||||
/* sync */
|
||||
if (!(fmt & SND_SOC_DAIFMT_ASYNC))
|
||||
scr |= SSI_SCR_SYN;
|
||||
|
||||
/* tdm - only for stereo atm */
|
||||
if (fmt & SND_SOC_DAIFMT_TDM)
|
||||
scr |= SSI_SCR_NET;
|
||||
|
||||
if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI2) {
|
||||
SSI1_STCR = stcr;
|
||||
SSI1_SRCR = srcr;
|
||||
|
|
|
@ -524,7 +524,7 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget)
|
|||
|
||||
/* connected jack or spk ? */
|
||||
if (widget->id == snd_soc_dapm_hp || widget->id == snd_soc_dapm_spk ||
|
||||
widget->id == snd_soc_dapm_line)
|
||||
(widget->id == snd_soc_dapm_line && !list_empty(&widget->sources)))
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -573,7 +573,8 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget)
|
|||
return 1;
|
||||
|
||||
/* connected jack ? */
|
||||
if (widget->id == snd_soc_dapm_mic || widget->id == snd_soc_dapm_line)
|
||||
if (widget->id == snd_soc_dapm_mic ||
|
||||
(widget->id == snd_soc_dapm_line && !list_empty(&widget->sinks)))
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче