Commit 0db055c9 authored by Brad Campbell's avatar Brad Campbell Committed by Marcel Holtmann

cc2520: Do not store platform_data in spi_device

Storing the `platform_data` struct inside of the SPI struct when using
the device tree allows for a later function to edit the content of that
struct. This patch refactors the `cc2520_get_platformat_data` function
to accept a pointer to a `cc2520_platform_data` struct and populates
the fields inside of it.

This change mirrors commit aaa1c4d2
("at86rf230: copy pdata to driver allocated space").
Signed-off-by: default avatarBrad Campbell <bradjc5@gmail.com>
Acked-by: default avatarVarka Bhadram <varkabhadram@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 63511f6d
...@@ -714,6 +714,33 @@ static irqreturn_t cc2520_sfd_isr(int irq, void *data) ...@@ -714,6 +714,33 @@ static irqreturn_t cc2520_sfd_isr(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int cc2520_get_platform_data(struct spi_device *spi,
struct cc2520_platform_data *pdata)
{
struct device_node *np = spi->dev.of_node;
struct cc2520_private *priv = spi_get_drvdata(spi);
if (!np) {
struct cc2520_platform_data *spi_pdata = spi->dev.platform_data;
if (!spi_pdata)
return -ENOENT;
*pdata = *spi_pdata;
return 0;
}
pdata->fifo = of_get_named_gpio(np, "fifo-gpio", 0);
priv->fifo_pin = pdata->fifo;
pdata->fifop = of_get_named_gpio(np, "fifop-gpio", 0);
pdata->sfd = of_get_named_gpio(np, "sfd-gpio", 0);
pdata->cca = of_get_named_gpio(np, "cca-gpio", 0);
pdata->vreg = of_get_named_gpio(np, "vreg-gpio", 0);
pdata->reset = of_get_named_gpio(np, "reset-gpio", 0);
return 0;
}
static int cc2520_hw_init(struct cc2520_private *priv) static int cc2520_hw_init(struct cc2520_private *priv)
{ {
u8 status = 0, state = 0xff; u8 status = 0, state = 0xff;
...@@ -808,40 +835,10 @@ static int cc2520_hw_init(struct cc2520_private *priv) ...@@ -808,40 +835,10 @@ static int cc2520_hw_init(struct cc2520_private *priv)
return ret; return ret;
} }
static struct cc2520_platform_data *
cc2520_get_platform_data(struct spi_device *spi)
{
struct cc2520_platform_data *pdata;
struct device_node *np = spi->dev.of_node;
struct cc2520_private *priv = spi_get_drvdata(spi);
if (!np)
return spi->dev.platform_data;
pdata = devm_kzalloc(&spi->dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
goto done;
pdata->fifo = of_get_named_gpio(np, "fifo-gpio", 0);
priv->fifo_pin = pdata->fifo;
pdata->fifop = of_get_named_gpio(np, "fifop-gpio", 0);
pdata->sfd = of_get_named_gpio(np, "sfd-gpio", 0);
pdata->cca = of_get_named_gpio(np, "cca-gpio", 0);
pdata->vreg = of_get_named_gpio(np, "vreg-gpio", 0);
pdata->reset = of_get_named_gpio(np, "reset-gpio", 0);
spi->dev.platform_data = pdata;
done:
return pdata;
}
static int cc2520_probe(struct spi_device *spi) static int cc2520_probe(struct spi_device *spi)
{ {
struct cc2520_private *priv; struct cc2520_private *priv;
struct cc2520_platform_data *pdata; struct cc2520_platform_data pdata;
int ret; int ret;
priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL);
...@@ -850,8 +847,8 @@ static int cc2520_probe(struct spi_device *spi) ...@@ -850,8 +847,8 @@ static int cc2520_probe(struct spi_device *spi)
spi_set_drvdata(spi, priv); spi_set_drvdata(spi, priv);
pdata = cc2520_get_platform_data(spi); ret = cc2520_get_platform_data(spi, &pdata);
if (!pdata) { if (ret < 0) {
dev_err(&spi->dev, "no platform data\n"); dev_err(&spi->dev, "no platform data\n");
return -EINVAL; return -EINVAL;
} }
...@@ -869,76 +866,76 @@ static int cc2520_probe(struct spi_device *spi) ...@@ -869,76 +866,76 @@ static int cc2520_probe(struct spi_device *spi)
init_completion(&priv->tx_complete); init_completion(&priv->tx_complete);
/* Request all the gpio's */ /* Request all the gpio's */
if (!gpio_is_valid(pdata->fifo)) { if (!gpio_is_valid(pdata.fifo)) {
dev_err(&spi->dev, "fifo gpio is not valid\n"); dev_err(&spi->dev, "fifo gpio is not valid\n");
ret = -EINVAL; ret = -EINVAL;
goto err_hw_init; goto err_hw_init;
} }
ret = devm_gpio_request_one(&spi->dev, pdata->fifo, ret = devm_gpio_request_one(&spi->dev, pdata.fifo,
GPIOF_IN, "fifo"); GPIOF_IN, "fifo");
if (ret) if (ret)
goto err_hw_init; goto err_hw_init;
if (!gpio_is_valid(pdata->cca)) { if (!gpio_is_valid(pdata.cca)) {
dev_err(&spi->dev, "cca gpio is not valid\n"); dev_err(&spi->dev, "cca gpio is not valid\n");
ret = -EINVAL; ret = -EINVAL;
goto err_hw_init; goto err_hw_init;
} }
ret = devm_gpio_request_one(&spi->dev, pdata->cca, ret = devm_gpio_request_one(&spi->dev, pdata.cca,
GPIOF_IN, "cca"); GPIOF_IN, "cca");
if (ret) if (ret)
goto err_hw_init; goto err_hw_init;
if (!gpio_is_valid(pdata->fifop)) { if (!gpio_is_valid(pdata.fifop)) {
dev_err(&spi->dev, "fifop gpio is not valid\n"); dev_err(&spi->dev, "fifop gpio is not valid\n");
ret = -EINVAL; ret = -EINVAL;
goto err_hw_init; goto err_hw_init;
} }
ret = devm_gpio_request_one(&spi->dev, pdata->fifop, ret = devm_gpio_request_one(&spi->dev, pdata.fifop,
GPIOF_IN, "fifop"); GPIOF_IN, "fifop");
if (ret) if (ret)
goto err_hw_init; goto err_hw_init;
if (!gpio_is_valid(pdata->sfd)) { if (!gpio_is_valid(pdata.sfd)) {
dev_err(&spi->dev, "sfd gpio is not valid\n"); dev_err(&spi->dev, "sfd gpio is not valid\n");
ret = -EINVAL; ret = -EINVAL;
goto err_hw_init; goto err_hw_init;
} }
ret = devm_gpio_request_one(&spi->dev, pdata->sfd, ret = devm_gpio_request_one(&spi->dev, pdata.sfd,
GPIOF_IN, "sfd"); GPIOF_IN, "sfd");
if (ret) if (ret)
goto err_hw_init; goto err_hw_init;
if (!gpio_is_valid(pdata->reset)) { if (!gpio_is_valid(pdata.reset)) {
dev_err(&spi->dev, "reset gpio is not valid\n"); dev_err(&spi->dev, "reset gpio is not valid\n");
ret = -EINVAL; ret = -EINVAL;
goto err_hw_init; goto err_hw_init;
} }
ret = devm_gpio_request_one(&spi->dev, pdata->reset, ret = devm_gpio_request_one(&spi->dev, pdata.reset,
GPIOF_OUT_INIT_LOW, "reset"); GPIOF_OUT_INIT_LOW, "reset");
if (ret) if (ret)
goto err_hw_init; goto err_hw_init;
if (!gpio_is_valid(pdata->vreg)) { if (!gpio_is_valid(pdata.vreg)) {
dev_err(&spi->dev, "vreg gpio is not valid\n"); dev_err(&spi->dev, "vreg gpio is not valid\n");
ret = -EINVAL; ret = -EINVAL;
goto err_hw_init; goto err_hw_init;
} }
ret = devm_gpio_request_one(&spi->dev, pdata->vreg, ret = devm_gpio_request_one(&spi->dev, pdata.vreg,
GPIOF_OUT_INIT_LOW, "vreg"); GPIOF_OUT_INIT_LOW, "vreg");
if (ret) if (ret)
goto err_hw_init; goto err_hw_init;
gpio_set_value(pdata->vreg, HIGH); gpio_set_value(pdata.vreg, HIGH);
usleep_range(100, 150); usleep_range(100, 150);
gpio_set_value(pdata->reset, HIGH); gpio_set_value(pdata.reset, HIGH);
usleep_range(200, 250); usleep_range(200, 250);
ret = cc2520_hw_init(priv); ret = cc2520_hw_init(priv);
...@@ -947,7 +944,7 @@ static int cc2520_probe(struct spi_device *spi) ...@@ -947,7 +944,7 @@ static int cc2520_probe(struct spi_device *spi)
/* Set up fifop interrupt */ /* Set up fifop interrupt */
ret = devm_request_irq(&spi->dev, ret = devm_request_irq(&spi->dev,
gpio_to_irq(pdata->fifop), gpio_to_irq(pdata.fifop),
cc2520_fifop_isr, cc2520_fifop_isr,
IRQF_TRIGGER_RISING, IRQF_TRIGGER_RISING,
dev_name(&spi->dev), dev_name(&spi->dev),
...@@ -959,7 +956,7 @@ static int cc2520_probe(struct spi_device *spi) ...@@ -959,7 +956,7 @@ static int cc2520_probe(struct spi_device *spi)
/* Set up sfd interrupt */ /* Set up sfd interrupt */
ret = devm_request_irq(&spi->dev, ret = devm_request_irq(&spi->dev,
gpio_to_irq(pdata->sfd), gpio_to_irq(pdata.sfd),
cc2520_sfd_isr, cc2520_sfd_isr,
IRQF_TRIGGER_FALLING, IRQF_TRIGGER_FALLING,
dev_name(&spi->dev), dev_name(&spi->dev),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment