mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 16:13:19 +09:00
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>
This commit is contained in:
committed by
Ulf Hansson
parent
0f2c771e74
commit
6dab809bb5
@@ -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);
|
||||||
|
|||||||
@@ -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 @@ fail_glue_init:
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -509,7 +509,7 @@ void mmc_free_host(struct mmc_host *);
|
|||||||
void mmc_of_parse_clk_phase(struct mmc_host *host,
|
void mmc_of_parse_clk_phase(struct mmc_host *host,
|
||||||
struct mmc_clk_phase_map *map);
|
struct mmc_clk_phase_map *map);
|
||||||
int mmc_of_parse(struct mmc_host *host);
|
int mmc_of_parse(struct mmc_host *host);
|
||||||
int mmc_of_parse_voltage(struct device_node *np, u32 *mask);
|
int mmc_of_parse_voltage(struct mmc_host *host, u32 *mask);
|
||||||
|
|
||||||
static inline void *mmc_priv(struct mmc_host *host)
|
static inline void *mmc_priv(struct mmc_host *host)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user