On Tue, May 6, 2014 at 3:57 PM, Tim Kryger <tim.kryger@xxxxxxxxxx> wrote: > Callers of mmc_regulator_get_supply could benefit from knowing if either > of the regulators are present but not yet available. Since callers do > not currently examine the return value, modify this function to return > zero or -EPROBE_DEFER if either regulator get returns the same. > > Furthermore, since callers check vmmc/vqmmc using IS_ERR and can deal > with absent regulators, switch to devm_regulator_get_optional. This has > the added benefit of allowing this function to behave correctly even in > the !CONFIG_REGULATOR case such that the stub can be removed. > > Signed-off-by: Tim Kryger <tim.kryger@xxxxxxxxxx> > --- Changes since v1: - Removed stub function for !CONFIG_REGULATOR case > drivers/mmc/core/core.c | 31 +++++++++++++++++++------------ > include/linux/mmc/host.h | 8 ++------ > 2 files changed, 21 insertions(+), 18 deletions(-) > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > index acbc3f2..2d9f6c5 100644 > --- a/drivers/mmc/core/core.c > +++ b/drivers/mmc/core/core.c > @@ -1310,31 +1310,38 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, > } > EXPORT_SYMBOL_GPL(mmc_regulator_set_ocr); > > +#endif /* CONFIG_REGULATOR */ > + > int mmc_regulator_get_supply(struct mmc_host *mmc) > { > struct device *dev = mmc_dev(mmc); > - struct regulator *supply; > int ret; > > - supply = devm_regulator_get(dev, "vmmc"); > - mmc->supply.vmmc = supply; > + mmc->supply.vmmc = devm_regulator_get_optional(dev, "vmmc"); > mmc->supply.vqmmc = devm_regulator_get_optional(dev, "vqmmc"); > > - if (IS_ERR(supply)) > - return PTR_ERR(supply); > + if (IS_ERR(mmc->supply.vmmc)) { > + if (PTR_ERR(mmc->supply.vmmc) == -EPROBE_DEFER) > + return -EPROBE_DEFER; > + dev_info(dev, "No vmmc regulator found\n"); > + } else { > + ret = mmc_regulator_get_ocrmask(mmc->supply.vmmc); > + if (ret > 0) > + mmc->ocr_avail = ret; > + else > + dev_warn(dev, "Failed getting OCR mask: %d\n", ret); > + } > > - ret = mmc_regulator_get_ocrmask(supply); > - if (ret > 0) > - mmc->ocr_avail = ret; > - else > - dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret); > + if (IS_ERR(mmc->supply.vqmmc)) { > + if (PTR_ERR(mmc->supply.vqmmc) == -EPROBE_DEFER) > + return -EPROBE_DEFER; > + dev_info(dev, "No vqmmc regulator found\n"); > + } > > return 0; > } > EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); > > -#endif /* CONFIG_REGULATOR */ > - > /* > * Mask off any voltages we don't support and select > * the lowest voltage > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > index cb61ea4..cfa2ecb 100644 > --- a/include/linux/mmc/host.h > +++ b/include/linux/mmc/host.h > @@ -396,7 +396,6 @@ int mmc_regulator_get_ocrmask(struct regulator *supply); > int mmc_regulator_set_ocr(struct mmc_host *mmc, > struct regulator *supply, > unsigned short vdd_bit); > -int mmc_regulator_get_supply(struct mmc_host *mmc); > #else > static inline int mmc_regulator_get_ocrmask(struct regulator *supply) > { > @@ -409,13 +408,10 @@ static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, > { > return 0; > } > - > -static inline int mmc_regulator_get_supply(struct mmc_host *mmc) > -{ > - return 0; > -} > #endif > > +int mmc_regulator_get_supply(struct mmc_host *mmc); > + > int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *); > > static inline int mmc_card_is_removable(struct mmc_host *host) > -- > 1.7.9.5 > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html