#include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/pm.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/i2c.h>
 #include <linux/regmap.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/platform_device.h>
 #include <linux/spi/spi.h>
 #include <linux/acpi.h>
        rt5640_reset(component);
        regcache_cache_only(rt5640->regmap, true);
        regcache_mark_dirty(rt5640->regmap);
-       if (gpio_is_valid(rt5640->ldo1_en))
-               gpio_set_value_cansleep(rt5640->ldo1_en, 0);
+       if (rt5640->ldo1_en)
+               gpiod_set_value_cansleep(rt5640->ldo1_en, 0);
 
        return 0;
 }
 {
        struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component);
 
-       if (gpio_is_valid(rt5640->ldo1_en)) {
-               gpio_set_value_cansleep(rt5640->ldo1_en, 1);
+       if (rt5640->ldo1_en) {
+               gpiod_set_value_cansleep(rt5640->ldo1_en, 1);
                msleep(400);
        }
 
 MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match);
 #endif
 
-static int rt5640_parse_dt(struct rt5640_priv *rt5640, struct device_node *np)
-{
-       rt5640->ldo1_en = of_get_named_gpio(np, "realtek,ldo1-en-gpios", 0);
-       /*
-        * LDO1_EN is optional (it may be statically tied on the board).
-        * -ENOENT means that the property doesn't exist, i.e. there is no
-        * GPIO, so is not an error. Any other error code means the property
-        * exists, but could not be parsed.
-        */
-       if (!gpio_is_valid(rt5640->ldo1_en) &&
-                       (rt5640->ldo1_en != -ENOENT))
-               return rt5640->ldo1_en;
-
-       return 0;
-}
-
 static int rt5640_i2c_probe(struct i2c_client *i2c)
 {
        struct rt5640_priv *rt5640;
                return -ENOMEM;
        i2c_set_clientdata(i2c, rt5640);
 
-       if (i2c->dev.of_node) {
-               ret = rt5640_parse_dt(rt5640, i2c->dev.of_node);
-               if (ret)
-                       return ret;
-       } else
-               rt5640->ldo1_en = -EINVAL;
+       rt5640->ldo1_en = devm_gpiod_get_optional(&i2c->dev,
+                                                 "realtek,ldo1-en",
+                                                 GPIOD_OUT_HIGH);
+       if (IS_ERR(rt5640->ldo1_en))
+               return PTR_ERR(rt5640->ldo1_en);
+
+       if (rt5640->ldo1_en) {
+               gpiod_set_consumer_name(rt5640->ldo1_en, "RT5640 LDO1_EN");
+               msleep(400);
+       }
 
        rt5640->regmap = devm_regmap_init_i2c(i2c, &rt5640_regmap);
        if (IS_ERR(rt5640->regmap)) {
                return ret;
        }
 
-       if (gpio_is_valid(rt5640->ldo1_en)) {
-               ret = devm_gpio_request_one(&i2c->dev, rt5640->ldo1_en,
-                                           GPIOF_OUT_INIT_HIGH,
-                                           "RT5640 LDO1_EN");
-               if (ret < 0) {
-                       dev_err(&i2c->dev, "Failed to request LDO1_EN %d: %d\n",
-                               rt5640->ldo1_en, ret);
-                       return ret;
-               }
-               msleep(400);
-       }
-
        regmap_read(rt5640->regmap, RT5640_VENDOR_ID2, &val);
        if (val != RT5640_DEVICE_ID) {
                dev_err(&i2c->dev,