From 0be0dc3a75279c4621ff45a027ffad5ddc9810c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Mon, 30 Nov 2015 16:24:25 +0200 Subject: [PATCH] gpio: mcp23s08: support setting pullups from device tree data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make pullup configurable from device tree data. Signed-off-by: Timo Teräs --- Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt | 1 + drivers/gpio/gpio-mcp23s08.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt b/Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt index f3332b9..c7d2128 100644 --- a/Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt +++ b/Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt @@ -59,6 +59,7 @@ Optional device specific properties: On devices with only one interrupt output this property is useless. - microchip,irq-active-high: Sets the INTPOL flag in the IOCON register. This configures the IRQ output polarity as active high. +- microchip,pullups: Configuration value for GPPU register. Example I2C (with interrupt): gpiom1: gpio@20 { diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c index 73db7ec..2320230 100644 --- a/drivers/gpio/gpio-mcp23s08.c +++ b/drivers/gpio/gpio-mcp23s08.c @@ -786,9 +786,12 @@ static int mcp230xx_probe(struct i2c_client *client, match = of_match_device(of_match_ptr(mcp23s08_i2c_of_match), &client->dev); if (match) { + u32 pullups = 0; pdata = &local_pdata; pdata->base = -1; - pdata->chip[0].pullups = 0; + of_property_read_u32(client->dev.of_node, "microchip,pullups", + &pullups); + pdata->chip[0].pullups = pullups; pdata->irq_controller = of_property_read_bool( client->dev.of_node, "interrupt-controller"); @@ -910,9 +913,14 @@ static int mcp23s08_probe(struct spi_device *spi) pdata = &local_pdata; pdata->base = -1; for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { - pdata->chip[addr].pullups = 0; - if (spi_present_mask & (1 << addr)) + u32 pullups = 0; + if (spi_present_mask & (1 << addr)) { + of_property_read_u32_index(spi->dev.of_node, + "microchip,pullups", + addr, &pullups); chips++; + } + pdata->chip[addr].pullups = pullups; } pdata->irq_controller = of_property_read_bool( spi->dev.of_node, -- 2.6.3