Merge branch 'fix/hda' into topic/hda
Conflicts: sound/pci/hda/patch_conexant.c Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Коммит
d398011057
|
@ -43,7 +43,9 @@ ALC680
|
|||
|
||||
ALC882/883/885/888/889
|
||||
======================
|
||||
N/A
|
||||
acer-aspire-4930g Acer Aspire 4930G/5930G/6530G/6930G/7730G
|
||||
acer-aspire-8930g Acer Aspire 8330G/6935G
|
||||
acer-aspire Acer Aspire others
|
||||
|
||||
ALC861/660
|
||||
==========
|
||||
|
|
|
@ -4807,6 +4807,7 @@ F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
|
|||
F: arch/arm/mach-omap2/clockdomain44xx.c
|
||||
|
||||
OMAP AUDIO SUPPORT
|
||||
M: Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
M: Jarkko Nikula <jarkko.nikula@bitmer.com>
|
||||
L: alsa-devel@alsa-project.org (subscribers-only)
|
||||
L: linux-omap@vger.kernel.org
|
||||
|
@ -7462,8 +7463,7 @@ F: include/linux/wm97xx.h
|
|||
|
||||
WOLFSON MICROELECTRONICS DRIVERS
|
||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
||||
M: Ian Lartey <ian@opensource.wolfsonmicro.com>
|
||||
M: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
|
||||
L: patches@opensource.wolfsonmicro.com
|
||||
T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc
|
||||
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
|
||||
W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices
|
||||
|
|
|
@ -325,6 +325,13 @@ void release_and_free_resource(struct resource *res);
|
|||
|
||||
/* --- */
|
||||
|
||||
/* sound printk debug levels */
|
||||
enum {
|
||||
SND_PR_ALWAYS,
|
||||
SND_PR_DEBUG,
|
||||
SND_PR_VERBOSE,
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)
|
||||
__printf(4, 5)
|
||||
void __snd_printk(unsigned int level, const char *file, int line,
|
||||
|
@ -354,6 +361,8 @@ void __snd_printk(unsigned int level, const char *file, int line,
|
|||
*/
|
||||
#define snd_printd(fmt, args...) \
|
||||
__snd_printk(1, __FILE__, __LINE__, fmt, ##args)
|
||||
#define _snd_printd(level, fmt, args...) \
|
||||
__snd_printk(level, __FILE__, __LINE__, fmt, ##args)
|
||||
|
||||
/**
|
||||
* snd_BUG - give a BUG warning message and stack trace
|
||||
|
@ -383,6 +392,7 @@ void __snd_printk(unsigned int level, const char *file, int line,
|
|||
#else /* !CONFIG_SND_DEBUG */
|
||||
|
||||
#define snd_printd(fmt, args...) do { } while (0)
|
||||
#define _snd_printd(level, fmt, args...) do { } while (0)
|
||||
#define snd_BUG() do { } while (0)
|
||||
static inline int __snd_bug_on(int cond)
|
||||
{
|
||||
|
|
|
@ -419,6 +419,7 @@ EXPORT_SYMBOL(snd_ctl_make_virtual_master);
|
|||
* snd_ctl_add_vmaster_hook - Add a hook to a vmaster control
|
||||
* @kcontrol: vmaster kctl element
|
||||
* @hook: the hook function
|
||||
* @private_data: the private_data pointer to be saved
|
||||
*
|
||||
* Adds the given hook to the vmaster control element so that it's called
|
||||
* at each time when the value is changed.
|
||||
|
|
|
@ -1019,13 +1019,15 @@ static int __devinit create_sscape(int dev, struct snd_card *card)
|
|||
irq_cfg = get_irq_config(sscape->type, irq[dev]);
|
||||
if (irq_cfg == INVALID_IRQ) {
|
||||
snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]);
|
||||
return -ENXIO;
|
||||
err = -ENXIO;
|
||||
goto _release_dma;
|
||||
}
|
||||
|
||||
mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]);
|
||||
if (mpu_irq_cfg == INVALID_IRQ) {
|
||||
snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]);
|
||||
return -ENXIO;
|
||||
err = -ENXIO;
|
||||
goto _release_dma;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -38,4 +38,4 @@ static int __init alsa_sound_last_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
__initcall(alsa_sound_last_init);
|
||||
late_initcall_sync(alsa_sound_last_init);
|
||||
|
|
|
@ -1294,6 +1294,8 @@ static int __init calibrate_adc(WORD srate)
|
|||
|
||||
static int upload_dsp_code(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
msnd_outb(HPBLKSEL_0, dev.io + HP_BLKS);
|
||||
#ifndef HAVE_DSPCODEH
|
||||
INITCODESIZE = mod_firmware_load(INITCODEFILE, &INITCODE);
|
||||
|
@ -1312,7 +1314,8 @@ static int upload_dsp_code(void)
|
|||
memcpy_toio(dev.base, PERMCODE, PERMCODESIZE);
|
||||
if (msnd_upload_host(&dev, INITCODE, INITCODESIZE) < 0) {
|
||||
printk(KERN_WARNING LOGNAME ": Error uploading to DSP\n");
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
#ifdef HAVE_DSPCODEH
|
||||
printk(KERN_INFO LOGNAME ": DSP firmware uploaded (resident)\n");
|
||||
|
@ -1320,12 +1323,13 @@ static int upload_dsp_code(void)
|
|||
printk(KERN_INFO LOGNAME ": DSP firmware uploaded\n");
|
||||
#endif
|
||||
|
||||
out:
|
||||
#ifndef HAVE_DSPCODEH
|
||||
vfree(INITCODE);
|
||||
vfree(PERMCODE);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef MSND_CLASSIC
|
||||
|
|
|
@ -418,7 +418,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a)
|
|||
else
|
||||
buf2[0] = '\0';
|
||||
|
||||
printk(KERN_INFO "HDMI: supports coding type %s:"
|
||||
_snd_printd(SND_PR_VERBOSE, "HDMI: supports coding type %s:"
|
||||
" channels = %d, rates =%s%s\n",
|
||||
cea_audio_coding_type_names[a->format],
|
||||
a->channels,
|
||||
|
@ -442,14 +442,14 @@ void snd_hdmi_show_eld(struct hdmi_eld *e)
|
|||
{
|
||||
int i;
|
||||
|
||||
printk(KERN_INFO "HDMI: detected monitor %s at connection type %s\n",
|
||||
_snd_printd(SND_PR_VERBOSE, "HDMI: detected monitor %s at connection type %s\n",
|
||||
e->monitor_name,
|
||||
eld_connection_type_names[e->conn_type]);
|
||||
|
||||
if (e->spk_alloc) {
|
||||
char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE];
|
||||
snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf));
|
||||
printk(KERN_INFO "HDMI: available speakers:%s\n", buf);
|
||||
_snd_printd(SND_PR_VERBOSE, "HDMI: available speakers:%s\n", buf);
|
||||
}
|
||||
|
||||
for (i = 0; i < e->sad_count; i++)
|
||||
|
|
|
@ -3972,9 +3972,14 @@ static void cx_auto_init_output(struct hda_codec *codec)
|
|||
int i;
|
||||
|
||||
mute_outputs(codec, spec->multiout.num_dacs, spec->multiout.dac_nids);
|
||||
for (i = 0; i < cfg->hp_outs; i++)
|
||||
for (i = 0; i < cfg->hp_outs; i++) {
|
||||
unsigned int val = PIN_OUT;
|
||||
if (snd_hda_query_pin_caps(codec, cfg->hp_pins[i]) &
|
||||
AC_PINCAP_HP_DRV)
|
||||
val |= AC_PINCTL_HP_EN;
|
||||
snd_hda_codec_write(codec, cfg->hp_pins[i], 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, val);
|
||||
}
|
||||
mute_outputs(codec, cfg->hp_outs, cfg->hp_pins);
|
||||
mute_outputs(codec, cfg->line_outs, cfg->line_out_pins);
|
||||
mute_outputs(codec, cfg->speaker_outs, cfg->speaker_pins);
|
||||
|
@ -4431,6 +4436,7 @@ static void apply_pincfg(struct hda_codec *codec, const struct cxt_pincfg *cfg)
|
|||
|
||||
enum {
|
||||
CXT_PINCFG_LENOVO_X200,
|
||||
CXT_PINCFG_LENOVO_TP410,
|
||||
CXT_FIXUP_STEREO_DMIC,
|
||||
};
|
||||
|
||||
|
@ -4455,6 +4461,7 @@ static void apply_fixup(struct hda_codec *codec,
|
|||
}
|
||||
}
|
||||
|
||||
/* ThinkPad X200 & co with cxt5051 */
|
||||
static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = {
|
||||
{ 0x16, 0x042140ff }, /* HP (seq# overridden) */
|
||||
{ 0x17, 0x21a11000 }, /* dock-mic */
|
||||
|
@ -4463,13 +4470,31 @@ static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
/* ThinkPad 410/420/510/520, X201 & co with cxt5066 */
|
||||
static const struct cxt_pincfg cxt_pincfg_lenovo_tp410[] = {
|
||||
{ 0x19, 0x042110ff }, /* HP (seq# overridden) */
|
||||
{ 0x1a, 0x21a190f0 }, /* dock-mic */
|
||||
{ 0x1c, 0x212140ff }, /* dock-HP */
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct cxt_pincfg *cxt_pincfg_tbl[] = {
|
||||
[CXT_PINCFG_LENOVO_X200] = cxt_pincfg_lenovo_x200,
|
||||
[CXT_PINCFG_LENOVO_TP410] = cxt_pincfg_lenovo_tp410,
|
||||
[CXT_FIXUP_STEREO_DMIC] = NULL,
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk cxt_fixups[] = {
|
||||
static const struct snd_pci_quirk cxt5051_fixups[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT_PINCFG_LENOVO_X200),
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk cxt5066_fixups[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo T410", CXT_PINCFG_LENOVO_TP410),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215f, "Lenovo T510", CXT_PINCFG_LENOVO_TP410),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21ce, "Lenovo T420", CXT_PINCFG_LENOVO_TP410),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC),
|
||||
{}
|
||||
};
|
||||
|
@ -4510,13 +4535,13 @@ static int patch_conexant_auto(struct hda_codec *codec)
|
|||
case 0x14f15051:
|
||||
add_cx5051_fake_mutes(codec);
|
||||
codec->pin_amp_workaround = 1;
|
||||
apply_fixup(codec, cxt5051_fixups, cxt_pincfg_tbl);
|
||||
break;
|
||||
default:
|
||||
codec->pin_amp_workaround = 1;
|
||||
apply_fixup(codec, cxt5066_fixups, cxt_pincfg_tbl);
|
||||
}
|
||||
|
||||
apply_fixup(codec, cxt_fixups, cxt_pincfg_tbl);
|
||||
|
||||
/* Show mute-led control only on HP laptops
|
||||
* This is a sort of white-list: on HP laptops, EAPD corresponds
|
||||
* only to the mute-LED without actualy amp function. Meanwhile,
|
||||
|
|
|
@ -757,8 +757,6 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)
|
|||
struct hdmi_spec *spec = codec->spec;
|
||||
int tag = res >> AC_UNSOL_RES_TAG_SHIFT;
|
||||
int pin_nid;
|
||||
int pd = !!(res & AC_UNSOL_RES_PD);
|
||||
int eldv = !!(res & AC_UNSOL_RES_ELDV);
|
||||
int pin_idx;
|
||||
struct hda_jack_tbl *jack;
|
||||
|
||||
|
@ -768,9 +766,10 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)
|
|||
pin_nid = jack->nid;
|
||||
jack->jack_dirty = 1;
|
||||
|
||||
printk(KERN_INFO
|
||||
_snd_printd(SND_PR_VERBOSE,
|
||||
"HDMI hot plug event: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n",
|
||||
codec->addr, pin_nid, pd, eldv);
|
||||
codec->addr, pin_nid,
|
||||
!!(res & AC_UNSOL_RES_PD), !!(res & AC_UNSOL_RES_ELDV));
|
||||
|
||||
pin_idx = pin_nid_to_pin_index(spec, pin_nid);
|
||||
if (pin_idx < 0)
|
||||
|
@ -992,7 +991,7 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
|
|||
if (eld->monitor_present)
|
||||
eld_valid = !!(present & AC_PINSENSE_ELDV);
|
||||
|
||||
printk(KERN_INFO
|
||||
_snd_printd(SND_PR_VERBOSE,
|
||||
"HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n",
|
||||
codec->addr, pin_nid, eld->monitor_present, eld_valid);
|
||||
|
||||
|
|
|
@ -1445,6 +1445,13 @@ enum {
|
|||
ALC_FIXUP_ACT_BUILD,
|
||||
};
|
||||
|
||||
static void alc_apply_pincfgs(struct hda_codec *codec,
|
||||
const struct alc_pincfg *cfg)
|
||||
{
|
||||
for (; cfg->nid; cfg++)
|
||||
snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
|
||||
}
|
||||
|
||||
static void alc_apply_fixup(struct hda_codec *codec, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
@ -1478,9 +1485,7 @@ static void alc_apply_fixup(struct hda_codec *codec, int action)
|
|||
snd_printdd(KERN_INFO "hda_codec: %s: "
|
||||
"Apply pincfg for %s\n",
|
||||
codec->chip_name, modelname);
|
||||
for (; cfg->nid; cfg++)
|
||||
snd_hda_codec_set_pincfg(codec, cfg->nid,
|
||||
cfg->val);
|
||||
alc_apply_pincfgs(codec, cfg);
|
||||
break;
|
||||
case ALC_FIXUP_VERBS:
|
||||
if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs)
|
||||
|
@ -3398,8 +3403,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
|
|||
for (;;) {
|
||||
badness = fill_and_eval_dacs(codec, fill_hardwired,
|
||||
fill_mio_first);
|
||||
if (badness < 0)
|
||||
if (badness < 0) {
|
||||
kfree(best_cfg);
|
||||
return badness;
|
||||
}
|
||||
debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
|
||||
cfg->line_out_type, fill_hardwired, fill_mio_first,
|
||||
badness);
|
||||
|
@ -4859,6 +4866,7 @@ enum {
|
|||
ALC260_FIXUP_GPIO1_TOGGLE,
|
||||
ALC260_FIXUP_REPLACER,
|
||||
ALC260_FIXUP_HP_B1900,
|
||||
ALC260_FIXUP_KN1,
|
||||
};
|
||||
|
||||
static void alc260_gpio1_automute(struct hda_codec *codec)
|
||||
|
@ -4886,6 +4894,36 @@ static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
|
|||
}
|
||||
}
|
||||
|
||||
static void alc260_fixup_kn1(struct hda_codec *codec,
|
||||
const struct alc_fixup *fix, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
static const struct alc_pincfg pincfgs[] = {
|
||||
{ 0x0f, 0x02214000 }, /* HP/speaker */
|
||||
{ 0x12, 0x90a60160 }, /* int mic */
|
||||
{ 0x13, 0x02a19000 }, /* ext mic */
|
||||
{ 0x18, 0x01446000 }, /* SPDIF out */
|
||||
/* disable bogus I/O pins */
|
||||
{ 0x10, 0x411111f0 },
|
||||
{ 0x11, 0x411111f0 },
|
||||
{ 0x14, 0x411111f0 },
|
||||
{ 0x15, 0x411111f0 },
|
||||
{ 0x16, 0x411111f0 },
|
||||
{ 0x17, 0x411111f0 },
|
||||
{ 0x19, 0x411111f0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
switch (action) {
|
||||
case ALC_FIXUP_ACT_PRE_PROBE:
|
||||
alc_apply_pincfgs(codec, pincfgs);
|
||||
break;
|
||||
case ALC_FIXUP_ACT_PROBE:
|
||||
spec->init_amp = ALC_INIT_NONE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct alc_fixup alc260_fixups[] = {
|
||||
[ALC260_FIXUP_HP_DC5750] = {
|
||||
.type = ALC_FIXUP_PINS,
|
||||
|
@ -4936,7 +4974,11 @@ static const struct alc_fixup alc260_fixups[] = {
|
|||
.v.func = alc260_fixup_gpio1_toggle,
|
||||
.chained = true,
|
||||
.chain_id = ALC260_FIXUP_COEF,
|
||||
}
|
||||
},
|
||||
[ALC260_FIXUP_KN1] = {
|
||||
.type = ALC_FIXUP_FUNC,
|
||||
.v.func = alc260_fixup_kn1,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc260_fixup_tbl[] = {
|
||||
|
@ -4946,6 +4988,7 @@ static const struct snd_pci_quirk alc260_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
|
||||
SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
|
||||
SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
|
||||
SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
|
||||
SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
|
||||
SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
|
||||
{}
|
||||
|
@ -5269,7 +5312,9 @@ static const struct alc_fixup alc882_fixups[] = {
|
|||
{ 0x16, 0x99130111 }, /* CLFE speaker */
|
||||
{ 0x17, 0x99130112 }, /* surround speaker */
|
||||
{ }
|
||||
}
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC882_FIXUP_GPIO1,
|
||||
},
|
||||
[ALC882_FIXUP_ACER_ASPIRE_8930G] = {
|
||||
.type = ALC_FIXUP_PINS,
|
||||
|
@ -5312,7 +5357,9 @@ static const struct alc_fixup alc882_fixups[] = {
|
|||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
|
||||
{ }
|
||||
}
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC882_FIXUP_GPIO1,
|
||||
},
|
||||
[ALC885_FIXUP_MACPRO_GPIO] = {
|
||||
.type = ALC_FIXUP_FUNC,
|
||||
|
@ -5359,6 +5406,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
ALC882_FIXUP_ACER_ASPIRE_4930G),
|
||||
SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
|
||||
SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
|
||||
SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
|
||||
SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
|
||||
SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
|
||||
|
@ -5384,6 +5432,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO),
|
||||
SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
|
||||
SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF),
|
||||
|
@ -5399,6 +5448,13 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static const struct alc_model_fixup alc882_fixup_models[] = {
|
||||
{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
|
||||
{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
|
||||
{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
|
||||
{}
|
||||
};
|
||||
|
||||
/*
|
||||
* BIOS auto configuration
|
||||
*/
|
||||
|
@ -5439,7 +5495,8 @@ static int patch_alc882(struct hda_codec *codec)
|
|||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups);
|
||||
alc_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
|
||||
alc882_fixups);
|
||||
alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
|
||||
|
||||
alc_auto_parse_customize_define(codec);
|
||||
|
|
|
@ -5063,12 +5063,11 @@ static void stac92xx_update_led_status(struct hda_codec *codec, int enabled)
|
|||
if (spec->gpio_led_polarity)
|
||||
muted = !muted;
|
||||
|
||||
/*polarity defines *not* muted state level*/
|
||||
if (!spec->vref_mute_led_nid) {
|
||||
if (muted)
|
||||
spec->gpio_data &= ~spec->gpio_led; /* orange */
|
||||
spec->gpio_data |= spec->gpio_led;
|
||||
else
|
||||
spec->gpio_data |= spec->gpio_led; /* white */
|
||||
spec->gpio_data &= ~spec->gpio_led;
|
||||
stac_gpio_set(codec, spec->gpio_mask,
|
||||
spec->gpio_dir, spec->gpio_data);
|
||||
} else {
|
||||
|
|
|
@ -140,7 +140,7 @@
|
|||
* min : 0xFE : -115.0 dB
|
||||
* mute: 0xFF
|
||||
*/
|
||||
static const DECLARE_TLV_DB_SCALE(out_tlv, -11500, 50, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(out_tlv, -11550, 50, 1);
|
||||
|
||||
static const struct snd_kcontrol_new ak4642_snd_controls[] = {
|
||||
|
||||
|
|
|
@ -143,11 +143,11 @@ static int mic_bias_event(struct snd_soc_dapm_widget *w,
|
|||
}
|
||||
|
||||
/*
|
||||
* using codec assist to small pop, hp_powerup or lineout_powerup
|
||||
* should stay setting until vag_powerup is fully ramped down,
|
||||
* vag fully ramped down require 400ms.
|
||||
* As manual described, ADC/DAC only works when VAG powerup,
|
||||
* So enabled VAG before ADC/DAC up.
|
||||
* In power down case, we need wait 400ms when vag fully ramped down.
|
||||
*/
|
||||
static int small_pop_event(struct snd_soc_dapm_widget *w,
|
||||
static int power_vag_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
switch (event) {
|
||||
|
@ -156,7 +156,7 @@ static int small_pop_event(struct snd_soc_dapm_widget *w,
|
|||
SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP);
|
||||
break;
|
||||
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
snd_soc_update_bits(w->codec, SGTL5000_CHIP_ANA_POWER,
|
||||
SGTL5000_VAG_POWERUP, 0);
|
||||
msleep(400);
|
||||
|
@ -201,12 +201,8 @@ static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = {
|
|||
mic_bias_event,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
|
||||
|
||||
SND_SOC_DAPM_PGA_E("HP", SGTL5000_CHIP_ANA_POWER, 4, 0, NULL, 0,
|
||||
small_pop_event,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
|
||||
SND_SOC_DAPM_PGA_E("LO", SGTL5000_CHIP_ANA_POWER, 0, 0, NULL, 0,
|
||||
small_pop_event,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
|
||||
SND_SOC_DAPM_PGA("HP", SGTL5000_CHIP_ANA_POWER, 4, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("LO", SGTL5000_CHIP_ANA_POWER, 0, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_MUX("Capture Mux", SND_SOC_NOPM, 0, 0, &adc_mux),
|
||||
SND_SOC_DAPM_MUX("Headphone Mux", SND_SOC_NOPM, 0, 0, &dac_mux),
|
||||
|
@ -221,8 +217,11 @@ static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = {
|
|||
0, SGTL5000_CHIP_DIG_POWER,
|
||||
1, 0),
|
||||
|
||||
SND_SOC_DAPM_ADC("ADC", "Capture", SGTL5000_CHIP_ANA_POWER, 1, 0),
|
||||
SND_SOC_DAPM_SUPPLY("VAG_POWER", SGTL5000_CHIP_ANA_POWER, 7, 0,
|
||||
power_vag_event,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
|
||||
SND_SOC_DAPM_ADC("ADC", "Capture", SGTL5000_CHIP_ANA_POWER, 1, 0),
|
||||
SND_SOC_DAPM_DAC("DAC", "Playback", SGTL5000_CHIP_ANA_POWER, 3, 0),
|
||||
};
|
||||
|
||||
|
@ -231,9 +230,11 @@ static const struct snd_soc_dapm_route sgtl5000_dapm_routes[] = {
|
|||
{"Capture Mux", "LINE_IN", "LINE_IN"}, /* line_in --> adc_mux */
|
||||
{"Capture Mux", "MIC_IN", "MIC_IN"}, /* mic_in --> adc_mux */
|
||||
|
||||
{"ADC", NULL, "VAG_POWER"},
|
||||
{"ADC", NULL, "Capture Mux"}, /* adc_mux --> adc */
|
||||
{"AIFOUT", NULL, "ADC"}, /* adc --> i2s_out */
|
||||
|
||||
{"DAC", NULL, "VAG_POWER"},
|
||||
{"DAC", NULL, "AIFIN"}, /* i2s-->dac,skip audio mux */
|
||||
{"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */
|
||||
{"LO", NULL, "DAC"}, /* dac --> line_out */
|
||||
|
|
|
@ -79,6 +79,9 @@ static ssize_t audmux_read_file(struct file *file, char __user *user_buf,
|
|||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!audmux_base)
|
||||
return -ENOSYS;
|
||||
|
||||
if (audmux_clk)
|
||||
clk_prepare_enable(audmux_clk);
|
||||
|
||||
|
@ -158,7 +161,7 @@ static void __init audmux_debugfs_init(void)
|
|||
return;
|
||||
}
|
||||
|
||||
for (i = 1; i < 8; i++) {
|
||||
for (i = 0; i < MX31_AUDMUX_PORT6_SSI_PINS_6 + 1; i++) {
|
||||
snprintf(buf, sizeof(buf), "ssi%d", i);
|
||||
if (!debugfs_create_file(buf, 0444, audmux_debugfs_root,
|
||||
(void *)i, &audmux_debugfs_fops))
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/initval.h>
|
||||
|
|
|
@ -1087,6 +1087,8 @@ static int soc_probe_platform(struct snd_soc_card *card,
|
|||
snd_soc_dapm_new_controls(&platform->dapm,
|
||||
driver->dapm_widgets, driver->num_dapm_widgets);
|
||||
|
||||
platform->dapm.idle_bias_off = 1;
|
||||
|
||||
if (driver->probe) {
|
||||
ret = driver->probe(platform);
|
||||
if (ret < 0) {
|
||||
|
|
|
@ -79,11 +79,15 @@ static int tegra_i2s_show(struct seq_file *s, void *unused)
|
|||
struct tegra_i2s *i2s = s->private;
|
||||
int i;
|
||||
|
||||
clk_enable(i2s->clk_i2s);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(regs); i++) {
|
||||
u32 val = tegra_i2s_read(i2s, regs[i].offset);
|
||||
seq_printf(s, "%s = %08x\n", regs[i].name, val);
|
||||
}
|
||||
|
||||
clk_disable(i2s->clk_i2s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -112,7 +116,7 @@ static void tegra_i2s_debug_remove(struct tegra_i2s *i2s)
|
|||
debugfs_remove(i2s->debug);
|
||||
}
|
||||
#else
|
||||
static inline void tegra_i2s_debug_add(struct tegra_i2s *i2s, int id)
|
||||
static inline void tegra_i2s_debug_add(struct tegra_i2s *i2s)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -79,11 +79,15 @@ static int tegra_spdif_show(struct seq_file *s, void *unused)
|
|||
struct tegra_spdif *spdif = s->private;
|
||||
int i;
|
||||
|
||||
clk_enable(spdif->clk_spdif_out);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(regs); i++) {
|
||||
u32 val = tegra_spdif_read(spdif, regs[i].offset);
|
||||
seq_printf(s, "%s = %08x\n", regs[i].name, val);
|
||||
}
|
||||
|
||||
clk_disable(spdif->clk_spdif_out);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче