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

Grant Likely grant.likely at secretlab.ca
Wed Jul 20 05:47:54 EST 2011


On Tue, Jul 19, 2011 at 06:17:21PM +0800, Eric Miao wrote:
> 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?

Not really, since there is no such thing as a generic platform_data
structure.  We can certainly have helper functions, but any
driver-specific data must by definition have driver-specific code to
decode it from the device tree.

It does help though when similar drivers use the same binding.

g.

> 
> 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 devicetree-discuss mailing list