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 <[email protected]>
@@ -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);
}