Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/sunxi Add mic preamp controls and ...



details:   https://anonhg.NetBSD.org/src/rev/8ca647abfd07
branches:  trunk
changeset: 319093:8ca647abfd07
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Wed May 16 10:23:43 2018 +0000

description:
Add mic preamp controls and unswap L/R DAC channels to ADC mixer

diffstat:

 sys/arch/arm/sunxi/sun50i_a64_acodec.c |  61 +++++++++++++++++++++++++++++++--
 1 files changed, 57 insertions(+), 4 deletions(-)

diffs (115 lines):

diff -r 4be541d0a331 -r 8ca647abfd07 sys/arch/arm/sunxi/sun50i_a64_acodec.c
--- a/sys/arch/arm/sunxi/sun50i_a64_acodec.c    Wed May 16 10:22:54 2018 +0000
+++ b/sys/arch/arm/sunxi/sun50i_a64_acodec.c    Wed May 16 10:23:43 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sun50i_a64_acodec.c,v 1.7 2018/05/16 00:12:57 jmcneill Exp $ */
+/* $NetBSD: sun50i_a64_acodec.c,v 1.8 2018/05/16 10:23:43 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sun50i_a64_acodec.c,v 1.7 2018/05/16 00:12:57 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sun50i_a64_acodec.c,v 1.8 2018/05/16 10:23:43 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -85,7 +85,7 @@
 #define         A64_ADCMIX_SRC_MIC1    __BIT(6)
 #define         A64_ADCMIX_SRC_MIC2    __BIT(5)
 #define         A64_ADCMIX_SRC_LINEIN  __BIT(2)
-#define         A64_ADCMIX_SRC_OMIXER  __BIT(0)
+#define         A64_ADCMIX_SRC_OMIXER  __BIT(1)
 #define        A64_ADC_CTRL            0x0d
 #define         A64_ADCREN             __BIT(7)
 #define         A64_ADCLEN             __BIT(6)
@@ -117,7 +117,9 @@
        A64_CODEC_INPUT_HP_VOLUME,
        A64_CODEC_RECORD_LINE_VOLUME,
        A64_CODEC_RECORD_MIC1_VOLUME,
+       A64_CODEC_RECORD_MIC1_PREAMP,
        A64_CODEC_RECORD_MIC2_VOLUME,
+       A64_CODEC_RECORD_MIC2_PREAMP,
        A64_CODEC_RECORD_AGC_VOLUME,
        A64_CODEC_RECORD_SOURCE,
 
@@ -299,6 +301,26 @@
                a64_acodec_pr_write(sc, mix->reg, val);
                return 0;
 
+       case A64_CODEC_RECORD_MIC1_PREAMP:
+               if (mc->un.ord < 0 || mc->un.ord > 1)
+                       return EINVAL;
+               if (mc->un.ord) {
+                       a64_acodec_pr_set_clear(sc, A64_MIC1_CTRL, A64_MIC1AMPEN, 0);
+               } else {
+                       a64_acodec_pr_set_clear(sc, A64_MIC1_CTRL, 0, A64_MIC1AMPEN);
+               }
+               return 0;
+                       
+       case A64_CODEC_RECORD_MIC2_PREAMP:
+               if (mc->un.ord < 0 || mc->un.ord > 1)
+                       return EINVAL;
+               if (mc->un.ord) {
+                       a64_acodec_pr_set_clear(sc, A64_MIC2_CTRL, A64_MIC2AMPEN, 0);
+               } else {
+                       a64_acodec_pr_set_clear(sc, A64_MIC2_CTRL, 0, A64_MIC2AMPEN);
+               }
+               return 0;
+
        case A64_CODEC_OUTPUT_MUTE:
                if (mc->un.ord < 0 || mc->un.ord > 1)
                        return EINVAL;
@@ -367,6 +389,14 @@
                mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = nvol;
                return 0;
 
+       case A64_CODEC_RECORD_MIC1_PREAMP:
+               mc->un.ord = !!(a64_acodec_pr_read(sc, A64_MIC1_CTRL) & A64_MIC1AMPEN);
+               return 0;
+                       
+       case A64_CODEC_RECORD_MIC2_PREAMP:
+               mc->un.ord = !!(a64_acodec_pr_read(sc, A64_MIC2_CTRL) & A64_MIC2AMPEN);
+               return 0;
+
        case A64_CODEC_OUTPUT_MUTE:
                mc->un.ord = 1;
                if (a64_acodec_pr_read(sc, A64_OL_MIX_CTRL) & A64_LMIXMUTE_LDAC)
@@ -445,11 +475,34 @@
                di->un.v.delta =
                    256 / (__SHIFTOUT_MASK(mix->mask) + 1);
                di->type = AUDIO_MIXER_VALUE;
-               di->next = di->prev = AUDIO_MIXER_LAST;
+               di->prev = AUDIO_MIXER_LAST;
+               if (di->index == A64_CODEC_RECORD_MIC1_VOLUME)
+                       di->next = A64_CODEC_RECORD_MIC1_PREAMP;
+               else if (di->index == A64_CODEC_RECORD_MIC2_VOLUME)
+                       di->next = A64_CODEC_RECORD_MIC2_PREAMP;
+               else
+                       di->next = AUDIO_MIXER_LAST;
                di->un.v.num_channels = 2;
                strcpy(di->un.v.units.name, AudioNvolume);
                return 0;
 
+       case A64_CODEC_RECORD_MIC1_PREAMP:
+       case A64_CODEC_RECORD_MIC2_PREAMP:
+               di->mixer_class = A64_CODEC_RECORD_CLASS;
+               strcpy(di->label.name, AudioNpreamp);
+               di->type = AUDIO_MIXER_ENUM;
+               if (di->index == A64_CODEC_RECORD_MIC1_PREAMP)
+                       di->prev = A64_CODEC_RECORD_MIC1_VOLUME;
+               else
+                       di->prev = A64_CODEC_RECORD_MIC2_VOLUME;
+               di->next = AUDIO_MIXER_LAST;
+               di->un.e.num_mem = 2;
+               strcpy(di->un.e.member[0].label.name, AudioNoff);
+               di->un.e.member[0].ord = 0;
+               strcpy(di->un.e.member[1].label.name, AudioNon);
+               di->un.e.member[1].ord = 1;
+               return 0;
+
        case A64_CODEC_OUTPUT_MUTE:
                di->mixer_class = A64_CODEC_OUTPUT_CLASS;
                strcpy(di->label.name, AudioNmute);



Home | Main Index | Thread Index | Old Index