Module Name: src
Committed By: jmcneill
Date: Wed May 16 10:23:43 UTC 2018
Modified Files:
src/sys/arch/arm/sunxi: sun50i_a64_acodec.c
Log Message:
Add mic preamp controls and unswap L/R DAC channels to ADC mixer
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/sunxi/sun50i_a64_acodec.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/sunxi/sun50i_a64_acodec.c
diff -u src/sys/arch/arm/sunxi/sun50i_a64_acodec.c:1.7 src/sys/arch/arm/sunxi/sun50i_a64_acodec.c:1.8
--- src/sys/arch/arm/sunxi/sun50i_a64_acodec.c:1.7 Wed May 16 00:12:57 2018
+++ src/sys/arch/arm/sunxi/sun50i_a64_acodec.c Wed May 16 10:23:43 2018
@@ -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 <[email protected]>
@@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: sun50i_a64_a
#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 @@ enum a64_acodec_mixer_ctrl {
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_set_port(void *priv, mixer_ct
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 @@ a64_acodec_get_port(void *priv, mixer_ct
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 @@ a64_acodec_query_devinfo(void *priv, mix
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);