sound updates #2 for 5.5-rc1
A few last-minute updates, most of them are the regression fixes: - AMD HD-audio HDMI runtime PM improvements - Fixes for HD-audio HDMI regressions wrt DP-MST - A regression fix for the previous aloop enhancement - A fix for a long-time problem in PCM OSS layer that was spotted by fuzzer now - A few HD-audio quirks -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAl3qVZwOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9jNRAA1Z/OAAwuoOHPDRVCKvlsZ/cm2FG7jaaTxSpi p8jcs59gKhIzeDD9w2WMNr8sw7mx+S7t4r0OPLqGyOlmfwxOIPiZ9P4WJAr+EXJV IWjG/lfyqWswcLQIo543OKEDv/4enKnKGL5UxBQyHUDmBsnK0dRLmVchQvGfZrwJ wV6Z7qfpBg/DqCA5cEZj6M2j+CyWn6PzBwK7mJTEO9r/JPwONRK9kSu85kbKSGyp GpKosgMv9jJ3aoC9sPgEEh03i++y5q/Sn9LrMkuv7oCF7to46DmpXobKQAod9sQT nnFYhXNz9y2kStNPlWuQbNTUxdBN5Ad06AzlAFYRv+IVB3rTbSfotRvMJBg6nBnH rICv6gEn1+E6voDszPH40+9DbvEUaXdE1F3qZNv2eQd3hFCUjQg4KFY+g8YpsFI6 AqEt68vRt6zZrfYNrL8loADvckyy+lLc3PQmfsLvF8Wr0T04cBAUC3fIJc+sYd3V kZQhAZBiL0qihmF/PZKjdycmT8+3GpRkZwhlZdOBe1t39ZeXy7ztxnROYqZcxEZK BZUoBq7sh0qSui1sfxF8uuUp/H1wprbJYwTrjmPLTo3eYRTYpwfbi7bZQ0hLkKUF C3Haf4e4IWWZabl+6HcdZhXfcXXSH+1pnV2ITjh83nbnd2+wEVnzS705s9qaD7ge SGgWfcY= =eLUD -----END PGP SIGNATURE----- Merge tag 'sound-fix-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull more sound updates from Takashi Iwai: "A few last-minute updates, most of them are the regression fixes: - AMD HD-audio HDMI runtime PM improvements - Fixes for HD-audio HDMI regressions wrt DP-MST - A regression fix for the previous aloop enhancement - A fix for a long-time problem in PCM OSS layer that was spotted by fuzzer now - A few HD-audio quirks" * tag 'sound-fix-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: pcm: oss: Avoid potential buffer overflows ALSA: hda: hdmi - Keep old slot assignment behavior for Intel platforms ALSA: hda: Modify stream stripe mask only when needed ALSA: hda - fixup for the bass speaker on Lenovo Carbon X1 7th gen ALSA: hda: hdmi - preserve non-MST PCM routing for Intel platforms ALSA: hda: hdmi - fix kernel oops caused by invalid PCM idx ALSA: hda/realtek - Fix inverted bass GPIO pin on Acer 8951G ALSA: hda/realtek - Dell headphone has noise on unmute for ALC236 ALSA: hda: hdmi - fix regression in connect list handling ALSA: aloop: Avoid pointer dereference before null-check ALSA: hda/hdmi - enable automatic runtime pm for AMD HDMI codecs by default ALSA: hda/hdmi - enable runtime pm for newer AMD display audio ALSA: hda/hdmi - Add new pci ids for AMD GPU display audio ALSA: hda/hdmi - fix vgaswitcheroo detection for AMD
This commit is contained in:
commit
3cf2890f29
@ -493,6 +493,7 @@ struct hdac_stream {
|
||||
bool prepared:1;
|
||||
bool no_period_wakeup:1;
|
||||
bool locked:1;
|
||||
bool stripe:1; /* apply stripe control */
|
||||
|
||||
/* timestamp */
|
||||
unsigned long start_wallclk; /* start + minimum wallclk */
|
||||
|
@ -107,6 +107,8 @@ static snd_pcm_sframes_t linear_transfer(struct snd_pcm_plugin *plugin,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (frames > dst_channels[0].frames)
|
||||
frames = dst_channels[0].frames;
|
||||
convert(plugin, src_channels, dst_channels, frames);
|
||||
return frames;
|
||||
}
|
||||
|
@ -269,6 +269,8 @@ static snd_pcm_sframes_t mulaw_transfer(struct snd_pcm_plugin *plugin,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (frames > dst_channels[0].frames)
|
||||
frames = dst_channels[0].frames;
|
||||
data = (struct mulaw_priv *)plugin->extra_data;
|
||||
data->func(plugin, src_channels, dst_channels, frames);
|
||||
return frames;
|
||||
|
@ -57,6 +57,8 @@ static snd_pcm_sframes_t route_transfer(struct snd_pcm_plugin *plugin,
|
||||
return -ENXIO;
|
||||
if (frames == 0)
|
||||
return 0;
|
||||
if (frames > dst_channels[0].frames)
|
||||
frames = dst_channels[0].frames;
|
||||
|
||||
nsrcs = plugin->src_format.channels;
|
||||
ndsts = plugin->dst_format.channels;
|
||||
|
@ -727,10 +727,6 @@ static void loopback_snd_timer_period_elapsed(struct loopback_cable *cable,
|
||||
|
||||
dpcm_play = cable->streams[SNDRV_PCM_STREAM_PLAYBACK];
|
||||
dpcm_capt = cable->streams[SNDRV_PCM_STREAM_CAPTURE];
|
||||
substream_play = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ?
|
||||
dpcm_play->substream : NULL;
|
||||
substream_capt = (running & (1 << SNDRV_PCM_STREAM_CAPTURE)) ?
|
||||
dpcm_capt->substream : NULL;
|
||||
|
||||
if (event == SNDRV_TIMER_EVENT_MSTOP) {
|
||||
if (!dpcm_play ||
|
||||
@ -741,6 +737,10 @@ static void loopback_snd_timer_period_elapsed(struct loopback_cable *cable,
|
||||
}
|
||||
}
|
||||
|
||||
substream_play = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ?
|
||||
dpcm_play->substream : NULL;
|
||||
substream_capt = (running & (1 << SNDRV_PCM_STREAM_CAPTURE)) ?
|
||||
dpcm_capt->substream : NULL;
|
||||
valid_runtime = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ?
|
||||
dpcm_play->substream->runtime :
|
||||
dpcm_capt->substream->runtime;
|
||||
|
@ -96,12 +96,14 @@ void snd_hdac_stream_start(struct hdac_stream *azx_dev, bool fresh_start)
|
||||
1 << azx_dev->index,
|
||||
1 << azx_dev->index);
|
||||
/* set stripe control */
|
||||
if (azx_dev->substream)
|
||||
stripe_ctl = snd_hdac_get_stream_stripe_ctl(bus, azx_dev->substream);
|
||||
else
|
||||
stripe_ctl = 0;
|
||||
snd_hdac_stream_updateb(azx_dev, SD_CTL_3B, SD_CTL_STRIPE_MASK,
|
||||
stripe_ctl);
|
||||
if (azx_dev->stripe) {
|
||||
if (azx_dev->substream)
|
||||
stripe_ctl = snd_hdac_get_stream_stripe_ctl(bus, azx_dev->substream);
|
||||
else
|
||||
stripe_ctl = 0;
|
||||
snd_hdac_stream_updateb(azx_dev, SD_CTL_3B, SD_CTL_STRIPE_MASK,
|
||||
stripe_ctl);
|
||||
}
|
||||
/* set DMA start and interrupt mask */
|
||||
snd_hdac_stream_updateb(azx_dev, SD_CTL,
|
||||
0, SD_CTL_DMA_START | SD_INT_MASK);
|
||||
@ -118,7 +120,10 @@ void snd_hdac_stream_clear(struct hdac_stream *azx_dev)
|
||||
snd_hdac_stream_updateb(azx_dev, SD_CTL,
|
||||
SD_CTL_DMA_START | SD_INT_MASK, 0);
|
||||
snd_hdac_stream_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
|
||||
snd_hdac_stream_updateb(azx_dev, SD_CTL_3B, SD_CTL_STRIPE_MASK, 0);
|
||||
if (azx_dev->stripe) {
|
||||
snd_hdac_stream_updateb(azx_dev, SD_CTL_3B, SD_CTL_STRIPE_MASK, 0);
|
||||
azx_dev->stripe = 0;
|
||||
}
|
||||
azx_dev->running = false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_stream_clear);
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
/* for snoop control */
|
||||
@ -1401,6 +1402,34 @@ static int azx_dev_free(struct snd_device *device)
|
||||
}
|
||||
|
||||
#ifdef SUPPORT_VGA_SWITCHEROO
|
||||
#ifdef CONFIG_ACPI
|
||||
/* ATPX is in the integrated GPU's namespace */
|
||||
static bool atpx_present(void)
|
||||
{
|
||||
struct pci_dev *pdev = NULL;
|
||||
acpi_handle dhandle, atpx_handle;
|
||||
acpi_status status;
|
||||
|
||||
while ((pdev = pci_get_class(PCI_BASE_CLASS_DISPLAY << 16, pdev)) != NULL) {
|
||||
dhandle = ACPI_HANDLE(&pdev->dev);
|
||||
if (dhandle) {
|
||||
status = acpi_get_handle(dhandle, "ATPX", &atpx_handle);
|
||||
if (!ACPI_FAILURE(status)) {
|
||||
pci_dev_put(pdev);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
static bool atpx_present(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check of disabled HDMI controller by vga_switcheroo
|
||||
*/
|
||||
@ -1412,6 +1441,22 @@ static struct pci_dev *get_bound_vga(struct pci_dev *pci)
|
||||
switch (pci->vendor) {
|
||||
case PCI_VENDOR_ID_ATI:
|
||||
case PCI_VENDOR_ID_AMD:
|
||||
if (pci->devfn == 1) {
|
||||
p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
|
||||
pci->bus->number, 0);
|
||||
if (p) {
|
||||
/* ATPX is in the integrated GPU's ACPI namespace
|
||||
* rather than the dGPU's namespace. However,
|
||||
* the dGPU is the one who is involved in
|
||||
* vgaswitcheroo.
|
||||
*/
|
||||
if (((p->class >> 16) == PCI_BASE_CLASS_DISPLAY) &&
|
||||
atpx_present())
|
||||
return p;
|
||||
pci_dev_put(p);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PCI_VENDOR_ID_NVIDIA:
|
||||
if (pci->devfn == 1) {
|
||||
p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
|
||||
@ -2547,13 +2592,38 @@ static const struct pci_device_id azx_ids[] = {
|
||||
{ PCI_DEVICE(0x1002, 0xaac8),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
|
||||
{ PCI_DEVICE(0x1002, 0xaad8),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
|
||||
{ PCI_DEVICE(0x1002, 0xaae8),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xaae0),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xaae8),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xaaf0),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xaaf8),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xab00),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xab08),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xab10),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xab18),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xab20),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xab38),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
/* VIA VT8251/VT8237A */
|
||||
{ PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA },
|
||||
/* VIA GFX VT7122/VX900 */
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <sound/hda_codec.h>
|
||||
#include "hda_local.h"
|
||||
#include "hda_jack.h"
|
||||
#include "hda_controller.h"
|
||||
|
||||
static bool static_hdmi_pcm;
|
||||
module_param(static_hdmi_pcm, bool, 0644);
|
||||
@ -1249,6 +1250,10 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo,
|
||||
per_pin->cvt_nid = per_cvt->cvt_nid;
|
||||
hinfo->nid = per_cvt->cvt_nid;
|
||||
|
||||
/* flip stripe flag for the assigned stream if supported */
|
||||
if (get_wcaps(codec, per_cvt->cvt_nid) & AC_WCAP_STRIPE)
|
||||
azx_stream(get_azx_dev(substream))->stripe = 1;
|
||||
|
||||
snd_hda_set_dev_select(codec, per_pin->pin_nid, per_pin->dev_id);
|
||||
snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0,
|
||||
AC_VERB_SET_CONNECT_SEL,
|
||||
@ -1302,6 +1307,7 @@ static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx)
|
||||
struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
|
||||
hda_nid_t pin_nid = per_pin->pin_nid;
|
||||
int dev_id = per_pin->dev_id;
|
||||
int conns;
|
||||
|
||||
if (!(get_wcaps(codec, pin_nid) & AC_WCAP_CONN_LIST)) {
|
||||
codec_warn(codec,
|
||||
@ -1312,10 +1318,18 @@ static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx)
|
||||
|
||||
snd_hda_set_dev_select(codec, pin_nid, dev_id);
|
||||
|
||||
if (spec->intel_hsw_fixup) {
|
||||
conns = spec->num_cvts;
|
||||
memcpy(per_pin->mux_nids, spec->cvt_nids,
|
||||
sizeof(hda_nid_t) * conns);
|
||||
} else {
|
||||
conns = snd_hda_get_raw_connections(codec, pin_nid,
|
||||
per_pin->mux_nids,
|
||||
HDA_MAX_CONNECTIONS);
|
||||
}
|
||||
|
||||
/* all the device entries on the same pin have the same conn list */
|
||||
per_pin->num_mux_nids =
|
||||
snd_hda_get_raw_connections(codec, pin_nid, per_pin->mux_nids,
|
||||
HDA_MAX_CONNECTIONS);
|
||||
per_pin->num_mux_nids = conns;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1326,24 +1340,26 @@ static int hdmi_find_pcm_slot(struct hdmi_spec *spec,
|
||||
int i;
|
||||
|
||||
/*
|
||||
* generic_hdmi_build_pcms() allocates (num_nids + dev_num - 1)
|
||||
* number of pcms.
|
||||
* generic_hdmi_build_pcms() may allocate extra PCMs on some
|
||||
* platforms (with maximum of 'num_nids + dev_num - 1')
|
||||
*
|
||||
* The per_pin of pin_nid_idx=n and dev_id=m prefers to get pcm-n
|
||||
* if m==0. This guarantees that dynamic pcm assignments are compatible
|
||||
* with the legacy static per_pin-pmc assignment that existed in the
|
||||
* with the legacy static per_pin-pcm assignment that existed in the
|
||||
* days before DP-MST.
|
||||
*
|
||||
* Intel DP-MST prefers this legacy behavior for compatibility, too.
|
||||
*
|
||||
* per_pin of m!=0 prefers to get pcm=(num_nids + (m - 1)).
|
||||
*/
|
||||
if (per_pin->dev_id == 0 &&
|
||||
!test_bit(per_pin->pin_nid_idx, &spec->pcm_bitmap))
|
||||
return per_pin->pin_nid_idx;
|
||||
|
||||
if (per_pin->dev_id != 0 &&
|
||||
!(test_bit(spec->num_nids + (per_pin->dev_id - 1),
|
||||
&spec->pcm_bitmap))) {
|
||||
return spec->num_nids + (per_pin->dev_id - 1);
|
||||
if (per_pin->dev_id == 0 || spec->intel_hsw_fixup) {
|
||||
if (!test_bit(per_pin->pin_nid_idx, &spec->pcm_bitmap))
|
||||
return per_pin->pin_nid_idx;
|
||||
} else {
|
||||
i = spec->num_nids + (per_pin->dev_id - 1);
|
||||
if (i < spec->pcm_used && !(test_bit(i, &spec->pcm_bitmap)))
|
||||
return i;
|
||||
}
|
||||
|
||||
/* have a second try; check the area over num_nids */
|
||||
@ -1713,9 +1729,6 @@ static void hdmi_repoll_eld(struct work_struct *work)
|
||||
mutex_unlock(&spec->pcm_lock);
|
||||
}
|
||||
|
||||
static void intel_haswell_fixup_connect_list(struct hda_codec *codec,
|
||||
hda_nid_t nid);
|
||||
|
||||
static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
|
||||
{
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
@ -1790,8 +1803,6 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
|
||||
per_pin->dev_id = i;
|
||||
per_pin->non_pcm = false;
|
||||
snd_hda_set_dev_select(codec, pin_nid, i);
|
||||
if (spec->intel_hsw_fixup)
|
||||
intel_haswell_fixup_connect_list(codec, pin_nid);
|
||||
err = hdmi_read_pin_conn(codec, pin_idx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@ -2603,24 +2614,6 @@ static void generic_acomp_init(struct hda_codec *codec,
|
||||
* Intel codec parsers and helpers
|
||||
*/
|
||||
|
||||
static void intel_haswell_fixup_connect_list(struct hda_codec *codec,
|
||||
hda_nid_t nid)
|
||||
{
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
hda_nid_t conns[4];
|
||||
int nconns;
|
||||
|
||||
nconns = snd_hda_get_raw_connections(codec, nid, conns,
|
||||
ARRAY_SIZE(conns));
|
||||
if (nconns == spec->num_cvts &&
|
||||
!memcmp(conns, spec->cvt_nids, spec->num_cvts * sizeof(hda_nid_t)))
|
||||
return;
|
||||
|
||||
/* override pins connection list */
|
||||
codec_dbg(codec, "hdmi: haswell: override pin connection 0x%x\n", nid);
|
||||
snd_hda_override_conn_list(codec, nid, spec->num_cvts, spec->cvt_nids);
|
||||
}
|
||||
|
||||
#define INTEL_GET_VENDOR_VERB 0xf81
|
||||
#define INTEL_SET_VENDOR_VERB 0x781
|
||||
#define INTEL_EN_DP12 0x02 /* enable DP 1.2 features */
|
||||
@ -4063,6 +4056,7 @@ static int atihdmi_init(struct hda_codec *codec)
|
||||
ATI_VERB_SET_MULTICHANNEL_MODE,
|
||||
ATI_MULTICHANNEL_MODE_SINGLE);
|
||||
}
|
||||
codec->auto_runtime_pm = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -367,9 +367,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
||||
case 0x10ec0215:
|
||||
case 0x10ec0233:
|
||||
case 0x10ec0235:
|
||||
case 0x10ec0236:
|
||||
case 0x10ec0255:
|
||||
case 0x10ec0256:
|
||||
case 0x10ec0257:
|
||||
case 0x10ec0282:
|
||||
case 0x10ec0283:
|
||||
@ -381,6 +379,11 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
||||
case 0x10ec0300:
|
||||
alc_update_coef_idx(codec, 0x10, 1<<9, 0);
|
||||
break;
|
||||
case 0x10ec0236:
|
||||
case 0x10ec0256:
|
||||
alc_write_coef_idx(codec, 0x36, 0x5757);
|
||||
alc_update_coef_idx(codec, 0x10, 1<<9, 0);
|
||||
break;
|
||||
case 0x10ec0275:
|
||||
alc_update_coef_idx(codec, 0xe, 0, 1<<0);
|
||||
break;
|
||||
@ -5544,6 +5547,16 @@ static void alc295_fixup_disable_dac3(struct hda_codec *codec,
|
||||
}
|
||||
}
|
||||
|
||||
/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
|
||||
static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
||||
hda_nid_t conn[1] = { 0x02 };
|
||||
snd_hda_override_conn_list(codec, 0x17, 1, conn);
|
||||
}
|
||||
}
|
||||
|
||||
/* Hook to update amp GPIO4 for automute */
|
||||
static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
|
||||
struct hda_jack_callback *jack)
|
||||
@ -5846,6 +5859,7 @@ enum {
|
||||
ALC225_FIXUP_DISABLE_MIC_VREF,
|
||||
ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC295_FIXUP_DISABLE_DAC3,
|
||||
ALC285_FIXUP_SPEAKER2_TO_DAC1,
|
||||
ALC280_FIXUP_HP_HEADSET_MIC,
|
||||
ALC221_FIXUP_HP_FRONT_MIC,
|
||||
ALC292_FIXUP_TPT460,
|
||||
@ -6646,6 +6660,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc295_fixup_disable_dac3,
|
||||
},
|
||||
[ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_speaker2_to_dac1,
|
||||
},
|
||||
[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
@ -7221,6 +7239,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2293, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_SPEAKER2_TO_DAC1),
|
||||
SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||
SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||
SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
||||
@ -7405,6 +7424,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
||||
{.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
|
||||
{.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
|
||||
{.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
|
||||
{.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
|
||||
{.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
|
||||
{.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
|
||||
{.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
|
||||
@ -8424,6 +8444,8 @@ static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
snd_hda_jack_detect_enable_callback(codec, 0x1b,
|
||||
alc662_aspire_ethos_mute_speakers);
|
||||
/* subwoofer needs an extra GPIO setting to become audible */
|
||||
alc_setup_gpio(codec, 0x02);
|
||||
break;
|
||||
case HDA_FIXUP_ACT_INIT:
|
||||
/* Make sure to start in a correct state, i.e. if
|
||||
@ -8506,7 +8528,6 @@ enum {
|
||||
ALC662_FIXUP_USI_HEADSET_MODE,
|
||||
ALC662_FIXUP_LENOVO_MULTI_CODECS,
|
||||
ALC669_FIXUP_ACER_ASPIRE_ETHOS,
|
||||
ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER,
|
||||
ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
|
||||
};
|
||||
|
||||
@ -8838,18 +8859,6 @@ static const struct hda_fixup alc662_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc662_fixup_aspire_ethos_hp,
|
||||
},
|
||||
[ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
/* subwoofer needs an extra GPIO setting to become audible */
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
|
||||
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
|
||||
{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
|
||||
},
|
||||
[ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
@ -8859,7 +8868,7 @@ static const struct hda_fixup alc662_fixups[] = {
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER
|
||||
.chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
|
||||
},
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user