提交 aaa1c4d2 编写于 作者: A Alexander Aring 提交者: Marcel Holtmann

at86rf230: copy pdata to driver allocated space

This patch copies the platform data in driver allocated space at first.
With this change we ensure that we access the allocated platform data as
readonly space.
Signed-off-by: NAlexander Aring <alex.aring@gmail.com>
Reported-by: NMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
上级 9391976a
...@@ -1377,24 +1377,24 @@ static int at86rf230_hw_init(struct at86rf230_local *lp) ...@@ -1377,24 +1377,24 @@ static int at86rf230_hw_init(struct at86rf230_local *lp)
return at86rf230_write_subreg(lp, SR_SLOTTED_OPERATION, 0); return at86rf230_write_subreg(lp, SR_SLOTTED_OPERATION, 0);
} }
static struct at86rf230_platform_data * static int
at86rf230_get_pdata(struct spi_device *spi) at86rf230_get_pdata(struct spi_device *spi, int *rstn, int *slp_tr)
{ {
struct at86rf230_platform_data *pdata; struct at86rf230_platform_data *pdata = spi->dev.platform_data;
if (!IS_ENABLED(CONFIG_OF) || !spi->dev.of_node) if (!IS_ENABLED(CONFIG_OF) || !spi->dev.of_node) {
return spi->dev.platform_data; if (!pdata)
return -ENOENT;
pdata = devm_kzalloc(&spi->dev, sizeof(*pdata), GFP_KERNEL); *rstn = pdata->rstn;
if (!pdata) *slp_tr = pdata->slp_tr;
goto done; return 0;
}
pdata->rstn = of_get_named_gpio(spi->dev.of_node, "reset-gpio", 0); *rstn = of_get_named_gpio(spi->dev.of_node, "reset-gpio", 0);
pdata->slp_tr = of_get_named_gpio(spi->dev.of_node, "sleep-gpio", 0); *slp_tr = of_get_named_gpio(spi->dev.of_node, "sleep-gpio", 0);
spi->dev.platform_data = pdata; return 0;
done:
return pdata;
} }
static int static int
...@@ -1501,43 +1501,42 @@ at86rf230_setup_spi_messages(struct at86rf230_local *lp) ...@@ -1501,43 +1501,42 @@ at86rf230_setup_spi_messages(struct at86rf230_local *lp)
static int at86rf230_probe(struct spi_device *spi) static int at86rf230_probe(struct spi_device *spi)
{ {
struct at86rf230_platform_data *pdata;
struct ieee802154_hw *hw; struct ieee802154_hw *hw;
struct at86rf230_local *lp; struct at86rf230_local *lp;
unsigned int status; unsigned int status;
int rc, irq_type; int rc, irq_type, rstn, slp_tr;
if (!spi->irq) { if (!spi->irq) {
dev_err(&spi->dev, "no IRQ specified\n"); dev_err(&spi->dev, "no IRQ specified\n");
return -EINVAL; return -EINVAL;
} }
pdata = at86rf230_get_pdata(spi); rc = at86rf230_get_pdata(spi, &rstn, &slp_tr);
if (!pdata) { if (rc < 0) {
dev_err(&spi->dev, "no platform_data\n"); dev_err(&spi->dev, "failed to parse platform_data: %d\n", rc);
return -EINVAL; return rc;
} }
if (gpio_is_valid(pdata->rstn)) { if (gpio_is_valid(rstn)) {
rc = devm_gpio_request_one(&spi->dev, pdata->rstn, rc = devm_gpio_request_one(&spi->dev, rstn,
GPIOF_OUT_INIT_HIGH, "rstn"); GPIOF_OUT_INIT_HIGH, "rstn");
if (rc) if (rc)
return rc; return rc;
} }
if (gpio_is_valid(pdata->slp_tr)) { if (gpio_is_valid(slp_tr)) {
rc = devm_gpio_request_one(&spi->dev, pdata->slp_tr, rc = devm_gpio_request_one(&spi->dev, slp_tr,
GPIOF_OUT_INIT_LOW, "slp_tr"); GPIOF_OUT_INIT_LOW, "slp_tr");
if (rc) if (rc)
return rc; return rc;
} }
/* Reset */ /* Reset */
if (gpio_is_valid(pdata->rstn)) { if (gpio_is_valid(rstn)) {
udelay(1); udelay(1);
gpio_set_value(pdata->rstn, 0); gpio_set_value(rstn, 0);
udelay(1); udelay(1);
gpio_set_value(pdata->rstn, 1); gpio_set_value(rstn, 1);
usleep_range(120, 240); usleep_range(120, 240);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册