#include <linux/pm.h>
 #include <linux/property.h>
 #include <linux/regulator/consumer.h>
+#include <linux/reset.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <dt-bindings/mux/mux.h>
        unsigned int irq_mask;
        raw_spinlock_t lock;
        struct regulator *supply;
+
+       struct gpio_desc *reset_gpio;
+       struct reset_control *reset_cont;
 };
 
 /* Provide specs for the MAX735x, PCA954x and PCA984x types we know about */
        return ret;
 }
 
+static int pca954x_get_reset(struct device *dev, struct pca954x *data)
+{
+       data->reset_cont = devm_reset_control_get_optional_shared(dev, NULL);
+       if (IS_ERR(data->reset_cont))
+               return dev_err_probe(dev, PTR_ERR(data->reset_cont),
+                                    "Failed to get reset\n");
+       else if (data->reset_cont)
+               return 0;
+
+       /*
+        * fallback to legacy reset-gpios
+        */
+       data->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(data->reset_gpio)) {
+               return dev_err_probe(dev, PTR_ERR(data->reset_gpio),
+                                    "Failed to get reset gpio");
+       }
+
+       return 0;
+}
+
+static void pca954x_reset_deassert(struct pca954x *data)
+{
+       if (data->reset_cont)
+               reset_control_deassert(data->reset_cont);
+       else
+               gpiod_set_value_cansleep(data->reset_gpio, 0);
+}
+
 /*
  * I2C init/probing/exit functions
  */
        const struct i2c_device_id *id = i2c_client_get_device_id(client);
        struct i2c_adapter *adap = client->adapter;
        struct device *dev = &client->dev;
-       struct gpio_desc *gpio;
        struct i2c_mux_core *muxc;
        struct pca954x *data;
        int num;
                return dev_err_probe(dev, ret,
                                     "Failed to enable vdd supply\n");
 
-       /* Reset the mux if a reset GPIO is specified. */
-       gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
-       if (IS_ERR(gpio)) {
-               ret = PTR_ERR(gpio);
+       ret = pca954x_get_reset(dev, data);
+       if (ret)
                goto fail_cleanup;
-       }
-       if (gpio) {
+
+       if (data->reset_cont || data->reset_gpio) {
                udelay(1);
-               gpiod_set_value_cansleep(gpio, 0);
+               pca954x_reset_deassert(data);
                /* Give the chip some time to recover. */
                udelay(1);
        }