svn commit: r360011 - in head/sys: arm/allwinner modules/allwinner modules/allwinner/aw_mmc
Emmanuel Vadot
manu at FreeBSD.org
Thu Apr 16 16:00:22 UTC 2020
Author: manu
Date: Thu Apr 16 16:00:21 2020
New Revision: 360011
URL: https://svnweb.freebsd.org/changeset/base/360011
Log:
arm: allwinner: aw_mmc: Make it possible to unload the module
While here, add a makefile in sys/modules/allwinner so it is built.
Also add the PNP info so devmatch will load this module automatically.
MFC after: 1 month
Added:
head/sys/modules/allwinner/aw_mmc/
head/sys/modules/allwinner/aw_mmc/Makefile (contents, props changed)
Modified:
head/sys/arm/allwinner/aw_mmc.c
head/sys/modules/allwinner/Makefile
Modified: head/sys/arm/allwinner/aw_mmc.c
==============================================================================
--- head/sys/arm/allwinner/aw_mmc.c Thu Apr 16 15:59:23 2020 (r360010)
+++ head/sys/arm/allwinner/aw_mmc.c Thu Apr 16 16:00:21 2020 (r360011)
@@ -163,6 +163,7 @@ static int aw_mmc_probe(device_t);
static int aw_mmc_attach(device_t);
static int aw_mmc_detach(device_t);
static int aw_mmc_setup_dma(struct aw_mmc_softc *);
+static void aw_mmc_teardown_dma(struct aw_mmc_softc *sc);
static int aw_mmc_reset(struct aw_mmc_softc *);
static int aw_mmc_init(struct aw_mmc_softc *);
static void aw_mmc_intr(void *);
@@ -559,8 +560,46 @@ fail:
static int
aw_mmc_detach(device_t dev)
{
+ struct aw_mmc_softc *sc;
+ device_t d;
- return (EBUSY);
+ sc = device_get_softc(dev);
+
+ clk_disable(sc->aw_clk_mmc);
+ clk_disable(sc->aw_clk_ahb);
+ hwreset_assert(sc->aw_rst_ahb);
+
+ mmc_fdt_gpio_teardown(&sc->mmc_helper);
+
+ callout_drain(&sc->aw_timeoutc);
+
+ AW_MMC_LOCK(sc);
+ d = sc->child;
+ sc->child = NULL;
+ AW_MMC_UNLOCK(sc);
+ if (d != NULL)
+ device_delete_child(sc->aw_dev, d);
+
+ aw_mmc_teardown_dma(sc);
+
+ mtx_destroy(&sc->aw_mtx);
+
+ bus_teardown_intr(dev, sc->aw_res[AW_MMC_IRQRES], sc->aw_intrhand);
+ bus_release_resources(dev, aw_mmc_res_spec, sc->aw_res);
+
+#ifdef MMCCAM
+ if (sc->sim != NULL) {
+ mtx_lock(&sc->sim_mtx);
+ xpt_bus_deregister(cam_sim_path(sc->sim));
+ cam_sim_free(sc->sim, FALSE);
+ mtx_unlock(&sc->sim_mtx);
+ }
+
+ if (sc->devq != NULL)
+ cam_simq_free(sc->devq);
+#endif
+
+ return (0);
}
static void
@@ -635,6 +674,21 @@ aw_mmc_setup_dma(struct aw_mmc_softc *sc)
}
static void
+aw_mmc_teardown_dma(struct aw_mmc_softc *sc)
+{
+
+ bus_dmamap_unload(sc->aw_dma_tag, sc->aw_dma_map);
+ bus_dmamem_free(sc->aw_dma_tag, sc->aw_dma_desc, sc->aw_dma_map);
+ if (bus_dma_tag_destroy(sc->aw_dma_tag) != 0)
+ device_printf(sc->aw_dev, "Cannot destroy the dma tag\n");
+
+ bus_dmamap_unload(sc->aw_dma_buf_tag, sc->aw_dma_buf_map);
+ bus_dmamap_destroy(sc->aw_dma_buf_tag, sc->aw_dma_buf_map);
+ if (bus_dma_tag_destroy(sc->aw_dma_buf_tag) != 0)
+ device_printf(sc->aw_dev, "Cannot destroy the dma buf tag\n");
+}
+
+static void
aw_dma_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int err)
{
int i;
@@ -1519,3 +1573,4 @@ DRIVER_MODULE(aw_mmc, simplebus, aw_mmc_driver, aw_mmc
#ifndef MMCCAM
MMC_DECLARE_BRIDGE(aw_mmc);
#endif
+SIMPLEBUS_PNP_INFO(compat_data);
Modified: head/sys/modules/allwinner/Makefile
==============================================================================
--- head/sys/modules/allwinner/Makefile Thu Apr 16 15:59:23 2020 (r360010)
+++ head/sys/modules/allwinner/Makefile Thu Apr 16 16:00:21 2020 (r360011)
@@ -2,6 +2,7 @@
# Build modules specific to Allwinner.
SUBDIR = \
+ aw_mmc \
aw_pwm \
aw_rtc \
aw_rsb \
Added: head/sys/modules/allwinner/aw_mmc/Makefile
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/modules/allwinner/aw_mmc/Makefile Thu Apr 16 16:00:21 2020 (r360011)
@@ -0,0 +1,14 @@
+# $FreeBSD$
+
+.PATH: ${SRCTOP}/sys/arm/allwinner
+
+KMOD= aw_mmc
+SRCS= aw_mmc.c
+
+SRCS+= \
+ bus_if.h \
+ clknode_if.h \
+ device_if.h \
+ ofw_bus_if.h
+
+.include <bsd.kmod.mk>
More information about the svn-src-all
mailing list