ASoC: ak4642: Add Digital Playback Volume control
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 1 Jul 2010 05:23:45 +0000 (14:23 +0900)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 1 Jul 2010 16:08:47 +0000 (17:08 +0100)
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/ak4642.c

index 8d56811..60b83b4 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/slab.h>
 #include <sound/soc-dapm.h>
 #include <sound/initval.h>
+#include <sound/tlv.h>
 
 #include "ak4642.h"
 
 
 struct snd_soc_codec_device soc_codec_dev_ak4642;
 
+/*
+ * Playback Volume (table 39)
+ *
+ * max : 0x00 : +12.0 dB
+ *       ( 0.5 dB step )
+ * min : 0xFE : -115.0 dB
+ * mute: 0xFF
+ */
+static const DECLARE_TLV_DB_SCALE(out_tlv, -11500, 50, 1);
+
+static const struct snd_kcontrol_new ak4642_snd_controls[] = {
+
+       SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC,
+                        0, 0xFF, 1, out_tlv),
+};
+
+
 /* codec private data */
 struct ak4642_priv {
        struct snd_soc_codec codec;
@@ -196,7 +214,6 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream,
                 *
                 * PLL, Master Mode
                 * Audio I/F Format :MSB justified (ADC & DAC)
-                * Digital Volume: -8dB
                 * Bass Boost Level : Middle
                 *
                 * This operation came from example code of
@@ -206,8 +223,6 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream,
                ak4642_write(codec, 0x0e, 0x19);
                ak4642_write(codec, 0x09, 0x91);
                ak4642_write(codec, 0x0c, 0x91);
-               ak4642_write(codec, 0x0a, 0x28);
-               ak4642_write(codec, 0x0d, 0x28);
                ak4642_write(codec, 0x00, 0x64);
                snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, PMHP);
                snd_soc_update_bits(codec, PW_MGMT2, HPMTN,     HPMTN);
@@ -540,6 +555,9 @@ static int ak4642_probe(struct platform_device *pdev)
                goto pcm_err;
        }
 
+       snd_soc_add_controls(ak4642_codec, ak4642_snd_controls,
+                            ARRAY_SIZE(ak4642_snd_controls));
+
        dev_info(&pdev->dev, "AK4642 Audio Codec %s", AK4642_VERSION);
        return ret;