mirror of https://gitee.com/openkylin/linux.git
sound fixes for 3.12-rc5
All stable fixes except for a trivial headset mic fixup: the removal of bogus frame checks in snd-usb-usx2y driver that have regressed in the recent kernel versions, the HD-audio HDMI channel map fix, and a few HD-audio device-specific fixes. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJSWAXvAAoJEGwxgFQ9KSmk91MP+gIbgNXoQUU/eshYi0juUkcw ixWyS5azotfsA6Ekqrvk/xSGMm8hECLXLOahQg0IA2fG6i+duf5xkkAAzq3Z1cdy C8ij0QSFN0zNLLmczDEzEm/gTkfUz3Qv+raa2IVRWBe5dBfunRdGWFNlesWv9/oV r8d4y2dFMX7sU5viTx3OlsTt7nQvZGDRjDlToPhkf3DqlVY098sTERbgbDyPcR4W zfwzqN5iMGKqHIp4F+faqW9oL7mDqX9sXSEC+KMbrPGg1mTsBHLJjqwcSm46+N6I GJOkLv8jPzRPG4UxsQRmaJxnf1xuenuzalcAdjzdEvX2KpbNJTW5gaXl9iDQub9J tttSILD+Dy45fGLje8V7HASLf6tVpl3/bqCo6aUZdlKQdOwBtu5a6vlK7yDQb9q7 kiwaenUPnqoPZWNd+EHfae1FnBfkhXodWyxm0xwwtGfIjFd37CEKU+MlOidObXRf W8tj8rol9NzSB0uq76AKXHAO07EfmX60LfIOZOkuqcxONByJ13BwppBr7I/LMb7g HRQre/9p1kMgRekbHHhgZafhQIqHFRyYGsRi7Xram125FsLRu/3jSdFy9LP6vt3b vszgT3Eu8HEjijBFwcjqf89nF8IWTKvoZJb93dpwgPYQBkpcgH9SX1jW2zBKD8yo Uf4cnixswRc441pE1Qdz =huaz -----END PGP SIGNATURE----- Merge tag 'sound-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "All stable fixes except for a trivial headset mic fixup: the removal of bogus frame checks in snd-usb-usx2y driver that have regressed in the recent kernel versions, the HD-audio HDMI channel map fix, and a few HD-audio device-specific fixes" * tag 'sound-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Sony VAIO Pro 13 (haswell) now has a working headset jack ALSA: hda - Add a headset mic model for ALC269 and friends ALSA: hda - Fix microphone for Sony VAIO Pro 13 (Haswell model) ALSA: hda - Add fixup for ASUS N56VZ ALSA: hda - hdmi: Fix channel map switch not taking effect ALSA: hda - Fix mono speakers and headset mic on Dell Vostro 5470 ALSA: snd-usb-usx2y: remove bogus frame checks
This commit is contained in:
commit
d192f0d57c
|
@ -28,6 +28,7 @@ ALC269/270/275/276/28x/29x
|
|||
alc269-dmic Enable ALC269(VA) digital mic workaround
|
||||
alc271-dmic Enable ALC271X digital mic workaround
|
||||
inv-dmic Inverted internal mic workaround
|
||||
headset-mic Indicates a combined headset (headphone+mic) jack
|
||||
lenovo-dock Enables docking station I/O for some Lenovos
|
||||
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||
dell-headset-dock Headset jack (without mic-in), and also dock I/O
|
||||
|
|
|
@ -936,6 +936,14 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec,
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* always configure channel mapping, it may have been changed by the
|
||||
* user in the meantime
|
||||
*/
|
||||
hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
|
||||
channels, per_pin->chmap,
|
||||
per_pin->chmap_set);
|
||||
|
||||
/*
|
||||
* sizeof(ai) is used instead of sizeof(*hdmi_ai) or
|
||||
* sizeof(*dp_ai) to avoid partial match/update problems when
|
||||
|
@ -947,20 +955,10 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec,
|
|||
"pin=%d channels=%d\n",
|
||||
pin_nid,
|
||||
channels);
|
||||
hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
|
||||
channels, per_pin->chmap,
|
||||
per_pin->chmap_set);
|
||||
hdmi_stop_infoframe_trans(codec, pin_nid);
|
||||
hdmi_fill_audio_infoframe(codec, pin_nid,
|
||||
ai.bytes, sizeof(ai));
|
||||
hdmi_start_infoframe_trans(codec, pin_nid);
|
||||
} else {
|
||||
/* For non-pcm audio switch, setup new channel mapping
|
||||
* accordingly */
|
||||
if (per_pin->non_pcm != non_pcm)
|
||||
hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
|
||||
channels, per_pin->chmap,
|
||||
per_pin->chmap_set);
|
||||
}
|
||||
|
||||
per_pin->non_pcm = non_pcm;
|
||||
|
|
|
@ -2819,6 +2819,15 @@ static void alc269_fixup_hweq(struct hda_codec *codec,
|
|||
alc_write_coef_idx(codec, 0x1e, coef | 0x80);
|
||||
}
|
||||
|
||||
static void alc269_fixup_headset_mic(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
||||
spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
|
||||
}
|
||||
|
||||
static void alc271_fixup_dmic(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
|
@ -3496,6 +3505,15 @@ static void alc282_fixup_asus_tx300(struct hda_codec *codec,
|
|||
}
|
||||
}
|
||||
|
||||
static void alc290_fixup_mono_speakers(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
||||
/* Remove DAC node 0x03, as it seems to be
|
||||
giving mono output */
|
||||
snd_hda_override_wcaps(codec, 0x03, 0);
|
||||
}
|
||||
|
||||
enum {
|
||||
ALC269_FIXUP_SONY_VAIO,
|
||||
ALC275_FIXUP_SONY_VAIO_GPIO2,
|
||||
|
@ -3507,6 +3525,7 @@ enum {
|
|||
ALC271_FIXUP_DMIC,
|
||||
ALC269_FIXUP_PCM_44K,
|
||||
ALC269_FIXUP_STEREO_DMIC,
|
||||
ALC269_FIXUP_HEADSET_MIC,
|
||||
ALC269_FIXUP_QUANTA_MUTE,
|
||||
ALC269_FIXUP_LIFEBOOK,
|
||||
ALC269_FIXUP_AMIC,
|
||||
|
@ -3519,9 +3538,11 @@ enum {
|
|||
ALC269_FIXUP_HP_GPIO_LED,
|
||||
ALC269_FIXUP_INV_DMIC,
|
||||
ALC269_FIXUP_LENOVO_DOCK,
|
||||
ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
|
||||
ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_HEADSET_MODE,
|
||||
ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
|
||||
ALC269_FIXUP_ASUS_X101_FUNC,
|
||||
|
@ -3535,6 +3556,7 @@ enum {
|
|||
ALC283_FIXUP_CHROME_BOOK,
|
||||
ALC282_FIXUP_ASUS_TX300,
|
||||
ALC283_FIXUP_INT_MIC,
|
||||
ALC290_FIXUP_MONO_SPEAKERS,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
|
@ -3603,6 +3625,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_stereo_dmic,
|
||||
},
|
||||
[ALC269_FIXUP_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_headset_mic,
|
||||
},
|
||||
[ALC269_FIXUP_QUANTA_MUTE] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_quanta_mute,
|
||||
|
@ -3712,6 +3738,15 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
||||
},
|
||||
[ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
||||
},
|
||||
[ALC269_FIXUP_HEADSET_MODE] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_headset_mode,
|
||||
|
@ -3720,6 +3755,15 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_headset_mode_no_hp_mic,
|
||||
},
|
||||
[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MIC
|
||||
},
|
||||
[ALC269_FIXUP_ASUS_X101_FUNC] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_x101_headset_mic,
|
||||
|
@ -3804,6 +3848,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
|
||||
},
|
||||
[ALC290_FIXUP_MONO_SPEAKERS] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc290_fixup_mono_speakers,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
|
@ -3845,6 +3895,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
|
||||
|
@ -3867,6 +3918,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
|
||||
SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
|
||||
SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||
SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||
|
@ -3952,6 +4004,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
|||
{.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
|
||||
{.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
|
||||
{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
||||
{.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
|
||||
{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
|
||||
{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
|
||||
{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
|
||||
|
@ -4569,6 +4622,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
|
||||
SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_ASUS_MODE4),
|
||||
SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
|
||||
SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
|
||||
SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
|
||||
|
|
|
@ -299,19 +299,6 @@ static void usX2Y_error_urb_status(struct usX2Ydev *usX2Y,
|
|||
usX2Y_clients_stop(usX2Y);
|
||||
}
|
||||
|
||||
static void usX2Y_error_sequence(struct usX2Ydev *usX2Y,
|
||||
struct snd_usX2Y_substream *subs, struct urb *urb)
|
||||
{
|
||||
snd_printk(KERN_ERR
|
||||
"Sequence Error!(hcd_frame=%i ep=%i%s;wait=%i,frame=%i).\n"
|
||||
"Most probably some urb of usb-frame %i is still missing.\n"
|
||||
"Cause could be too long delays in usb-hcd interrupt handling.\n",
|
||||
usb_get_current_frame_number(usX2Y->dev),
|
||||
subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out",
|
||||
usX2Y->wait_iso_frame, urb->start_frame, usX2Y->wait_iso_frame);
|
||||
usX2Y_clients_stop(usX2Y);
|
||||
}
|
||||
|
||||
static void i_usX2Y_urb_complete(struct urb *urb)
|
||||
{
|
||||
struct snd_usX2Y_substream *subs = urb->context;
|
||||
|
@ -328,12 +315,9 @@ static void i_usX2Y_urb_complete(struct urb *urb)
|
|||
usX2Y_error_urb_status(usX2Y, subs, urb);
|
||||
return;
|
||||
}
|
||||
if (likely((urb->start_frame & 0xFFFF) == (usX2Y->wait_iso_frame & 0xFFFF)))
|
||||
|
||||
subs->completed_urb = urb;
|
||||
else {
|
||||
usX2Y_error_sequence(usX2Y, subs, urb);
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
struct snd_usX2Y_substream *capsubs = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE],
|
||||
*playbacksubs = usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK];
|
||||
|
|
|
@ -244,13 +244,8 @@ static void i_usX2Y_usbpcm_urb_complete(struct urb *urb)
|
|||
usX2Y_error_urb_status(usX2Y, subs, urb);
|
||||
return;
|
||||
}
|
||||
if (likely((urb->start_frame & 0xFFFF) == (usX2Y->wait_iso_frame & 0xFFFF)))
|
||||
subs->completed_urb = urb;
|
||||
else {
|
||||
usX2Y_error_sequence(usX2Y, subs, urb);
|
||||
return;
|
||||
}
|
||||
|
||||
subs->completed_urb = urb;
|
||||
capsubs = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE];
|
||||
capsubs2 = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE + 2];
|
||||
playbacksubs = usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK];
|
||||
|
|
Loading…
Reference in New Issue