All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lu Guanqun <guanqun.lu@intel.com>
To: ALSA <alsa-devel@alsa-project.org>, Lu Guanqun <guanqun.lu@intel.com>
Cc: Takashi Iwai <tiwai@suse.de>, Koul Vinod <vinod.koul@intel.com>,
	Mark Brown <broonie@opensource.wolfsonmicro.com>,
	Liam Girdwood <lrg@ti.com>,
	Wang Xingchao <xingchao.wang@intel.com>
Subject: [PATCH 01/19] ASoC: upd9976: Add Renesas uPD9976 codec driver
Date: Wed, 04 May 2011 21:44:58 +0800	[thread overview]
Message-ID: <20110504134458.32443.45825.stgit@localhost> (raw)
In-Reply-To: <20110504133756.32443.6282.stgit@localhost>

uPD9976 is a complex codec, however this patch only provides basic playback
functionality for headphone. More functionality will be added bit by bit in the
following patches.

Signed-off-by: Lu Guanqun <guanqun.lu@intel.com>
Signed-off-by: Wang Xingchao <xingchao.wang@intel.com>
---
 sound/soc/codecs/Kconfig   |    4 
 sound/soc/codecs/Makefile  |    2 
 sound/soc/codecs/upd9976.c |  407 ++++++++++++++++++++++++++++++++++++++++++++
 sound/soc/codecs/upd9976.h |   83 +++++++++
 4 files changed, 496 insertions(+), 0 deletions(-)
 create mode 100644 sound/soc/codecs/upd9976.c
 create mode 100644 sound/soc/codecs/upd9976.h

diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 2a69718..b914bc6 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -52,6 +52,7 @@ config SND_SOC_ALL_CODECS
 	select SND_SOC_TWL6040 if TWL4030_CORE
 	select SND_SOC_UDA134X
 	select SND_SOC_UDA1380 if I2C
+	select SND_SOC_UPD9976 if INTEL_SCU_IPC
 	select SND_SOC_WL1273 if MFD_WL1273_CORE
 	select SND_SOC_WM1250_EV1 if I2C
 	select SND_SOC_WM2000 if I2C
@@ -244,6 +245,9 @@ config SND_SOC_UDA134X
 config SND_SOC_UDA1380
         tristate
 
+config SND_SOC_UPD9976
+	tristate
+
 config SND_SOC_WL1273
 	tristate
 
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 4cb2f42..163c623 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -37,6 +37,7 @@ snd-soc-twl4030-objs := twl4030.o
 snd-soc-twl6040-objs := twl6040.o
 snd-soc-uda134x-objs := uda134x.o
 snd-soc-uda1380-objs := uda1380.o
+snd-soc-upd9976-objs := upd9976.o
 snd-soc-wl1273-objs := wl1273.o
 snd-soc-wm1250-ev1-objs := wm1250-ev1.o
 snd-soc-wm8350-objs := wm8350.o
@@ -128,6 +129,7 @@ obj-$(CONFIG_SND_SOC_TWL4030)	+= snd-soc-twl4030.o
 obj-$(CONFIG_SND_SOC_TWL6040)	+= snd-soc-twl6040.o
 obj-$(CONFIG_SND_SOC_UDA134X)	+= snd-soc-uda134x.o
 obj-$(CONFIG_SND_SOC_UDA1380)	+= snd-soc-uda1380.o
+obj-$(CONFIG_SND_SOC_UPD9976)	+= snd-soc-upd9976.o
 obj-$(CONFIG_SND_SOC_WL1273)	+= snd-soc-wl1273.o
 obj-$(CONFIG_SND_SOC_WM1250_EV1) += snd-soc-wm1250-ev1.o
 obj-$(CONFIG_SND_SOC_WM8350)	+= snd-soc-wm8350.o
