On Fri, Nov 21, 2008 at 11:58 AM, Adrian Hunter <ext-adrian.hunter@xxxxxxxxx> wrote: <snip> > @@ -1128,15 +1128,17 @@ static int omap_mmc_remove(struct platform_device <snip> > + mmc_omap_fclk_state(host, ON); > + if (!(OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET)) { > + /* > + * Set the vdd back to 3V, > + * applicable for dual volt support. > + */ > + vdd = fls(host->mmc->ocr_avail) - 1; > + if (omap_mmc_switch_opcond(host, vdd) != 0) > + host->mmc->ios.vdd = vdd; > + } I wonder what this block is for? Wouldn't simple host->mmc->ios.vdd = vdd; be enough? It calls omap_mmc_switch_opcond() which toggles clocks and power without good reason (I think). Clocks will be turned off later in omap_mmc_remove() anyway, and .set_ios will turn off power. Also, HCTL SDVSDET bit will never be set for MMC2 and MMC3, causing mentioned omap_mmc_switch_opcond() to be called unconditionally here. The same block can be found in mmc_omap_detect() function, where it is executed on card removal. There it causes MMC2 controller to stop working completely on pandora board :( -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html