]> git.karo-electronics.de Git - linux-beck.git/blobdiff - drivers/gpio/gpio-pcf857x.c
gpio: pcf857x: Check for irq_set_irq_wake() failures
[linux-beck.git] / drivers / gpio / gpio-pcf857x.c
index 945f0cda8529d38af0cf747e300d58ef1e71d1f6..83db0e19ec7e6b4974b6c4d7be91f70a0009ef99 100644 (file)
@@ -91,6 +91,7 @@ struct pcf857x {
        spinlock_t              slock;          /* protect irq demux */
        unsigned                out;            /* software latch */
        unsigned                status;         /* current status */
+       unsigned int            irq_parent;
 
        int (*write)(struct i2c_client *client, unsigned data);
        int (*read)(struct i2c_client *client);
@@ -217,9 +218,19 @@ static unsigned int noop_ret(struct irq_data *data)
 static int pcf857x_irq_set_wake(struct irq_data *data, unsigned int on)
 {
        struct pcf857x *gpio = irq_data_get_irq_chip_data(data);
+       int error = 0;
+
+       if (gpio->irq_parent) {
+               error = irq_set_irq_wake(gpio->irq_parent, on);
+               if (error) {
+                       dev_dbg(&gpio->client->dev,
+                               "irq %u doesn't support irq_set_wake\n",
+                               gpio->irq_parent);
+                       gpio->irq_parent = 0;
+               }
+       }
 
-       irq_set_irq_wake(gpio->client->irq, on);
-       return 0;
+       return error;
 }
 
 static struct irq_chip pcf857x_irq_chip = {
@@ -364,6 +375,7 @@ static int pcf857x_probe(struct i2c_client *client,
 
                gpiochip_set_chained_irqchip(&gpio->chip, &pcf857x_irq_chip,
                                             client->irq, NULL);
+               gpio->irq_parent = client->irq;
        }
 
        /* Let platform code set up the GPIOs and their users.