Commit 9e7b9a25 authored by Jan Glauber's avatar Jan Glauber Committed by Ulf Hansson

mmc: cavium: Prevent crash with incomplete DT

In case the DT specifies neither a regulator nor a gpio
for the shared power the driver will crash accessing the regulator.
Prevent the crash by checking the regulator before use.

Use mmc_regulator_get_supply() instead of open coding the same
logic.
Signed-off-by: default avatarJan Glauber <jglauber@cavium.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 899e4aad
...@@ -839,14 +839,14 @@ static void cvm_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) ...@@ -839,14 +839,14 @@ static void cvm_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
cvm_mmc_reset_bus(slot); cvm_mmc_reset_bus(slot);
if (host->global_pwr_gpiod) if (host->global_pwr_gpiod)
host->set_shared_power(host, 0); host->set_shared_power(host, 0);
else else if (!IS_ERR(mmc->supply.vmmc))
mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
break; break;
case MMC_POWER_UP: case MMC_POWER_UP:
if (host->global_pwr_gpiod) if (host->global_pwr_gpiod)
host->set_shared_power(host, 1); host->set_shared_power(host, 1);
else else if (!IS_ERR(mmc->supply.vmmc))
mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd);
break; break;
} }
...@@ -968,20 +968,15 @@ static int cvm_mmc_of_parse(struct device *dev, struct cvm_mmc_slot *slot) ...@@ -968,20 +968,15 @@ static int cvm_mmc_of_parse(struct device *dev, struct cvm_mmc_slot *slot)
return -EINVAL; return -EINVAL;
} }
mmc->supply.vmmc = devm_regulator_get_optional(dev, "vmmc"); ret = mmc_regulator_get_supply(mmc);
if (IS_ERR(mmc->supply.vmmc)) { if (ret == -EPROBE_DEFER)
if (PTR_ERR(mmc->supply.vmmc) == -EPROBE_DEFER) return ret;
return -EPROBE_DEFER; /*
/* * Legacy Octeon firmware has no regulator entry, fall-back to
* Legacy Octeon firmware has no regulator entry, fall-back to * a hard-coded voltage to get a sane OCR.
* a hard-coded voltage to get a sane OCR. */
*/ if (IS_ERR(mmc->supply.vmmc))
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
} else {
ret = mmc_regulator_get_ocrmask(mmc->supply.vmmc);
if (ret > 0)
mmc->ocr_avail = ret;
}
/* Common MMC bindings */ /* Common MMC bindings */
ret = mmc_of_parse(mmc); ret = mmc_of_parse(mmc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment