Lines Matching +full:vmmc +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0
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
54 * @supply: regulator to use
61 static int mmc_regulator_get_ocrmask(struct regulator *supply) in mmc_regulator_get_ocrmask() argument
69 count = regulator_count_voltages(supply); in mmc_regulator_get_ocrmask()
74 vdd_uV = regulator_list_voltage(supply, i); in mmc_regulator_get_ocrmask()
83 vdd_uV = regulator_get_voltage(supply); in mmc_regulator_get_ocrmask()
95 * mmc_regulator_set_ocr - set regulator to match host->ios voltage
97 * @supply: regulator to use
98 * @vdd_bit: zero for power off, else a bit number (host->ios.vdd)
103 * a particular supply voltage. This would normally be called from the
107 struct regulator *supply, in mmc_regulator_set_ocr() argument
113 if (IS_ERR(supply)) in mmc_regulator_set_ocr()
119 result = regulator_set_voltage(supply, min_uV, max_uV); in mmc_regulator_set_ocr()
120 if (result == 0 && !mmc->regulator_enabled) { in mmc_regulator_set_ocr()
121 result = regulator_enable(supply); in mmc_regulator_set_ocr()
123 mmc->regulator_enabled = true; in mmc_regulator_set_ocr()
125 } else if (mmc->regulator_enabled) { in mmc_regulator_set_ocr()
126 result = regulator_disable(supply); in mmc_regulator_set_ocr()
128 mmc->regulator_enabled = false; in mmc_regulator_set_ocr()
149 return -EINVAL; in mmc_regulator_set_voltage_if_supported()
164 * mmc_regulator_set_vqmmc - Set VQMMC as per the ios
168 * For 3.3V signaling, we try to match VQMMC to VMMC as closely as possible.
169 * That will match the behavior of old boards where VQMMC and VMMC were supplied
170 * by the same supply. The Bus Operating conditions for 3.3V signaling in the
171 * SD card spec also define VQMMC in terms of VMMC.
172 * If this is not possible we'll try the full 2.7-3.6V of the spec.
187 /* If no vqmmc supply then we can't change the voltage */ in mmc_regulator_set_vqmmc()
188 if (IS_ERR(mmc->supply.vqmmc)) in mmc_regulator_set_vqmmc()
189 return -EINVAL; in mmc_regulator_set_vqmmc()
191 switch (ios->signal_voltage) { in mmc_regulator_set_vqmmc()
193 return mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc, in mmc_regulator_set_vqmmc()
196 return mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc, in mmc_regulator_set_vqmmc()
199 ret = mmc_ocrbitnum_to_vdd(mmc->ios.vdd, &volt, &max_uV); in mmc_regulator_set_vqmmc()
203 dev_dbg(dev, "%s: found vmmc voltage range of %d-%duV\n", in mmc_regulator_set_vqmmc()
206 min_uV = max(volt - 300000, 2700000); in mmc_regulator_set_vqmmc()
213 * voltage in two steps and try to stay close to vmmc in mmc_regulator_set_vqmmc()
216 ret = mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc, in mmc_regulator_set_vqmmc()
221 return mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc, in mmc_regulator_set_vqmmc()
224 return -EINVAL; in mmc_regulator_set_vqmmc()
231 static inline int mmc_regulator_get_ocrmask(struct regulator *supply) in mmc_regulator_get_ocrmask() argument
239 * mmc_regulator_get_supply - try to get VMMC and VQMMC regulators for a host
243 * or -EPROBE_DEFER. 0 means no critical error but it does not mean all
253 mmc->supply.vmmc = devm_regulator_get_optional(dev, "vmmc"); in mmc_regulator_get_supply()
254 mmc->supply.vqmmc = devm_regulator_get_optional(dev, "vqmmc"); in mmc_regulator_get_supply()
256 if (IS_ERR(mmc->supply.vmmc)) { in mmc_regulator_get_supply()
257 if (PTR_ERR(mmc->supply.vmmc) == -EPROBE_DEFER) in mmc_regulator_get_supply()
258 return dev_err_probe(dev, -EPROBE_DEFER, in mmc_regulator_get_supply()
259 "vmmc regulator not available\n"); in mmc_regulator_get_supply()
261 dev_dbg(dev, "No vmmc regulator found\n"); in mmc_regulator_get_supply()
263 ret = mmc_regulator_get_ocrmask(mmc->supply.vmmc); in mmc_regulator_get_supply()
265 mmc->ocr_avail = ret; in mmc_regulator_get_supply()
270 if (IS_ERR(mmc->supply.vqmmc)) { in mmc_regulator_get_supply()
271 if (PTR_ERR(mmc->supply.vqmmc) == -EPROBE_DEFER) in mmc_regulator_get_supply()
272 return dev_err_probe(dev, -EPROBE_DEFER, in mmc_regulator_get_supply()
283 * mmc_regulator_enable_vqmmc - enable VQMMC regulator for a host
294 if (!IS_ERR(mmc->supply.vqmmc) && !mmc->vqmmc_enabled) { in mmc_regulator_enable_vqmmc()
295 ret = regulator_enable(mmc->supply.vqmmc); in mmc_regulator_enable_vqmmc()
299 mmc->vqmmc_enabled = true; in mmc_regulator_enable_vqmmc()
307 * mmc_regulator_disable_vqmmc - disable VQMMC regulator for a host
316 if (!IS_ERR(mmc->supply.vqmmc) && mmc->vqmmc_enabled) { in mmc_regulator_disable_vqmmc()
317 regulator_disable(mmc->supply.vqmmc); in mmc_regulator_disable_vqmmc()
318 mmc->vqmmc_enabled = false; in mmc_regulator_disable_vqmmc()