Commit d3980110 authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'fix/hda' into topic/hda

Conflicts:
	sound/pci/hda/patch_conexant.c
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parents 83b0c6ba c817eebe
...@@ -43,7 +43,9 @@ ALC680 ...@@ -43,7 +43,9 @@ ALC680
ALC882/883/885/888/889 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 ALC861/660
========== ==========
......
...@@ -4807,6 +4807,7 @@ F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c ...@@ -4807,6 +4807,7 @@ F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
F: arch/arm/mach-omap2/clockdomain44xx.c F: arch/arm/mach-omap2/clockdomain44xx.c
OMAP AUDIO SUPPORT OMAP AUDIO SUPPORT
M: Peter Ujfalusi <peter.ujfalusi@ti.com>
M: Jarkko Nikula <jarkko.nikula@bitmer.com> M: Jarkko Nikula <jarkko.nikula@bitmer.com>
L: alsa-devel@alsa-project.org (subscribers-only) L: alsa-devel@alsa-project.org (subscribers-only)
L: linux-omap@vger.kernel.org L: linux-omap@vger.kernel.org
...@@ -7462,8 +7463,7 @@ F: include/linux/wm97xx.h ...@@ -7462,8 +7463,7 @@ F: include/linux/wm97xx.h
WOLFSON MICROELECTRONICS DRIVERS WOLFSON MICROELECTRONICS DRIVERS
M: Mark Brown <broonie@opensource.wolfsonmicro.com> M: Mark Brown <broonie@opensource.wolfsonmicro.com>
M: Ian Lartey <ian@opensource.wolfsonmicro.com> L: patches@opensource.wolfsonmicro.com
M: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices
......
...@@ -325,6 +325,13 @@ void release_and_free_resource(struct resource *res); ...@@ -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) #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)
__printf(4, 5) __printf(4, 5)
void __snd_printk(unsigned int level, const char *file, int line, 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, ...@@ -354,6 +361,8 @@ void __snd_printk(unsigned int level, const char *file, int line,
*/ */
#define snd_printd(fmt, args...) \ #define snd_printd(fmt, args...) \
__snd_printk(1, __FILE__, __LINE__, 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 * 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, ...@@ -383,6 +392,7 @@ void __snd_printk(unsigned int level, const char *file, int line,
#else /* !CONFIG_SND_DEBUG */ #else /* !CONFIG_SND_DEBUG */
#define snd_printd(fmt, args...) do { } while (0) #define snd_printd(fmt, args...) do { } while (0)
#define _snd_printd(level, fmt, args...) do { } while (0)
#define snd_BUG() do { } while (0) #define snd_BUG() do { } while (0)
static inline int __snd_bug_on(int cond) static inline int __snd_bug_on(int cond)
{ {
......
...@@ -419,6 +419,7 @@ EXPORT_SYMBOL(snd_ctl_make_virtual_master); ...@@ -419,6 +419,7 @@ EXPORT_SYMBOL(snd_ctl_make_virtual_master);
* snd_ctl_add_vmaster_hook - Add a hook to a vmaster control * snd_ctl_add_vmaster_hook - Add a hook to a vmaster control
* @kcontrol: vmaster kctl element * @kcontrol: vmaster kctl element
* @hook: the hook function * @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 * Adds the given hook to the vmaster control element so that it's called
* at each time when the value is changed. * at each time when the value is changed.
......
...@@ -1019,13 +1019,15 @@ static int __devinit create_sscape(int dev, struct snd_card *card) ...@@ -1019,13 +1019,15 @@ static int __devinit create_sscape(int dev, struct snd_card *card)
irq_cfg = get_irq_config(sscape->type, irq[dev]); irq_cfg = get_irq_config(sscape->type, irq[dev]);
if (irq_cfg == INVALID_IRQ) { if (irq_cfg == INVALID_IRQ) {
snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]); 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]); mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]);
if (mpu_irq_cfg == INVALID_IRQ) { if (mpu_irq_cfg == INVALID_IRQ) {
snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]); 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) ...@@ -38,4 +38,4 @@ static int __init alsa_sound_last_init(void)
return 0; 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) ...@@ -1294,6 +1294,8 @@ static int __init calibrate_adc(WORD srate)
static int upload_dsp_code(void) static int upload_dsp_code(void)
{ {
int ret = 0;
msnd_outb(HPBLKSEL_0, dev.io + HP_BLKS); msnd_outb(HPBLKSEL_0, dev.io + HP_BLKS);
#ifndef HAVE_DSPCODEH #ifndef HAVE_DSPCODEH
INITCODESIZE = mod_firmware_load(INITCODEFILE, &INITCODE); INITCODESIZE = mod_firmware_load(INITCODEFILE, &INITCODE);
...@@ -1312,7 +1314,8 @@ static int upload_dsp_code(void) ...@@ -1312,7 +1314,8 @@ static int upload_dsp_code(void)
memcpy_toio(dev.base, PERMCODE, PERMCODESIZE); memcpy_toio(dev.base, PERMCODE, PERMCODESIZE);
if (msnd_upload_host(&dev, INITCODE, INITCODESIZE) < 0) { if (msnd_upload_host(&dev, INITCODE, INITCODESIZE) < 0) {
printk(KERN_WARNING LOGNAME ": Error uploading to DSP\n"); printk(KERN_WARNING LOGNAME ": Error uploading to DSP\n");
return -ENODEV; ret = -ENODEV;
goto out;
} }
#ifdef HAVE_DSPCODEH #ifdef HAVE_DSPCODEH
printk(KERN_INFO LOGNAME ": DSP firmware uploaded (resident)\n"); printk(KERN_INFO LOGNAME ": DSP firmware uploaded (resident)\n");
...@@ -1320,12 +1323,13 @@ static int upload_dsp_code(void) ...@@ -1320,12 +1323,13 @@ static int upload_dsp_code(void)
printk(KERN_INFO LOGNAME ": DSP firmware uploaded\n"); printk(KERN_INFO LOGNAME ": DSP firmware uploaded\n");
#endif #endif
out:
#ifndef HAVE_DSPCODEH #ifndef HAVE_DSPCODEH
vfree(INITCODE); vfree(INITCODE);
vfree(PERMCODE); vfree(PERMCODE);
#endif #endif
return 0; return ret;
} }
#ifdef MSND_CLASSIC #ifdef MSND_CLASSIC
......
...@@ -418,7 +418,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a) ...@@ -418,7 +418,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a)
else else
buf2[0] = '\0'; 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", " channels = %d, rates =%s%s\n",
cea_audio_coding_type_names[a->format], cea_audio_coding_type_names[a->format],
a->channels, a->channels,
...@@ -442,14 +442,14 @@ void snd_hdmi_show_eld(struct hdmi_eld *e) ...@@ -442,14 +442,14 @@ void snd_hdmi_show_eld(struct hdmi_eld *e)
{ {
int i; 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, e->monitor_name,
eld_connection_type_names[e->conn_type]); eld_connection_type_names[e->conn_type]);
if (e->spk_alloc) { if (e->spk_alloc) {
char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE]; char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE];
snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf)); 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++) for (i = 0; i < e->sad_count; i++)
......
...@@ -3972,9 +3972,14 @@ static void cx_auto_init_output(struct hda_codec *codec) ...@@ -3972,9 +3972,14 @@ static void cx_auto_init_output(struct hda_codec *codec)
int i; int i;
mute_outputs(codec, spec->multiout.num_dacs, spec->multiout.dac_nids); 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, 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->hp_outs, cfg->hp_pins);
mute_outputs(codec, cfg->line_outs, cfg->line_out_pins); mute_outputs(codec, cfg->line_outs, cfg->line_out_pins);
mute_outputs(codec, cfg->speaker_outs, cfg->speaker_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) ...@@ -4431,6 +4436,7 @@ static void apply_pincfg(struct hda_codec *codec, const struct cxt_pincfg *cfg)
enum { enum {
CXT_PINCFG_LENOVO_X200, CXT_PINCFG_LENOVO_X200,
CXT_PINCFG_LENOVO_TP410,
CXT_FIXUP_STEREO_DMIC, CXT_FIXUP_STEREO_DMIC,
}; };
...@@ -4455,6 +4461,7 @@ static void apply_fixup(struct hda_codec *codec, ...@@ -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[] = { static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = {
{ 0x16, 0x042140ff }, /* HP (seq# overridden) */ { 0x16, 0x042140ff }, /* HP (seq# overridden) */
{ 0x17, 0x21a11000 }, /* dock-mic */ { 0x17, 0x21a11000 }, /* dock-mic */
...@@ -4463,13 +4470,31 @@ static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = { ...@@ -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[] = { static const struct cxt_pincfg *cxt_pincfg_tbl[] = {
[CXT_PINCFG_LENOVO_X200] = cxt_pincfg_lenovo_x200, [CXT_PINCFG_LENOVO_X200] = cxt_pincfg_lenovo_x200,
[CXT_PINCFG_LENOVO_TP410] = cxt_pincfg_lenovo_tp410,
[CXT_FIXUP_STEREO_DMIC] = NULL, [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), 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), SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC),
{} {}
}; };
...@@ -4510,13 +4535,13 @@ static int patch_conexant_auto(struct hda_codec *codec) ...@@ -4510,13 +4535,13 @@ static int patch_conexant_auto(struct hda_codec *codec)
case 0x14f15051: case 0x14f15051:
add_cx5051_fake_mutes(codec); add_cx5051_fake_mutes(codec);
codec->pin_amp_workaround = 1; codec->pin_amp_workaround = 1;
apply_fixup(codec, cxt5051_fixups, cxt_pincfg_tbl);
break; break;
default: default:
codec->pin_amp_workaround = 1; 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 /* Show mute-led control only on HP laptops
* This is a sort of white-list: on HP laptops, EAPD corresponds * This is a sort of white-list: on HP laptops, EAPD corresponds
* only to the mute-LED without actualy amp function. Meanwhile, * 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) ...@@ -757,8 +757,6 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)
struct hdmi_spec *spec = codec->spec; struct hdmi_spec *spec = codec->spec;
int tag = res >> AC_UNSOL_RES_TAG_SHIFT; int tag = res >> AC_UNSOL_RES_TAG_SHIFT;
int pin_nid; int pin_nid;
int pd = !!(res & AC_UNSOL_RES_PD);
int eldv = !!(res & AC_UNSOL_RES_ELDV);
int pin_idx; int pin_idx;
struct hda_jack_tbl *jack; struct hda_jack_tbl *jack;
...@@ -768,9 +766,10 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) ...@@ -768,9 +766,10 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)
pin_nid = jack->nid; pin_nid = jack->nid;
jack->jack_dirty = 1; 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", "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); pin_idx = pin_nid_to_pin_index(spec, pin_nid);
if (pin_idx < 0) if (pin_idx < 0)
...@@ -992,7 +991,7 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) ...@@ -992,7 +991,7 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
if (eld->monitor_present) if (eld->monitor_present)
eld_valid = !!(present & AC_PINSENSE_ELDV); 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", "HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n",
codec->addr, pin_nid, eld->monitor_present, eld_valid); codec->addr, pin_nid, eld->monitor_present, eld_valid);
......
...@@ -1445,6 +1445,13 @@ enum { ...@@ -1445,6 +1445,13 @@ enum {
ALC_FIXUP_ACT_BUILD, 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) static void alc_apply_fixup(struct hda_codec *codec, int action)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
...@@ -1478,9 +1485,7 @@ static void alc_apply_fixup(struct hda_codec *codec, int action) ...@@ -1478,9 +1485,7 @@ static void alc_apply_fixup(struct hda_codec *codec, int action)
snd_printdd(KERN_INFO "hda_codec: %s: " snd_printdd(KERN_INFO "hda_codec: %s: "
"Apply pincfg for %s\n", "Apply pincfg for %s\n",
codec->chip_name, modelname); codec->chip_name, modelname);
for (; cfg->nid; cfg++) alc_apply_pincfgs(codec, cfg);
snd_hda_codec_set_pincfg(codec, cfg->nid,
cfg->val);
break; break;
case ALC_FIXUP_VERBS: case ALC_FIXUP_VERBS:
if (action != ALC_FIXUP_ACT_PROBE || !fix->v.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) ...@@ -3398,8 +3403,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
for (;;) { for (;;) {
badness = fill_and_eval_dacs(codec, fill_hardwired, badness = fill_and_eval_dacs(codec, fill_hardwired,
fill_mio_first); fill_mio_first);
if (badness < 0) if (badness < 0) {
kfree(best_cfg);
return badness; return badness;
}
debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n", debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
cfg->line_out_type, fill_hardwired, fill_mio_first, cfg->line_out_type, fill_hardwired, fill_mio_first,
badness); badness);
...@@ -3434,7 +3441,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec) ...@@ -3434,7 +3441,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
cfg->line_out_type = AUTO_PIN_SPEAKER_OUT; cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
fill_hardwired = true; fill_hardwired = true;
continue; continue;
} }
if (cfg->hp_outs > 0 && if (cfg->hp_outs > 0 &&
cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
cfg->speaker_outs = cfg->line_outs; cfg->speaker_outs = cfg->line_outs;
...@@ -3448,7 +3455,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec) ...@@ -3448,7 +3455,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
cfg->line_out_type = AUTO_PIN_HP_OUT; cfg->line_out_type = AUTO_PIN_HP_OUT;
fill_hardwired = true; fill_hardwired = true;
continue; continue;
} }
break; break;
} }
...@@ -4423,7 +4430,7 @@ static int alc_parse_auto_config(struct hda_codec *codec, ...@@ -4423,7 +4430,7 @@ static int alc_parse_auto_config(struct hda_codec *codec,
static int alc880_parse_auto_config(struct hda_codec *codec) static int alc880_parse_auto_config(struct hda_codec *codec)
{ {
static const hda_nid_t alc880_ignore[] = { 0x1d, 0 }; static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 }; static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids); return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
} }
...@@ -4859,6 +4866,7 @@ enum { ...@@ -4859,6 +4866,7 @@ enum {
ALC260_FIXUP_GPIO1_TOGGLE, ALC260_FIXUP_GPIO1_TOGGLE,
ALC260_FIXUP_REPLACER, ALC260_FIXUP_REPLACER,
ALC260_FIXUP_HP_B1900, ALC260_FIXUP_HP_B1900,
ALC260_FIXUP_KN1,
}; };
static void alc260_gpio1_automute(struct hda_codec *codec) static void alc260_gpio1_automute(struct hda_codec *codec)
...@@ -4886,6 +4894,36 @@ static void alc260_fixup_gpio1_toggle(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[] = { static const struct alc_fixup alc260_fixups[] = {
[ALC260_FIXUP_HP_DC5750] = { [ALC260_FIXUP_HP_DC5750] = {
.type = ALC_FIXUP_PINS, .type = ALC_FIXUP_PINS,
...@@ -4936,7 +4974,11 @@ static const struct alc_fixup alc260_fixups[] = { ...@@ -4936,7 +4974,11 @@ static const struct alc_fixup alc260_fixups[] = {
.v.func = alc260_fixup_gpio1_toggle, .v.func = alc260_fixup_gpio1_toggle,
.chained = true, .chained = true,
.chain_id = ALC260_FIXUP_COEF, .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[] = { static const struct snd_pci_quirk alc260_fixup_tbl[] = {
...@@ -4946,6 +4988,7 @@ 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, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900), 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(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(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF), SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
{} {}
...@@ -5269,7 +5312,9 @@ static const struct alc_fixup alc882_fixups[] = { ...@@ -5269,7 +5312,9 @@ static const struct alc_fixup alc882_fixups[] = {
{ 0x16, 0x99130111 }, /* CLFE speaker */ { 0x16, 0x99130111 }, /* CLFE speaker */
{ 0x17, 0x99130112 }, /* surround speaker */ { 0x17, 0x99130112 }, /* surround speaker */
{ } { }
} },
.chained = true,
.chain_id = ALC882_FIXUP_GPIO1,
}, },
[ALC882_FIXUP_ACER_ASPIRE_8930G] = { [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
.type = ALC_FIXUP_PINS, .type = ALC_FIXUP_PINS,
...@@ -5312,7 +5357,9 @@ static const struct alc_fixup alc882_fixups[] = { ...@@ -5312,7 +5357,9 @@ static const struct alc_fixup alc882_fixups[] = {
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 }, { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 }, { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
{ } { }
} },
.chained = true,
.chain_id = ALC882_FIXUP_GPIO1,
}, },
[ALC885_FIXUP_MACPRO_GPIO] = { [ALC885_FIXUP_MACPRO_GPIO] = {
.type = ALC_FIXUP_FUNC, .type = ALC_FIXUP_FUNC,
...@@ -5359,6 +5406,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { ...@@ -5359,6 +5406,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
ALC882_FIXUP_ACER_ASPIRE_4930G), ALC882_FIXUP_ACER_ASPIRE_4930G),
SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), 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, 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(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
...@@ -5384,6 +5432,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { ...@@ -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, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 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, 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, 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, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", 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[] = { ...@@ -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 * BIOS auto configuration
*/ */
...@@ -5439,7 +5495,8 @@ static int patch_alc882(struct hda_codec *codec) ...@@ -5439,7 +5495,8 @@ static int patch_alc882(struct hda_codec *codec)
if (err < 0) if (err < 0)
goto error; 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_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
alc_auto_parse_customize_define(codec); alc_auto_parse_customize_define(codec);
...@@ -6079,7 +6136,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { ...@@ -6079,7 +6136,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
* Basically the device should work as is without the fixup table. * Basically the device should work as is without the fixup table.
* If BIOS doesn't give a proper info, enable the corresponding * If BIOS doesn't give a proper info, enable the corresponding
* fixup entry. * fixup entry.
*/ */
SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
ALC269_FIXUP_AMIC), ALC269_FIXUP_AMIC),
SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
...@@ -6296,7 +6353,7 @@ static void alc_fixup_no_jack_detect(struct hda_codec *codec, ...@@ -6296,7 +6353,7 @@ static void alc_fixup_no_jack_detect(struct hda_codec *codec,
{ {
if (action == ALC_FIXUP_ACT_PRE_PROBE) if (action == ALC_FIXUP_ACT_PRE_PROBE)
codec->no_jack_detect = 1; codec->no_jack_detect = 1;
} }
static const struct alc_fixup alc861_fixups[] = { static const struct alc_fixup alc861_fixups[] = {
[ALC861_FIXUP_FSC_AMILO_PI1505] = { [ALC861_FIXUP_FSC_AMILO_PI1505] = {
...@@ -6714,7 +6771,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { ...@@ -6714,7 +6771,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
* Basically the device should work as is without the fixup table. * Basically the device should work as is without the fixup table.
* If BIOS doesn't give a proper info, enable the corresponding * If BIOS doesn't give a proper info, enable the corresponding
* fixup entry. * fixup entry.
*/ */
SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3), SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1), SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
......
...@@ -5063,12 +5063,11 @@ static void stac92xx_update_led_status(struct hda_codec *codec, int enabled) ...@@ -5063,12 +5063,11 @@ static void stac92xx_update_led_status(struct hda_codec *codec, int enabled)
if (spec->gpio_led_polarity) if (spec->gpio_led_polarity)
muted = !muted; muted = !muted;
/*polarity defines *not* muted state level*/
if (!spec->vref_mute_led_nid) { if (!spec->vref_mute_led_nid) {
if (muted) if (muted)
spec->gpio_data &= ~spec->gpio_led; /* orange */ spec->gpio_data |= spec->gpio_led;
else else
spec->gpio_data |= spec->gpio_led; /* white */ spec->gpio_data &= ~spec->gpio_led;
stac_gpio_set(codec, spec->gpio_mask, stac_gpio_set(codec, spec->gpio_mask,
spec->gpio_dir, spec->gpio_data); spec->gpio_dir, spec->gpio_data);
} else { } else {
......
...@@ -140,7 +140,7 @@ ...@@ -140,7 +140,7 @@
* min : 0xFE : -115.0 dB * min : 0xFE : -115.0 dB
* mute: 0xFF * 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[] = { static const struct snd_kcontrol_new ak4642_snd_controls[] = {
......
...@@ -143,11 +143,11 @@ static int mic_bias_event(struct snd_soc_dapm_widget *w, ...@@ -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 * As manual described, ADC/DAC only works when VAG powerup,
* should stay setting until vag_powerup is fully ramped down, * So enabled VAG before ADC/DAC up.
* vag fully ramped down require 400ms. * 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) struct snd_kcontrol *kcontrol, int event)
{ {
switch (event) { switch (event) {
...@@ -156,7 +156,7 @@ static int small_pop_event(struct snd_soc_dapm_widget *w, ...@@ -156,7 +156,7 @@ static int small_pop_event(struct snd_soc_dapm_widget *w,
SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP); SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP);
break; break;
case SND_SOC_DAPM_PRE_PMD: case SND_SOC_DAPM_POST_PMD:
snd_soc_update_bits(w->codec, SGTL5000_CHIP_ANA_POWER, snd_soc_update_bits(w->codec, SGTL5000_CHIP_ANA_POWER,
SGTL5000_VAG_POWERUP, 0); SGTL5000_VAG_POWERUP, 0);
msleep(400); msleep(400);
...@@ -201,12 +201,8 @@ static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = { ...@@ -201,12 +201,8 @@ static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = {
mic_bias_event, mic_bias_event,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_PGA_E("HP", SGTL5000_CHIP_ANA_POWER, 4, 0, NULL, 0, SND_SOC_DAPM_PGA("HP", SGTL5000_CHIP_ANA_POWER, 4, 0, NULL, 0),
small_pop_event, SND_SOC_DAPM_PGA("LO", SGTL5000_CHIP_ANA_POWER, 0, 0, NULL, 0),
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_MUX("Capture Mux", SND_SOC_NOPM, 0, 0, &adc_mux), 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), 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[] = { ...@@ -221,8 +217,11 @@ static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = {
0, SGTL5000_CHIP_DIG_POWER, 0, SGTL5000_CHIP_DIG_POWER,
1, 0), 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), 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[] = { ...@@ -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", "LINE_IN", "LINE_IN"}, /* line_in --> adc_mux */
{"Capture Mux", "MIC_IN", "MIC_IN"}, /* mic_in --> adc_mux */ {"Capture Mux", "MIC_IN", "MIC_IN"}, /* mic_in --> adc_mux */
{"ADC", NULL, "VAG_POWER"},
{"ADC", NULL, "Capture Mux"}, /* adc_mux --> adc */ {"ADC", NULL, "Capture Mux"}, /* adc_mux --> adc */
{"AIFOUT", NULL, "ADC"}, /* adc --> i2s_out */ {"AIFOUT", NULL, "ADC"}, /* adc --> i2s_out */
{"DAC", NULL, "VAG_POWER"},
{"DAC", NULL, "AIFIN"}, /* i2s-->dac,skip audio mux */ {"DAC", NULL, "AIFIN"}, /* i2s-->dac,skip audio mux */
{"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */ {"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */
{"LO", NULL, "DAC"}, /* dac --> line_out */ {"LO", NULL, "DAC"}, /* dac --> line_out */
......
...@@ -79,6 +79,9 @@ static ssize_t audmux_read_file(struct file *file, char __user *user_buf, ...@@ -79,6 +79,9 @@ static ssize_t audmux_read_file(struct file *file, char __user *user_buf,
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
if (!audmux_base)
return -ENOSYS;
if (audmux_clk) if (audmux_clk)
clk_prepare_enable(audmux_clk); clk_prepare_enable(audmux_clk);
...@@ -158,7 +161,7 @@ static void __init audmux_debugfs_init(void) ...@@ -158,7 +161,7 @@ static void __init audmux_debugfs_init(void)
return; 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); snprintf(buf, sizeof(buf), "ssi%d", i);
if (!debugfs_create_file(buf, 0444, audmux_debugfs_root, if (!debugfs_create_file(buf, 0444, audmux_debugfs_root,
(void *)i, &audmux_debugfs_fops)) (void *)i, &audmux_debugfs_fops))
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/io.h>
#include <sound/core.h> #include <sound/core.h>
#include <sound/pcm.h> #include <sound/pcm.h>
#include <sound/initval.h> #include <sound/initval.h>
......
...@@ -1087,6 +1087,8 @@ static int soc_probe_platform(struct snd_soc_card *card, ...@@ -1087,6 +1087,8 @@ static int soc_probe_platform(struct snd_soc_card *card,
snd_soc_dapm_new_controls(&platform->dapm, snd_soc_dapm_new_controls(&platform->dapm,
driver->dapm_widgets, driver->num_dapm_widgets); driver->dapm_widgets, driver->num_dapm_widgets);
platform->dapm.idle_bias_off = 1;
if (driver->probe) { if (driver->probe) {
ret = driver->probe(platform); ret = driver->probe(platform);
if (ret < 0) { if (ret < 0) {
......
...@@ -79,11 +79,15 @@ static int tegra_i2s_show(struct seq_file *s, void *unused) ...@@ -79,11 +79,15 @@ static int tegra_i2s_show(struct seq_file *s, void *unused)
struct tegra_i2s *i2s = s->private; struct tegra_i2s *i2s = s->private;
int i; int i;
clk_enable(i2s->clk_i2s);
for (i = 0; i < ARRAY_SIZE(regs); i++) { for (i = 0; i < ARRAY_SIZE(regs); i++) {
u32 val = tegra_i2s_read(i2s, regs[i].offset); u32 val = tegra_i2s_read(i2s, regs[i].offset);
seq_printf(s, "%s = %08x\n", regs[i].name, val); seq_printf(s, "%s = %08x\n", regs[i].name, val);
} }
clk_disable(i2s->clk_i2s);
return 0; return 0;
} }
...@@ -112,7 +116,7 @@ static void tegra_i2s_debug_remove(struct tegra_i2s *i2s) ...@@ -112,7 +116,7 @@ static void tegra_i2s_debug_remove(struct tegra_i2s *i2s)
debugfs_remove(i2s->debug); debugfs_remove(i2s->debug);
} }
#else #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) ...@@ -79,11 +79,15 @@ static int tegra_spdif_show(struct seq_file *s, void *unused)
struct tegra_spdif *spdif = s->private; struct tegra_spdif *spdif = s->private;
int i; int i;
clk_enable(spdif->clk_spdif_out);
for (i = 0; i < ARRAY_SIZE(regs); i++) { for (i = 0; i < ARRAY_SIZE(regs); i++) {
u32 val = tegra_spdif_read(spdif, regs[i].offset); u32 val = tegra_spdif_read(spdif, regs[i].offset);
seq_printf(s, "%s = %08x\n", regs[i].name, val); seq_printf(s, "%s = %08x\n", regs[i].name, val);
} }
clk_disable(spdif->clk_spdif_out);
return 0; return 0;
} }
......
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