In device tree, there is vmmc-supply property for SD/MMC. Introduce mmc_power_init function and pwrup hook function to let the specific drivers handle vmmc-supply.
mmc_power_init will first invoke board_mmc_power_init to avoid break boards which already implement board_mmc_power_init. Then if pwrup hook functions have been implemented for different mmc drivers, pwrup will be invoked. Signed-off-by: Peng Fan <[email protected]> Cc: Pantelis Antoniou <[email protected]> Cc: Andrew Gabbasov <[email protected]> Cc: Simon Glass <[email protected]> Cc: Stephen Warren <[email protected]> Cc: Clemens Gruber <[email protected]> Cc: Eric Nelson <[email protected]> Cc: Stefano Babic <[email protected]> Cc: Fabio Estevam <[email protected]> --- drivers/mmc/mmc.c | 15 ++++++++++++++- include/mmc.h | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index ede5d6e..f6d5c6f 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -1594,6 +1594,16 @@ __weak void board_mmc_power_init(void) { } +__weak int mmc_power_init(struct mmc *mmc) +{ + board_mmc_power_init(); + + if (mmc->cfg->ops->pwrup) + return mmc->cfg->ops->pwrup(mmc); + + return 0; +} + int mmc_start_init(struct mmc *mmc) { int err; @@ -1613,7 +1623,10 @@ int mmc_start_init(struct mmc *mmc) #ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT mmc_adapter_card_type_ident(); #endif - board_mmc_power_init(); + + err = mmc_power_init(mmc); + if (err) + return err; /* made sure it's not NULL earlier */ err = mmc->cfg->ops->init(mmc); diff --git a/include/mmc.h b/include/mmc.h index d652c14..111ff75 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -329,6 +329,7 @@ struct mmc_ops { int (*init)(struct mmc *mmc); int (*getcd)(struct mmc *mmc); int (*getwp)(struct mmc *mmc); + int (*pwrup)(struct mmc *mmc); }; struct mmc_config { -- 2.6.2 _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

