*  Author: Lars-Peter Clausen <lars@metafoo.de>
  */
 
+#include <linux/err.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
-#include <linux/gpio.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
        unsigned int sysclk;
        const struct snd_pcm_hw_constraint_list *constraints;
 
-       int enable_gpio;
+       struct gpio_desc *enable_gpio;
 };
 
 static const struct reg_default ssm2518_reg_defaults[] = {
                regcache_mark_dirty(ssm2518->regmap);
        }
 
-       if (gpio_is_valid(ssm2518->enable_gpio))
-               gpio_set_value(ssm2518->enable_gpio, enable);
+       if (ssm2518->enable_gpio)
+               gpiod_set_value_cansleep(ssm2518->enable_gpio, enable);
 
        regcache_cache_only(ssm2518->regmap, !enable);
 
        if (ssm2518 == NULL)
                return -ENOMEM;
 
-       if (i2c->dev.of_node) {
-               ssm2518->enable_gpio = of_get_gpio(i2c->dev.of_node, 0);
-               if (ssm2518->enable_gpio < 0 && ssm2518->enable_gpio != -ENOENT)
-                       return ssm2518->enable_gpio;
-       } else {
-               ssm2518->enable_gpio = -1;
-       }
+       /* Start with enabling the chip */
+       ssm2518->enable_gpio = devm_gpiod_get_optional(&i2c->dev, NULL,
+                                                      GPIOD_OUT_HIGH);
+       ret = PTR_ERR_OR_ZERO(ssm2518->enable_gpio);
+       if (ret)
+               return ret;
 
-       if (gpio_is_valid(ssm2518->enable_gpio)) {
-               ret = devm_gpio_request_one(&i2c->dev, ssm2518->enable_gpio,
-                               GPIOF_OUT_INIT_HIGH, "SSM2518 nSD");
-               if (ret)
-                       return ret;
-       }
+       gpiod_set_consumer_name(ssm2518->enable_gpio, "SSM2518 nSD");
 
        i2c_set_clientdata(i2c, ssm2518);