[PATCH linux dev-4.10] drivers/leds: Add GPIO keys for PCA955x and ast24/2500 gpio

Joel Stanley joel at jms.id.au
Mon Jul 3 15:40:10 AEST 2017


On Sat, Jul 1, 2017 at 8:25 AM, Christopher Bostic
<cbostic at linux.vnet.ibm.com> wrote:
> Define gpio keys for power supply presence, ucd alert, and fan presence.
>
> Link pca955x to parent i2c interrupt controller so that new pca955x gpio
> keys for fan presence haning off of pca955x can be defined.
>
> Signed-off-by: Christopher Bostic <cbostic at linux.vnet.ibm.com>
> ---
>  arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts | 77 ++++++++++++++++++++++++
>  drivers/leds/leds-pca955x.c                      | 64 ++++++++++++++++++++

The change to the source file and the .dts should be in separate patches.

>  2 files changed, 141 insertions(+)
>
> diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> index 31315d0..24ea9944 100644
> --- a/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> +++ b/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
> @@ -46,6 +46,48 @@
>                         gpios = <&gpio ASPEED_GPIO(J, 2) GPIO_ACTIVE_LOW>;
>                         linux,code = <ASPEED_GPIO(J, 2)>;
>                 };
> +
> +               ps0-presence {
> +                       label = "ps0-presence";
> +                       gpios = <&gpio ASPEED_GPIO(P, 7) GPIO_ACTIVE_LOW>;
> +                       linux,code = <ASPEED_GPIO(P, 7)>;
> +               };
> +
> +               ps1-presence {
> +                       label = "ps1-presence";
> +                       gpios = <&gpio ASPEED_GPIO(N, 0) GPIO_ACTIVE_LOW>;
> +                       linux,code = <ASPEED_GPIO(N, 0)>;
> +               };
> +
> +               ucd-alert {
> +                       label = "ucd-alert";
> +                       gpios = <&gpio ASPEED_GPIO(I, 2) GPIO_ACTIVE_LOW>;
> +                       linux,code = <ASPEED_GPIO(I, 2)>;
> +               };

I don't think this is correct. Isn't the alert line part of the sbmus device?

> +
> +               fan0-presence {
> +                       label = "fan0-presence";
> +                       gpios = <&pca0 0 GPIO_ACTIVE_LOW>;
> +                       linux,code = <0>;
> +               };
> +
> +               fan1-presence {
> +                       label = "fan1-presence";
> +                       gpios = <&pca0 1 GPIO_ACTIVE_LOW>;
> +                       linux,code = <1>;
> +               };
> +
> +               fan2-presence {
> +                       label = "fan2-presence";
> +                       gpios = <&pca0 2 GPIO_ACTIVE_LOW>;
> +                       linux,code = <2>;
> +               };
> +
> +               fan3-presence {
> +                       label = "fan3-presence";
> +                       gpios = <&pca0 3 GPIO_ACTIVE_LOW>;
> +                       linux,code = <3>;
> +               };
>         };
>
>         leds {
> @@ -203,6 +245,41 @@
>                 compatible = "infineon,dps310";
>                 reg = <0x76>;
>         };
> +
> +       pca0: pca9552 at 60 {
> +               compatible = "nxp,pca9552";
> +               reg = <0x60>;
> +               #address-cells = <1>;
> +               #size-cells = <0>;
> +               gpio-controller;
> +               #gpio-cells = <2>;
> +
> +               interrupt-parent = <&i2c_ic>;
> +               interrupts = <3>;
> +
> +               gpio-line-names = "FAN0_PRESENSE_N", "FAN1_PRESENSE_N",
> +                               "FAN2_PRESENSE_N", "FAN3_PRESENSE_N";
> +
> +               gpio at 4 {
> +                       reg = <4>;
> +                       type = <PCA955X_TYPE_GPIO>;
> +               };
> +
> +               gpio at 5 {
> +                       reg = <5>;
> +                       type = <PCA955X_TYPE_GPIO>;
> +               };
> +
> +               gpio at 6 {
> +                       reg = <6>;
> +                       type = <PCA955X_TYPE_GPIO>;
> +               };
> +
> +               gpio at 7 {
> +                       reg = <7>;
> +                       type = <PCA955X_TYPE_GPIO>;
> +               };
> +       };
>  };
>
>  &i2c4 {
> diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c
> index 9216742..88990f1 100644
> --- a/drivers/leds/leds-pca955x.c
> +++ b/drivers/leds/leds-pca955x.c
> @@ -52,6 +52,7 @@
>  #include <linux/of.h>
>  #include <linux/slab.h>
>  #include <linux/string.h>
> +#include <linux/interrupt.h>
>
>  #include <dt-bindings/leds/leds-pca955x.h>
>
> @@ -389,6 +390,66 @@ static int pca955x_gpio_direction_output(struct gpio_chip *gc,
>  }
>  #endif
>
> +static void pca955x_irq_mask(struct irq_data *d)
> +{
> +}
> +
> +static void pca955x_irq_unmask(struct irq_data *d)
> +{
> +}
> +
> +static void pca955x_irq_bus_lock(struct irq_data *d)
> +{
> +}
> +
> +static void pca955x_irq_bus_sync_unlock(struct irq_data *d)
> +{
> +}

It looks like you sent a half-finished version.

> +
> +static int pca955x_irq_set_type(struct irq_data *d, unsigned int type)
> +{
> +       return 0;
> +}
> +
> +static struct irq_chip pca955x_irq_chip = {
> +       .name                   = "pca955x",
> +       .irq_mask               = pca955x_irq_mask,
> +       .irq_unmask             = pca955x_irq_unmask,
> +       .irq_bus_lock           = pca955x_irq_bus_lock,
> +       .irq_bus_sync_unlock    = pca955x_irq_bus_sync_unlock,
> +       .irq_set_type           = pca955x_irq_set_type,
> +};
> +
> +static int pca955x_irq_setup(struct pca955x *chip, int irq_base)
> +{
> +       struct i2c_client *client;
> +       int ret;
> +
> +       if (!chip)
> +               return 0;
> +
> +       client = chip->client;
> +       if (!client)
> +               return 0;
> +
> +       if (client->irq && irq_base >= 0) {
> +               ret = gpiochip_irqchip_add_nested(&chip->gpio,
> +                                               &pca955x_irq_chip,
> +                                               irq_base,
> +                                               handle_simple_irq,
> +                                               IRQ_TYPE_NONE);
> +               if (ret) {
> +                       dev_err(&client->dev,
> +                               "could not connect irqchip to gpiochip\n");
> +                       return ret;
> +               }
> +               gpiochip_set_nested_irqchip(&chip->gpio,
> +                                       &pca955x_irq_chip,
> +                                       client->irq);
> +       }
> +       return 0;
> +}
> +
>  static int pca955x_probe(struct i2c_client *client,
>                                         const struct i2c_device_id *id)
>  {
> @@ -543,6 +604,9 @@ static int pca955x_probe(struct i2c_client *client,
>                 }
>         }
>  #endif
> +       err = pca955x_irq_setup(pca955x, 0);
> +       if (err)
> +               return err;
>
>         return 0;
>  }
> --
> 1.8.2.2
>


More information about the openbmc mailing list