diff --git a/sound/soc/codecs/upd9976.c b/sound/soc/codecs/upd9976.c
new file mode 100644
index 0000000..cd68633
--- /dev/null
+++ b/sound/soc/codecs/upd9976.c
@@ -0,0 +1,407 @@
+/*
+ *  upd9976.c -  Renesas uPD9976 codec driver
+ *
+ *  Copyright (C) 2011 Intel Corporation
+ *
+ *  Maintainer:
+ *              Lu Guanqun <guanqun.lu@intel.com>
+ *              Wang Xingchao <xingchao.wang@intel.com>
+ *
+ *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; version 2 of the License.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ */
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <asm/intel_scu_ipc.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/soc-dapm.h>
+#include <sound/initval.h>
+#include <sound/tlv.h>
+#include <sound/jack.h>
+#include "upd9976.h"
+
+static inline unsigned int upd9976_read(struct snd_soc_codec *codec,
+					unsigned int reg)
+{
+	u8 value = 0;
+	int ret;
+
+	ret = intel_scu_ipc_ioread8(reg, &value);
+	if (ret)
+		pr_err("upd9976 read of 0x%x failed, error: %d\n", reg, ret);
+	return value;
+}
+
+static inline int upd9976_write(struct snd_soc_codec *codec,
+				unsigned int reg, unsigned int value)
+{
+	int ret;
+
+	ret = intel_scu_ipc_iowrite8(reg, value);
+	if (ret)
+		pr_err("upd9976 write of 0x%x failed, error: %d\n", reg, ret);
+	return ret;
+}
+
+/*
+ * Mixing Volume: from -25 dB to 6 dB in 1 dB steps.
+ */
+static DECLARE_TLV_DB_SCALE(mixer_tlv, -2500, 100, 0);
+
+static const struct snd_kcontrol_new upd9976_snd_controls[] = {
+	SOC_DOUBLE_R_TLV("Headphone & Speaker Volume",
+			 UPD9976_HPSPRLVOL, UPD9976_HPSPRRVOL,
+			 0, 0x1f, 1, mixer_tlv),
+};
+
+static const struct snd_kcontrol_new upd9976_hp_spkr_mixer_left_controls[] = {
+	SOC_DAPM_SINGLE("Audio DAC Left", UPD9976_HPLMIXSEL, 4, 1, 1),
+	SOC_DAPM_SINGLE("Audio DAC Right", UPD9976_HPLMIXSEL, 3, 1, 1),
+};
+
+static const struct snd_kcontrol_new upd9976_hp_spkr_mixer_right_controls[] = {
+	SOC_DAPM_SINGLE("Audio DAC Left", UPD9976_HPRMIXSEL, 4, 1, 1),
+	SOC_DAPM_SINGLE("Audio DAC Right", UPD9976_HPRMIXSEL, 3, 1, 1),
+};
+
+static const struct snd_soc_dapm_widget upd9976_dapm_widgets[] = {
+	/* Input */
+	SND_SOC_DAPM_INPUT("LINEINL"),
+	SND_SOC_DAPM_INPUT("LINEINR"),
+	SND_SOC_DAPM_INPUT("MIC1"),
+	SND_SOC_DAPM_INPUT("MIC2"),
+	SND_SOC_DAPM_INPUT("DMICDAT"),
+	SND_SOC_DAPM_INPUT("HPINL"),
+	SND_SOC_DAPM_INPUT("HPINR"),
+
+	/* Output */
+	SND_SOC_DAPM_OUTPUT("PREOUTL"),
+	SND_SOC_DAPM_OUTPUT("PREOUTR"),
+	SND_SOC_DAPM_OUTPUT("EPOUTP"),
+	SND_SOC_DAPM_OUTPUT("EPOUTN"),
+	SND_SOC_DAPM_OUTPUT("LINEOUTL"),
+	SND_SOC_DAPM_OUTPUT("LINEOUTR"),
+	SND_SOC_DAPM_OUTPUT("HPOUTL"),
+	SND_SOC_DAPM_OUTPUT("HPOUTR"),
+
+	/* DAC */
+	SND_SOC_DAPM_DAC("ADAC", "Audio Playback", UPD9976_POWERCTRL1, 0, 0),
+	SND_SOC_DAPM_DAC("VDAC", "Voice Playback", UPD9976_POWERCTRL1, 6, 0),
+
+	/* ADC */
+	SND_SOC_DAPM_ADC("AADC", "Audio Capture", UPD9976_POWERCTRL1, 1, 0),
+	SND_SOC_DAPM_ADC("VADC", "Voice Capture", UPD9976_POWERCTRL1, 7, 0),
+
+	/* Mixer */
+	SND_SOC_DAPM_MIXER("HP Spkr Mixer Left", UPD9976_POWERCTRL2, 3, 0,
+			   upd9976_hp_spkr_mixer_left_controls,
+			   ARRAY_SIZE(upd9976_hp_spkr_mixer_left_controls)),
+	SND_SOC_DAPM_MIXER("HP Spkr Mixer Right", UPD9976_POWERCTRL2, 2, 0,
+			   upd9976_hp_spkr_mixer_right_controls,
+			   ARRAY_SIZE(upd9976_hp_spkr_mixer_right_controls)),
+
+	/* PGA */
+	SND_SOC_DAPM_PGA("HP Playback Left", UPD9976_DRVPOWERCTRL,
+			 2, 0, NULL, 0),
+	SND_SOC_DAPM_PGA("HP Playback Right", UPD9976_DRVPOWERCTRL,
+			 1, 0, NULL, 0),
+
+};
+
+static const struct snd_soc_dapm_route upd9976_dapm_routes[] = {
+	{"HP Spkr Mixer Left", "Audio DAC Left", "ADAC"},
+	{"HP Spkr Mixer Left", "Audio DAC Right", "ADAC"},
+
+	{"HP Spkr Mixer Right", "Audio DAC Left", "ADAC"},
+	{"HP Spkr Mixer Right", "Audio DAC Right", "ADAC"},
+
+	{"PREOUTL", NULL, "HP Spkr Mixer Left"},
+	{"PREOUTR", NULL, "HP Spkr Mixer Right"},
+
+	{"HP Playback Left", NULL, "HPINL"},
+	{"HP Playback Right", NULL, "HPINR"},
+
+	{"HPOUTL", NULL, "HP Playback Left"},
+	{"HPOUTR", NULL, "HP Playback Right"},
+
+};
+
+static int upd9976_audio_digital_mute(struct snd_soc_dai *dai, int mute)
+{
+	struct snd_soc_codec *codec = dai->codec;
+	unsigned int value, mask;
+
+	/* soft mute on, fast 0.75dB/6fs */
+	value = 0;
+	if (mute)
+		value = 1;
+	mask = BIT(1) | BIT(0);
+	snd_soc_update_bits(codec, UPD9976_SOFTMUTE, mask, value);
+
+	/* mute headphone, internals speaker, internal earpiece mono */
+	value = 0;
+	if (mute)
+		value = BIT(2) | BIT(1) | BIT(0);
+	mask = BIT(2) | BIT(1) | BIT(0);
+	snd_soc_update_bits(codec, UPD9976_LMUTE, mask, value);
+
+	/* mute headphone, internal speaker */
+	value = 0;
+	if (mute)
+		value = BIT(2) | BIT(1);
+	mask = BIT(2) | BIT(1);
+	snd_soc_update_bits(codec, UPD9976_RMUTE, mask, value);
+
+	/* mute audio DAC */
+	value = 0;
+	if (mute)
+		value = BIT(7);
+	mask = BIT(7);
+	snd_soc_update_bits(codec, UPD9976_AUDIOLVOL, mask, value);
+	snd_soc_update_bits(codec, UPD9976_AUDIORVOL, mask, value);
+
+	return 0;
+}
+
+static int upd9976_audio_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
+{
+	struct snd_soc_codec *codec = dai->codec;
+	unsigned int mode, mask;
+
+	mask = BIT(5) | BIT(4);
+	mode = 0;
+
+	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+	case SND_SOC_DAIFMT_I2S:
+		mode |= BIT(4);
+		break;
+	case SND_SOC_DAIFMT_RIGHT_J:
+		mode |= BIT(5);
+		break;
+	case SND_SOC_DAIFMT_LEFT_J:
+		mode |= BIT(5) | BIT(4);
+		break;
+	}
+
+	mask |= BIT(7) | BIT(3);
+
+	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+	case SND_SOC_DAIFMT_CBM_CFM:
+	case SND_SOC_DAIFMT_CBM_CFS:
+		mode |= BIT(7) | BIT(3);
+		break;
+	}
+
+	return snd_soc_update_bits(codec, UPD9976_AUDIOPORT1, mask, mode);
+}
+
+static int upd9976_audio_hw_params(struct snd_pcm_substream *substream,
+				   struct snd_pcm_hw_params *params,
+				   struct snd_soc_dai *dai)
+{
+	struct snd_soc_codec *codec = dai->codec;
+	unsigned int tmp;
+
+	switch (params_format(params)) {
+	case SNDRV_PCM_FORMAT_S16_LE:
+		tmp = 0x00;
+		break;
+	case SNDRV_PCM_FORMAT_S24_LE:
+		tmp = 0x03;
+		break;
+	case SNDRV_PCM_FORMAT_S18_3LE:
+		tmp = 0x01;
+		break;
+	case SNDRV_PCM_FORMAT_S20_3LE:
+		tmp = 0x02;
+		break;
+	default:
+		return -EINVAL;
+	}
+	snd_soc_update_bits(codec, UPD9976_AUDIOPORT1,
+			    BIT(2)|BIT(1)|BIT(0), tmp);
+
+	switch (params_rate(params)) {
+	case 8000:
+		tmp = 0x00;
+		break;
+	case 11025:
+		tmp = 0x01;
+		break;
+	case 12000:
+		tmp = 0x02;
+		break;
+	case 16000:
+		tmp = 0x03;
+		break;
+	case 22050:
+		tmp = 0x04;
+		break;
+	case 24000:
+		tmp = 0x05;
+		break;
+	case 32000:
+		tmp = 0x07;
+		break;
+	case 44100:
+		tmp = 0x08;
+		break;
+	case 48000:
+		tmp = 0x09;
+		break;
+	default:
+		return -EINVAL;
+	}
+	snd_soc_update_bits(codec, UPD9976_AUDIOPORT2,
+			    BIT(3)|BIT(2)|BIT(1)|BIT(0), tmp);
+
+	return 0;
+}
+
+static int upd9976_audio_set_tristate(struct snd_soc_dai *dai, int tristate)
+{
+	struct snd_soc_codec *codec = dai->codec;
+	if (tristate)
+		snd_soc_update_bits(codec, UPD9976_AUDIOPORT1,
+				    BIT(4)|BIT(5), 0);
+	return 0;
+}
+
+static struct snd_soc_dai_ops upd9976_audio_dai_ops = {
+	.digital_mute	= upd9976_audio_digital_mute,
+	.set_fmt	= upd9976_audio_set_dai_fmt,
+	.set_tristate	= upd9976_audio_set_tristate,
+	.hw_params	= upd9976_audio_hw_params,
+};
+
+static struct snd_soc_dai_driver upd9976_dais[] = {
+{
+	.name = "upd9976-audio",
+	.playback = {
+		.stream_name = "Audio Playback",
+		.channels_min = 1,
+		.channels_max = 2,
+		.rates = (SNDRV_PCM_RATE_48000 |
+			  SNDRV_PCM_RATE_44100 |
+			  SNDRV_PCM_RATE_8000),
+		.formats = (SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_U16 |
+			    SNDRV_PCM_FMTBIT_S24 | SNDRV_PCM_FMTBIT_U24 |
+			    SNDRV_PCM_FMTBIT_S32 | SNDRV_PCM_FMTBIT_U32),
+	},
+	.ops = &upd9976_audio_dai_ops,
+},
+};
+
+static int upd9976_set_bias_level(struct snd_soc_codec *codec,
+				  enum snd_soc_bias_level level)
+{
+	switch (level) {
+	case SND_SOC_BIAS_ON:
+		break;
+
+	case SND_SOC_BIAS_PREPARE:
+		if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) {
+			snd_soc_update_bits(codec, UPD9976_VAUDIOCNT,
+					    0x27, 0x27);
+			snd_soc_update_bits(codec, UPD9976_VREFPLL,
+					    0x35, 0x35);
+		}
+		break;
+
+	case SND_SOC_BIAS_STANDBY:
+		snd_soc_write(codec, UPD9976_VAUDIOCNT, 0x25);
+		snd_soc_write(codec, UPD9976_VREFPLL, 0x10);
+		break;
+
+	case SND_SOC_BIAS_OFF:
+		snd_soc_write(codec, UPD9976_VREFPLL, 0);
+		snd_soc_write(codec, UPD9976_VAUDIOCNT, 0x24);
+		break;
+	}
+
+	codec->dapm.bias_level = level;
+	return 0;
+}
+
+static int upd9976_codec_probe(struct snd_soc_codec *codec)
+{
+	upd9976_set_bias_level(codec, SND_SOC_BIAS_OFF);
+
+	return 0;
+}
+
+static int upd9976_codec_remove(struct snd_soc_codec *codec)
+{
+	return 0;
+}
+
+static struct snd_soc_codec_driver upd9976_codec = {
+	.probe			= upd9976_codec_probe,
+	.remove			= upd9976_codec_remove,
+	.read			= upd9976_read,
+	.write			= upd9976_write,
+	.set_bias_level		= upd9976_set_bias_level,
+
+	.controls		= upd9976_snd_controls,
+	.num_controls		= ARRAY_SIZE(upd9976_snd_controls),
+	.dapm_widgets		= upd9976_dapm_widgets,
+	.num_dapm_widgets	= ARRAY_SIZE(upd9976_dapm_widgets),
+	.dapm_routes		= upd9976_dapm_routes,
+	.num_dapm_routes	= ARRAY_SIZE(upd9976_dapm_routes),
+};
+
+static int __devinit upd9976_device_probe(struct platform_device *pdev)
+{
+	return snd_soc_register_codec(&pdev->dev, &upd9976_codec,
+				      upd9976_dais, ARRAY_SIZE(upd9976_dais));
+}
+
+static int __devexit upd9976_device_remove(struct platform_device *pdev)
+{
+	snd_soc_unregister_codec(&pdev->dev);
+	return 0;
+}
+
+static struct platform_driver upd9976_codec_driver = {
+	.driver	= {
+		.name	= "upd9976",
+		.owner	= THIS_MODULE,
+	},
+	.probe	= upd9976_device_probe,
+	.remove	= __devexit_p(upd9976_device_remove),
+};
+
+static int __init upd9976_init(void)
+{
+	return platform_driver_register(&upd9976_codec_driver);
+}
+module_init(upd9976_init);
+
+static void __exit upd9976_exit(void)
+{
+	platform_driver_unregister(&upd9976_codec_driver);
+}
+module_exit(upd9976_exit);
+
+MODULE_DESCRIPTION("ASoC Renesas uPD9976 codec driver");
+MODULE_AUTHOR("Lu Guanqun <guanqun.lu@intel.com>");
+MODULE_AUTHOR("Wang Xingchao <xingchao.wang@intel.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:upd9976");
diff --git a/sound/soc/codecs/upd9976.h b/sound/soc/codecs/upd9976.h
new file mode 100644
index 0000000..ab2ea15
--- /dev/null
+++ b/sound/soc/codecs/upd9976.h
@@ -0,0 +1,83 @@
+/*
+ *  upd9976.h -  Renesas uPD9976 codec driver
+ *
+ *  Copyright (C) 2011 Intel Corporation
+ *
+ *  Maintainer:
+ *              Lu Guanqun <guanqun.lu@intel.com>
+ *              Wang Xingchao <xingchao.wang@intel.com>
+ *
+ *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; version 2 of the License.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ */
+#ifndef _UPD9976_H
+#define _UPD9976_H
+
+#define UPD9976_VAUDIOCNT       0x51
+
+#define UPD9976_VOICEPORT1	0x100
+#define UPD9976_VOICEPORT2	0x101
+#define UPD9976_AUDIOPORT1	0x102
+#define UPD9976_AUDIOPORT2	0x103
+#define UPD9976_ADCSAMPLERATE	0x104
+#define UPD9976_DMICCTRL1	0x105
+#define UPD9976_DMICCTRL2	0x106
+#define UPD9976_MICCTRL		0x107
+#define UPD9976_MICSELVOL	0x108
+#define UPD9976_LILSEL		0x109
+#define UPD9976_LIRSEL		0x10a
+#define UPD9976_VOICEVOL	0x10b
+#define UPD9976_AUDIOLVOL	0x10c
+#define UPD9976_AUDIORVOL	0x10d
+#define UPD9976_LMUTE		0x10e
+#define UPD9976_RMUTE		0x10f
+#define UPD9976_POWERCTRL1	0x110
+#define UPD9976_POWERCTRL2	0x111
+#define UPD9976_DRVPOWERCTRL	0x112
+#define UPD9976_VREFPLL		0x113
+#define UPD9976_PCMBUFCTRL	0x114
+#define UPD9976_SOFTMUTE	0x115
+#define UPD9976_DTMFPATH	0x116
+#define UPD9976_DTMFVOL		0x117
+#define UPD9976_DTMFFREQ	0x118
+#define UPD9976_DTMFHFREQ	0x119
+#define UPD9976_DTMFLFREQ	0x11a
+#define UPD9976_DTMFCTRL	0x11b
+#define UPD9976_DTMFASON	0x11c
+#define UPD9976_DTMFASOFF	0x11d
+#define UPD9976_DTMFASINUM	0x11e
+#define UPD9976_CLASSDVOL	0x11f
+#define UPD9976_VOICEDACAVOL	0x120
+#define UPD9976_AUDDACAVOL	0x121
+#define UPD9976_LOMUTEVOL	0x122
+#define UPD9976_HPSPRLVOL	0x123
+#define UPD9976_HPSPRRVOL	0x124
+#define UPD9976_MONOVOL		0x125
+#define UPD9976_LINEOUTMIXVOL	0x126
+#define UPD9976_EPMIXVOL	0x127
+#define UPD9976_LINEOUTLSEL	0x128
+#define UPD9976_LINEOUTRSEL	0x129
+#define UPD9976_EPMIXOUTSEL	0x12a
+#define UPD9976_HPLMIXSEL	0x12b
+#define UPD9976_HPRMIXSEL	0x12c
+#define UPD9976_LOANTIPOP	0x12d
+#define UPD9976_AUXDBNC		0x12f
+
+#define UPD9976_SAUXINT		0x132
+
+#endif

  reply	other threads:[~2011-05-04 13:43 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-04 13:44 [PATCH 00/19] ASoC for moorestown Lu Guanqun
2011-05-04 13:44 ` Lu Guanqun [this message]
2011-05-04 14:34   ` [PATCH 01/19] ASoC: upd9976: Add Renesas uPD9976 codec driver Mark Brown
2011-05-04 15:05     ` Lu Guanqun
2011-05-05  3:14       ` Koul, Vinod
2011-05-05  3:51         ` Lu Guanqun
2011-05-04 15:07     ` Takashi Iwai
2011-05-04 15:18       ` Lu Guanqun
2011-05-04 15:38         ` Takashi Iwai
2011-05-04 16:15           ` Mark Brown
2011-05-05  0:33             ` Lu Guanqun
2011-05-05  0:30           ` Lu Guanqun
2011-05-04 16:13         ` Mark Brown
2011-05-05 16:26     ` Lu Guanqun
2011-05-06  9:37       ` Mark Brown
2011-05-04 14:46   ` Dimitris Papastamos
2011-05-04 15:12     ` Lu Guanqun
2011-05-04 16:11       ` Mark Brown
2011-05-05  3:12       ` Koul, Vinod
2011-05-05  8:07         ` Mark Brown
2011-05-04 13:45 ` [PATCH 02/19] ASoC: sst_platform: add cpu dai driver for moorestown platform Lu Guanqun
2011-05-05  3:23   ` Koul, Vinod
2011-05-05  4:48     ` Lu Guanqun
2011-05-05  9:26       ` Koul, Vinod
2011-05-05  8:05     ` Mark Brown
2011-05-05  9:28       ` Koul, Vinod
2011-05-05 10:26         ` Mark Brown
2011-05-05 10:00           ` Koul, Vinod
2011-05-05 13:46             ` Mark Brown
2011-05-05 14:55               ` Koul, Vinod
2011-05-06  9:37                 ` Mark Brown
2011-05-04 13:45 ` [PATCH 03/19] ASoC: mrst_machine: add moorestown machine driver Lu Guanqun
2011-05-04 14:55   ` Dimitris Papastamos
2011-05-04 15:25     ` Lu Guanqun
2011-05-04 13:45 ` [PATCH 04/19] ASoC: mrst_machine: add speaker widget to " Lu Guanqun
2011-05-04 16:17   ` Mark Brown
2011-05-04 13:45 ` [PATCH 05/19] ASoC: mrst_machine: enable user to select different output Lu Guanqun
2011-05-04 16:22   ` Mark Brown
2011-05-05  0:34     ` Lu Guanqun
2011-05-04 13:45 ` [PATCH 06/19] ASoC: upd9976: add capture ability for dai driver Lu Guanqun
2011-05-04 16:22   ` Mark Brown
2011-05-04 13:45 ` [PATCH 07/19] ASoC: sst_platform: add capture capability for cpu " Lu Guanqun
2011-05-04 13:45 ` [PATCH 08/19] ASoC: upd9976: add DMIC support Lu Guanqun
2011-05-04 15:03   ` Dimitris Papastamos
2011-05-04 15:20     ` Lu Guanqun
2011-05-04 13:45 ` [PATCH 09/19] ASoC: upd9976: add Analog MIC support Lu Guanqun
2011-05-04 13:45 ` [PATCH 10/19] ASoC: upd9976: add microphone bias support Lu Guanqun
2011-05-04 16:25   ` Mark Brown
2011-05-05  0:40     ` Lu Guanqun
2011-05-04 13:45 ` [PATCH 11/19] ASoC: upd9976: add jack detection function Lu Guanqun
2011-05-04 16:32   ` Mark Brown
2011-05-05  0:37     ` Lu Guanqun
2011-05-04 13:45 ` [PATCH 12/19] ASoC: mrst_machine: add capture functionality Lu Guanqun
2011-05-04 13:45 ` [PATCH 13/19] ASoC: mrst_machine: add jack detection support Lu Guanqun
2011-05-04 13:46 ` [PATCH 14/19] ASoC: upd9976: add mute switch for DMIC Lu Guanqun
2011-05-04 13:46 ` [PATCH 15/19] ASoC: upd9976: add mute switch for analog Lu Guanqun
2011-05-04 13:46 ` [PATCH 16/19] ASoC: mrst_machine: make DMIC's output to PCM2 mono Lu Guanqun
2011-05-04 13:46 ` [PATCH 17/19] ASoC: mrst_machine: make MIC2 pseudo-differential Lu Guanqun
2011-05-04 13:46 ` [PATCH 18/19] ASoC: upd9976: add capture volume for analog inputs Lu Guanqun
2011-05-04 13:46 ` [PATCH 19/19] ASoC: upd9976: add capture volume for DMIC Lu Guanqun

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110504134458.32443.45825.stgit@localhost \
    --to=guanqun.lu@intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=lrg@ti.com \
    --cc=tiwai@suse.de \
    --cc=vinod.koul@intel.com \
    --cc=xingchao.wang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.