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;