Module Name: src Committed By: jmcneill Date: Sat Oct 21 11:47:17 UTC 2017
Modified Files: src/sys/arch/arm/sunxi: sunxi_mmc.c Log Message: Add support for sdio interrupts To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/sunxi/sunxi_mmc.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/sunxi_mmc.c diff -u src/sys/arch/arm/sunxi/sunxi_mmc.c:1.10 src/sys/arch/arm/sunxi/sunxi_mmc.c:1.11 --- src/sys/arch/arm/sunxi/sunxi_mmc.c:1.10 Sun Oct 8 18:00:36 2017 +++ src/sys/arch/arm/sunxi/sunxi_mmc.c Sat Oct 21 11:47:17 2017 @@ -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 <jmcne...@invisible.ca> @@ -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 @@ struct sunxi_mmc_softc { 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 @@ static int 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 @@ done: 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); }