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 Add support for sdio interrupts



details:   https://anonhg.NetBSD.org/src/rev/eea73d1d244a
branches:  trunk
changeset: 827236:eea73d1d244a
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sat Oct 21 11:47:17 2017 +0000

description:
Add support for sdio interrupts

diffstat:

 sys/arch/arm/sunxi/sunxi_mmc.c |  37 +++++++++++++++++++++++++------------
 1 files changed, 25 insertions(+), 12 deletions(-)

diffs (95 lines):

diff -r 46fe05166888 -r eea73d1d244a sys/arch/arm/sunxi/sunxi_mmc.c
--- a/sys/arch/arm/sunxi/sunxi_mmc.c    Sat Oct 21 11:38:13 2017 +0000
+++ b/sys/arch/arm/sunxi/sunxi_mmc.c    Sat Oct 21 11:47:17 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_mmc.c,v 1.10 2017/10/08 18:00:36 jmcneill Exp $ */
+/* $NetBSD: sunxi_mmc.c,v 1.11 2017/10/21 11:47:17 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014-2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_mmc.c,v 1.10 2017/10/08 18:00:36 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_mmc.c,v 1.11 2017/10/21 11:47:17 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -153,7 +153,6 @@
        void *sc_idma_desc;
 
        uint32_t sc_intr_rint;
-       uint32_t sc_intr_mint;
        uint32_t sc_idma_idst;
 
        struct clk *sc_clk_ahb;
@@ -451,35 +450,37 @@
 sunxi_mmc_intr(void *priv)
 {
        struct sunxi_mmc_softc *sc = priv;
-       uint32_t idst, rint, mint;
+       uint32_t idst, rint;
 
        mutex_enter(&sc->sc_intr_lock);
        idst = MMC_READ(sc, SUNXI_MMC_IDST);
        rint = MMC_READ(sc, SUNXI_MMC_RINT);
-       mint = MMC_READ(sc, SUNXI_MMC_MINT);
-       if (!idst && !rint && !mint) {
+       if (!idst && !rint) {
                mutex_exit(&sc->sc_intr_lock);
                return 0;
        }
        MMC_WRITE(sc, SUNXI_MMC_IDST, idst);
        MMC_WRITE(sc, SUNXI_MMC_RINT, rint);
-       MMC_WRITE(sc, SUNXI_MMC_MINT, mint);
 
 #ifdef SUNXI_MMC_DEBUG
-       device_printf(sc->sc_dev, "mmc intr idst=%08X rint=%08X mint=%08X\n",
-           idst, rint, mint);
+       device_printf(sc->sc_dev, "mmc intr idst=%08X rint=%08X\n",
+           idst, rint);
 #endif
 
-       if (idst) {
+       if (idst != 0) {
                sc->sc_idma_idst |= idst;
                cv_broadcast(&sc->sc_idst_cv);
        }
 
-       if (rint) {
-               sc->sc_intr_rint |= rint;
+       if ((rint & ~SUNXI_MMC_INT_SDIO_INT) != 0) {
+               sc->sc_intr_rint |= (rint & ~SUNXI_MMC_INT_SDIO_INT);
                cv_broadcast(&sc->sc_intr_cv);
        }
 
+       if ((rint & SUNXI_MMC_INT_SDIO_INT) != 0) {
+               sdmmc_card_intr(sc->sc_sdmmc_dev);
+       }
+
        mutex_exit(&sc->sc_intr_lock);
 
        return 1;
@@ -1038,9 +1039,21 @@
 static void
 sunxi_mmc_card_enable_intr(sdmmc_chipset_handle_t sch, int enable)
 {
+       struct sunxi_mmc_softc *sc = sch;
+       uint32_t imask;
+
+       imask = MMC_READ(sc, SUNXI_MMC_IMASK);
+       if (enable)
+               imask |= SUNXI_MMC_INT_SDIO_INT;
+       else
+               imask &= ~SUNXI_MMC_INT_SDIO_INT;
+       MMC_WRITE(sc, SUNXI_MMC_IMASK, imask);
 }
 
 static void
 sunxi_mmc_card_intr_ack(sdmmc_chipset_handle_t sch)
 {
+       struct sunxi_mmc_softc *sc = sch;
+
+       MMC_WRITE(sc, SUNXI_MMC_RINT, SUNXI_MMC_INT_SDIO_INT);
 }



Home | Main Index | Thread Index | Old Index