Commit 6dab809b authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Ulf Hansson
Browse files

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: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20210419112459.25241-2-andriy.shevchenko@linux.intel.com


Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 0f2c771e
Loading
Loading
Loading
Loading
+32 −14
Original line number Original line Diff line number Diff line
@@ -416,44 +416,62 @@ EXPORT_SYMBOL(mmc_of_parse);


/**
/**
 * mmc_of_parse_voltage - return mask of supported voltages
 * 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
 * @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,
 * found, negative errno if the voltage-range specification is invalid,
 * or one if the voltage-range is specified and successfully parsed.
 * 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 num_ranges, i;
	int ret;


	voltage_ranges = of_get_property(np, "voltage-ranges", &num_ranges);
	if (!device_property_present(dev, prop)) {
	if (!voltage_ranges) {
		dev_dbg(dev, "%s unspecified\n", prop);
		pr_debug("%pOF: voltage-ranges unspecified\n", np);
		return 0;
		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) {
	if (!num_ranges) {
		pr_err("%pOF: voltage-ranges empty\n", np);
		dev_err(dev, "%s empty\n", prop);
		return -EINVAL;
		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++) {
	for (i = 0; i < num_ranges; i++) {
		const int j = i * 2;
		const int j = i * 2;
		u32 ocr_mask;
		u32 ocr_mask;


		ocr_mask = mmc_vddrange_to_ocrmask(
		ocr_mask = mmc_vddrange_to_ocrmask(voltage_ranges[j + 0],
				be32_to_cpu(voltage_ranges[j]),
						   voltage_ranges[j + 1]);
				be32_to_cpu(voltage_ranges[j + 1]));
		if (!ocr_mask) {
		if (!ocr_mask) {
			pr_err("%pOF: voltage-range #%d is invalid\n",
			dev_err(dev, "range #%d in %s is invalid\n", i, prop);
				np, i);
			kfree(voltage_ranges);
			return -EINVAL;
			return -EINVAL;
		}
		}
		*mask |= ocr_mask;
		*mask |= ocr_mask;
	}
	}


	kfree(voltage_ranges);

	return 1;
	return 1;
}
}
EXPORT_SYMBOL(mmc_of_parse_voltage);
EXPORT_SYMBOL(mmc_of_parse_voltage);
+4 −4
Original line number Original line Diff line number Diff line
@@ -1397,6 +1397,8 @@ static int mmc_spi_probe(struct spi_device *spi)


	host->ones = ones;
	host->ones = ones;


	dev_set_drvdata(&spi->dev, mmc);

	/* Platform data is used to hook up things like card sensing
	/* Platform data is used to hook up things like card sensing
	 * and power switching gpios.
	 * and power switching gpios.
	 */
	 */
@@ -1413,8 +1415,6 @@ static int mmc_spi_probe(struct spi_device *spi)
			host->powerup_msecs = 250;
			host->powerup_msecs = 250;
	}
	}


	dev_set_drvdata(&spi->dev, mmc);

	/* preallocate dma buffers */
	/* preallocate dma buffers */
	host->data = kmalloc(sizeof(*host->data), GFP_KERNEL);
	host->data = kmalloc(sizeof(*host->data), GFP_KERNEL);
	if (!host->data)
	if (!host->data)
@@ -1494,8 +1494,8 @@ static int mmc_spi_probe(struct spi_device *spi)
fail_dma:
fail_dma:
	kfree(host->data);
	kfree(host->data);
fail_nobuf1:
fail_nobuf1:
	mmc_free_host(mmc);
	mmc_spi_put_pdata(spi);
	mmc_spi_put_pdata(spi);
	mmc_free_host(mmc);
nomem:
nomem:
	kfree(ones);
	kfree(ones);
	return status;
	return status;
@@ -1518,8 +1518,8 @@ static int mmc_spi_remove(struct spi_device *spi)
	kfree(host->ones);
	kfree(host->ones);


	spi->max_speed_hz = mmc->f_max;
	spi->max_speed_hz = mmc->f_max;
	mmc_free_host(mmc);
	mmc_spi_put_pdata(spi);
	mmc_spi_put_pdata(spi);
	mmc_free_host(mmc);
	return 0;
	return 0;
}
}


+2 −1
Original line number Original line Diff line number Diff line
@@ -54,6 +54,7 @@ static void of_mmc_spi_exit(struct device *dev, void *mmc)


struct mmc_spi_platform_data *mmc_spi_get_pdata(struct spi_device *spi)
struct mmc_spi_platform_data *mmc_spi_get_pdata(struct spi_device *spi)
{
{
	struct mmc_host *mmc = dev_get_drvdata(&spi->dev);
	struct device *dev = &spi->dev;
	struct device *dev = &spi->dev;
	struct device_node *np = dev->of_node;
	struct device_node *np = dev->of_node;
	struct of_mmc_spi *oms;
	struct of_mmc_spi *oms;
@@ -65,7 +66,7 @@ struct mmc_spi_platform_data *mmc_spi_get_pdata(struct spi_device *spi)
	if (!oms)
	if (!oms)
		return NULL;
		return NULL;


	if (mmc_of_parse_voltage(np, &oms->pdata.ocr_mask) <= 0)
	if (mmc_of_parse_voltage(mmc, &oms->pdata.ocr_mask) <= 0)
		goto err_ocr;
		goto err_ocr;


	oms->detect_irq = irq_of_parse_and_map(np, 0);
	oms->detect_irq = irq_of_parse_and_map(np, 0);
+1 −1
Original line number Original line Diff line number Diff line
@@ -1485,7 +1485,7 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev,
	if (of_property_read_u32(np, "fsl,delay-line", &boarddata->delay_line))
	if (of_property_read_u32(np, "fsl,delay-line", &boarddata->delay_line))
		boarddata->delay_line = 0;
		boarddata->delay_line = 0;


	mmc_of_parse_voltage(np, &host->ocr_mask);
	mmc_of_parse_voltage(host->mmc, &host->ocr_mask);


	if (esdhc_is_usdhc(imx_data) && !IS_ERR(imx_data->pinctrl)) {
	if (esdhc_is_usdhc(imx_data) && !IS_ERR(imx_data->pinctrl)) {
		imx_data->pins_100mhz = pinctrl_lookup_state(imx_data->pinctrl,
		imx_data->pins_100mhz = pinctrl_lookup_state(imx_data->pinctrl,
+1 −1
Original line number Original line Diff line number Diff line
@@ -1489,7 +1489,7 @@ static int sdhci_esdhc_probe(struct platform_device *pdev)
	if (ret)
	if (ret)
		goto err;
		goto err;


	mmc_of_parse_voltage(np, &host->ocr_mask);
	mmc_of_parse_voltage(host->mmc, &host->ocr_mask);


	ret = sdhci_add_host(host);
	ret = sdhci_add_host(host);
	if (ret)
	if (ret)
Loading