[PATCH 7/7] i2c: pxa: support to parse property

Eric Miao eric.y.miao at gmail.com
Tue Jul 19 06:17:21 EDT 2011


On Tue, Jul 19, 2011 at 10:24 AM, Haojian Zhuang
<haojian.zhuang at marvell.com> wrote:
> Support to parse some optional properties. These three properties are
> i2c-polling, i2c-frequency, i2c-class.
>
> After supporting these property, i2c-pxa driver can avoid to use platform
> data except for slave mode.
>
> Signed-off-by: Haojian Zhuang <haojian.zhuang at marvell.com>
> ---
>  .../devicetree/bindings/i2c/pxa255-i2c.txt         |   36 ++++++++++++++++++++
>  drivers/i2c/busses/i2c-pxa.c                       |   22 ++++++++----
>  2 files changed, 51 insertions(+), 7 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/i2c/pxa255-i2c.txt
>
> diff --git a/Documentation/devicetree/bindings/i2c/pxa255-i2c.txt b/Documentation/devicetree/bindings/i2c/pxa255-i2c.txt
> new file mode 100644
> index 0000000..bf34236
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/i2c/pxa255-i2c.txt
> @@ -0,0 +1,36 @@
> +PXA255 I2C
> +
> +The I2C-Controller is first used in PXA255. It's widely used in Intel/Marvell
> +silicons.
> +
> +Optional Property:
> +       - i2c-polling: Specifies whether I2C-Controller is used in polling
> +         mode or interrupt mode. The type of property should be <u32>.
> +
> +       - i2c-frequency: Specifies the frequency that the I2C-Controller
> +         is working. The type of property should be <string>.
> +
> +       - i2c-class: Specifies the class of I2C-Controller. The type of
> +         property should be <u32>.
> +
> +Example:
> +       i2c0: i2c at d4011000 {
> +               compatible = "pxa2xx-i2c";
> +               #address-cells = <1>;
> +               #size-cells = <0>;
> +               reg = <0xd4011000 0x60>;
> +               /* I2C-Controller works in interrupt mode. */
> +               i2c-polling = <0>;
> +               /* I2C-Controller's frequency is FAST. */
> +               i2c-frequency = "fast";
> +               /* interrupt of I2C-Controller */
> +               interrupts = <7>;
> +               interrupt-parent = <&mmp_intc>;
> +
> +               pm860x: pmic at 34 {
> +                       interrupt-controller;
> +                       /* interrupt of pm860x */
> +                       interrupts = <4>;
> +                       interrupt-parent = <&mmp_intc>;
> +               };
> +       };
> diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
> index adac74a..4b9fa71 100644
> --- a/drivers/i2c/busses/i2c-pxa.c
> +++ b/drivers/i2c/busses/i2c-pxa.c
> @@ -1060,7 +1060,8 @@ static int i2c_pxa_probe(struct platform_device *dev)
>        const struct platform_device_id *id = platform_get_device_id(dev);
>        enum pxa_i2c_types i2c_type;
>        struct resource *res;
> -       int irq, ret;
> +       int irq, ret, poll;
> +       char *p = NULL;
>        static int idx = 0;
>
>        if (np) {
> @@ -1093,11 +1094,24 @@ static int i2c_pxa_probe(struct platform_device *dev)
>
>
>        if (np) {
> +               of_property_read_u32(np, "i2c-polling", &poll);
> +               i2c->use_pio = (poll) ? 1 : 0;
> +               of_property_read_string(np, "i2c-frequency", &p);
> +               if (p && !strncmp(p, "fast", 4))
> +                       i2c->fast_mode = 1;
> +               of_property_read_u32(np, "i2c-class", &i2c->adap.class);
> +
>                i2c->adap.nr = idx++;
>                snprintf(i2c->adap.name, sizeof(i2c->adap.name),
>                        "pxa2xx-i2c.%u", i2c->adap.nr);
>                i2c->clk = clk_get_sys(i2c->adap.name, NULL);
>        } else {
> +               if (plat) {
> +                       i2c->adap.class = plat->class;
> +                       i2c->use_pio = plat->use_pio;
> +                       i2c->fast_mode = plat->fast_mode;
> +               }
> +

One concern of DT's impact to existing drivers is _every_ driver has to be
modified. While I'm not sure if it's a right way to go in a long run. Or can
we have a generic way to automatically map the DT properties to the
specific platform data structure?

Grant, any idea on this?

>                /*
>                 * If "dev->id" is negative we consider it as zero.
>                 * The reason to do so is to avoid sysfs names that only make
> @@ -1142,12 +1156,6 @@ static int i2c_pxa_probe(struct platform_device *dev)
>
>        clk_enable(i2c->clk);
>
> -       if (plat) {
> -               i2c->adap.class = plat->class;
> -               i2c->use_pio = plat->use_pio;
> -               i2c->fast_mode = plat->fast_mode;
> -       }
> -
>        if (i2c->use_pio) {
>                i2c->adap.algo = &i2c_pxa_pio_algorithm;
>        } else {
> --
> 1.5.6.5
>
>



More information about the linux-arm-kernel mailing list