Commit a1ada086 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 - A series of fixes for Conexant 20549 HD-audio codec chip
 - A workaround for HDMI hotplug debug prints that annoyed people
 - A fix for the new support of platform DAPM contexts
 - Many driver-specific minor fixes

* tag 'sound-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda - hide HDMI/ELD printks unless snd.debug=2
  ALSA: sound/isa/sscape.c: add missing resource-release code
  sound: sound/oss/msnd_pinnacle.c: add vfrees
  ALSA: hda - clean up CX20549 test mixer setup
  ALSA: hda - CX20549 doesn't need pin_amp_workaround.
  ALSA: hda - Remove CD control from model=benq for CX20549
  ALSA: hda - fix record volume controls of CX20459 ("Venice")
  ALSA: hda - Rename capture sources of CX20549 to match common conventions
  ALSA: hda - Fix proc output for ADC amp values of CX20549
  ASoC: tegra: fix i2s compilation when !CONFIG_DEBUG_FS
  ASoC: set idle_bias_off=1 for all platform DAPM contexts
  ASoC: imx-audmux: Check for NULL pointer
  ASoC: imx-audmux: Fix ssi port numbers in sysfs
  ASoC: ak4642: fixup: mute needs +1 step
  MAINTAINERS: Don't list everyone working on Wolfson drivers
  MAINTAINERS: Add missing ASoC OMAP co-maintainer
  ASoC: pxa: pxa2xx-i2s: add io.h for IOMEM macro
  ASoC: tegra: ensure clocks are enabled when touching registers
  ASoC: sgtl5000: Enable VAG when DAC/ADC up
  ALSA: asihpi - fix return value of hpios_locked_mem_alloc()
