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 <jmcne...@invisible.ca> @@ -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);