diff --git a/sys/arm/allwinner/aw_mmc.c b/sys/arm/allwinner/aw_mmc.c --- a/sys/arm/allwinner/aw_mmc.c +++ b/sys/arm/allwinner/aw_mmc.c @@ -317,36 +317,41 @@ aw_mmc_helper_cd_handler(device_t dev, bool present) { struct aw_mmc_softc *sc; +#ifndef MMCCAM + device_t child; +#endif sc = device_get_softc(dev); #ifdef MMCCAM mmc_cam_sim_discover(&sc->mmc_sim); #else AW_MMC_LOCK(sc); - if (present) { - if (sc->child == NULL) { - if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD)) - device_printf(sc->aw_dev, "Card inserted\n"); + child = sc->child; + AW_MMC_UNLOCK(sc); - sc->child = device_add_child(sc->aw_dev, "mmc", DEVICE_UNIT_ANY); - AW_MMC_UNLOCK(sc); - if (sc->child) { - device_set_ivars(sc->child, sc); - (void)device_probe_and_attach(sc->child); - } - } else - AW_MMC_UNLOCK(sc); - } else { - /* Card isn't present, detach if necessary */ - if (sc->child != NULL) { - if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD)) - device_printf(sc->aw_dev, "Card removed\n"); + if (present && child == NULL) { + if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD)) + device_printf(sc->aw_dev, "Card inserted\n"); - AW_MMC_UNLOCK(sc); - device_delete_child(sc->aw_dev, sc->child); - sc->child = NULL; - } else - AW_MMC_UNLOCK(sc); + child = device_add_child(sc->aw_dev, "mmc", DEVICE_UNIT_ANY); + if (child != NULL) { + device_set_ivars(child, sc); + (void)device_probe_and_attach(child); + } + + AW_MMC_LOCK(sc); + sc->child = child; + AW_MMC_UNLOCK(sc); + } else if (!present && child != NULL) { + /* Card isn't present, detach. */ + if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD)) + device_printf(sc->aw_dev, "Card removed\n"); + + AW_MMC_LOCK(sc); + sc->child = NULL; + AW_MMC_UNLOCK(sc); + + device_delete_child(sc->aw_dev, child); } #endif /* MMCCAM */ }