|
@@ -28,15 +28,17 @@ struct mmc_gpio {
|
|
|
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;
|
|
|
}
|
|
@@ -49,6 +51,7 @@ int mmc_gpio_alloc(struct mmc_host *host)
|
|
|
|
|
|
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;
|
|
@@ -261,7 +264,7 @@ int mmc_gpiod_request_cd(struct mmc_host *host, const char *con_id,
|
|
|
if (debounce) {
|
|
|
ret = gpiod_set_debounce(desc, debounce);
|
|
|
if (ret < 0)
|
|
|
- return ret;
|
|
|
+ ctx->cd_debounce_delay_ms = debounce;
|
|
|
}
|
|
|
|
|
|
if (gpio_invert)
|