Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/sunxi Disable lineout by default. If HP is not ...



details:   https://anonhg.NetBSD.org/src/rev/5d7e063ca3c8
branches:  trunk
changeset: 322688:5d7e063ca3c8
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Fri May 11 23:05:41 2018 +0000

description:
Disable lineout by default. If HP is not plugged at boot, we get an
unplug event. However, no plug event when HP is plugged at boot.

diffstat:

 sys/arch/arm/sunxi/sun50i_a64_acodec.c |  18 +++++++++++-------
 sys/arch/arm/sunxi/sun8i_codec.c       |  29 +++++++++++++++--------------
 2 files changed, 26 insertions(+), 21 deletions(-)

diffs (145 lines):

diff -r 2d9340631f03 -r 5d7e063ca3c8 sys/arch/arm/sunxi/sun50i_a64_acodec.c
--- a/sys/arch/arm/sunxi/sun50i_a64_acodec.c    Fri May 11 22:51:33 2018 +0000
+++ b/sys/arch/arm/sunxi/sun50i_a64_acodec.c    Fri May 11 23:05:41 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sun50i_a64_acodec.c,v 1.3 2018/05/11 22:51:12 jmcneill Exp $ */
+/* $NetBSD: sun50i_a64_acodec.c,v 1.4 2018/05/11 23:05:41 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sun50i_a64_acodec.c,v 1.3 2018/05/11 22:51:12 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sun50i_a64_acodec.c,v 1.4 2018/05/11 23:05:41 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -439,15 +439,21 @@
 {
        struct a64_acodec_softc * const sc = audio_dai_private(dai);
        const uint32_t lineout_mask = A64_LINEOUT_LEFT_EN | A64_LINEOUT_RIGHT_EN;
+       const uint32_t hppa_mask = A64_HPPA_EN;
 
        switch (jack) {
        case AUDIO_DAI_JACK_HP:
-               if (present)
+               if (present) {
                        a64_acodec_pr_set_clear(sc, A64_LINEOUT_CTRL0,
                            0, lineout_mask);
-               else
+                       a64_acodec_pr_set_clear(sc, A64_HP_CTRL,
+                           hppa_mask, 0);
+               } else {
                        a64_acodec_pr_set_clear(sc, A64_LINEOUT_CTRL0,
                            lineout_mask, 0);
+                       a64_acodec_pr_set_clear(sc, A64_HP_CTRL,
+                           0, hppa_mask);
+               }
                break;
        case AUDIO_DAI_JACK_MIC:
                /* XXX TODO */
@@ -495,12 +501,10 @@
        aprint_naive("\n");
        aprint_normal(": A64 Audio Codec (analog part)\n");
 
-       /* Right & Left LINEOUT enable */
-       a64_acodec_pr_set_clear(sc, A64_LINEOUT_CTRL0,
-           A64_LINEOUT_LEFT_EN | A64_LINEOUT_RIGHT_EN, 0);
        /* Right & Left Headphone PA enable */
        a64_acodec_pr_set_clear(sc, A64_HP_CTRL,
            A64_HPPA_EN, 0);
+
        /* Jack detect enable */
        a64_acodec_pr_set_clear(sc, A64_JACK_MIC_CTRL,
            A64_JACKDETEN | A64_INNERRESEN | A64_AUTOPLEN, 0);
diff -r 2d9340631f03 -r 5d7e063ca3c8 sys/arch/arm/sunxi/sun8i_codec.c
--- a/sys/arch/arm/sunxi/sun8i_codec.c  Fri May 11 22:51:33 2018 +0000
+++ b/sys/arch/arm/sunxi/sun8i_codec.c  Fri May 11 23:05:41 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sun8i_codec.c,v 1.2 2018/05/11 22:51:12 jmcneill Exp $ */
+/* $NetBSD: sun8i_codec.c,v 1.3 2018/05/11 23:05:41 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sun8i_codec.c,v 1.2 2018/05/11 22:51:12 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sun8i_codec.c,v 1.3 2018/05/11 23:05:41 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -118,7 +118,6 @@
 
        struct audio_dai_device sc_dai;
        audio_dai_tag_t         sc_codec_analog;
-       uint32_t                sc_jackdet;
        int                     sc_jackdet_pol;
 
        struct fdtbus_gpio_pin  *sc_pin_pa;
@@ -260,15 +259,15 @@
 static int
 sun8i_codec_intr(void *priv)
 {
-       struct sun8i_codec_softc * const sc = priv;
        const uint32_t mask =
            HMIC_STS_JACK_DET_OIRQ |
            HMIC_STS_JACK_DET_IIRQ |
            HMIC_STS_MIC_DET_ST;
+       struct sun8i_codec_softc * const sc = priv;
+       uint32_t val;
 
-       sc->sc_jackdet = RD4(sc, HMIC_STS);
-
-       if (sc->sc_jackdet & mask) {
+       val = RD4(sc, HMIC_STS);
+       if (val & mask) {
                /* Disable jack detect IRQ until work is complete */
                sun8i_codec_set_jackdet(sc, false);
 
@@ -276,8 +275,6 @@
                workqueue_enqueue(sc->sc_workq, &sc->sc_work, NULL);
        }
 
-       WR4(sc, HMIC_STS, sc->sc_jackdet);
-
        return 1;
 }
 
@@ -286,17 +283,19 @@
 sun8i_codec_thread(struct work *wk, void *priv)
 {
        struct sun8i_codec_softc * const sc = priv;
-       const uint32_t sts = sc->sc_jackdet;
        int hpdet = -1, micdet = -1;
+       uint32_t val;
+
+       val = RD4(sc, HMIC_STS);
 
        if (sc->sc_codec_analog) {
-               if (sts & HMIC_STS_JACK_DET_OIRQ)
+               if (val & HMIC_STS_JACK_DET_OIRQ)
                        hpdet = 0 ^ sc->sc_jackdet_pol;
-               else if (sts & HMIC_STS_JACK_DET_IIRQ)
+               else if (val & HMIC_STS_JACK_DET_IIRQ)
                        hpdet = 1 ^ sc->sc_jackdet_pol;
 
-               if (sts & HMIC_STS_MIC_DET_ST)
-                       micdet = !!(sts & HMIC_STS_MIC_PRESENT);
+               if (val & HMIC_STS_MIC_DET_ST)
+                       micdet = !!(val & HMIC_STS_MIC_PRESENT);
 
                if (hpdet != -1) {
                        audio_dai_jack_detect(sc->sc_codec_analog,
@@ -308,6 +307,8 @@
                }
        }
 
+       WR4(sc, HMIC_STS, val);
+
        /* Re-enable jack detect IRQ */
        sun8i_codec_set_jackdet(sc, true);
 }



Home | Main Index | Thread Index | Old Index