atmel-mci: Add support for inverted detect pin
[deliverable/linux.git] / drivers / mmc / host / atmel-mci.c
index cf6a100bb38ff99a4fb56588ab3eb9b84ee7cf87..7b603e4b41dbe9eb60a03e2dd57a13d47f64d94d 100644 (file)
@@ -177,6 +177,7 @@ struct atmel_mci {
  *     available.
  * @wp_pin: GPIO pin used for card write protect sending, or negative
  *     if not available.
+ * @detect_is_active_high: The state of the detect pin when it is active.
  * @detect_timer: Timer used for debouncing @detect_pin interrupts.
  */
 struct atmel_mci_slot {
@@ -196,6 +197,7 @@ struct atmel_mci_slot {
 
        int                     detect_pin;
        int                     wp_pin;
+       bool                    detect_is_active_high;
 
        struct timer_list       detect_timer;
 };
@@ -924,7 +926,8 @@ static int atmci_get_cd(struct mmc_host *mmc)
        struct atmel_mci_slot   *slot = mmc_priv(mmc);
 
        if (gpio_is_valid(slot->detect_pin)) {
-               present = !gpio_get_value(slot->detect_pin);
+               present = !(gpio_get_value(slot->detect_pin) ^
+                           slot->detect_is_active_high);
                dev_dbg(&mmc->class_dev, "card is %spresent\n",
                                present ? "" : "not ");
        }
@@ -1028,7 +1031,8 @@ static void atmci_detect_change(unsigned long data)
                return;
 
        enable_irq(gpio_to_irq(slot->detect_pin));
-       present = !gpio_get_value(slot->detect_pin);
+       present = !(gpio_get_value(slot->detect_pin) ^
+                   slot->detect_is_active_high);
        present_old = test_bit(ATMCI_CARD_PRESENT, &slot->flags);
 
        dev_vdbg(&slot->mmc->class_dev, "detect change: %d (was %d)\n",
@@ -1456,6 +1460,7 @@ static int __init atmci_init_slot(struct atmel_mci *host,
        slot->host = host;
        slot->detect_pin = slot_data->detect_pin;
        slot->wp_pin = slot_data->wp_pin;
+       slot->detect_is_active_high = slot_data->detect_is_active_high;
        slot->sdc_reg = sdc_reg;
 
        mmc->ops = &atmci_ops;
@@ -1477,7 +1482,8 @@ static int __init atmci_init_slot(struct atmel_mci *host,
                if (gpio_request(slot->detect_pin, "mmc_detect")) {
                        dev_dbg(&mmc->class_dev, "no detect pin available\n");
                        slot->detect_pin = -EBUSY;
-               } else if (gpio_get_value(slot->detect_pin)) {
+               } else if (gpio_get_value(slot->detect_pin) ^
+                               slot->detect_is_active_high) {
                        clear_bit(ATMCI_CARD_PRESENT, &slot->flags);
                }
        }
This page took 0.023975 seconds and 5 git commands to generate.