Merge tag 'gpio-v5.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux...
[linux-2.6-microblaze.git] / drivers / gpio / gpio-pca953x.c
index 7e76830..b7ef33f 100644 (file)
@@ -73,6 +73,7 @@
 #define PCA_CHIP_TYPE(x)       ((x) & PCA_TYPE_MASK)
 
 static const struct i2c_device_id pca953x_id[] = {
+       { "pca6416", 16 | PCA953X_TYPE | PCA_INT, },
        { "pca9505", 40 | PCA953X_TYPE | PCA_INT, },
        { "pca9534", 8  | PCA953X_TYPE | PCA_INT, },
        { "pca9535", 16 | PCA953X_TYPE | PCA_INT, },
@@ -153,6 +154,7 @@ struct pca953x_chip {
        u8 irq_trig_fall[MAX_BANK];
        struct irq_chip irq_chip;
 #endif
+       atomic_t wakeup_path;
 
        struct i2c_client *client;
        struct gpio_chip gpio_chip;
@@ -581,6 +583,11 @@ static int pca953x_irq_set_wake(struct irq_data *d, unsigned int on)
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct pca953x_chip *chip = gpiochip_get_data(gc);
 
+       if (on)
+               atomic_inc(&chip->wakeup_path);
+       else
+               atomic_dec(&chip->wakeup_path);
+
        return irq_set_irq_wake(chip->client->irq, on);
 }
 
@@ -1100,7 +1107,10 @@ static int pca953x_suspend(struct device *dev)
 
        regcache_cache_only(chip->regmap, true);
 
-       regulator_disable(chip->regulator);
+       if (atomic_read(&chip->wakeup_path))
+               device_set_wakeup_path(dev);
+       else
+               regulator_disable(chip->regulator);
 
        return 0;
 }
@@ -1110,10 +1120,12 @@ static int pca953x_resume(struct device *dev)
        struct pca953x_chip *chip = dev_get_drvdata(dev);
        int ret;
 
-       ret = regulator_enable(chip->regulator);
-       if (ret != 0) {
-               dev_err(dev, "Failed to enable regulator: %d\n", ret);
-               return 0;
+       if (!atomic_read(&chip->wakeup_path)) {
+               ret = regulator_enable(chip->regulator);
+               if (ret != 0) {
+                       dev_err(dev, "Failed to enable regulator: %d\n", ret);
+                       return 0;
+               }
        }
 
        regcache_cache_only(chip->regmap, false);
@@ -1137,6 +1149,7 @@ static int pca953x_resume(struct device *dev)
 #define OF_957X(__nrgpio, __int) (void *)(__nrgpio | PCA957X_TYPE | __int)
 
 static const struct of_device_id pca953x_dt_ids[] = {
+       { .compatible = "nxp,pca6416", .data = OF_953X(16, PCA_INT), },
        { .compatible = "nxp,pca9505", .data = OF_953X(40, PCA_INT), },
        { .compatible = "nxp,pca9534", .data = OF_953X( 8, PCA_INT), },
        { .compatible = "nxp,pca9535", .data = OF_953X(16, PCA_INT), },
@@ -1152,6 +1165,7 @@ static const struct of_device_id pca953x_dt_ids[] = {
        { .compatible = "nxp,pca9575", .data = OF_957X(16, PCA_INT), },
        { .compatible = "nxp,pca9698", .data = OF_953X(40, 0), },
 
+       { .compatible = "nxp,pcal6416", .data = OF_953X(16, PCA_LATCH_INT), },
        { .compatible = "nxp,pcal6524", .data = OF_953X(24, PCA_LATCH_INT), },
        { .compatible = "nxp,pcal9555a", .data = OF_953X(16, PCA_LATCH_INT), },
 
@@ -1167,6 +1181,7 @@ static const struct of_device_id pca953x_dt_ids[] = {
        { .compatible = "ti,tca6416", .data = OF_953X(16, PCA_INT), },
        { .compatible = "ti,tca6424", .data = OF_953X(24, PCA_INT), },
 
+       { .compatible = "onnn,cat9554", .data = OF_953X( 8, PCA_INT), },
        { .compatible = "onnn,pca9654", .data = OF_953X( 8, PCA_INT), },
 
        { .compatible = "exar,xra1202", .data = OF_953X( 8, 0), },