]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - sound/soc/sunxi/sun4i-codec.c
ASoC: sun4i-codec: Merge sun4i_codec_left_mixer_controls and sun4i_codec_right_mixer_...
[linux.git] / sound / soc / sunxi / sun4i-codec.c
index 9a3cb77048105fbc71c075906187fa43e060c9b0..279a7880d623750e0c99587158fdd5dd52626272 100644 (file)
@@ -64,6 +64,7 @@
 #define SUN4I_CODEC_DAC_ACTL_DACAENR                   (31)
 #define SUN4I_CODEC_DAC_ACTL_DACAENL                   (30)
 #define SUN4I_CODEC_DAC_ACTL_MIXEN                     (29)
+#define SUN4I_CODEC_DAC_ACTL_MICG                      (20)
 #define SUN4I_CODEC_DAC_ACTL_LDACLMIXS                 (15)
 #define SUN4I_CODEC_DAC_ACTL_RDACRMIXS                 (14)
 #define SUN4I_CODEC_DAC_ACTL_LDACRMIXS                 (13)
@@ -94,6 +95,8 @@
 #define SUN4I_CODEC_ADC_ACTL_PREG1EN                   (29)
 #define SUN4I_CODEC_ADC_ACTL_PREG2EN                   (28)
 #define SUN4I_CODEC_ADC_ACTL_VMICEN                    (27)
