Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@xxxxxxxxxxxx> --- drivers/mci/atmel_mci.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/mci/atmel_mci.c b/drivers/mci/atmel_mci.c index 4ef45b5..261ac49 100644 --- a/drivers/mci/atmel_mci.c +++ b/drivers/mci/atmel_mci.c @@ -371,6 +371,23 @@ static int atmci_card_present(struct mci_host *mci) return ret == 0 ? 1 : 0; } +static int atmci_card_write_protected(struct mci_host *mci) +{ + struct atmel_mci_host *host = to_mci_host(mci); + struct atmel_mci_platform_data *pd = host->hw_dev->platform_data; + int ret; + + /* No gpio, assume card is not protected */ + if (!gpio_is_valid(pd->wp_pin)) + return 0; + + ret = gpio_get_value(pd->detect_pin); + if (ret < 0) + return 0; + + return ret; +} + /** init the host interface */ static int atmci_reset(struct mci_host *mci, struct device_d *mci_dev) { @@ -491,6 +508,9 @@ static void atmci_info(struct device_d *mci_dev) printf("\n Card detection support: %s\n", gpio_is_valid(pd->detect_pin) ? "yes" : "no"); + printf(" Card write protected support: %s\n", + gpio_is_valid(pd->wp_pin) ? "yes" : "no"); + } #endif /* CONFIG_MCI_INFO */ /* @@ -558,11 +578,28 @@ static int atmci_probe(struct device_d *hw_dev) } } + if (gpio_is_valid(pd->wp_pin)) { + ret = gpio_request(pd->wp_pin, "mci_wp"); + if (ret) { + dev_err(hw_dev, "Impossible to request WP gpio %d (%d)\n", + ret, pd->wp_pin); + goto err_gpio_cd_request; + } + + ret = gpio_direction_input(pd->wp_pin); + if (ret) { + dev_err(hw_dev, "Impossible to configure WP gpio %d as input (%d)\n", + ret, pd->wp_pin); + goto err_gpio_wp_request; + } + } + host = xzalloc(sizeof(*host)); host->mci.send_cmd = atmci_request; host->mci.set_ios = atmci_set_ios; host->mci.init = atmci_reset; host->mci.card_present = atmci_card_present; + host->mci.card_write_protected = atmci_card_write_protected; host->mci.hw_dev = hw_dev; if (pd->bus_width >= 4) @@ -578,7 +615,7 @@ static int atmci_probe(struct device_d *hw_dev) if (IS_ERR(host->clk)) { dev_err(hw_dev, "no mci_clk\n"); ret = PTR_ERR(host->clk); - goto err_gpio_cd_request; + goto err_gpio_wp_request; } clk_enable(host->clk); @@ -606,6 +643,9 @@ static int atmci_probe(struct device_d *hw_dev) return 0; +err_gpio_wp_request: + if (gpio_is_valid(pd->wp_pin)) + gpio_free(pd->wp_pin); err_gpio_cd_request: if (gpio_is_valid(pd->detect_pin)) gpio_free(pd->detect_pin); -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox