Lines Matching +full:mmc +full:-

1 // SPDX-License-Identifier: GPL-2.0
3 * Helper functions for MMC regulators.
11 #include <linux/mmc/host.h>
19 * mmc_ocrbitnum_to_vdd - Convert a OCR bit number to its voltage
32 return -EINVAL; in mmc_ocrbitnum_to_vdd()
40 tmp = vdd_bit - ilog2(MMC_VDD_165_195); in mmc_ocrbitnum_to_vdd()
53 * mmc_regulator_get_ocrmask - return mask of supported voltages
57 * can be provided to MMC/SD/SDIO devices using the specified voltage
59 * MMC host adapter.
95 * mmc_regulator_set_ocr - set regulator to match host->ios voltage
96 * @mmc: the host to regulate
98 * @vdd_bit: zero for power off, else a bit number (host->ios.vdd)
102 * MMC host drivers may use this to enable or disable a regulator using
106 int mmc_regulator_set_ocr(struct mmc_host *mmc, in mmc_regulator_set_ocr() argument
117 if (result == 0 && !mmc->regulator_enabled) { in mmc_regulator_set_ocr()
120 mmc->regulator_enabled = true; in mmc_regulator_set_ocr()
122 } else if (mmc->regulator_enabled) { in mmc_regulator_set_ocr()
125 mmc->regulator_enabled = false; in mmc_regulator_set_ocr()
129 dev_err(mmc_dev(mmc), in mmc_regulator_set_ocr()
146 return -EINVAL; in mmc_regulator_set_voltage_if_supported()
161 * mmc_regulator_set_vqmmc - Set VQMMC as per the ios
162 * @mmc: the host to regulate
169 * If this is not possible we'll try the full 2.7-3.6V of the spec.
179 int mmc_regulator_set_vqmmc(struct mmc_host *mmc, struct mmc_ios *ios) in mmc_regulator_set_vqmmc() argument
181 struct device *dev = mmc_dev(mmc); in mmc_regulator_set_vqmmc()
185 if (IS_ERR(mmc->supply.vqmmc)) in mmc_regulator_set_vqmmc()
186 return -EINVAL; in mmc_regulator_set_vqmmc()
188 switch (ios->signal_voltage) { in mmc_regulator_set_vqmmc()
190 return mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc, in mmc_regulator_set_vqmmc()
193 return mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc, in mmc_regulator_set_vqmmc()
196 ret = mmc_ocrbitnum_to_vdd(mmc->ios.vdd, &volt, &max_uV); in mmc_regulator_set_vqmmc()
200 dev_dbg(dev, "%s: found vmmc voltage range of %d-%duV\n", in mmc_regulator_set_vqmmc()
203 min_uV = max(volt - 300000, 2700000); in mmc_regulator_set_vqmmc()
213 ret = mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc, in mmc_regulator_set_vqmmc()
218 return mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc, in mmc_regulator_set_vqmmc()
221 return -EINVAL; in mmc_regulator_set_vqmmc()
236 * mmc_regulator_get_supply - try to get VMMC and VQMMC regulators for a host
237 * @mmc: the host to regulate
240 * or -EPROBE_DEFER. 0 means no critical error but it does not mean all
245 int mmc_regulator_get_supply(struct mmc_host *mmc) in mmc_regulator_get_supply() argument
247 struct device *dev = mmc_dev(mmc); in mmc_regulator_get_supply()
250 mmc->supply.vmmc = devm_regulator_get_optional(dev, "vmmc"); in mmc_regulator_get_supply()
251 mmc->supply.vqmmc = devm_regulator_get_optional(dev, "vqmmc"); in mmc_regulator_get_supply()
253 if (IS_ERR(mmc->supply.vmmc)) { in mmc_regulator_get_supply()
254 if (PTR_ERR(mmc->supply.vmmc) == -EPROBE_DEFER) in mmc_regulator_get_supply()
255 return -EPROBE_DEFER; in mmc_regulator_get_supply()
258 ret = mmc_regulator_get_ocrmask(mmc->supply.vmmc); in mmc_regulator_get_supply()
260 mmc->ocr_avail = ret; in mmc_regulator_get_supply()
265 if (IS_ERR(mmc->supply.vqmmc)) { in mmc_regulator_get_supply()
266 if (PTR_ERR(mmc->supply.vqmmc) == -EPROBE_DEFER) in mmc_regulator_get_supply()
267 return -EPROBE_DEFER; in mmc_regulator_get_supply()