aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/core/host.c
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2021-04-19 14:24:55 +0300
committerUlf Hansson <ulf.hansson@linaro.org>2021-04-23 09:29:49 +0200
commit6dab809bb5b183015e19d558bfa95107de660be0 (patch)
treef93693d6866d448af6b22289f29397dc8082414c /drivers/mmc/core/host.c
parentmmc: core: Correct descriptions in mmc_of_parse() (diff)
downloadlinux-stable-6dab809bb5b183015e19d558bfa95107de660be0.tar.xz
linux-stable-6dab809bb5b183015e19d558bfa95107de660be0.zip
mmc: core: Convert mmc_of_parse_voltage() to use device property API
mmc_of_parse() for a few years has been using device property API. Convert mmc_of_parse_voltage() as well. At the same time switch users to new API. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20210419112459.25241-2-andriy.shevchenko@linux.intel.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc/core/host.c')
-rw-r--r--drivers/mmc/core/host.c46
1 files changed, 32 insertions, 14 deletions
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index 324f4cfa92a7..0b0577990ddc 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -416,44 +416,62 @@ EXPORT_SYMBOL(mmc_of_parse);
/**
* mmc_of_parse_voltage - return mask of supported voltages
- * @np: The device node need to be parsed.
+ * @host: host whose properties should be parsed.
* @mask: mask of voltages available for MMC/SD/SDIO
*
- * Parse the "voltage-ranges" DT property, returning zero if it is not
+ * Parse the "voltage-ranges" property, returning zero if it is not
* found, negative errno if the voltage-range specification is invalid,
* or one if the voltage-range is specified and successfully parsed.
*/
-int mmc_of_parse_voltage(struct device_node *np, u32 *mask)
+int mmc_of_parse_voltage(struct mmc_host *host, u32 *mask)
{
- const u32 *voltage_ranges;
+ const char *prop = "voltage-ranges";
+ struct device *dev = host->parent;
+ u32 *voltage_ranges;
int num_ranges, i;
+ int ret;
- voltage_ranges = of_get_property(np, "voltage-ranges", &num_ranges);
- if (!voltage_ranges) {
- pr_debug("%pOF: voltage-ranges unspecified\n", np);
+ if (!device_property_present(dev, prop)) {
+ dev_dbg(dev, "%s unspecified\n", prop);
return 0;
}
- num_ranges = num_ranges / sizeof(*voltage_ranges) / 2;
+
+ ret = device_property_count_u32(dev, prop);
+ if (ret < 0)
+ return ret;
+
+ num_ranges = ret / 2;
if (!num_ranges) {
- pr_err("%pOF: voltage-ranges empty\n", np);
+ dev_err(dev, "%s empty\n", prop);
return -EINVAL;
}
+ voltage_ranges = kcalloc(2 * num_ranges, sizeof(*voltage_ranges), GFP_KERNEL);
+ if (!voltage_ranges)
+ return -ENOMEM;
+
+ ret = device_property_read_u32_array(dev, prop, voltage_ranges, 2 * num_ranges);
+ if (ret) {
+ kfree(voltage_ranges);
+ return ret;
+ }
+
for (i = 0; i < num_ranges; i++) {
const int j = i * 2;
u32 ocr_mask;
- ocr_mask = mmc_vddrange_to_ocrmask(
- be32_to_cpu(voltage_ranges[j]),
- be32_to_cpu(voltage_ranges[j + 1]));
+ ocr_mask = mmc_vddrange_to_ocrmask(voltage_ranges[j + 0],
+ voltage_ranges[j + 1]);
if (!ocr_mask) {
- pr_err("%pOF: voltage-range #%d is invalid\n",
- np, i);
+ dev_err(dev, "range #%d in %s is invalid\n", i, prop);
+ kfree(voltage_ranges);
return -EINVAL;
}
*mask |= ocr_mask;
}
+ kfree(voltage_ranges);
+
return 1;
}
EXPORT_SYMBOL(mmc_of_parse_voltage);