Commit 37561442 authored by Linus Torvalds's avatar 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: Allow to force model to intel-mac-v3 in snd_hda_intel (sigmatel).
  ALSA: cs4232: fix crash during chip PNP detection
  ALSA: hda - Add automatic model setting for the Acer Aspire 5920G laptop
  ALSA: make snd_ac97_add_vmaster() static
  ALSA: sound/pci/azt3328.h: no variables for enums
  ALSA: soc - wm9712 mono mixer
  ALSA: hda - Add support of ASUS Eeepc P90*
  ALSA: opti9xx: no isapnp param for !CONFIG_PNP
  ALSA: opti93x - Fix NULL dereference
  ALSA: hda - Added support for Asus V1Sn
  ALSA: ASoC: Factor PGA DAPM handling into main
  ALSA: ASoC: Refactor DAPM event handler
  ALSA: ALSA: ens1370: communicate PCI device to AC97
  ALSA: ens1370: SRC stands for Sample Rate Converter
  ALSA: hda - Align BDL position adjustment parameter
  ALSA: Au1xpsc: psc not disabled when TX is idle
  ALSA: add TriTech 28023 AC97 codec ID and Wolfson 9701 name.
parents eeb61f71 536319af
...@@ -1024,6 +1024,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -1024,6 +1024,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
intel-mac-v3 Intel Mac Type 3 intel-mac-v3 Intel Mac Type 3
intel-mac-v4 Intel Mac Type 4 intel-mac-v4 Intel Mac Type 4
intel-mac-v5 Intel Mac Type 5 intel-mac-v5 Intel Mac Type 5
intel-mac-auto Intel Mac (detect type according to subsystem id)
macmini Intel Mac Mini (equivalent with type 3) macmini Intel Mac Mini (equivalent with type 3)
macbook Intel Mac Book (eq. type 5) macbook Intel Mac Book (eq. type 5)
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3) macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
......
...@@ -325,6 +325,7 @@ static int __devinit snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev *pdev) ...@@ -325,6 +325,7 @@ static int __devinit snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev *pdev)
static int __devinit snd_card_cs4232_pnp(int dev, struct snd_card_cs4236 *acard, static int __devinit snd_card_cs4232_pnp(int dev, struct snd_card_cs4236 *acard,
struct pnp_dev *pdev) struct pnp_dev *pdev)
{ {
acard->wss = pdev;
if (snd_cs423x_pnp_init_wss(dev, acard->wss) < 0) if (snd_cs423x_pnp_init_wss(dev, acard->wss) < 0)
return -EBUSY; return -EBUSY;
cport[dev] = -1; cport[dev] = -1;
......
...@@ -68,7 +68,9 @@ MODULE_SUPPORTED_DEVICE("{{OPTi,82C924 (AD1848)}," ...@@ -68,7 +68,9 @@ MODULE_SUPPORTED_DEVICE("{{OPTi,82C924 (AD1848)},"
static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */ static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */ static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
//static int enable = SNDRV_DEFAULT_ENABLE1; /* Enable this card */ //static int enable = SNDRV_DEFAULT_ENABLE1; /* Enable this card */
#ifdef CONFIG_PNP
static int isapnp = 1; /* Enable ISA PnP detection */ static int isapnp = 1; /* Enable ISA PnP detection */
#endif
static long port = SNDRV_DEFAULT_PORT1; /* 0x530,0xe80,0xf40,0x604 */ static long port = SNDRV_DEFAULT_PORT1; /* 0x530,0xe80,0xf40,0x604 */
static long mpu_port = SNDRV_DEFAULT_PORT1; /* 0x300,0x310,0x320,0x330 */ static long mpu_port = SNDRV_DEFAULT_PORT1; /* 0x300,0x310,0x320,0x330 */
static long fm_port = SNDRV_DEFAULT_PORT1; /* 0x388 */ static long fm_port = SNDRV_DEFAULT_PORT1; /* 0x388 */
...@@ -85,8 +87,10 @@ module_param(id, charp, 0444); ...@@ -85,8 +87,10 @@ module_param(id, charp, 0444);
MODULE_PARM_DESC(id, "ID string for opti9xx based soundcard."); MODULE_PARM_DESC(id, "ID string for opti9xx based soundcard.");
//module_param(enable, bool, 0444); //module_param(enable, bool, 0444);
//MODULE_PARM_DESC(enable, "Enable opti9xx soundcard."); //MODULE_PARM_DESC(enable, "Enable opti9xx soundcard.");
#ifdef CONFIG_PNP
module_param(isapnp, bool, 0444); module_param(isapnp, bool, 0444);
MODULE_PARM_DESC(isapnp, "Enable ISA PnP detection for specified soundcard."); MODULE_PARM_DESC(isapnp, "Enable ISA PnP detection for specified soundcard.");
#endif
module_param(port, long, 0444); module_param(port, long, 0444);
MODULE_PARM_DESC(port, "WSS port # for opti9xx driver."); MODULE_PARM_DESC(port, "WSS port # for opti9xx driver.");
module_param(mpu_port, long, 0444); module_param(mpu_port, long, 0444);
...@@ -688,7 +692,7 @@ static void snd_card_opti9xx_free(struct snd_card *card) ...@@ -688,7 +692,7 @@ static void snd_card_opti9xx_free(struct snd_card *card)
if (chip) { if (chip) {
#ifdef OPTi93X #ifdef OPTi93X
struct snd_cs4231 *codec = chip->codec; struct snd_cs4231 *codec = chip->codec;
if (codec->irq > 0) { if (codec && codec->irq > 0) {
disable_irq(codec->irq); disable_irq(codec->irq);
free_irq(codec->irq, codec); free_irq(codec->irq, codec);
} }
......
...@@ -161,6 +161,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { ...@@ -161,6 +161,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = {
{ 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL }, { 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL },
{ 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH }, { 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH },
{ 0x54524102, 0xffffffff, "TR28022", NULL, NULL }, { 0x54524102, 0xffffffff, "TR28022", NULL, NULL },
{ 0x54524103, 0xffffffff, "TR28023", NULL, NULL },
{ 0x54524106, 0xffffffff, "TR28026", NULL, NULL }, { 0x54524106, 0xffffffff, "TR28026", NULL, NULL },
{ 0x54524108, 0xffffffff, "TR28028", patch_tritech_tr28028, NULL }, // added by xin jin [07/09/99] { 0x54524108, 0xffffffff, "TR28028", patch_tritech_tr28028, NULL }, // added by xin jin [07/09/99]
{ 0x54524123, 0xffffffff, "TR28602", NULL, NULL }, // only guess --jk [TR28023 = eMicro EM28023 (new CT1297)] { 0x54524123, 0xffffffff, "TR28602", NULL, NULL }, // only guess --jk [TR28023 = eMicro EM28023 (new CT1297)]
...@@ -169,7 +170,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { ...@@ -169,7 +170,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = {
{ 0x56494170, 0xffffffff, "VIA1617A", patch_vt1617a, NULL }, // modified VT1616 with S/PDIF { 0x56494170, 0xffffffff, "VIA1617A", patch_vt1617a, NULL }, // modified VT1616 with S/PDIF
{ 0x56494182, 0xffffffff, "VIA1618", NULL, NULL }, { 0x56494182, 0xffffffff, "VIA1618", NULL, NULL },
{ 0x57454301, 0xffffffff, "W83971D", NULL, NULL }, { 0x57454301, 0xffffffff, "W83971D", NULL, NULL },
{ 0x574d4c00, 0xffffffff, "WM9701A", NULL, NULL }, { 0x574d4c00, 0xffffffff, "WM9701,WM9701A", NULL, NULL },
{ 0x574d4C03, 0xffffffff, "WM9703,WM9707,WM9708,WM9717", patch_wolfson03, NULL}, { 0x574d4C03, 0xffffffff, "WM9703,WM9707,WM9708,WM9717", patch_wolfson03, NULL},
{ 0x574d4C04, 0xffffffff, "WM9704M,WM9704Q", patch_wolfson04, NULL}, { 0x574d4C04, 0xffffffff, "WM9704M,WM9704Q", patch_wolfson04, NULL},
{ 0x574d4C05, 0xffffffff, "WM9705,WM9710", patch_wolfson05, NULL}, { 0x574d4C05, 0xffffffff, "WM9705,WM9710", patch_wolfson05, NULL},
......
...@@ -3381,8 +3381,8 @@ static struct snd_kcontrol *snd_ac97_find_mixer_ctl(struct snd_ac97 *ac97, ...@@ -3381,8 +3381,8 @@ static struct snd_kcontrol *snd_ac97_find_mixer_ctl(struct snd_ac97 *ac97,
} }
/* create a virtual master control and add slaves */ /* create a virtual master control and add slaves */
int snd_ac97_add_vmaster(struct snd_ac97 *ac97, char *name, static int snd_ac97_add_vmaster(struct snd_ac97 *ac97, char *name,
const unsigned int *tlv, const char **slaves) const unsigned int *tlv, const char **slaves)
{ {
struct snd_kcontrol *kctl; struct snd_kcontrol *kctl;
const char **s; const char **s;
......
...@@ -94,7 +94,7 @@ enum azf_freq_t { ...@@ -94,7 +94,7 @@ enum azf_freq_t {
AZF_FREQ(48000), AZF_FREQ(48000),
AZF_FREQ(66200), AZF_FREQ(66200),
#undef AZF_FREQ #undef AZF_FREQ
} AZF_FREQUENCIES; };
/** recording area (see also: playback bit flag definitions) **/ /** recording area (see also: playback bit flag definitions) **/
#define IDX_IO_REC_FLAGS 0x20 /* ??, PU:0x0000 */ #define IDX_IO_REC_FLAGS 0x20 /* ??, PU:0x0000 */
...@@ -210,7 +210,7 @@ enum azf_freq_t { ...@@ -210,7 +210,7 @@ enum azf_freq_t {
enum { enum {
AZF_GAME_LEGACY_IO_PORT = 0x200 AZF_GAME_LEGACY_IO_PORT = 0x200
} AZF_GAME_CONFIGS; };
#define IDX_GAME_LEGACY_COMPATIBLE 0x00 #define IDX_GAME_LEGACY_COMPATIBLE 0x00
/* in some operation mode, writing anything to this port /* in some operation mode, writing anything to this port
......
...@@ -522,7 +522,7 @@ static unsigned int snd_es1371_wait_src_ready(struct ensoniq * ensoniq) ...@@ -522,7 +522,7 @@ static unsigned int snd_es1371_wait_src_ready(struct ensoniq * ensoniq)
return r; return r;
cond_resched(); cond_resched();
} }
snd_printk(KERN_ERR "wait source ready timeout 0x%lx [0x%x]\n", snd_printk(KERN_ERR "wait src ready timeout 0x%lx [0x%x]\n",
ES_REG(ensoniq, 1371_SMPRATE), r); ES_REG(ensoniq, 1371_SMPRATE), r);
return 0; return 0;
} }
...@@ -1629,6 +1629,7 @@ static int __devinit snd_ensoniq_1371_mixer(struct ensoniq *ensoniq, ...@@ -1629,6 +1629,7 @@ static int __devinit snd_ensoniq_1371_mixer(struct ensoniq *ensoniq,
memset(&ac97, 0, sizeof(ac97)); memset(&ac97, 0, sizeof(ac97));
ac97.private_data = ensoniq; ac97.private_data = ensoniq;
ac97.private_free = snd_ensoniq_mixer_free_ac97; ac97.private_free = snd_ensoniq_mixer_free_ac97;
ac97.pci = ensoniq->pci;
ac97.scaps = AC97_SCAP_AUDIO; ac97.scaps = AC97_SCAP_AUDIO;
if ((err = snd_ac97_mixer(pbus, &ac97, &ensoniq->u.es1371.ac97)) < 0) if ((err = snd_ac97_mixer(pbus, &ac97, &ensoniq->u.es1371.ac97)) < 0)
return err; return err;
......
...@@ -1047,9 +1047,13 @@ static int azx_setup_periods(struct azx *chip, ...@@ -1047,9 +1047,13 @@ static int azx_setup_periods(struct azx *chip,
pos_adj = bdl_pos_adj[chip->dev_index]; pos_adj = bdl_pos_adj[chip->dev_index];
if (pos_adj > 0) { if (pos_adj > 0) {
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
int pos_align = pos_adj;
pos_adj = (pos_adj * runtime->rate + 47999) / 48000; pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
if (!pos_adj) if (!pos_adj)
pos_adj = 1; pos_adj = pos_align;
else
pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
pos_align;
pos_adj = frames_to_bytes(runtime, pos_adj); pos_adj = frames_to_bytes(runtime, pos_adj);
if (pos_adj >= period_bytes) { if (pos_adj >= period_bytes) {
snd_printk(KERN_WARNING "Too big adjustment %d\n", snd_printk(KERN_WARNING "Too big adjustment %d\n",
......
...@@ -122,6 +122,8 @@ enum { ...@@ -122,6 +122,8 @@ enum {
/* ALC269 models */ /* ALC269 models */
enum { enum {
ALC269_BASIC, ALC269_BASIC,
ALC269_ASUS_EEEPC_P703,
ALC269_ASUS_EEEPC_P901,
ALC269_AUTO, ALC269_AUTO,
ALC269_MODEL_LAST /* last tag */ ALC269_MODEL_LAST /* last tag */
}; };
...@@ -7905,6 +7907,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { ...@@ -7905,6 +7907,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
SND_PCI_QUIRK(0x1025, 0, "Acer laptop", ALC883_ACER), /* default Acer */ SND_PCI_QUIRK(0x1025, 0, "Acer laptop", ALC883_ACER), /* default Acer */
SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG), SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
...@@ -10946,7 +10949,23 @@ static int patch_alc268(struct hda_codec *codec) ...@@ -10946,7 +10949,23 @@ static int patch_alc268(struct hda_codec *codec)
static hda_nid_t alc269_adc_nids[1] = { static hda_nid_t alc269_adc_nids[1] = {
/* ADC1 */ /* ADC1 */
0x07, 0x08,
};
static struct hda_input_mux alc269_eeepc_dmic_capture_source = {
.num_items = 2,
.items = {
{ "i-Mic", 0x5 },
{ "e-Mic", 0x0 },
},
};
static struct hda_input_mux alc269_eeepc_amic_capture_source = {
.num_items = 2,
.items = {
{ "i-Mic", 0x1 },
{ "e-Mic", 0x0 },
},
}; };
#define alc269_modes alc260_modes #define alc269_modes alc260_modes
...@@ -10968,10 +10987,27 @@ static struct snd_kcontrol_new alc269_base_mixer[] = { ...@@ -10968,10 +10987,27 @@ static struct snd_kcontrol_new alc269_base_mixer[] = {
{ } /* end */ { } /* end */
}; };
/* bind volumes of both NID 0x0c and 0x0d */
static struct hda_bind_ctls alc269_epc_bind_vol = {
.ops = &snd_hda_bind_vol,
.values = {
HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
0
},
};
static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
HDA_BIND_VOL("LineOut Playback Volume", &alc269_epc_bind_vol),
HDA_CODEC_MUTE("LineOut Playback Switch", 0x15, 0x0, HDA_OUTPUT),
{ } /* end */
};
/* capture mixer elements */ /* capture mixer elements */
static struct snd_kcontrol_new alc269_capture_mixer[] = { static struct snd_kcontrol_new alc269_capture_mixer[] = {
HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
{ {
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
/* The multiple "Capture Source" controls confuse alsamixer /* The multiple "Capture Source" controls confuse alsamixer
...@@ -10987,6 +11023,13 @@ static struct snd_kcontrol_new alc269_capture_mixer[] = { ...@@ -10987,6 +11023,13 @@ static struct snd_kcontrol_new alc269_capture_mixer[] = {
{ } /* end */ { } /* end */
}; };
/* capture mixer elements */
static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
{ } /* end */
};
/* /*
* generic initialization of ADC, input mixers and output mixers * generic initialization of ADC, input mixers and output mixers
*/ */
...@@ -10994,7 +11037,7 @@ static struct hda_verb alc269_init_verbs[] = { ...@@ -10994,7 +11037,7 @@ static struct hda_verb alc269_init_verbs[] = {
/* /*
* Unmute ADC0 and set the default input to mic-in * Unmute ADC0 and set the default input to mic-in
*/ */
{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
/* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the
* analog-loopback mixer widget * analog-loopback mixer widget
...@@ -11057,6 +11100,98 @@ static struct hda_verb alc269_init_verbs[] = { ...@@ -11057,6 +11100,98 @@ static struct hda_verb alc269_init_verbs[] = {
{ } { }
}; };
static struct hda_verb alc269_eeepc_dmic_init_verbs[] = {
{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
{0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
{}
};
static struct hda_verb alc269_eeepc_amic_init_verbs[] = {
{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
{0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
{}
};
/* toggle speaker-output according to the hp-jack state */
static void alc269_speaker_automute(struct hda_codec *codec)
{
unsigned int present;
unsigned int bits;
present = snd_hda_codec_read(codec, 0x15, 0,
AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
bits = present ? AMP_IN_MUTE(0) : 0;
snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
AMP_IN_MUTE(0), bits);
snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
AMP_IN_MUTE(0), bits);
}
static void alc269_eeepc_dmic_automute(struct hda_codec *codec)
{
unsigned int present;
present = snd_hda_codec_read(codec, 0x18, 0, AC_VERB_GET_PIN_SENSE, 0)
& AC_PINSENSE_PRESENCE;
snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_CONNECT_SEL,
present ? 0 : 5);
}
static void alc269_eeepc_amic_automute(struct hda_codec *codec)
{
unsigned int present;
present = snd_hda_codec_read(codec, 0x18, 0, AC_VERB_GET_PIN_SENSE, 0)
& AC_PINSENSE_PRESENCE;
snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE,
present ? AMP_IN_UNMUTE(0) : AMP_IN_MUTE(0));
snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE,
present ? AMP_IN_MUTE(1) : AMP_IN_UNMUTE(1));
}
/* unsolicited event for HP jack sensing */
static void alc269_eeepc_dmic_unsol_event(struct hda_codec *codec,
unsigned int res)
{
if ((res >> 26) == ALC880_HP_EVENT)
alc269_speaker_automute(codec);
if ((res >> 26) == ALC880_MIC_EVENT)
alc269_eeepc_dmic_automute(codec);
}
static void alc269_eeepc_dmic_inithook(struct hda_codec *codec)
{
alc269_speaker_automute(codec);
alc269_eeepc_dmic_automute(codec);
}
/* unsolicited event for HP jack sensing */
static void alc269_eeepc_amic_unsol_event(struct hda_codec *codec,
unsigned int res)
{
if ((res >> 26) == ALC880_HP_EVENT)
alc269_speaker_automute(codec);
if ((res >> 26) == ALC880_MIC_EVENT)
alc269_eeepc_amic_automute(codec);
}
static void alc269_eeepc_amic_inithook(struct hda_codec *codec)
{
alc269_speaker_automute(codec);
alc269_eeepc_amic_automute(codec);
}
/* add playback controls from the parsed DAC table */ /* add playback controls from the parsed DAC table */
static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec, static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec,
const struct auto_pin_cfg *cfg) const struct auto_pin_cfg *cfg)
...@@ -11188,6 +11323,9 @@ static int alc269_parse_auto_config(struct hda_codec *codec) ...@@ -11188,6 +11323,9 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
if (err < 0) if (err < 0)
return err; return err;
spec->mixers[spec->num_mixers] = alc269_capture_mixer;
spec->num_mixers++;
return 1; return 1;
} }
...@@ -11215,12 +11353,16 @@ static const char *alc269_models[ALC269_MODEL_LAST] = { ...@@ -11215,12 +11353,16 @@ static const char *alc269_models[ALC269_MODEL_LAST] = {
}; };
static struct snd_pci_quirk alc269_cfg_tbl[] = { static struct snd_pci_quirk alc269_cfg_tbl[] = {
SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
ALC269_ASUS_EEEPC_P703),
SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
ALC269_ASUS_EEEPC_P901),
{} {}
}; };
static struct alc_config_preset alc269_presets[] = { static struct alc_config_preset alc269_presets[] = {
[ALC269_BASIC] = { [ALC269_BASIC] = {
.mixers = { alc269_base_mixer }, .mixers = { alc269_base_mixer, alc269_capture_mixer },
.init_verbs = { alc269_init_verbs }, .init_verbs = { alc269_init_verbs },
.num_dacs = ARRAY_SIZE(alc269_dac_nids), .num_dacs = ARRAY_SIZE(alc269_dac_nids),
.dac_nids = alc269_dac_nids, .dac_nids = alc269_dac_nids,
...@@ -11229,6 +11371,32 @@ static struct alc_config_preset alc269_presets[] = { ...@@ -11229,6 +11371,32 @@ static struct alc_config_preset alc269_presets[] = {
.channel_mode = alc269_modes, .channel_mode = alc269_modes,
.input_mux = &alc269_capture_source, .input_mux = &alc269_capture_source,
}, },
[ALC269_ASUS_EEEPC_P703] = {
.mixers = { alc269_eeepc_mixer, alc269_epc_capture_mixer },
.init_verbs = { alc269_init_verbs,
alc269_eeepc_amic_init_verbs },
.num_dacs = ARRAY_SIZE(alc269_dac_nids),
.dac_nids = alc269_dac_nids,
.hp_nid = 0x03,
.num_channel_mode = ARRAY_SIZE(alc269_modes),
.channel_mode = alc269_modes,
.input_mux = &alc269_eeepc_amic_capture_source,
.unsol_event = alc269_eeepc_amic_unsol_event,
.init_hook = alc269_eeepc_amic_inithook,
},
[ALC269_ASUS_EEEPC_P901] = {
.mixers = { alc269_eeepc_mixer, alc269_epc_capture_mixer},
.init_verbs = { alc269_init_verbs,
alc269_eeepc_dmic_init_verbs },
.num_dacs = ARRAY_SIZE(alc269_dac_nids),
.dac_nids = alc269_dac_nids,
.hp_nid = 0x03,
.num_channel_mode = ARRAY_SIZE(alc269_modes),
.channel_mode = alc269_modes,
.input_mux = &alc269_eeepc_dmic_capture_source,
.unsol_event = alc269_eeepc_dmic_unsol_event,
.init_hook = alc269_eeepc_dmic_inithook,
},
}; };
static int patch_alc269(struct hda_codec *codec) static int patch_alc269(struct hda_codec *codec)
...@@ -11282,8 +11450,6 @@ static int patch_alc269(struct hda_codec *codec) ...@@ -11282,8 +11450,6 @@ static int patch_alc269(struct hda_codec *codec)
spec->adc_nids = alc269_adc_nids; spec->adc_nids = alc269_adc_nids;
spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
spec->mixers[spec->num_mixers] = alc269_capture_mixer;
spec->num_mixers++;
codec->patch_ops = alc_patch_ops; codec->patch_ops = alc_patch_ops;
if (board_config == ALC269_AUTO) if (board_config == ALC269_AUTO)
...@@ -12994,6 +13160,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = { ...@@ -12994,6 +13160,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), 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),
SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC861VD_LENOVO),
SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG), SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO), SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
......
...@@ -94,6 +94,9 @@ enum { ...@@ -94,6 +94,9 @@ enum {
STAC_INTEL_MAC_V3, STAC_INTEL_MAC_V3,
STAC_INTEL_MAC_V4, STAC_INTEL_MAC_V4,
STAC_INTEL_MAC_V5, STAC_INTEL_MAC_V5,
STAC_INTEL_MAC_AUTO, /* This model is selected if no module parameter
* is given, one of the above models will be
* chosen according to the subsystem id. */
/* for backward compatibility */ /* for backward compatibility */
STAC_MACMINI, STAC_MACMINI,
STAC_MACBOOK, STAC_MACBOOK,
...@@ -1483,6 +1486,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = { ...@@ -1483,6 +1486,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
[STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs, [STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
[STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs, [STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
[STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs, [STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
[STAC_INTEL_MAC_AUTO] = intel_mac_v3_pin_configs,
/* for backward compatibility */ /* for backward compatibility */
[STAC_MACMINI] = intel_mac_v3_pin_configs, [STAC_MACMINI] = intel_mac_v3_pin_configs,
[STAC_MACBOOK] = intel_mac_v5_pin_configs, [STAC_MACBOOK] = intel_mac_v5_pin_configs,
...@@ -1505,6 +1509,7 @@ static const char *stac922x_models[STAC_922X_MODELS] = { ...@@ -1505,6 +1509,7 @@ static const char *stac922x_models[STAC_922X_MODELS] = {
[STAC_INTEL_MAC_V3] = "intel-mac-v3", [STAC_INTEL_MAC_V3] = "intel-mac-v3",
[STAC_INTEL_MAC_V4] = "intel-mac-v4", [STAC_INTEL_MAC_V4] = "intel-mac-v4",
[STAC_INTEL_MAC_V5] = "intel-mac-v5", [STAC_INTEL_MAC_V5] = "intel-mac-v5",
[STAC_INTEL_MAC_AUTO] = "intel-mac-auto",
/* for backward compatibility */ /* for backward compatibility */
[STAC_MACMINI] = "macmini", [STAC_MACMINI] = "macmini",
[STAC_MACBOOK] = "macbook", [STAC_MACBOOK] = "macbook",
...@@ -1576,9 +1581,9 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = { ...@@ -1576,9 +1581,9 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = {
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707, SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
"Intel D945P", STAC_D945GTP5), "Intel D945P", STAC_D945GTP5),
/* other systems */ /* other systems */
/* Apple Mac Mini (early 2006) */ /* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */
SND_PCI_QUIRK(0x8384, 0x7680, SND_PCI_QUIRK(0x8384, 0x7680,
"Mac Mini", STAC_INTEL_MAC_V3), "Mac", STAC_INTEL_MAC_AUTO),
/* Dell systems */ /* Dell systems */
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7, SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
"unknown Dell", STAC_922X_DELL_D81), "unknown Dell", STAC_922X_DELL_D81),
...@@ -3725,7 +3730,7 @@ static int patch_stac922x(struct hda_codec *codec) ...@@ -3725,7 +3730,7 @@ static int patch_stac922x(struct hda_codec *codec)
spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS, spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
stac922x_models, stac922x_models,
stac922x_cfg_tbl); stac922x_cfg_tbl);
if (spec->board_config == STAC_INTEL_MAC_V3) { if (spec->board_config == STAC_INTEL_MAC_AUTO) {
spec->gpio_mask = spec->gpio_dir = 0x03; spec->gpio_mask = spec->gpio_dir = 0x03;
spec->gpio_data = 0x03; spec->gpio_data = 0x03;
/* Intel Macs have all same PCI SSID, so we need to check /* Intel Macs have all same PCI SSID, so we need to check
...@@ -3757,6 +3762,9 @@ static int patch_stac922x(struct hda_codec *codec) ...@@ -3757,6 +3762,9 @@ static int patch_stac922x(struct hda_codec *codec)
case 0x106b2200: case 0x106b2200:
spec->board_config = STAC_INTEL_MAC_V5; spec->board_config = STAC_INTEL_MAC_V5;
break; break;
default:
spec->board_config = STAC_INTEL_MAC_V3;
break;
} }
} }
......
...@@ -231,7 +231,7 @@ static int au1xpsc_i2s_stop(struct au1xpsc_audio_data *pscdata, int stype) ...@@ -231,7 +231,7 @@ static int au1xpsc_i2s_stop(struct au1xpsc_audio_data *pscdata, int stype)
/* if both TX and RX are idle, disable PSC */ /* if both TX and RX are idle, disable PSC */
stat = au_readl(I2S_STAT(pscdata)); stat = au_readl(I2S_STAT(pscdata));
if (!(stat & (PSC_I2SSTAT_RB | PSC_I2SSTAT_RB))) { if (!(stat & (PSC_I2SSTAT_TB | PSC_I2SSTAT_RB))) {
au_writel(0, I2S_CFG(pscdata)); au_writel(0, I2S_CFG(pscdata));
au_sync(); au_sync();
au_writel(PSC_CTRL_SUSPEND, PSC_CTRL(pscdata)); au_writel(PSC_CTRL_SUSPEND, PSC_CTRL(pscdata));
......
...@@ -427,20 +427,20 @@ static const struct snd_soc_dapm_route audio_map[] = { ...@@ -427,20 +427,20 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"HPOUTR", NULL, "Headphone PGA"}, {"HPOUTR", NULL, "Headphone PGA"},
{"Headphone PGA", NULL, "Right HP Mixer"}, {"Headphone PGA", NULL, "Right HP Mixer"},
/* mono hp mixer */ /* mono mixer */
{"Mono HP Mixer", NULL, "Left HP Mixer"}, {"Mono Mixer", NULL, "Left HP Mixer"},
{"Mono HP Mixer", NULL, "Right HP Mixer"}, {"Mono Mixer", NULL, "Right HP Mixer"},
/* Out3 Mux */ /* Out3 Mux */
{"Out3 Mux", "Left", "Left HP Mixer"}, {"Out3 Mux", "Left", "Left HP Mixer"},
{"Out3 Mux", "Mono", "Phone Mixer"}, {"Out3 Mux", "Mono", "Phone Mixer"},
{"Out3 Mux", "Left + Right", "Mono HP Mixer"}, {"Out3 Mux", "Left + Right", "Mono Mixer"},
{"Out 3 PGA", NULL, "Out3 Mux"}, {"Out 3 PGA", NULL, "Out3 Mux"},
{"OUT3", NULL, "Out 3 PGA"}, {"OUT3", NULL, "Out 3 PGA"},
/* speaker Mux */ /* speaker Mux */
{"Speaker Mux", "Speaker Mix", "Speaker Mixer"}, {"Speaker Mux", "Speaker Mix", "Speaker Mixer"},
{"Speaker Mux", "Headphone Mix", "Mono HP Mixer"}, {"Speaker Mux", "Headphone Mix", "Mono Mixer"},
{"Speaker PGA", NULL, "Speaker Mux"}, {"Speaker PGA", NULL, "Speaker Mux"},
{"LOUT2", NULL, "Speaker PGA"}, {"LOUT2", NULL, "Speaker PGA"},
{"ROUT2", NULL, "Speaker PGA"}, {"ROUT2", NULL, "Speaker PGA"},
......
...@@ -523,24 +523,6 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) ...@@ -523,24 +523,6 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
continue; continue;
} }
/* programmable gain/attenuation */
if (w->id == snd_soc_dapm_pga) {
int on;
in = is_connected_input_ep(w);
dapm_clear_walk(w->codec);
out = is_connected_output_ep(w);
dapm_clear_walk(w->codec);
w->power = on = (out != 0 && in != 0) ? 1 : 0;
if (!on)
dapm_set_pga(w, on); /* lower volume to reduce pops */
dapm_update_bits(w);
if (on)
dapm_set_pga(w, on); /* restore volume from zero */
continue;
}
/* pre and post event widgets */ /* pre and post event widgets */
if (w->id == snd_soc_dapm_pre) { if (w->id == snd_soc_dapm_pre) {
if (!w->event) if (!w->event)
...@@ -586,45 +568,56 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) ...@@ -586,45 +568,56 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
power_change = (w->power == power) ? 0: 1; power_change = (w->power == power) ? 0: 1;
w->power = power; w->power = power;
if (!power_change)
continue;
/* call any power change event handlers */ /* call any power change event handlers */
if (power_change) { if (w->event)
if (w->event) { pr_debug("power %s event for %s flags %x\n",
pr_debug("power %s event for %s flags %x\n", w->power ? "on" : "off",
w->power ? "on" : "off", w->name, w->event_flags); w->name, w->event_flags);
if (power) {
/* power up event */ /* power up pre event */
if (w->event_flags & SND_SOC_DAPM_PRE_PMU) { if (power && w->event &&
ret = w->event(w, (w->event_flags & SND_SOC_DAPM_PRE_PMU)) {
NULL, SND_SOC_DAPM_PRE_PMU); ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMU);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
dapm_update_bits(w);
if (w->event_flags & SND_SOC_DAPM_POST_PMU){ /* power down pre event */
ret = w->event(w, if (!power && w->event &&
NULL, SND_SOC_DAPM_POST_PMU); (w->event_flags & SND_SOC_DAPM_PRE_PMD)) {
if (ret < 0) ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMD);
return ret; if (ret < 0)
} return ret;
} else { }
/* power down event */
if (w->event_flags & SND_SOC_DAPM_PRE_PMD) { /* Lower PGA volume to reduce pops */
ret = w->event(w, if (w->id == snd_soc_dapm_pga && !power)
NULL, SND_SOC_DAPM_PRE_PMD); dapm_set_pga(w, power);
if (ret < 0)
return ret; dapm_update_bits(w);
}
dapm_update_bits(w); /* Raise PGA volume to reduce pops */
if (w->event_flags & SND_SOC_DAPM_POST_PMD) { if (w->id == snd_soc_dapm_pga && power)
ret = w->event(w, dapm_set_pga(w, power);
NULL, SND_SOC_DAPM_POST_PMD);
if (ret < 0) /* power up post event */
return ret; if (power && w->event &&
} (w->event_flags & SND_SOC_DAPM_POST_PMU)) {
} ret = w->event(w,
} else NULL, SND_SOC_DAPM_POST_PMU);
/* no event handler */ if (ret < 0)
dapm_update_bits(w); return ret;
}
/* power down post event */
if (!power && w->event &&
(w->event_flags & SND_SOC_DAPM_POST_PMD)) {
ret = w->event(w, NULL, SND_SOC_DAPM_POST_PMD);
if (ret < 0)
return ret;
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment