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 <van.free...@gmail.com> Cc: Pantelis Antoniou <pa...@antoniou-consulting.com> Cc: Andrew Gabbasov <andrew_gabba...@mentor.com> Cc: Simon Glass <s...@chromium.org> Cc: Stephen Warren <swar...@nvidia.com> Cc: Clemens Gruber <clemens.gru...@pqgruber.com> Cc: Eric Nelson <e...@nelint.com> Cc: Stefano Babic <sba...@denx.de> Cc: Fabio Estevam <fabio.este...@nxp.com> --- 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 U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot