Thread (9 messages) 9 messages, 3 authors, 2017-10-25

Re: about pca955x led driver gpio management

From: Andrea Scian - DAVE Embedded Systems <hidden>
Date: 2017-10-17 09:17:05
Also in: lkml

On 10/17/2017 10:20 AM, Andrea Scian - DAVE Embedded Systems wrote:
quoted
Il 17/10/2017 10:18, Cédric Le Goater ha scritto:
quoted
On 10/17/2017 09:36 AM, Andrea Scian - DAVE Embedded Systems wrote:
quoted
Dear all,

I'm working on an iMX6 based board with a PCA9555 which is used both to drive LEDs and manage some GPIOs.
The PCA9555 chip and the PCA955[0-3] chips have different control
registers. You need a different led driver for it.
My typo sorry, as you can see in the device tree below, I'm using pca9551
ok.

You might want to take a look at how we mixed gpios and leds on the witherspoon
system using pca9552 chips. we added a gpio-leds binding.

https://github.com/openbmc/linux/blob/dev-4.10/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
understood: you configure all pins of PCA955x as GPIOs and the map the 
one you need as led with gpio-leds binding.

However to me this is a kind of workaround or, at least, there's nothing 
about this limitation into the devicetree binding (in fact, IMHO, the 
device tree binding example will just fail)

I wrote the attached patch which should fix the issue and allow a more 
generic approach. WDYT?

(in case it looks good, I'll send the patch in the correct way)


Kind Regards,

Andrea
quoted
quoted
quoted
My current kernel is quite old (4.1.15) but I've found Cédric patches on mainline and backported to this old revision.

I'm facing an issue with it, because it seems that it fails when it's used in a mixed (led/gpios) environment.

E.g.: let's say that I have one led connected to LED0 output and one GPIO connected at LED1 output.

I define it as

                          pca9551: pca9551@60 {
                                  compatible = "nxp,pca9551";
                                  reg = <0x60>;
                                  #address-cells = <1>;
                                  #size-cells = <0>;
                                  #gpio-cells = <1>;

                                  led@0 {
                                          label = "led0";
                                          reg = <0>;
                                          linux,default-trigger = "none";
                                  };
                                  gpio@1 {
                                          label = "gpio1";
                                          reg = <1>;
                                          type = <2>; /* GPIO */
                                  };
                  };

At boot it's probed as

root@sbc-lynx:~# dmesg | grep pca
[    5.315425] leds-pca955x 5-0060: leds-pca955x: Using pca9551 8-bit LED driver at slave address 0x60
[    5.350349] leds-pca955x 5-0060: gpios 511...511

But I cannot access it:

root@sbc-lynx:~# echo 511 > /sys/class/gpio/export
-sh: echo: write error: Device or resource busy

Because for pca955x_gpio_request_pin() this is at offset 0 (in fact is the first gpio registered of this gpio_chip) but it's the index 1 inside pca955x->leds[]

Am I missing something? (maybe I made a mistake in my backport and/or I'm missing some patches about the GPIO subsystems).

If I'm right I think I can send a patch to fix this (I'm thinking about having an array of GPIO index to map offset -> pca955x->leds[] index or just register all pins as GPIOs and then just report the busy state)

WDYT?

Kind Regards,

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help