Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Andy Shevchenko and committed by
Ulf Hansson
6dab809b 0f2c771e

+41 -22
+32 -14
drivers/mmc/core/host.c
··· 416 416 417 417 /** 418 418 * mmc_of_parse_voltage - return mask of supported voltages 419 - * @np: The device node need to be parsed. 419 + * @host: host whose properties should be parsed. 420 420 * @mask: mask of voltages available for MMC/SD/SDIO 421 421 * 422 - * Parse the "voltage-ranges" DT property, returning zero if it is not 422 + * Parse the "voltage-ranges" property, returning zero if it is not 423 423 * found, negative errno if the voltage-range specification is invalid, 424 424 * or one if the voltage-range is specified and successfully parsed. 425 425 */ 426 - int mmc_of_parse_voltage(struct device_node *np, u32 *mask) 426 + int mmc_of_parse_voltage(struct mmc_host *host, u32 *mask) 427 427 { 428 - const u32 *voltage_ranges; 428 + const char *prop = "voltage-ranges"; 429 + struct device *dev = host->parent; 430 + u32 *voltage_ranges; 429 431 int num_ranges, i; 432 + int ret; 430 433 431 - voltage_ranges = of_get_property(np, "voltage-ranges", &num_ranges); 432 - if (!voltage_ranges) { 433 - pr_debug("%pOF: voltage-ranges unspecified\n", np); 434 + if (!device_property_present(dev, prop)) { 435 + dev_dbg(dev, "%s unspecified\n", prop); 434 436 return 0; 435 437 } 436 - num_ranges = num_ranges / sizeof(*voltage_ranges) / 2; 438 + 439 + ret = device_property_count_u32(dev, prop); 440 + if (ret < 0) 441 + return ret; 442 + 443 + num_ranges = ret / 2; 437 444 if (!num_ranges) { 438 - pr_err("%pOF: voltage-ranges empty\n", np); 445 + dev_err(dev, "%s empty\n", prop); 439 446 return -EINVAL; 447 + } 448 + 449 + voltage_ranges = kcalloc(2 * num_ranges, sizeof(*voltage_ranges), GFP_KERNEL); 450 + if (!voltage_ranges) 451 + return -ENOMEM; 452 + 453 + ret = device_property_read_u32_array(dev, prop, voltage_ranges, 2 * num_ranges); 454 + if (ret) { 455 + kfree(voltage_ranges); 456 + return ret; 440 457 } 441 458 442 459 for (i = 0; i < num_ranges; i++) { 443 460 const int j = i * 2; 444 461 u32 ocr_mask; 445 462 446 - ocr_mask = mmc_vddrange_to_ocrmask( 447 - be32_to_cpu(voltage_ranges[j]), 448 - be32_to_cpu(voltage_ranges[j + 1])); 463 + ocr_mask = mmc_vddrange_to_ocrmask(voltage_ranges[j + 0], 464 + voltage_ranges[j + 1]); 449 465 if (!ocr_mask) { 450 - pr_err("%pOF: voltage-range #%d is invalid\n", 451 - np, i); 466 + dev_err(dev, "range #%d in %s is invalid\n", i, prop); 467 + kfree(voltage_ranges); 452 468 return -EINVAL; 453 469 } 454 470 *mask |= ocr_mask; 455 471 } 472 + 473 + kfree(voltage_ranges); 456 474 457 475 return 1; 458 476 }
+4 -4
drivers/mmc/host/mmc_spi.c
··· 1397 1397 1398 1398 host->ones = ones; 1399 1399 1400 + dev_set_drvdata(&spi->dev, mmc); 1401 + 1400 1402 /* Platform data is used to hook up things like card sensing 1401 1403 * and power switching gpios. 1402 1404 */ ··· 1414 1412 if (!host->powerup_msecs || host->powerup_msecs > 250) 1415 1413 host->powerup_msecs = 250; 1416 1414 } 1417 - 1418 - dev_set_drvdata(&spi->dev, mmc); 1419 1415 1420 1416 /* preallocate dma buffers */ 1421 1417 host->data = kmalloc(sizeof(*host->data), GFP_KERNEL); ··· 1494 1494 fail_dma: 1495 1495 kfree(host->data); 1496 1496 fail_nobuf1: 1497 - mmc_free_host(mmc); 1498 1497 mmc_spi_put_pdata(spi); 1498 + mmc_free_host(mmc); 1499 1499 nomem: 1500 1500 kfree(ones); 1501 1501 return status; ··· 1518 1518 kfree(host->ones); 1519 1519 1520 1520 spi->max_speed_hz = mmc->f_max; 1521 - mmc_free_host(mmc); 1522 1521 mmc_spi_put_pdata(spi); 1522 + mmc_free_host(mmc); 1523 1523 return 0; 1524 1524 } 1525 1525
+2 -1
drivers/mmc/host/of_mmc_spi.c
··· 54 54 55 55 struct mmc_spi_platform_data *mmc_spi_get_pdata(struct spi_device *spi) 56 56 { 57 + struct mmc_host *mmc = dev_get_drvdata(&spi->dev); 57 58 struct device *dev = &spi->dev; 58 59 struct device_node *np = dev->of_node; 59 60 struct of_mmc_spi *oms; ··· 66 65 if (!oms) 67 66 return NULL; 68 67 69 - if (mmc_of_parse_voltage(np, &oms->pdata.ocr_mask) <= 0) 68 + if (mmc_of_parse_voltage(mmc, &oms->pdata.ocr_mask) <= 0) 70 69 goto err_ocr; 71 70 72 71 oms->detect_irq = irq_of_parse_and_map(np, 0);
+1 -1
drivers/mmc/host/sdhci-esdhc-imx.c
··· 1485 1485 if (of_property_read_u32(np, "fsl,delay-line", &boarddata->delay_line)) 1486 1486 boarddata->delay_line = 0; 1487 1487 1488 - mmc_of_parse_voltage(np, &host->ocr_mask); 1488 + mmc_of_parse_voltage(host->mmc, &host->ocr_mask); 1489 1489 1490 1490 if (esdhc_is_usdhc(imx_data) && !IS_ERR(imx_data->pinctrl)) { 1491 1491 imx_data->pins_100mhz = pinctrl_lookup_state(imx_data->pinctrl,
+1 -1
drivers/mmc/host/sdhci-of-esdhc.c
··· 1489 1489 if (ret) 1490 1490 goto err; 1491 1491 1492 - mmc_of_parse_voltage(np, &host->ocr_mask); 1492 + mmc_of_parse_voltage(host->mmc, &host->ocr_mask); 1493 1493 1494 1494 ret = sdhci_add_host(host); 1495 1495 if (ret)
+1 -1
include/linux/mmc/host.h
··· 509 509 void mmc_of_parse_clk_phase(struct mmc_host *host, 510 510 struct mmc_clk_phase_map *map); 511 511 int mmc_of_parse(struct mmc_host *host); 512 - int mmc_of_parse_voltage(struct device_node *np, u32 *mask); 512 + int mmc_of_parse_voltage(struct mmc_host *host, u32 *mask); 513 513 514 514 static inline void *mmc_priv(struct mmc_host *host) 515 515 {