int mmc_of_parse(struct mmc_host *host)
 {
        struct device *dev = host->parent;
-       u32 bus_width, drv_type;
+       u32 bus_width, drv_type, cd_debounce_delay_ms;
        int ret;
        bool cd_cap_invert, cd_gpio_invert = false;
        bool ro_cap_invert, ro_gpio_invert = false;
        } else {
                cd_cap_invert = device_property_read_bool(dev, "cd-inverted");
 
+               if (device_property_read_u32(dev, "cd-debounce-delay-ms",
+                                            &cd_debounce_delay_ms))
+                       cd_debounce_delay_ms = 200;
+
                if (device_property_read_bool(dev, "broken-cd"))
                        host->caps |= MMC_CAP_NEEDS_POLL;
 
                ret = mmc_gpiod_request_cd(host, "cd", 0, true,
-                                          0, &cd_gpio_invert);
+                                          cd_debounce_delay_ms,
+                                          &cd_gpio_invert);
                if (!ret)
                        dev_info(host->parent, "Got CD GPIO\n");
                else if (ret != -ENOENT && ret != -ENOSYS)
 
        irqreturn_t (*cd_gpio_isr)(int irq, void *dev_id);
        char *ro_label;
        char cd_label[0];
+       u32 cd_debounce_delay_ms;
 };
 
 static irqreturn_t mmc_gpio_cd_irqt(int irq, void *dev_id)
 {
        /* Schedule a card detection after a debounce timeout */
        struct mmc_host *host = dev_id;
+       struct mmc_gpio *ctx = host->slot.handler_priv;
 
        host->trigger_card_event = true;
-       mmc_detect_change(host, msecs_to_jiffies(200));
+       mmc_detect_change(host, msecs_to_jiffies(ctx->cd_debounce_delay_ms));
 
        return IRQ_HANDLED;
 }
 
        if (ctx) {
                ctx->ro_label = ctx->cd_label + len;
+               ctx->cd_debounce_delay_ms = 200;
                snprintf(ctx->cd_label, len, "%s cd", dev_name(host->parent));
                snprintf(ctx->ro_label, len, "%s ro", dev_name(host->parent));
                host->slot.handler_priv = ctx;
        if (debounce) {
                ret = gpiod_set_debounce(desc, debounce);
                if (ret < 0)
-                       return ret;
+                       ctx->cd_debounce_delay_ms = debounce;
        }
 
        if (gpio_invert)