| From 36a5d169ae8bec8914636b95cb8dc2b508ec456c Mon Sep 17 00:00:00 2001 |
| From: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
| Date: Thu, 12 Sep 2013 14:36:46 +0200 |
| Subject: i2c: rcar: add Device Tree support |
| |
| This patch adds Device Tree support to the i2c-rcar driver and respective |
| documentation. |
| |
| Signed-off-by: Guennadi Liakhovetski <g.liakhovetski+renesas@gmail.com> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| (cherry picked from commit 7679c0e19120ee7839adf1f05904cbfcc7a7c2b9) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| Documentation/devicetree/bindings/i2c/i2c-rcar.txt | 23 ++++++++++++++++++++++ |
| drivers/i2c/busses/i2c-rcar.c | 21 ++++++++++++++++++-- |
| 2 files changed, 42 insertions(+), 2 deletions(-) |
| create mode 100644 Documentation/devicetree/bindings/i2c/i2c-rcar.txt |
| |
| diff --git a/Documentation/devicetree/bindings/i2c/i2c-rcar.txt b/Documentation/devicetree/bindings/i2c/i2c-rcar.txt |
| new file mode 100644 |
| index 000000000000..897cfcd5ce92 |
| --- /dev/null |
| +++ b/Documentation/devicetree/bindings/i2c/i2c-rcar.txt |
| @@ -0,0 +1,23 @@ |
| +I2C for R-Car platforms |
| + |
| +Required properties: |
| +- compatible: Must be one of |
| + "renesas,i2c-rcar" |
| + "renesas,i2c-r8a7778" |
| + "renesas,i2c-r8a7779" |
| + "renesas,i2c-r8a7790" |
| +- reg: physical base address of the controller and length of memory mapped |
| + region. |
| +- interrupts: interrupt specifier. |
| + |
| +Optional properties: |
| +- clock-frequency: desired I2C bus clock frequency in Hz. The absence of this |
| + propoerty indicates the default frequency 100 kHz. |
| + |
| +Examples : |
| + |
| +i2c0: i2c@e6500000 { |
| + compatible = "renesas,i2c-rcar-h2"; |
| + reg = <0 0xe6500000 0 0x428>; |
| + interrupts = <0 174 0x4>; |
| +}; |
| diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c |
| index 39e9739f58b2..056323b0666a 100644 |
| --- a/drivers/i2c/busses/i2c-rcar.c |
| +++ b/drivers/i2c/busses/i2c-rcar.c |
| @@ -33,6 +33,7 @@ |
| #include <linux/i2c/i2c-rcar.h> |
| #include <linux/kernel.h> |
| #include <linux/module.h> |
| +#include <linux/of_device.h> |
| #include <linux/platform_device.h> |
| #include <linux/pm_runtime.h> |
| #include <linux/slab.h> |
| @@ -638,6 +639,15 @@ static const struct i2c_algorithm rcar_i2c_algo = { |
| .functionality = rcar_i2c_func, |
| }; |
| |
| +static const struct of_device_id rcar_i2c_dt_ids[] = { |
| + { .compatible = "renesas,i2c-rcar", .data = (void *)I2C_RCAR_H1 }, |
| + { .compatible = "renesas,i2c-r8a7778", .data = (void *)I2C_RCAR_H1 }, |
| + { .compatible = "renesas,i2c-r8a7779", .data = (void *)I2C_RCAR_H1 }, |
| + { .compatible = "renesas,i2c-r8a7790", .data = (void *)I2C_RCAR_H2 }, |
| + {}, |
| +}; |
| +MODULE_DEVICE_TABLE(of, rcar_i2c_dt_ids); |
| + |
| static int rcar_i2c_probe(struct platform_device *pdev) |
| { |
| struct i2c_rcar_platform_data *pdata = pdev->dev.platform_data; |
| @@ -661,10 +671,15 @@ static int rcar_i2c_probe(struct platform_device *pdev) |
| } |
| |
| bus_speed = 100000; /* default 100 kHz */ |
| - if (pdata && pdata->bus_speed) |
| + ret = of_property_read_u32(dev->of_node, "clock-frequency", &bus_speed); |
| + if (ret < 0 && pdata && pdata->bus_speed) |
| bus_speed = pdata->bus_speed; |
| |
| - priv->devtype = platform_get_device_id(pdev)->driver_data; |
| + if (pdev->dev.of_node) |
| + priv->devtype = (long)of_match_device(rcar_i2c_dt_ids, |
| + dev)->data; |
| + else |
| + priv->devtype = platform_get_device_id(pdev)->driver_data; |
| |
| ret = rcar_i2c_clock_calculate(priv, bus_speed, dev); |
| if (ret < 0) |
| @@ -684,6 +699,7 @@ static int rcar_i2c_probe(struct platform_device *pdev) |
| adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; |
| adap->retries = 3; |
| adap->dev.parent = dev; |
| + adap->dev.of_node = dev->of_node; |
| i2c_set_adapdata(adap, priv); |
| strlcpy(adap->name, pdev->name, sizeof(adap->name)); |
| |
| @@ -731,6 +747,7 @@ static struct platform_driver rcar_i2c_driver = { |
| .driver = { |
| .name = "i2c-rcar", |
| .owner = THIS_MODULE, |
| + .of_match_table = rcar_i2c_dt_ids, |
| }, |
| .probe = rcar_i2c_probe, |
| .remove = rcar_i2c_remove, |
| -- |
| 1.8.5.rc3 |
| |