Re: [PATCH 2/2] LEDS: tca6502: add device-tree support for GPIOconfiguration.

From: NeilBrown
Date: Mon Nov 18 2013 - 17:50:26 EST


On Mon, 18 Nov 2013 11:55:12 +0000 Mark Rutland <mark.rutland@xxxxxxx> wrote:

> On Fri, Nov 01, 2013 at 02:41:20AM +0000, NeilBrown wrote:
> >
> > The 7 lines driven by the TCA6507 can either drive LEDs or act as output-only
> > GPIOs.
> >
> > To make this distinction in devicetree we use the "compatible" property.
> >
> > If the device attached to a line is "compatible" with "gpio", we treat it
> > like a GPIO. If it is "compatible" with "led" (or if no "compatible" value
> > is set) we treat it like an LED.
>
> I'm nto sure I understand the purpose of this.
>
> Are these lines all GPIOs, some of which happen to by attached to LEDs?
>
> If so, why is handlnig the device as a gpio-controller and using the
> gpio-leds binding not sufficient?

No, all the lines are designed to drives LEDs but can happen to be wired up
like GPIOs. This configuration is explicitly described in the data sheets
for the chip, and is actually used in my board.

The 7 pins either float or sink current. They can switch between the two
modes in various ways under hardware control with a PWM which can have a
varying duty cycle.
So they are very suitable for driving LEDs as the PWM can adjust the apparent
brightness and the varying duty cycle can effect a 'blink' pattern.

But the pins can also be fixed in one state of the other - either never on or
always on. Floating or constantly sinking current.

This mode combined with a pull-up resistor makes an effective output-only
GPIO. The same action that would turn the LED on, will pull the GPIO low.
The action that would turn the LED off, will allow the GPIO to go high.

So the device connected to each pin can be treated as an LED or as a GPIO.

I hope that clarifies the situation.

Thanks,
NeilBrown


>
> THanksm
> Mark.
>
> >
> > Signed-off-by: NeilBrown <neilb@xxxxxxx>
> >
> > diff --git a/Documentation/devicetree/bindings/leds/tca6507.txt b/Documentation/devicetree/bindings/leds/tca6507.txt
> > index 80ff3dfb1f32..d7221b84987c 100644
> > --- a/Documentation/devicetree/bindings/leds/tca6507.txt
> > +++ b/Documentation/devicetree/bindings/leds/tca6507.txt
> > @@ -2,6 +2,13 @@ LEDs connected to tca6507
> >
> > Required properties:
> > - compatible : should be : "ti,tca6507".
> > +- #address-cells: must be 1
> > +- #size-cells: must be 0
> > +- reg: typically 0x45.
> > +
> > +Optional properties:
> > +- gpio-controller: allows lines to be used as output-only GPIOs.
> > +- #gpio-cells: if present, must be 0.
> >
> > Each led is represented as a sub-node of the ti,tca6507 device.
> >
> > @@ -10,6 +17,7 @@ LED sub-node properties:
> > - reg : number of LED line (could be from 0 to 6)
> > - linux,default-trigger : (optional)
> > see Documentation/devicetree/bindings/leds/common.txt
> > +- compatible: either "led" (the default) or "gpio".
> >
> > Examples:
> >
> > @@ -19,6 +27,9 @@ tca6507@45 {
> > #size-cells = <0>;
> > reg = <0x45>;
> >
> > + gpio-controller;
> > + #gpio-cells = <2>;
> > +
> > led0: red-aux@0 {
> > label = "red:aux";
> > reg = <0x0>;
> > @@ -29,5 +40,10 @@ tca6507@45 {
> > reg = <0x5>;
> > linux,default-trigger = "default-on";
> > };
> > +
> > + wifi-reset@6 {
> > + reg = <0x6>;
> > + compatible = "gpio";
> > + };
> > };
> >
> > diff --git a/drivers/leds/leds-tca6507.c b/drivers/leds/leds-tca6507.c
> > index f5063f447463..93a2b1759054 100644
> > --- a/drivers/leds/leds-tca6507.c
> > +++ b/drivers/leds/leds-tca6507.c
> > @@ -638,6 +638,9 @@ static int tca6507_probe_gpios(struct i2c_client *client,
> > tca->gpio.direction_output = tca6507_gpio_direction_output;
> > tca->gpio.set = tca6507_gpio_set_value;
> > tca->gpio.dev = &client->dev;
> > +#ifdef CONFIG_OF_GPIO
> > + tca->gpio.of_node = of_node_get(client->dev.of_node);
> > +#endif
> > err = gpiochip_add(&tca->gpio);
> > if (err) {
> > tca->gpio.ngpio = 0;
> > @@ -696,6 +699,8 @@ tca6507_led_dt_init(struct i2c_client *client)
> > led.default_trigger =
> > of_get_property(child, "linux,default-trigger", NULL);
> > led.flags = 0;
> > + if (of_property_match_string(child, "compatible", "gpio") >= 0)
> > + led.flags |= TCA6507_MAKE_GPIO;
> > ret = of_property_read_u32(child, "reg", &reg);
> > if (ret != 0 || reg < 0 || reg >= NUM_LEDS)
> > continue;
> > @@ -709,6 +714,7 @@ tca6507_led_dt_init(struct i2c_client *client)
> >
> > pdata->leds.leds = tca_leds;
> > pdata->leds.num_leds = NUM_LEDS;
> > + pdata->gpio_base = -1;
> >
> > return pdata;
> > }
>

Attachment: signature.asc
Description: PGP signature