You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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: sound: OSS: mpu401, fix deadlock ALSA: hda - Add missing initializations for ALC268 and ALC269 ALSA: cmi8330: fix MPU-401 PnP init copy&paste bug ALSA: hda - Line In for Acer Inspire 6530G model sound: oxygen: make mic volume control mono MAINTAINERS: Add entry for twl4030 series soc codec driver ALSA: lx6464es - configure ethersound io channels sound: Use PCI_VDEVICE for CREATIVE and ECTIVA sound: Use PCI_VDEVICE ALSA: hda - Use model=acer-aspire-6530g for Acer Aspire 6930G ALSA: hda - Fix acer-aspire-6530g model quirk ALSA: hda - Add pin-sense trigger when needed for Realtek codecs ALSA: hda - Fix support for Samsung P50 with AD1986A codec ALSA: hda - Generalize the pin-detect quirk for Lenovo N100 ALSA: hda - Simplify AD1986A mixer definitions
This commit is contained in:
@@ -240,6 +240,7 @@ AD1986A
|
||||
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
||||
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
||||
samsung 2-channel with EAPD (Samsung R65)
|
||||
samsung-p50 2-channel with HP-automute (Samsung P50)
|
||||
|
||||
AD1988/AD1988B/AD1989A/AD1989B
|
||||
==============================
|
||||
|
||||
@@ -5668,6 +5668,13 @@ F: drivers/misc/tifm*
|
||||
F: drivers/mmc/host/tifm_sd.c
|
||||
F: include/linux/tifm.h
|
||||
|
||||
TI TWL4030 SERIES SOC CODEC DRIVER
|
||||
P: Peter Ujfalusi
|
||||
M: peter.ujfalusi@nokia.com
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: sound/soc/codecs/twl4030*
|
||||
|
||||
TIPC NETWORK LAYER
|
||||
P: Per Liden
|
||||
M: per.liden@ericsson.com
|
||||
|
||||
+1
-1
@@ -338,7 +338,7 @@ static int __devinit snd_cmi8330_pnp(int dev, struct snd_cmi8330 *acard,
|
||||
return -EBUSY;
|
||||
|
||||
acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL);
|
||||
if (acard->play == NULL)
|
||||
if (acard->mpu == NULL)
|
||||
return -EBUSY;
|
||||
|
||||
pdev = acard->cap;
|
||||
|
||||
+1
-1
@@ -199,7 +199,7 @@ MODULE_LICENSE("GPL");
|
||||
*/
|
||||
|
||||
static struct pci_device_id id_tbl[] = {
|
||||
{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
|
||||
{ PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5530_AUDIO), 0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
+3
-13
@@ -926,31 +926,21 @@ static struct midi_operations mpu401_midi_operations[MAX_MIDI_DEV];
|
||||
static void mpu401_chk_version(int n, struct mpu_config *devc)
|
||||
{
|
||||
int tmp;
|
||||
unsigned long flags;
|
||||
|
||||
devc->version = devc->revision = 0;
|
||||
|
||||
spin_lock_irqsave(&devc->lock,flags);
|
||||
if ((tmp = mpu_cmd(n, 0xAC, 0)) < 0)
|
||||
{
|
||||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
tmp = mpu_cmd(n, 0xAC, 0);
|
||||
if (tmp < 0)
|
||||
return;
|
||||
}
|
||||
if ((tmp & 0xf0) > 0x20) /* Why it's larger than 2.x ??? */
|
||||
{
|
||||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
return;
|
||||
}
|
||||
devc->version = tmp;
|
||||
|
||||
if ((tmp = mpu_cmd(n, 0xAD, 0)) < 0)
|
||||
{
|
||||
if ((tmp = mpu_cmd(n, 0xAD, 0)) < 0) {
|
||||
devc->version = 0;
|
||||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
return;
|
||||
}
|
||||
devc->revision = tmp;
|
||||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
}
|
||||
|
||||
int attach_mpu401(struct address_info *hw_config, struct module *owner)
|
||||
|
||||
+4
-4
@@ -287,10 +287,10 @@ struct atiixp {
|
||||
/*
|
||||
*/
|
||||
static struct pci_device_id snd_atiixp_ids[] = {
|
||||
{ 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */
|
||||
{ 0x1002, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB300 */
|
||||
{ 0x1002, 0x4370, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */
|
||||
{ 0x1002, 0x4382, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB600 */
|
||||
{ PCI_VDEVICE(ATI, 0x4341), 0 }, /* SB200 */
|
||||
{ PCI_VDEVICE(ATI, 0x4361), 0 }, /* SB300 */
|
||||
{ PCI_VDEVICE(ATI, 0x4370), 0 }, /* SB400 */
|
||||
{ PCI_VDEVICE(ATI, 0x4382), 0 }, /* SB600 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
||||
@@ -262,8 +262,8 @@ struct atiixp_modem {
|
||||
/*
|
||||
*/
|
||||
static struct pci_device_id snd_atiixp_ids[] = {
|
||||
{ 0x1002, 0x434d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */
|
||||
{ 0x1002, 0x4378, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */
|
||||
{ PCI_VDEVICE(ATI, 0x434d), 0 }, /* SB200 */
|
||||
{ PCI_VDEVICE(ATI, 0x4378), 0 }, /* SB400 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#include "au8810.h"
|
||||
#include "au88x0.h"
|
||||
static struct pci_device_id snd_vortex_ids[] = {
|
||||
{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_ADVANTAGE,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1,},
|
||||
{PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_ADVANTAGE), 1,},
|
||||
{0,}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#include "au8820.h"
|
||||
#include "au88x0.h"
|
||||
static struct pci_device_id snd_vortex_ids[] = {
|
||||
{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
|
||||
{PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1), 0,},
|
||||
{0,}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#include "au8830.h"
|
||||
#include "au88x0.h"
|
||||
static struct pci_device_id snd_vortex_ids[] = {
|
||||
{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
|
||||
{PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2), 0,},
|
||||
{0,}
|
||||
};
|
||||
|
||||
|
||||
@@ -1876,7 +1876,7 @@ static int snd_ca0106_resume(struct pci_dev *pci)
|
||||
|
||||
// PCI IDs
|
||||
static struct pci_device_id snd_ca0106_ids[] = {
|
||||
{ 0x1102, 0x0007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Audigy LS or Live 24bit */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0007), 0 }, /* Audigy LS or Live 24bit */
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, snd_ca0106_ids);
|
||||
|
||||
+5
-5
@@ -2797,11 +2797,11 @@ static inline void snd_cmipci_proc_init(struct cmipci *cm) {}
|
||||
|
||||
|
||||
static struct pci_device_id snd_cmipci_ids[] = {
|
||||
{PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_AL, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A), 0},
|
||||
{PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B), 0},
|
||||
{PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738), 0},
|
||||
{PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738B), 0},
|
||||
{PCI_VDEVICE(AL, PCI_DEVICE_ID_CMEDIA_CM8738), 0},
|
||||
{0,},
|
||||
};
|
||||
|
||||
|
||||
+1
-1
@@ -495,7 +495,7 @@ struct cs4281 {
|
||||
static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id);
|
||||
|
||||
static struct pci_device_id snd_cs4281_ids[] = {
|
||||
{ 0x1013, 0x6005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4281 */
|
||||
{ PCI_VDEVICE(CIRRUS, 0x6005), 0, }, /* CS4281 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
||||
@@ -65,9 +65,9 @@ module_param_array(mmap_valid, bool, NULL, 0444);
|
||||
MODULE_PARM_DESC(mmap_valid, "Support OSS mmap.");
|
||||
|
||||
static struct pci_device_id snd_cs46xx_ids[] = {
|
||||
{ 0x1013, 0x6001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4280 */
|
||||
{ 0x1013, 0x6003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4612 */
|
||||
{ 0x1013, 0x6004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4615 */
|
||||
{ PCI_VDEVICE(CIRRUS, 0x6001), 0, }, /* CS4280 */
|
||||
{ PCI_VDEVICE(CIRRUS, 0x6003), 0, }, /* CS4612 */
|
||||
{ PCI_VDEVICE(CIRRUS, 0x6004), 0, }, /* CS4615 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
||||
@@ -77,9 +77,9 @@ MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
|
||||
* Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400
|
||||
*/
|
||||
static struct pci_device_id snd_emu10k1_ids[] = {
|
||||
{ 0x1102, 0x0002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* EMU10K1 */
|
||||
{ 0x1102, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, /* Audigy */
|
||||
{ 0x1102, 0x0008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, /* Audigy 2 Value SB0400 */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0002), 0 }, /* EMU10K1 */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0004), 1 }, /* Audigy */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0008), 1 }, /* Audigy 2 Value SB0400 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
||||
@@ -1607,7 +1607,7 @@ static void __devexit snd_emu10k1x_remove(struct pci_dev *pci)
|
||||
|
||||
// PCI IDs
|
||||
static struct pci_device_id snd_emu10k1x_ids[] = {
|
||||
{ 0x1102, 0x0006, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Dell OEM version (EMU10K1) */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0006), 0 }, /* Dell OEM version (EMU10K1) */
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, snd_emu10k1x_ids);
|
||||
|
||||
+4
-4
@@ -445,12 +445,12 @@ static irqreturn_t snd_audiopci_interrupt(int irq, void *dev_id);
|
||||
|
||||
static struct pci_device_id snd_audiopci_ids[] = {
|
||||
#ifdef CHIP1370
|
||||
{ 0x1274, 0x5000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1370 */
|
||||
{ PCI_VDEVICE(ENSONIQ, 0x5000), 0, }, /* ES1370 */
|
||||
#endif
|
||||
#ifdef CHIP1371
|
||||
{ 0x1274, 0x1371, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1371 */
|
||||
{ 0x1274, 0x5880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1373 - CT5880 */
|
||||
{ 0x1102, 0x8938, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Ectiva EV1938 */
|
||||
{ PCI_VDEVICE(ENSONIQ, 0x1371), 0, }, /* ES1371 */
|
||||
{ PCI_VDEVICE(ENSONIQ, 0x5880), 0, }, /* ES1373 - CT5880 */
|
||||
{ PCI_VDEVICE(ECTIVA, 0x8938), 0, }, /* Ectiva EV1938 */
|
||||
#endif
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
+1
-1
@@ -244,7 +244,7 @@ struct es1938 {
|
||||
static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id);
|
||||
|
||||
static struct pci_device_id snd_es1938_ids[] = {
|
||||
{ 0x125d, 0x1969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Solo-1 */
|
||||
{ PCI_VDEVICE(ESS, 0x1969), 0, }, /* Solo-1 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@ struct ad198x_spec {
|
||||
hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
|
||||
|
||||
unsigned int jack_present :1;
|
||||
unsigned int inv_jack_detect:1;
|
||||
|
||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||
struct hda_loopback_check loopback;
|
||||
@@ -669,13 +670,15 @@ static struct hda_input_mux ad1986a_automic_capture_source = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
|
||||
static struct snd_kcontrol_new ad1986a_laptop_master_mixers[] = {
|
||||
HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
|
||||
HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
|
||||
HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
|
||||
@@ -699,31 +702,9 @@ static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new ad1986a_samsung_mixers[] = {
|
||||
HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
|
||||
HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
|
||||
HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Capture Source",
|
||||
.info = ad198x_mux_enum_info,
|
||||
.get = ad198x_mux_enum_get,
|
||||
.put = ad198x_mux_enum_put,
|
||||
},
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "External Amplifier",
|
||||
.info = ad198x_eapd_info,
|
||||
.get = ad198x_eapd_get,
|
||||
.put = ad198x_eapd_put,
|
||||
.private_value = 0x1b | (1 << 8), /* port-D, inversed */
|
||||
},
|
||||
static struct snd_kcontrol_new ad1986a_laptop_intmic_mixers[] = {
|
||||
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
@@ -776,8 +757,9 @@ static void ad1986a_hp_automute(struct hda_codec *codec)
|
||||
unsigned int present;
|
||||
|
||||
present = snd_hda_codec_read(codec, 0x1a, 0, AC_VERB_GET_PIN_SENSE, 0);
|
||||
/* Lenovo N100 seems to report the reversed bit for HP jack-sensing */
|
||||
spec->jack_present = !(present & 0x80000000);
|
||||
spec->jack_present = !!(present & 0x80000000);
|
||||
if (spec->inv_jack_detect)
|
||||
spec->jack_present = !spec->jack_present;
|
||||
ad1986a_update_hp(codec);
|
||||
}
|
||||
|
||||
@@ -816,7 +798,7 @@ static int ad1986a_hp_master_sw_put(struct snd_kcontrol *kcontrol,
|
||||
return change;
|
||||
}
|
||||
|
||||
static struct snd_kcontrol_new ad1986a_laptop_automute_mixers[] = {
|
||||
static struct snd_kcontrol_new ad1986a_automute_master_mixers[] = {
|
||||
HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
@@ -826,33 +808,10 @@ static struct snd_kcontrol_new ad1986a_laptop_automute_mixers[] = {
|
||||
.put = ad1986a_hp_master_sw_put,
|
||||
.private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
|
||||
},
|
||||
HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Capture Source",
|
||||
.info = ad198x_mux_enum_info,
|
||||
.get = ad198x_mux_enum_get,
|
||||
.put = ad198x_mux_enum_put,
|
||||
},
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "External Amplifier",
|
||||
.info = ad198x_eapd_info,
|
||||
.get = ad198x_eapd_get,
|
||||
.put = ad198x_eapd_put,
|
||||
.private_value = 0x1b | (1 << 8), /* port-D, inversed */
|
||||
},
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* initialization verbs
|
||||
*/
|
||||
@@ -981,6 +940,27 @@ static struct hda_verb ad1986a_hp_init_verbs[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static void ad1986a_samsung_p50_unsol_event(struct hda_codec *codec,
|
||||
unsigned int res)
|
||||
{
|
||||
switch (res >> 26) {
|
||||
case AD1986A_HP_EVENT:
|
||||
ad1986a_hp_automute(codec);
|
||||
break;
|
||||
case AD1986A_MIC_EVENT:
|
||||
ad1986a_automic(codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int ad1986a_samsung_p50_init(struct hda_codec *codec)
|
||||
{
|
||||
ad198x_init(codec);
|
||||
ad1986a_hp_automute(codec);
|
||||
ad1986a_automic(codec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* models */
|
||||
enum {
|
||||
@@ -991,6 +971,7 @@ enum {
|
||||
AD1986A_LAPTOP_AUTOMUTE,
|
||||
AD1986A_ULTRA,
|
||||
AD1986A_SAMSUNG,
|
||||
AD1986A_SAMSUNG_P50,
|
||||
AD1986A_MODELS
|
||||
};
|
||||
|
||||
@@ -1002,6 +983,7 @@ static const char *ad1986a_models[AD1986A_MODELS] = {
|
||||
[AD1986A_LAPTOP_AUTOMUTE] = "laptop-automute",
|
||||
[AD1986A_ULTRA] = "ultra",
|
||||
[AD1986A_SAMSUNG] = "samsung",
|
||||
[AD1986A_SAMSUNG_P50] = "samsung-p50",
|
||||
};
|
||||
|
||||
static struct snd_pci_quirk ad1986a_cfg_tbl[] = {
|
||||
@@ -1024,6 +1006,7 @@ static struct snd_pci_quirk ad1986a_cfg_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD),
|
||||
SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK),
|
||||
SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP),
|
||||
SND_PCI_QUIRK(0x144d, 0xc024, "Samsung P50", AD1986A_SAMSUNG_P50),
|
||||
SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA),
|
||||
SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_SAMSUNG),
|
||||
SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK),
|
||||
@@ -1111,7 +1094,10 @@ static int patch_ad1986a(struct hda_codec *codec)
|
||||
spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
|
||||
break;
|
||||
case AD1986A_LAPTOP_EAPD:
|
||||
spec->mixers[0] = ad1986a_laptop_eapd_mixers;
|
||||
spec->num_mixers = 3;
|
||||
spec->mixers[0] = ad1986a_laptop_master_mixers;
|
||||
spec->mixers[1] = ad1986a_laptop_eapd_mixers;
|
||||
spec->mixers[2] = ad1986a_laptop_intmic_mixers;
|
||||
spec->num_init_verbs = 2;
|
||||
spec->init_verbs[1] = ad1986a_eapd_init_verbs;
|
||||
spec->multiout.max_channels = 2;
|
||||
@@ -1122,7 +1108,9 @@ static int patch_ad1986a(struct hda_codec *codec)
|
||||
spec->input_mux = &ad1986a_laptop_eapd_capture_source;
|
||||
break;
|
||||
case AD1986A_SAMSUNG:
|
||||
spec->mixers[0] = ad1986a_samsung_mixers;
|
||||
spec->num_mixers = 2;
|
||||
spec->mixers[0] = ad1986a_laptop_master_mixers;
|
||||
spec->mixers[1] = ad1986a_laptop_eapd_mixers;
|
||||
spec->num_init_verbs = 3;
|
||||
spec->init_verbs[1] = ad1986a_eapd_init_verbs;
|
||||
spec->init_verbs[2] = ad1986a_automic_verbs;
|
||||
@@ -1135,8 +1123,28 @@ static int patch_ad1986a(struct hda_codec *codec)
|
||||
codec->patch_ops.unsol_event = ad1986a_automic_unsol_event;
|
||||
codec->patch_ops.init = ad1986a_automic_init;
|
||||
break;
|
||||
case AD1986A_SAMSUNG_P50:
|
||||
spec->num_mixers = 2;
|
||||
spec->mixers[0] = ad1986a_automute_master_mixers;
|
||||
spec->mixers[1] = ad1986a_laptop_eapd_mixers;
|
||||
spec->num_init_verbs = 4;
|
||||
spec->init_verbs[1] = ad1986a_eapd_init_verbs;
|
||||
spec->init_verbs[2] = ad1986a_automic_verbs;
|
||||
spec->init_verbs[3] = ad1986a_hp_init_verbs;
|
||||
spec->multiout.max_channels = 2;
|
||||
spec->multiout.num_dacs = 1;
|
||||
spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
|
||||
if (!is_jack_available(codec, 0x25))
|
||||
spec->multiout.dig_out_nid = 0;
|
||||
spec->input_mux = &ad1986a_automic_capture_source;
|
||||
codec->patch_ops.unsol_event = ad1986a_samsung_p50_unsol_event;
|
||||
codec->patch_ops.init = ad1986a_samsung_p50_init;
|
||||
break;
|
||||
case AD1986A_LAPTOP_AUTOMUTE:
|
||||
spec->mixers[0] = ad1986a_laptop_automute_mixers;
|
||||
spec->num_mixers = 3;
|
||||
spec->mixers[0] = ad1986a_automute_master_mixers;
|
||||
spec->mixers[1] = ad1986a_laptop_eapd_mixers;
|
||||
spec->mixers[2] = ad1986a_laptop_intmic_mixers;
|
||||
spec->num_init_verbs = 3;
|
||||
spec->init_verbs[1] = ad1986a_eapd_init_verbs;
|
||||
spec->init_verbs[2] = ad1986a_hp_init_verbs;
|
||||
@@ -1148,6 +1156,10 @@ static int patch_ad1986a(struct hda_codec *codec)
|
||||
spec->input_mux = &ad1986a_laptop_eapd_capture_source;
|
||||
codec->patch_ops.unsol_event = ad1986a_hp_unsol_event;
|
||||
codec->patch_ops.init = ad1986a_hp_init;
|
||||
/* Lenovo N100 seems to report the reversed bit
|
||||
* for HP jack-sensing
|
||||
*/
|
||||
spec->inv_jack_detect = 1;
|
||||
break;
|
||||
case AD1986A_ULTRA:
|
||||
spec->mixers[0] = ad1986a_laptop_eapd_mixers;
|
||||
|
||||
@@ -945,12 +945,13 @@ static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
|
||||
static void alc_automute_pin(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
unsigned int present;
|
||||
unsigned int present, pincap;
|
||||
unsigned int nid = spec->autocfg.hp_pins[0];
|
||||
int i;
|
||||
|
||||
/* need to execute and sync at first */
|
||||
snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0);
|
||||
pincap = snd_hda_query_pin_caps(codec, nid);
|
||||
if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
|
||||
snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0);
|
||||
present = snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_PIN_SENSE, 0);
|
||||
spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
|
||||
@@ -1392,7 +1393,7 @@ static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
|
||||
static void alc_automute_amp(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
unsigned int val, mute;
|
||||
unsigned int val, mute, pincap;
|
||||
hda_nid_t nid;
|
||||
int i;
|
||||
|
||||
@@ -1401,6 +1402,10 @@ static void alc_automute_amp(struct hda_codec *codec)
|
||||
nid = spec->autocfg.hp_pins[i];
|
||||
if (!nid)
|
||||
break;
|
||||
pincap = snd_hda_query_pin_caps(codec, nid);
|
||||
if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
|
||||
snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_SET_PIN_SENSE, 0);
|
||||
val = snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_PIN_SENSE, 0);
|
||||
if (val & AC_PINSENSE_PRESENCE) {
|
||||
@@ -1471,6 +1476,10 @@ static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
|
||||
static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
|
||||
/* Bias voltage on for external mic port */
|
||||
{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
|
||||
/* Front Mic: set to PIN_IN (empty by default) */
|
||||
{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
|
||||
/* Unselect Front Mic by default in input mixer 3 */
|
||||
{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
|
||||
/* Enable unsolicited event for HP jack */
|
||||
{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
|
||||
/* Enable speaker output */
|
||||
@@ -1560,18 +1569,22 @@ static struct hda_input_mux alc888_2_capture_sources[2] = {
|
||||
static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
|
||||
/* Interal mic only available on one ADC */
|
||||
{
|
||||
.num_items = 3,
|
||||
.num_items = 5,
|
||||
.items = {
|
||||
{ "Ext Mic", 0x0 },
|
||||
{ "Line In", 0x2 },
|
||||
{ "CD", 0x4 },
|
||||
{ "Input Mix", 0xa },
|
||||
{ "Int Mic", 0xb },
|
||||
},
|
||||
},
|
||||
{
|
||||
.num_items = 2,
|
||||
.num_items = 4,
|
||||
.items = {
|
||||
{ "Ext Mic", 0x0 },
|
||||
{ "Line In", 0x2 },
|
||||
{ "CD", 0x4 },
|
||||
{ "Input Mix", 0xa },
|
||||
},
|
||||
}
|
||||
};
|
||||
@@ -1639,6 +1652,17 @@ static void alc888_acer_aspire_4930g_init_hook(struct hda_codec *codec)
|
||||
alc_automute_amp(codec);
|
||||
}
|
||||
|
||||
static void alc888_acer_aspire_6530g_init_hook(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
spec->autocfg.hp_pins[0] = 0x15;
|
||||
spec->autocfg.speaker_pins[0] = 0x14;
|
||||
spec->autocfg.speaker_pins[1] = 0x16;
|
||||
spec->autocfg.speaker_pins[2] = 0x17;
|
||||
alc_automute_amp(codec);
|
||||
}
|
||||
|
||||
static void alc889_acer_aspire_8930g_init_hook(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
@@ -8189,6 +8213,8 @@ static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
|
||||
HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, 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("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
||||
@@ -9064,7 +9090,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO),
|
||||
SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO),
|
||||
SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
|
||||
ALC888_ACER_ASPIRE_4930G),
|
||||
ALC888_ACER_ASPIRE_6530G),
|
||||
SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
|
||||
ALC888_ACER_ASPIRE_6530G),
|
||||
/* default Acer -- disabled as it causes more problems.
|
||||
@@ -9317,7 +9343,7 @@ static struct alc_config_preset alc883_presets[] = {
|
||||
ARRAY_SIZE(alc888_2_capture_sources),
|
||||
.input_mux = alc888_acer_aspire_6530_sources,
|
||||
.unsol_event = alc_automute_amp_unsol_event,
|
||||
.init_hook = alc888_acer_aspire_4930g_init_hook,
|
||||
.init_hook = alc888_acer_aspire_6530g_init_hook,
|
||||
},
|
||||
[ALC888_ACER_ASPIRE_8930G] = {
|
||||
.mixers = { alc888_base_mixer,
|
||||
@@ -12437,6 +12463,8 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
alc_ssid_check(codec, 0x15, 0x1b, 0x14);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -13345,6 +13373,8 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
|
||||
if (!spec->cap_mixer && !spec->no_analog)
|
||||
set_capture_mixer(spec);
|
||||
|
||||
alc_ssid_check(codec, 0x15, 0x1b, 0x14);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user