forked from luck/tmp_suning_uos_patched
atmel-mci: Add support for inverted detect pin
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>
This commit is contained in:
parent
577c9c456f
commit
1c1452be2e
@ -177,6 +177,7 @@ struct atmel_mci {
|
|||||||
* available.
|
* available.
|
||||||
* @wp_pin: GPIO pin used for card write protect sending, or negative
|
* @wp_pin: GPIO pin used for card write protect sending, or negative
|
||||||
* if not available.
|
* 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.
|
* @detect_timer: Timer used for debouncing @detect_pin interrupts.
|
||||||
*/
|
*/
|
||||||
struct atmel_mci_slot {
|
struct atmel_mci_slot {
|
||||||
@ -196,6 +197,7 @@ struct atmel_mci_slot {
|
|||||||
|
|
||||||
int detect_pin;
|
int detect_pin;
|
||||||
int wp_pin;
|
int wp_pin;
|
||||||
|
bool detect_is_active_high;
|
||||||
|
|
||||||
struct timer_list detect_timer;
|
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);
|
struct atmel_mci_slot *slot = mmc_priv(mmc);
|
||||||
|
|
||||||
if (gpio_is_valid(slot->detect_pin)) {
|
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",
|
dev_dbg(&mmc->class_dev, "card is %spresent\n",
|
||||||
present ? "" : "not ");
|
present ? "" : "not ");
|
||||||
}
|
}
|
||||||
@ -1028,7 +1031,8 @@ static void atmci_detect_change(unsigned long data)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
enable_irq(gpio_to_irq(slot->detect_pin));
|
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);
|
present_old = test_bit(ATMCI_CARD_PRESENT, &slot->flags);
|
||||||
|
|
||||||
dev_vdbg(&slot->mmc->class_dev, "detect change: %d (was %d)\n",
|
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->host = host;
|
||||||
slot->detect_pin = slot_data->detect_pin;
|
slot->detect_pin = slot_data->detect_pin;
|
||||||
slot->wp_pin = slot_data->wp_pin;
|
slot->wp_pin = slot_data->wp_pin;
|
||||||
|
slot->detect_is_active_high = slot_data->detect_is_active_high;
|
||||||
slot->sdc_reg = sdc_reg;
|
slot->sdc_reg = sdc_reg;
|
||||||
|
|
||||||
mmc->ops = &atmci_ops;
|
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")) {
|
if (gpio_request(slot->detect_pin, "mmc_detect")) {
|
||||||
dev_dbg(&mmc->class_dev, "no detect pin available\n");
|
dev_dbg(&mmc->class_dev, "no detect pin available\n");
|
||||||
slot->detect_pin = -EBUSY;
|
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);
|
clear_bit(ATMCI_CARD_PRESENT, &slot->flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
* @bus_width: Number of data lines wired up the slot
|
* @bus_width: Number of data lines wired up the slot
|
||||||
* @detect_pin: GPIO pin wired to the card detect switch
|
* @detect_pin: GPIO pin wired to the card detect switch
|
||||||
* @wp_pin: GPIO pin wired to the write protect sensor
|
* @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
|
* 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.
|
* set to 0. The other fields are ignored in this case.
|
||||||
@ -24,6 +25,7 @@ struct mci_slot_pdata {
|
|||||||
unsigned int bus_width;
|
unsigned int bus_width;
|
||||||
int detect_pin;
|
int detect_pin;
|
||||||
int wp_pin;
|
int wp_pin;
|
||||||
|
bool detect_is_active_high;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user