Skip to content

Commit

Permalink
atmel-mci: Add support for inverted detect pin
Browse files Browse the repository at this point in the history
Same patch as before, modified to use bool. Also adds description of
the new field in struct atmel_mci that I missed in the first patch.

This patch adds Atmel MCI support for inverted detect pins.

Signed-off-by: Jonas Larsson <jonas.larsson@martinsson.se>
Acked-by: Pierre Ossman <pierre@ossman.eu>
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
  • Loading branch information
Jonas Larsson authored and Haavard Skinnemoen committed Apr 8, 2009
1 parent 577c9c4 commit 1c1452b
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 3 deletions.
12 changes: 9 additions & 3 deletions drivers/mmc/host/atmel-mci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -196,6 +197,7 @@ struct atmel_mci_slot {

int detect_pin;
int wp_pin;
bool detect_is_active_high;

struct timer_list detect_timer;
};
Expand Down Expand Up @@ -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 ");
}
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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;
Expand All @@ -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);
}
}
Expand Down
2 changes: 2 additions & 0 deletions include/linux/atmel-mci.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* @bus_width: Number of data lines wired up the slot
* @detect_pin: GPIO pin wired to the card detect switch
* @wp_pin: GPIO pin wired to the write protect sensor
* @detect_is_active_high: The state of the detect pin when it is active
*
* If a given slot is not present on the board, @bus_width should be
* set to 0. The other fields are ignored in this case.
Expand All @@ -24,6 +25,7 @@ struct mci_slot_pdata {
unsigned int bus_width;
int detect_pin;
int wp_pin;
bool detect_is_active_high;
};

/**
Expand Down

0 comments on commit 1c1452b

Please sign in to comment.