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

Reply via email to