[alsa-devel] [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control

Kuninori Morimoto kuninori.morimoto.gx at renesas.com
Mon Nov 7 07:05:05 CET 2011


This patch modifies ak4642 driver to output both headphone/stereo-line in same time.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
---
 sound/soc/codecs/ak4642.c |   44 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c
index 50da176..f30e434 100644
--- a/sound/soc/codecs/ak4642.c
+++ b/sound/soc/codecs/ak4642.c
@@ -75,6 +75,7 @@
 /* PW_MGMT1*/
 #define PMVCM		(1 << 6) /* VCOM Power Management */
 #define PMMIN		(1 << 5) /* MIN Input Power Management */
+#define PMLO		(1 << 3) /* Stereo Line Out Power Management */
 #define PMDAC		(1 << 2) /* DAC Power Management */
 #define PMADL		(1 << 0) /* MIC Amp Lch and ADC Lch Power Management */
 
@@ -98,6 +99,9 @@
 #define PMMP		(1 << 2) /* MPWR pin Power Management */
 #define MGAIN0		(1 << 0) /* MIC amp gain*/
 
+/* SG_SL2 */
+#define LOPS		(1 << 6) /* Stereo Line Output Power-Save Mode */
+
 /* TIMER */
 #define ZTM(param)	((param & 0x3) << 4) /* ALC Zoro Crossing TimeOut */
 #define WTM(param)	(((param & 0x4) << 4) | ((param & 0x3) << 2))
@@ -130,10 +134,13 @@
 #define FS_MASK		(FS0 | FS1 | FS2 | FS3)
 
 /* MD_CTL3 */
-#define BST1		(1 << 3)
+#define DEM0		(1 << 0) /* De-emphasis Frequency Select */
+#define BST1		(1 << 3) /* Bass Boost Function Select */
+#define DVOLC		(1 << 4) /* Output Digital Volume Control Mode Select */
 
 /* MD_CTL4 */
-#define DACH		(1 << 0)
+#define DACH		(1 << 0) /* Switch Control from DAC to Headphone-Amp */
+#define IVOLC		(1 << 3) /* Input Digital Volume Control Mode Select */
 
 /*
  * Playback Volume (table 39)
@@ -241,21 +248,31 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream,
 
 	if (is_play) {
 		/*
-		 * start headphone output
+		 * start output
+		 *  - headphone
+		 *  - stereo line
 		 *
 		 * PLL, Master Mode
 		 * Audio I/F Format :MSB justified (ADC & DAC)
-		 * Bass Boost Level : Middle
+		 * Digital Volume	: -8dB
+		 * Bass Boost Level	: Middle
+		 * LOVL=MINL bits	: 0
 		 *
 		 * This operation came from example code of
 		 * "ASAHI KASEI AK4642" (japanese) manual p97.
+		 * "ASAHI KASEI AK4642" (japanese) manual p98.
+		 *
 		 */
 		snd_soc_update_bits(codec, MD_CTL4, DACH, DACH);
 		snd_soc_update_bits(codec, MD_CTL3, BST1, BST1);
+		snd_soc_update_bits(codec, SG_SL1, DACL | MGAIN0, DACL);
 		ak4642_write(codec, L_IVC, 0x91); /* volume */
 		ak4642_write(codec, R_IVC, 0x91); /* volume */
-		snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMMIN | PMDAC,
-						     PMVCM | PMMIN | PMDAC);
+		snd_soc_update_bits(codec, SG_SL2, LOPS, LOPS);
+		snd_soc_update_bits(codec, PW_MGMT1,
+				    PMVCM | PMMIN | PMLO | PMDAC,
+				    PMVCM | PMMIN | PMLO | PMDAC);
+		snd_soc_update_bits(codec, SG_SL2, LOPS, 0);
 		snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK,	PMHP);
 		snd_soc_update_bits(codec, PW_MGMT2, HPMTN,	HPMTN);
 	} else {
@@ -272,7 +289,9 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream,
 		 * This operation came from example code of
 		 * "ASAHI KASEI AK4642" (japanese) manual p94.
 		 */
-		ak4642_write(codec, SG_SL1, PMMP | MGAIN0);
+		snd_soc_update_bits(codec, SG_SL1,
+				    PMMP | MGAIN0,
+				    PMMP | MGAIN0);
 		ak4642_write(codec, TIMER, ZTM(0x3) | WTM(0x3));
 		ak4642_write(codec, ALC_CTL1, ALC | LMTH0);
 		snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMADL,
@@ -290,12 +309,19 @@ static void ak4642_dai_shutdown(struct snd_pcm_substream *substream,
 	struct snd_soc_codec *codec = dai->codec;
 
 	if (is_play) {
-		/* stop headphone output */
+		/*
+		 * stop output
+		 *  - headphone
+		 *  - stereo line
+		 */
+		snd_soc_update_bits(codec, SG_SL2, LOPS, LOPS);
 		snd_soc_update_bits(codec, PW_MGMT2, HPMTN,	0);
 		snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK,	0);
-		snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, 0);
+		snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMLO | PMDAC, 0);
 		snd_soc_update_bits(codec, MD_CTL3, BST1, 0);
 		snd_soc_update_bits(codec, MD_CTL4, DACH, 0);
+		snd_soc_update_bits(codec, SG_SL1, DACL, 0);
+		snd_soc_update_bits(codec, SG_SL2, LOPS, 0);
 	} else {
 		/* stop stereo input */
 		snd_soc_update_bits(codec, PW_MGMT1, PMADL, 0);
-- 
1.7.5.4



More information about the Alsa-devel mailing list