+#define SUN4I_CODEC_ADC_ACTL_PREG1                     (25)
+#define SUN4I_CODEC_ADC_ACTL_PREG2                     (23)
 #define SUN4I_CODEC_ADC_ACTL_VADCG                     (20)
 #define SUN4I_CODEC_ADC_ACTL_ADCIS                     (17)
 #define SUN4I_CODEC_ADC_ACTL_PA_EN                     (4)
 /* Microphone controls (sun7i only) */
 #define SUN7I_CODEC_AC_MIC_PHONE_CAL           (0x3c)
 
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1             (29)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2             (26)
+
 /*
  * sun6i specific registers
  *
@@ -673,22 +679,54 @@ static const struct snd_kcontrol_new sun4i_codec_pa_mute =
                        SUN4I_CODEC_DAC_ACTL_PA_MUTE, 1, 0);
 
 static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1);
+static DECLARE_TLV_DB_SCALE(sun4i_codec_micin_loopback_gain_scale, -450, 150,
+                           0);
+static DECLARE_TLV_DB_RANGE(sun4i_codec_micin_preamp_gain_scale,
+                           0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
+                           1, 7, TLV_DB_SCALE_ITEM(3500, 300, 0));
+static DECLARE_TLV_DB_RANGE(sun7i_codec_micin_preamp_gain_scale,
+                           0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
+                           1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0));
 
 static const struct snd_kcontrol_new sun4i_codec_controls[] = {
        SOC_SINGLE_TLV("Power Amplifier Volume", SUN4I_CODEC_DAC_ACTL,
                       SUN4I_CODEC_DAC_ACTL_PA_VOL, 0x3F, 0,
                       sun4i_codec_pa_volume_scale),
+       SOC_SINGLE_TLV("Mic Playback Volume", SUN4I_CODEC_DAC_ACTL,
+                      SUN4I_CODEC_DAC_ACTL_MICG, 7, 0,
+                      sun4i_codec_micin_loopback_gain_scale),
+       SOC_SINGLE_TLV("Mic1 Boost Volume", SUN4I_CODEC_ADC_ACTL,
+                      SUN4I_CODEC_ADC_ACTL_PREG1, 3, 0,
+                      sun4i_codec_micin_preamp_gain_scale),
+       SOC_SINGLE_TLV("Mic2 Boost Volume", SUN4I_CODEC_ADC_ACTL,
+                      SUN4I_CODEC_ADC_ACTL_PREG2, 3, 0,
+                      sun4i_codec_micin_preamp_gain_scale),
 };
 
-static const struct snd_kcontrol_new sun4i_codec_left_mixer_controls[] = {
-       SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
-                       SUN4I_CODEC_DAC_ACTL_LDACLMIXS, 1, 0),
+static const struct snd_kcontrol_new sun7i_codec_controls[] = {
+       SOC_SINGLE_TLV("Power Amplifier Volume", SUN4I_CODEC_DAC_ACTL,
+                      SUN4I_CODEC_DAC_ACTL_PA_VOL, 0x3F, 0,
+                      sun4i_codec_pa_volume_scale),
+       SOC_SINGLE_TLV("Mic Playback Volume", SUN4I_CODEC_DAC_ACTL,
+                      SUN4I_CODEC_DAC_ACTL_MICG, 7, 0,
+                      sun4i_codec_micin_loopback_gain_scale),
+       SOC_SINGLE_TLV("Mic1 Boost Volume", SUN7I_CODEC_AC_MIC_PHONE_CAL,
+                      SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1, 7, 0,
+                      sun7i_codec_micin_preamp_gain_scale),
+       SOC_SINGLE_TLV("Mic2 Boost Volume", SUN7I_CODEC_AC_MIC_PHONE_CAL,
+                      SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2, 7, 0,
+                      sun7i_codec_micin_preamp_gain_scale),
 };
 
-static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
-       SOC_DAPM_SINGLE("Right DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
-                       SUN4I_CODEC_DAC_ACTL_RDACRMIXS, 1, 0),
-       SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
+static const struct snd_kcontrol_new sun4i_codec_mixer_controls[] = {
+       SOC_DAPM_SINGLE("Left Mixer Left DAC Playback Switch",
+                       SUN4I_CODEC_DAC_ACTL, SUN4I_CODEC_DAC_ACTL_LDACLMIXS,
+                       1, 0),
+       SOC_DAPM_SINGLE("Right Mixer Right DAC Playback Switch",
+                       SUN4I_CODEC_DAC_ACTL, SUN4I_CODEC_DAC_ACTL_RDACRMIXS,
+                       1, 0),
+       SOC_DAPM_SINGLE("Right Mixer Left DAC Playback Switch",
+                       SUN4I_CODEC_DAC_ACTL,
                        SUN4I_CODEC_DAC_ACTL_LDACRMIXS, 1, 0),
 };
 
@@ -724,11 +762,11 @@ static const struct snd_soc_dapm_widget sun4i_codec_codec_dapm_widgets[] = {
 
        /* Mixers */
        SND_SOC_DAPM_MIXER("Left Mixer", SND_SOC_NOPM, 0, 0,
-                          sun4i_codec_left_mixer_controls,
-                          ARRAY_SIZE(sun4i_codec_left_mixer_controls)),
+                          sun4i_codec_mixer_controls,
+                          ARRAY_SIZE(sun4i_codec_mixer_controls)),
        SND_SOC_DAPM_MIXER("Right Mixer", SND_SOC_NOPM, 0, 0,
-                          sun4i_codec_right_mixer_controls,
-                          ARRAY_SIZE(sun4i_codec_right_mixer_controls)),
+                          sun4i_codec_mixer_controls,
+                          ARRAY_SIZE(sun4i_codec_mixer_controls)),
 
        /* Global Mixer Enable */
        SND_SOC_DAPM_SUPPLY("Mixer Enable", SUN4I_CODEC_DAC_ACTL,
@@ -741,6 +779,8 @@ static const struct snd_soc_dapm_widget sun4i_codec_codec_dapm_widgets[] = {
        /* Mic Pre-Amplifiers */
        SND_SOC_DAPM_PGA("MIC1 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
                         SUN4I_CODEC_ADC_ACTL_PREG1EN, 0, NULL, 0),
+       SND_SOC_DAPM_PGA("MIC2 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
+                        SUN4I_CODEC_ADC_ACTL_PREG2EN, 0, NULL, 0),
 
        /* Power Amplifier */
        SND_SOC_DAPM_MIXER("Power Amplifier", SUN4I_CODEC_ADC_ACTL,
@@ -751,6 +791,7 @@ static const struct snd_soc_dapm_widget sun4i_codec_codec_dapm_widgets[] = {
                            &sun4i_codec_pa_mute),
 
        SND_SOC_DAPM_INPUT("Mic1"),
+       SND_SOC_DAPM_INPUT("Mic2"),
 
        SND_SOC_DAPM_OUTPUT("HP Right"),
        SND_SOC_DAPM_OUTPUT("HP Left"),
@@ -767,12 +808,12 @@ static const struct snd_soc_dapm_route sun4i_codec_codec_dapm_routes[] = {
 
        /* Right Mixer Routes */
        { "Right Mixer", NULL, "Mixer Enable" },
-       { "Right Mixer", "Left DAC Playback Switch", "Left DAC" },
-       { "Right Mixer", "Right DAC Playback Switch", "Right DAC" },
+       { "Right Mixer", "Right Mixer Left DAC Playback Switch", "Left DAC" },
+       { "Right Mixer", "Right Mixer Right DAC Playback Switch", "Right DAC" },
 
        /* Left Mixer Routes */
        { "Left Mixer", NULL, "Mixer Enable" },
-       { "Left Mixer", "Left DAC Playback Switch", "Left DAC" },
+       { "Left Mixer", "Left Mixer Left DAC Playback Switch", "Left DAC" },
 
        /* Power Amplifier Routes */
        { "Power Amplifier", "Mixer Playback Switch", "Left Mixer" },
@@ -790,6 +831,12 @@ static const struct snd_soc_dapm_route sun4i_codec_codec_dapm_routes[] = {
        { "Right ADC", NULL, "MIC1 Pre-Amplifier" },
        { "MIC1 Pre-Amplifier", NULL, "Mic1"},
        { "Mic1", NULL, "VMIC" },
+
+       /* Mic2 Routes */
+       { "Left ADC", NULL, "MIC2 Pre-Amplifier" },
+       { "Right ADC", NULL, "MIC2 Pre-Amplifier" },
+       { "MIC2 Pre-Amplifier", NULL, "Mic2"},
+       { "Mic2", NULL, "VMIC" },
 };
 
 static const struct snd_soc_component_driver sun4i_codec_codec = {
@@ -805,6 +852,19 @@ static const struct snd_soc_component_driver sun4i_codec_codec = {
        .non_legacy_dai_naming  = 1,
 };
 
+static const struct snd_soc_component_driver sun7i_codec_codec = {
+       .controls               = sun7i_codec_controls,
+       .num_controls           = ARRAY_SIZE(sun7i_codec_controls),
+       .dapm_widgets           = sun4i_codec_codec_dapm_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(sun4i_codec_codec_dapm_widgets),
+       .dapm_routes            = sun4i_codec_codec_dapm_routes,
+       .num_dapm_routes        = ARRAY_SIZE(sun4i_codec_codec_dapm_routes),
+       .idle_bias_on           = 1,
+       .use_pmdown_time        = 1,
+       .endianness             = 1,
+       .non_legacy_dai_naming  = 1,
+};
+
 /*** sun6i Codec ***/
 
 /* mixer controls */
@@ -1485,7 +1545,7 @@ static const struct sun4i_codec_quirks sun6i_a31_codec_quirks = {
 
 static const struct sun4i_codec_quirks sun7i_codec_quirks = {
        .regmap_config  = &sun7i_codec_regmap_config,
-       .codec          = &sun4i_codec_codec,
+       .codec          = &sun7i_codec_codec,
        .create_card    = sun4i_codec_create_card,
        .reg_adc_fifoc  = REG_FIELD(SUN4I_CODEC_ADC_FIFOC, 0, 31),
        .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,