parents 39f86a60 fae3d88a
...@@ -4803,6 +4803,7 @@ F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c ...@@ -4803,6 +4803,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
...@@ -7461,8 +7462,7 @@ F: include/linux/wm97xx.h ...@@ -7461,8 +7462,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)
{ {
......
...@@ -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;
} }
/* /*
......
...@@ -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
......
/****************************************************************************** /******************************************************************************
AudioScience HPI driver AudioScience HPI driver
Copyright (C) 1997-2011 AudioScience Inc. <support@audioscience.com> Copyright (C) 1997-2012 AudioScience Inc. <support@audioscience.com>
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as it under the terms of version 2 of the GNU General Public License as
...@@ -42,7 +42,7 @@ On error *pLockedMemHandle marked invalid, non-zero returned. ...@@ -42,7 +42,7 @@ On error *pLockedMemHandle marked invalid, non-zero returned.
If this function succeeds, then HpiOs_LockedMem_GetVirtAddr() and If this function succeeds, then HpiOs_LockedMem_GetVirtAddr() and
HpiOs_LockedMem_GetPyhsAddr() will always succed on the returned handle. HpiOs_LockedMem_GetPyhsAddr() will always succed on the returned handle.
*/ */
int hpios_locked_mem_alloc(struct consistent_dma_area *p_locked_mem_handle, u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_locked_mem_handle,
/**< memory handle */ /**< memory handle */
u32 size, /**< Size in bytes to allocate */ u32 size, /**< Size in bytes to allocate */
struct pci_dev *p_os_reference struct pci_dev *p_os_reference
......
/****************************************************************************** /******************************************************************************
AudioScience HPI driver AudioScience HPI driver
Copyright (C) 1997-2011 AudioScience Inc. <support@audioscience.com> Copyright (C) 1997-2012 AudioScience Inc. <support@audioscience.com>
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as it under the terms of version 2 of the GNU General Public License as
...@@ -39,11 +39,11 @@ void hpios_delay_micro_seconds(u32 num_micro_sec) ...@@ -39,11 +39,11 @@ void hpios_delay_micro_seconds(u32 num_micro_sec)
} }
/** Allocated an area of locked memory for bus master DMA operations. /** Allocate an area of locked memory for bus master DMA operations.
On error, return -ENOMEM, and *pMemArea.size = 0 If allocation fails, return 1, and *pMemArea.size = 0
*/ */
int hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size, u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size,
struct pci_dev *pdev) struct pci_dev *pdev)
{ {
/*?? any benefit in using managed dmam_alloc_coherent? */ /*?? any benefit in using managed dmam_alloc_coherent? */
...@@ -62,7 +62,7 @@ int hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size, ...@@ -62,7 +62,7 @@ int hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size,
HPI_DEBUG_LOG(WARNING, HPI_DEBUG_LOG(WARNING,
"failed to allocate %d bytes locked memory\n", size); "failed to allocate %d bytes locked memory\n", size);
p_mem_area->size = 0; p_mem_area->size = 0;
return -ENOMEM; return 1;
} }
} }
......
...@@ -851,6 +851,9 @@ struct hda_codec { ...@@ -851,6 +851,9 @@ struct hda_codec {
unsigned int pin_amp_workaround:1; /* pin out-amp takes index unsigned int pin_amp_workaround:1; /* pin out-amp takes index
* (e.g. Conexant codecs) * (e.g. Conexant codecs)
*/ */
unsigned int single_adc_amp:1; /* adc in-amp takes no index
* (e.g. CX20549 codec)
*/
unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */ unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */
unsigned int pins_shutup:1; /* pins are shut up */ unsigned int pins_shutup:1; /* pins are shut up */
unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
......
...@@ -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++)
......
...@@ -651,9 +651,16 @@ static void print_codec_info(struct snd_info_entry *entry, ...@@ -651,9 +651,16 @@ static void print_codec_info(struct snd_info_entry *entry,
snd_iprintf(buffer, " Amp-In caps: "); snd_iprintf(buffer, " Amp-In caps: ");
print_amp_caps(buffer, codec, nid, HDA_INPUT); print_amp_caps(buffer, codec, nid, HDA_INPUT);
snd_iprintf(buffer, " Amp-In vals: "); snd_iprintf(buffer, " Amp-In vals: ");
if (wid_type == AC_WID_PIN ||
(codec->single_adc_amp &&
wid_type == AC_WID_AUD_IN))
print_amp_vals(buffer, codec, nid, HDA_INPUT, print_amp_vals(buffer, codec, nid, HDA_INPUT,
wid_caps & AC_WCAP_STEREO, wid_caps & AC_WCAP_STEREO,
wid_type == AC_WID_PIN ? 1 : conn_len); 1);
else
print_amp_vals(buffer, codec, nid, HDA_INPUT,
wid_caps & AC_WCAP_STEREO,
conn_len);
} }
if (wid_caps & AC_WCAP_OUT_AMP) { if (wid_caps & AC_WCAP_OUT_AMP) {
snd_iprintf(buffer, " Amp-Out caps: "); snd_iprintf(buffer, " Amp-Out caps: ");
......
...@@ -141,7 +141,6 @@ struct conexant_spec { ...@@ -141,7 +141,6 @@ struct conexant_spec {
unsigned int hp_laptop:1; unsigned int hp_laptop:1;
unsigned int asus:1; unsigned int asus:1;
unsigned int pin_eapd_ctrls:1; unsigned int pin_eapd_ctrls:1;
unsigned int single_adc_amp:1;
unsigned int adc_switching:1; unsigned int adc_switching:1;
...@@ -687,18 +686,17 @@ static const struct hda_channel_mode cxt5045_modes[1] = { ...@@ -687,18 +686,17 @@ static const struct hda_channel_mode cxt5045_modes[1] = {
static const struct hda_input_mux cxt5045_capture_source = { static const struct hda_input_mux cxt5045_capture_source = {
.num_items = 2, .num_items = 2,
.items = { .items = {
{ "IntMic", 0x1 }, { "Internal Mic", 0x1 },
{ "ExtMic", 0x2 }, { "Mic", 0x2 },
} }
}; };
static const struct hda_input_mux cxt5045_capture_source_benq = { static const struct hda_input_mux cxt5045_capture_source_benq = {
.num_items = 5, .num_items = 4,
.items = { .items = {
{ "IntMic", 0x1 }, { "Internal Mic", 0x1 },
{ "ExtMic", 0x2 }, { "Mic", 0x2 },
{ "LineIn", 0x3 }, { "Line", 0x3 },
{ "CD", 0x4 },
{ "Mixer", 0x0 }, { "Mixer", 0x0 },
} }
}; };
...@@ -706,8 +704,8 @@ static const struct hda_input_mux cxt5045_capture_source_benq = { ...@@ -706,8 +704,8 @@ static const struct hda_input_mux cxt5045_capture_source_benq = {
static const struct hda_input_mux cxt5045_capture_source_hp530 = { static const struct hda_input_mux cxt5045_capture_source_hp530 = {
.num_items = 2, .num_items = 2,
.items = { .items = {
{ "ExtMic", 0x1 }, { "Mic", 0x1 },
{ "IntMic", 0x2 }, { "Internal Mic", 0x2 },
} }
}; };
...@@ -798,10 +796,8 @@ static void cxt5045_hp_unsol_event(struct hda_codec *codec, ...@@ -798,10 +796,8 @@ static void cxt5045_hp_unsol_event(struct hda_codec *codec,
} }
static const struct snd_kcontrol_new cxt5045_mixers[] = { static const struct snd_kcontrol_new cxt5045_mixers[] = {
HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x00, HDA_INPUT),
HDA_CODEC_MUTE("Internal Mic Capture Switch", 0x1a, 0x01, HDA_INPUT), HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT),
HDA_CODEC_VOLUME("Mic Capture Volume", 0x1a, 0x02, HDA_INPUT),
HDA_CODEC_MUTE("Mic Capture Switch", 0x1a, 0x02, HDA_INPUT),
HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT), HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT),
HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT), HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT),
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x1, HDA_INPUT), HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x1, HDA_INPUT),
...@@ -822,27 +818,15 @@ static const struct snd_kcontrol_new cxt5045_mixers[] = { ...@@ -822,27 +818,15 @@ static const struct snd_kcontrol_new cxt5045_mixers[] = {
}; };
static const struct snd_kcontrol_new cxt5045_benq_mixers[] = { static const struct snd_kcontrol_new cxt5045_benq_mixers[] = {
HDA_CODEC_VOLUME("CD Capture Volume", 0x1a, 0x04, HDA_INPUT), HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x3, HDA_INPUT),
HDA_CODEC_MUTE("CD Capture Switch", 0x1a, 0x04, HDA_INPUT), HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x3, HDA_INPUT),
HDA_CODEC_VOLUME("CD Playback Volume", 0x17, 0x4, HDA_INPUT),
HDA_CODEC_MUTE("CD Playback Switch", 0x17, 0x4, HDA_INPUT),
HDA_CODEC_VOLUME("Line In Capture Volume", 0x1a, 0x03, HDA_INPUT),
HDA_CODEC_MUTE("Line In Capture Switch", 0x1a, 0x03, HDA_INPUT),
HDA_CODEC_VOLUME("Line In Playback Volume", 0x17, 0x3, HDA_INPUT),
HDA_CODEC_MUTE("Line In Playback Switch", 0x17, 0x3, HDA_INPUT),
HDA_CODEC_VOLUME("Mixer Capture Volume", 0x1a, 0x0, HDA_INPUT),
HDA_CODEC_MUTE("Mixer Capture Switch", 0x1a, 0x0, HDA_INPUT),
{} {}
}; };
static const struct snd_kcontrol_new cxt5045_mixers_hp530[] = { static const struct snd_kcontrol_new cxt5045_mixers_hp530[] = {
HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x00, HDA_INPUT),
HDA_CODEC_MUTE("Internal Mic Capture Switch", 0x1a, 0x02, HDA_INPUT), HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT),
HDA_CODEC_VOLUME("Mic Capture Volume", 0x1a, 0x01, HDA_INPUT),
HDA_CODEC_MUTE("Mic Capture Switch", 0x1a, 0x01, HDA_INPUT),
HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT), HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT),
HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT), HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT),
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x2, HDA_INPUT), HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x2, HDA_INPUT),
...@@ -946,10 +930,10 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = { ...@@ -946,10 +930,10 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = {
/* Output controls */ /* Output controls */
HDA_CODEC_VOLUME("Speaker Playback Volume", 0x10, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("Speaker Playback Volume", 0x10, 0x0, HDA_OUTPUT),
HDA_CODEC_MUTE("Speaker Playback Switch", 0x10, 0x0, HDA_OUTPUT), HDA_CODEC_MUTE("Speaker Playback Switch", 0x10, 0x0, HDA_OUTPUT),
HDA_CODEC_VOLUME("Node 11 Playback Volume", 0x11, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("HP-OUT Playback Volume", 0x11, 0x0, HDA_OUTPUT),
HDA_CODEC_MUTE("Node 11 Playback Switch", 0x11, 0x0, HDA_OUTPUT), HDA_CODEC_MUTE("HP-OUT Playback Switch", 0x11, 0x0, HDA_OUTPUT),
HDA_CODEC_VOLUME("Node 12 Playback Volume", 0x12, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x12, 0x0, HDA_OUTPUT),
HDA_CODEC_MUTE("Node 12 Playback Switch", 0x12, 0x0, HDA_OUTPUT), HDA_CODEC_MUTE("LINE1 Playback Switch", 0x12, 0x0, HDA_OUTPUT),
/* Modes for retasking pin widgets */ /* Modes for retasking pin widgets */
CXT_PIN_MODE("HP-OUT pin mode", 0x11, CXT_PIN_DIR_INOUT), CXT_PIN_MODE("HP-OUT pin mode", 0x11, CXT_PIN_DIR_INOUT),
...@@ -960,16 +944,16 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = { ...@@ -960,16 +944,16 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = {
/* Loopback mixer controls */ /* Loopback mixer controls */
HDA_CODEC_VOLUME("Mixer-1 Volume", 0x17, 0x0, HDA_INPUT), HDA_CODEC_VOLUME("PCM Volume", 0x17, 0x0, HDA_INPUT),
HDA_CODEC_MUTE("Mixer-1 Switch", 0x17, 0x0, HDA_INPUT), HDA_CODEC_MUTE("PCM Switch", 0x17, 0x0, HDA_INPUT),
HDA_CODEC_VOLUME("Mixer-2 Volume", 0x17, 0x1, HDA_INPUT), HDA_CODEC_VOLUME("MIC1 pin Volume", 0x17, 0x1, HDA_INPUT),
HDA_CODEC_MUTE("Mixer-2 Switch", 0x17, 0x1, HDA_INPUT), HDA_CODEC_MUTE("MIC1 pin Switch", 0x17, 0x1, HDA_INPUT),
HDA_CODEC_VOLUME("Mixer-3 Volume", 0x17, 0x2, HDA_INPUT), HDA_CODEC_VOLUME("LINE1 pin Volume", 0x17, 0x2, HDA_INPUT),
HDA_CODEC_MUTE("Mixer-3 Switch", 0x17, 0x2, HDA_INPUT), HDA_CODEC_MUTE("LINE1 pin Switch", 0x17, 0x2, HDA_INPUT),
HDA_CODEC_VOLUME("Mixer-4 Volume", 0x17, 0x3, HDA_INPUT), HDA_CODEC_VOLUME("HP-OUT pin Volume", 0x17, 0x3, HDA_INPUT),
HDA_CODEC_MUTE("Mixer-4 Switch", 0x17, 0x3, HDA_INPUT), HDA_CODEC_MUTE("HP-OUT pin Switch", 0x17, 0x3, HDA_INPUT),
HDA_CODEC_VOLUME("Mixer-5 Volume", 0x17, 0x4, HDA_INPUT), HDA_CODEC_VOLUME("CD pin Volume", 0x17, 0x4, HDA_INPUT),
HDA_CODEC_MUTE("Mixer-5 Switch", 0x17, 0x4, HDA_INPUT), HDA_CODEC_MUTE("CD pin Switch", 0x17, 0x4, HDA_INPUT),
{ {
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Input Source", .name = "Input Source",
...@@ -978,16 +962,8 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = { ...@@ -978,16 +962,8 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = {
.put = conexant_mux_enum_put, .put = conexant_mux_enum_put,
}, },
/* Audio input controls */ /* Audio input controls */
HDA_CODEC_VOLUME("Input-1 Volume", 0x1a, 0x0, HDA_INPUT), HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x0, HDA_INPUT),
HDA_CODEC_MUTE("Input-1 Switch", 0x1a, 0x0, HDA_INPUT), HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT),
HDA_CODEC_VOLUME("Input-2 Volume", 0x1a, 0x1, HDA_INPUT),
HDA_CODEC_MUTE("Input-2 Switch", 0x1a, 0x1, HDA_INPUT),
HDA_CODEC_VOLUME("Input-3 Volume", 0x1a, 0x2, HDA_INPUT),
HDA_CODEC_MUTE("Input-3 Switch", 0x1a, 0x2, HDA_INPUT),
HDA_CODEC_VOLUME("Input-4 Volume", 0x1a, 0x3, HDA_INPUT),
HDA_CODEC_MUTE("Input-4 Switch", 0x1a, 0x3, HDA_INPUT),
HDA_CODEC_VOLUME("Input-5 Volume", 0x1a, 0x4, HDA_INPUT),
HDA_CODEC_MUTE("Input-5 Switch", 0x1a, 0x4, HDA_INPUT),
{ } /* end */ { } /* end */
}; };
...@@ -1009,10 +985,6 @@ static const struct hda_verb cxt5045_test_init_verbs[] = { ...@@ -1009,10 +985,6 @@ static const struct hda_verb cxt5045_test_init_verbs[] = {
{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
{0x18, AC_VERB_SET_DIGI_CONVERT_1, 0}, {0x18, AC_VERB_SET_DIGI_CONVERT_1, 0},
/* Start with output sum widgets muted and their output gains at min */
{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
/* Unmute retasking pin widget output buffers since the default /* Unmute retasking pin widget output buffers since the default
* state appears to be output. As the pin mode is changed by the * state appears to be output. As the pin mode is changed by the
* user the pin mode control will take care of enabling the pin's * user the pin mode control will take care of enabling the pin's
...@@ -1027,11 +999,11 @@ static const struct hda_verb cxt5045_test_init_verbs[] = { ...@@ -1027,11 +999,11 @@ static const struct hda_verb cxt5045_test_init_verbs[] = {
/* Set ADC connection select to match default mixer setting (mic1 /* Set ADC connection select to match default mixer setting (mic1
* pin) * pin)
*/ */
{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
{0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, {0x17, AC_VERB_SET_CONNECT_SEL, 0x01},
/* Mute all inputs to mixer widget (even unconnected ones) */ /* Mute all inputs to mixer widget (even unconnected ones) */
{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* Mixer pin */ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* Mixer */
{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* Mic1 pin */ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* Mic1 pin */
{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* Line pin */ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* Line pin */
{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* HP pin */ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* HP pin */
...@@ -1110,7 +1082,7 @@ static int patch_cxt5045(struct hda_codec *codec) ...@@ -1110,7 +1082,7 @@ static int patch_cxt5045(struct hda_codec *codec)
if (!spec) if (!spec)
return -ENOMEM; return -ENOMEM;
codec->spec = spec; codec->spec = spec;
codec->pin_amp_workaround = 1; codec->single_adc_amp = 1;
spec->multiout.max_channels = 2; spec->multiout.max_channels = 2;
spec->multiout.num_dacs = ARRAY_SIZE(cxt5045_dac_nids); spec->multiout.num_dacs = ARRAY_SIZE(cxt5045_dac_nids);
...@@ -4220,7 +4192,7 @@ static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid, ...@@ -4220,7 +4192,7 @@ static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid,
int idx = get_input_connection(codec, adc_nid, nid); int idx = get_input_connection(codec, adc_nid, nid);
if (idx < 0) if (idx < 0)
continue; continue;
if (spec->single_adc_amp) if (codec->single_adc_amp)
idx = 0; idx = 0;
return cx_auto_add_volume_idx(codec, label, pfx, return cx_auto_add_volume_idx(codec, label, pfx,
cidx, adc_nid, HDA_INPUT, idx); cidx, adc_nid, HDA_INPUT, idx);
...@@ -4275,7 +4247,7 @@ static int cx_auto_build_input_controls(struct hda_codec *codec) ...@@ -4275,7 +4247,7 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
if (cidx < 0) if (cidx < 0)
continue; continue;
input_conn[i] = spec->imux_info[i].adc; input_conn[i] = spec->imux_info[i].adc;
if (!spec->single_adc_amp) if (!codec->single_adc_amp)
input_conn[i] |= cidx << 8; input_conn[i] |= cidx << 8;
if (i > 0 && input_conn[i] != input_conn[0]) if (i > 0 && input_conn[i] != input_conn[0])
multi_connection = 1; multi_connection = 1;
...@@ -4466,15 +4438,17 @@ static int patch_conexant_auto(struct hda_codec *codec) ...@@ -4466,15 +4438,17 @@ static int patch_conexant_auto(struct hda_codec *codec)
if (!spec) if (!spec)
return -ENOMEM; return -ENOMEM;
codec->spec = spec; codec->spec = spec;
codec->pin_amp_workaround = 1;
switch (codec->vendor_id) { switch (codec->vendor_id) {
case 0x14f15045: case 0x14f15045:
spec->single_adc_amp = 1; codec->single_adc_amp = 1;
break; break;
case 0x14f15051: case 0x14f15051:
add_cx5051_fake_mutes(codec); add_cx5051_fake_mutes(codec);
codec->pin_amp_workaround = 1;
break; break;
default:
codec->pin_amp_workaround = 1;
} }
apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl); apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl);
......
...@@ -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);
......
...@@ -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 */
......
...@@ -73,6 +73,9 @@ static ssize_t audmux_read_file(struct file *file, char __user *user_buf, ...@@ -73,6 +73,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);
...@@ -152,7 +155,7 @@ static void __init audmux_debugfs_init(void) ...@@ -152,7 +155,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>
......
...@@ -1081,6 +1081,8 @@ static int soc_probe_platform(struct snd_soc_card *card, ...@@ -1081,6 +1081,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