Re: [PATCH RFC 1/1] gpio: mcp23s08: convert driver to DT

2013-01-31 Thread Linus Walleij
On Thu, Jan 31, 2013 at 4:58 PM, Lars Poeschel  wrote:

> --- /dev/null
> +++ b/Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt
> @@ -0,0 +1,27 @@
> +Microchip MCP2308/MCP23S08/MCP23017/MCP23S17 driver for
> +8-/16-bit I/O expander with serial interface (I2C/SPI)
> +
> +Required properties:
> +- compatible : Should be "mcp,mcp23s08-gpio", "mcp,mcp23s17-gpio",
> +   "mcp,mcp23008-gpio" or "mcp,mcp23017-gpio"
> +- base : The first gpio number that should be assigned by this chip.

No. We do not tie the global GPIO numbers into the device tree.

In the DT GPIOs are referenced by ampersand <&gpio0 1 2>
notation referring to the instance, so as you realize DT itself
has no need for that number.

Further it is not OS-neutral.

You have to find another way to handle this in the driver code.
In worst case: use AUXDATA.

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH RFC 1/1] gpio: mcp23s08: convert driver to DT

2013-01-31 Thread Lars Poeschel
From: Lars Poeschel 

This converts the mcp23s08 driver to be able to be used with device
tree.
There are two properties taken, that correspond to the members of
the struct mcp23s08_platform_data, that is the base member and the
chip array member.

Signed-off-by: Lars Poeschel 
---
 .../devicetree/bindings/gpio/gpio-mcp23s08.txt |   27 ++
 drivers/gpio/gpio-mcp23s08.c   |   93 +++-
 include/linux/spi/mcp23s08.h   |1 +
 3 files changed, 117 insertions(+), 4 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt

diff --git a/Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt 
b/Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt
new file mode 100644
index 000..572bc87
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt
@@ -0,0 +1,27 @@
+Microchip MCP2308/MCP23S08/MCP23017/MCP23S17 driver for
+8-/16-bit I/O expander with serial interface (I2C/SPI)
+
+Required properties:
+- compatible : Should be "mcp,mcp23s08-gpio", "mcp,mcp23s17-gpio",
+   "mcp,mcp23008-gpio" or "mcp,mcp23017-gpio"
+- base : The first gpio number that should be assigned by this chip.
+
+Optional properties:
+- chips : This is a table with 2 columns and up to 8 entries. The first column
+   is a is_present flag, that makes only sense for SPI chips. Multiple
+   chips can share the same chipselect. This flag can be 0 or 1 depending
+   if there is a chip at this address or not.
+   The second column is written to the GPPU register, selecting a 100k
+   pullup resistor or not. Setting a 1 is activating the pullup.
+   For I2C chips only the first line in this table is used. Further chips
+   are registered at different addresses at the I2C bus.
+
+Example:
+&mcp0 {
+   compatible = "mcp,mcp23017";
+   base = <128>;
+   chips = <
+   /* is_present  pullups */
+   1   0x07/* chip addr 0 */
+   >;
+};
diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c
index 3cea0ea..7f90d11 100644
--- a/drivers/gpio/gpio-mcp23s08.c
+++ b/drivers/gpio/gpio-mcp23s08.c
@@ -12,6 +12,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 
 /**
  * MCP types supported by driver
@@ -473,16 +475,89 @@ fail:
 
 /*--*/
 
+#ifdef CONFIG_OF
+static struct of_device_id mcp23s08_of_match[] = {
+#ifdef CONFIG_SPI_MASTER
+   {
+   .compatible = "mcp,mcp23s08-gpio",
+   },
+   {
+   .compatible = "mcp,mcp23s17-gpio",
+   },
+#endif
+#if IS_ENABLED(CONFIG_I2C)
+   {
+   .compatible = "mcp,mcp23008-gpio",
+   },
+   {
+   .compatible = "mcp,mcp23017-gpio",
+   },
+#endif
+   { },
+};
+MODULE_DEVICE_TABLE(of, mcp23s08_of_match);
+
+static struct mcp23s08_platform_data *
+   of_get_mcp23s08_pdata(struct device *dev)
+{
+   struct mcp23s08_platform_data *pdata;
+   struct device_node *np = dev->of_node;
+   u32 gpio_base;
+   u32 chips[sizeof(pdata->chip)];
+   int ret, i, j;
+
+   pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+   if (!pdata)
+   return NULL;
+
+   ret = of_property_read_u32(np, "base", &gpio_base);
+   if (!ret)
+   pdata->base = gpio_base;
+
+   for (i = ARRAY_SIZE(pdata->chip) * MCP23S08_CHIP_INFO_MEMBERS;
+   i > 0; i -= MCP23S08_CHIP_INFO_MEMBERS) {
+   ret = of_property_read_u32_array(np, "chips", chips, i);
+   if (ret == -EOVERFLOW)
+   continue;
+   break;
+   }
+   if (!ret) {
+   for (j = 0; j < i / MCP23S08_CHIP_INFO_MEMBERS ; j++) {
+   pdata->chip[j].is_present =
+   chips[j * MCP23S08_CHIP_INFO_MEMBERS];
+   pdata->chip[j].pullups =
+   chips[j * MCP23S08_CHIP_INFO_MEMBERS + 1];
+   }
+   }
+
+   return pdata;
+}
+#else
+static struct mcp23s08_platform_data *
+   of_get_mcp23s08_pdata(struct i2c_client *client, int *chip_id)
+{
+   return NULL;
+}
+#endif /* CONFIG_OF */
+
 #if IS_ENABLED(CONFIG_I2C)
 
 static int mcp230xx_probe(struct i2c_client *client,
const struct i2c_device_id *id)
 {
-   struct mcp23s08_platform_data *pdata;
+   struct mcp23s08_platform_data *pdata = NULL;
struct mcp23s08 *mcp;
int status;
+   const struct of_device_id *match;
+
+   match = of_match_device(of_match_ptr(mcp23s08_of_match), &client->dev);
+   if (match)
+   pdata = of_get_mcp23s08_pdata(&client->dev);
+
+   /* if there was no pdata in DT, take it the legacy way */
+   if (!pdata)
+   pdata = client->dev.platform_data;
 
-   pdata = client->d

[PATCH RFC 0/1] Convert mcp23s08 to DT usage

2013-01-31 Thread Lars Poeschel
From: Lars Poeschel 

I wanted to use mcp23s08 driver with a device that boots using device tree.
Therefore I had to modify the driver to be able to take it's platform_data
from the device tree.
I am using a mcp23017 (I2C) device successfully with the patch booted over
device tree. I am not sure if I did this right and I am not able to test the
SPI part of the driver, so I am requesting for comments.

Thank you,
Lars

Lars Poeschel (1):
  gpio: mcp23s08: convert driver to DT

 .../devicetree/bindings/gpio/gpio-mcp23s08.txt |   27 ++
 drivers/gpio/gpio-mcp23s08.c   |   93 +++-
 include/linux/spi/mcp23s08.h   |1 +
 3 files changed, 117 insertions(+), 4 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt

-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html