Module Name: src
Committed By: jmcneill
Date: Tue May 15 01:26:46 UTC 2018
Modified Files:
src/sys/arch/arm/sunxi: sun50i_a64_acodec.c
Log Message:
Add outputs.mute control
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 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.5 src/sys/arch/arm/sunxi/sun50i_a64_acodec.c:1.6
--- src/sys/arch/arm/sunxi/sun50i_a64_acodec.c:1.5 Sun May 13 01:01:37 2018
+++ src/sys/arch/arm/sunxi/sun50i_a64_acodec.c Tue May 15 01:26:45 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: sun50i_a64_acodec.c,v 1.5 2018/05/13 01:01:37 jmcneill Exp $ */
+/* $NetBSD: sun50i_a64_acodec.c,v 1.6 2018/05/15 01:26:45 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.5 2018/05/13 01:01:37 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sun50i_a64_acodec.c,v 1.6 2018/05/15 01:26:45 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -111,6 +111,7 @@ enum a64_acodec_mixer_ctrl {
A64_CODEC_RECORD_CLASS,
A64_CODEC_OUTPUT_MASTER_VOLUME,
+ A64_CODEC_OUTPUT_MUTE,
A64_CODEC_OUTPUT_SOURCE,
A64_CODEC_INPUT_LINE_VOLUME,
A64_CODEC_INPUT_HP_VOLUME,
@@ -228,11 +229,6 @@ a64_acodec_trigger_output(void *priv, vo
a64_acodec_pr_set_clear(sc, A64_MIX_DAC_CTRL,
A64_DACAREN | A64_DACALEN | A64_RMIXEN | A64_LMIXEN |
A64_RHPPAMUTE | A64_LHPPAMUTE, 0);
- /* Unmute DAC l/r channels to output mixer */
- a64_acodec_pr_set_clear(sc, A64_OL_MIX_CTRL,
- A64_LMIXMUTE_LDAC, 0);
- a64_acodec_pr_set_clear(sc, A64_OR_MIX_CTRL,
- A64_RMIXMUTE_RDAC, 0);
return 0;
}
@@ -255,11 +251,6 @@ a64_acodec_halt_output(void *priv)
{
struct a64_acodec_softc * const sc = priv;
- /* Mute DAC l/r channels to output mixer */
- a64_acodec_pr_set_clear(sc, A64_OL_MIX_CTRL,
- 0, A64_LMIXMUTE_LDAC);
- a64_acodec_pr_set_clear(sc, A64_OR_MIX_CTRL,
- 0, A64_RMIXMUTE_RDAC);
/* Disable DAC analog l/r channels, HP PA, and output mixer */
a64_acodec_pr_set_clear(sc, A64_MIX_DAC_CTRL,
0, A64_DACAREN | A64_DACALEN | A64_RMIXEN | A64_LMIXEN |
@@ -308,6 +299,22 @@ a64_acodec_set_port(void *priv, mixer_ct
a64_acodec_pr_write(sc, mix->reg, val);
return 0;
+ case A64_CODEC_OUTPUT_MUTE:
+ if (mc->un.ord < 0 || mc->un.ord > 1)
+ return EINVAL;
+ if (mc->un.ord) {
+ a64_acodec_pr_set_clear(sc, A64_OL_MIX_CTRL,
+ 0, A64_LMIXMUTE_LDAC);
+ a64_acodec_pr_set_clear(sc, A64_OR_MIX_CTRL,
+ 0, A64_RMIXMUTE_RDAC);
+ } else {
+ a64_acodec_pr_set_clear(sc, A64_OL_MIX_CTRL,
+ A64_LMIXMUTE_LDAC, 0);
+ a64_acodec_pr_set_clear(sc, A64_OR_MIX_CTRL,
+ A64_RMIXMUTE_RDAC, 0);
+ }
+ return 0;
+
case A64_CODEC_OUTPUT_SOURCE:
if (mc->un.mask & A64_OUTPUT_SOURCE_LINE)
a64_acodec_pr_set_clear(sc, A64_LINEOUT_CTRL0,
@@ -360,6 +367,14 @@ a64_acodec_get_port(void *priv, mixer_ct
mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = nvol;
return 0;
+ case A64_CODEC_OUTPUT_MUTE:
+ mc->un.ord = 1;
+ if (a64_acodec_pr_read(sc, A64_OL_MIX_CTRL) & A64_LMIXMUTE_LDAC)
+ mc->un.ord = 0;
+ if (a64_acodec_pr_read(sc, A64_OR_MIX_CTRL) & A64_RMIXMUTE_RDAC)
+ mc->un.ord = 0;
+ return 0;
+
case A64_CODEC_OUTPUT_SOURCE:
mc->un.mask = 0;
if (a64_acodec_pr_read(sc, A64_LINEOUT_CTRL0) & A64_LINEOUT_EN)
@@ -435,6 +450,18 @@ a64_acodec_query_devinfo(void *priv, mix
strcpy(di->un.v.units.name, AudioNvolume);
return 0;
+ case A64_CODEC_OUTPUT_MUTE:
+ di->mixer_class = A64_CODEC_OUTPUT_CLASS;
+ strcpy(di->label.name, AudioNmute);
+ di->type = AUDIO_MIXER_ENUM;
+ di->next = di->prev = 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_SOURCE:
di->mixer_class = A64_CODEC_OUTPUT_CLASS;
strcpy(di->label.name, AudioNsource);
@@ -573,6 +600,12 @@ a64_acodec_attach(device_t parent, devic
a64_acodec_pr_set_clear(sc, A64_JACK_MIC_CTRL,
A64_JACKDETEN | A64_INNERRESEN | A64_AUTOPLEN, 0);
+ /* Unmute DAC to output mixer */
+ a64_acodec_pr_set_clear(sc, A64_OL_MIX_CTRL,
+ A64_LMIXMUTE_LDAC, 0);
+ a64_acodec_pr_set_clear(sc, A64_OR_MIX_CTRL,
+ A64_RMIXMUTE_RDAC, 0);
+
sc->sc_dai.dai_jack_detect = a64_acodec_dai_jack_detect;
sc->sc_dai.dai_hw_if = &a64_acodec_hw_if;
sc->sc_dai.dai_dev = self;