summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-mcp23s08.c
diff options
context:
space:
mode:
authorSebastian Reichel <sebastian.reichel@collabora.co.uk>2017-05-15 11:24:35 +0200
committerLinus Walleij <linus.walleij@linaro.org>2017-05-23 09:50:13 +0200
commit5b1a7e803a9fd960b6d75a1d970519c57cfe2618 (patch)
treeff7d8e12b67fc7717c3803b2f3d3f99838bb65c1 /drivers/pinctrl/pinctrl-mcp23s08.c
parent0d7fcd504cbe8e2a6269a9e267b044700f3da876 (diff)
downloadlinux-5b1a7e803a9fd960b6d75a1d970519c57cfe2618.tar.gz
linux-5b1a7e803a9fd960b6d75a1d970519c57cfe2618.tar.bz2
linux-5b1a7e803a9fd960b6d75a1d970519c57cfe2618.zip
pinctrl: mcp23s08: generalize irq property handling
This moves irq property handling from spi/i2c specific code into the generic mcp23s08_probe_one. This is possible because the device properties are named equally. As a side-effect this drops support for setting the properties via pdata, which has no mainline users. If boardcode wants to enable the chip as interrupt controller it can attach the device properties instead. Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinctrl-mcp23s08.c')
-rw-r--r--drivers/pinctrl/pinctrl-mcp23s08.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c
index 541bf80a2a13..b39da587f2fa 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08.c
@@ -783,7 +783,7 @@ done:
static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
void *data, unsigned addr, unsigned type,
- struct mcp23s08_platform_data *pdata, int cs)
+ unsigned int base, int cs)
{
int status, ret;
bool mirror = false;
@@ -855,7 +855,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
if (IS_ERR(mcp->regmap))
return PTR_ERR(mcp->regmap);
- mcp->chip.base = pdata->base;
+ mcp->chip.base = base;
mcp->chip.can_sleep = true;
mcp->chip.parent = dev;
mcp->chip.owner = THIS_MODULE;
@@ -868,13 +868,14 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
if (ret < 0)
goto fail;
- mcp->irq_controller = pdata->irq_controller;
+ mcp->irq_controller =
+ device_property_read_bool(dev, "interrupt-controller");
if (mcp->irq && mcp->irq_controller) {
mcp->irq_active_high =
- of_property_read_bool(mcp->chip.parent->of_node,
+ device_property_read_bool(dev,
"microchip,irq-active-high");
- mirror = pdata->mirror;
+ mirror = device_property_read_bool(dev, "microchip,irq-mirror");
}
if ((status & IOCON_SEQOP) || !(status & IOCON_HAEN) || mirror ||
@@ -1000,11 +1001,6 @@ static int mcp230xx_probe(struct i2c_client *client,
if (!pdata) {
pdata = &local_pdata;
pdata->base = -1;
-
- pdata->irq_controller = device_property_read_bool(
- &client->dev, "interrupt-controller");
- pdata->mirror = device_property_read_bool(
- &client->dev, "microchip,irq-mirror");
}
mcp = devm_kzalloc(&client->dev, sizeof(*mcp), GFP_KERNEL);
@@ -1013,7 +1009,7 @@ static int mcp230xx_probe(struct i2c_client *client,
mcp->irq = client->irq;
status = mcp23s08_probe_one(mcp, &client->dev, client, client->addr,
- id->driver_data, pdata, 0);
+ id->driver_data, pdata->base, 0);
if (status)
return status;
@@ -1081,11 +1077,6 @@ static int mcp23s08_probe(struct spi_device *spi)
pdata = &local_pdata;
pdata->base = -1;
- pdata->irq_controller = device_property_read_bool(&spi->dev,
- "interrupt-controller");
- pdata->mirror = device_property_read_bool(&spi->dev,
- "microchip,irq-mirror");
-
status = device_property_read_u32(&spi->dev,
"microchip,spi-present-mask", &spi_present_mask);
if (status) {
@@ -1138,8 +1129,8 @@ static int mcp23s08_probe(struct spi_device *spi)
data->mcp[addr] = &data->chip[chips];
data->mcp[addr]->irq = spi->irq;
status = mcp23s08_probe_one(data->mcp[addr], &spi->dev, spi,
- 0x40 | (addr << 1), type, pdata,
- addr);
+ 0x40 | (addr << 1), type,
+ pdata->base, addr);
if (status < 0)
return status;