#include <linux/gpio.h>
 #include <linux/gfp.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/of_device.h>
 
 #include <asm/sizes.h>
        unsigned int            imask;
        unsigned int            power_mode;
        unsigned long           detect_delay_ms;
+       bool                    use_ro_gpio;
        struct pxamci_platform_data *pdata;
 
        struct mmc_request      *mrq;
 {
        struct pxamci_host *host = mmc_priv(mmc);
 
-       if (host->pdata && gpio_is_valid(host->pdata->gpio_card_ro))
+       if (host->use_ro_gpio)
                return mmc_gpio_get_ro(mmc);
        if (host->pdata && host->pdata->get_ro)
                return !!host->pdata->get_ro(mmc_dev(mmc));
                                              host->pdata->gpio_power_invert);
                }
 
-               if (gpio_is_valid(gpio_ro)) {
+               /* FIXME: should we pass detection delay to debounce? */
+               ret = mmc_gpiod_request_cd(mmc, "cd", 0, false, 0, NULL);
+               if (ret && ret != -ENOENT) {
+                       dev_err(dev, "Failed requesting gpio_cd\n");
+                       goto out;
+               }
+               if (ret == -ENOENT && gpio_is_valid(gpio_cd)) {
+                       ret = mmc_gpio_request_cd(mmc, gpio_cd, 0);
+                       if (ret) {
+                               dev_err(dev, "Failed requesting gpio_cd %d\n",
+                                       gpio_cd);
+                       }
+               }
+
+               ret = mmc_gpiod_request_ro(mmc, "wp", 0, false, 0, NULL);
+               if (ret && ret != -ENOENT) {
+                       dev_err(dev, "Failed requesting gpio_ro\n");
+                       goto out;
+               }
+               /* Try platform data instead */
+               if (ret == -ENOENT && gpio_is_valid(gpio_ro)) {
                        ret = mmc_gpio_request_ro(mmc, gpio_ro);
                        if (ret) {
                                dev_err(dev,
                                        "Failed requesting gpio_ro %d\n",
                                        gpio_ro);
                                goto out;
-                       } else {
-                               mmc->caps2 |= host->pdata->gpio_card_ro_invert ?
-                                       0 : MMC_CAP2_RO_ACTIVE_HIGH;
                        }
                }
-
-               if (gpio_is_valid(gpio_cd))
-                       ret = mmc_gpio_request_cd(mmc, gpio_cd, 0);
-               if (ret) {
-                       dev_err(dev, "Failed requesting gpio_cd %d\n",
-                               gpio_cd);
-                       goto out;
+               if (!ret) {
+                       host->use_ro_gpio = true;
+                       mmc->caps2 |= host->pdata->gpio_card_ro_invert ?
+                               0 : MMC_CAP2_RO_ACTIVE_HIGH;
                }
 
                if (host->pdata->init)
 
                if (gpio_is_valid(gpio_power) && host->pdata->setpower)
                        dev_warn(dev, "gpio_power and setpower() both defined\n");
-               if (gpio_is_valid(gpio_ro) && host->pdata->get_ro)
+               if (host->use_ro_gpio && host->pdata->get_ro)
                        dev_warn(dev, "gpio_ro and get_ro() both defined\n");
        }