|
33 | 33 | #include <linux/gpio.h>
|
34 | 34 | #include <linux/gfp.h>
|
35 | 35 | #include <linux/of.h>
|
36 |
| -#include <linux/of_gpio.h> |
37 | 36 | #include <linux/of_device.h>
|
38 | 37 |
|
39 | 38 | #include <asm/sizes.h>
|
@@ -63,6 +62,7 @@ struct pxamci_host {
|
63 | 62 | unsigned int imask;
|
64 | 63 | unsigned int power_mode;
|
65 | 64 | unsigned long detect_delay_ms;
|
| 65 | + bool use_ro_gpio; |
66 | 66 | struct pxamci_platform_data *pdata;
|
67 | 67 |
|
68 | 68 | struct mmc_request *mrq;
|
@@ -432,7 +432,7 @@ static int pxamci_get_ro(struct mmc_host *mmc)
|
432 | 432 | {
|
433 | 433 | struct pxamci_host *host = mmc_priv(mmc);
|
434 | 434 |
|
435 |
| - if (host->pdata && gpio_is_valid(host->pdata->gpio_card_ro)) |
| 435 | + if (host->use_ro_gpio) |
436 | 436 | return mmc_gpio_get_ro(mmc);
|
437 | 437 | if (host->pdata && host->pdata->get_ro)
|
438 | 438 | return !!host->pdata->get_ro(mmc_dev(mmc));
|
@@ -749,33 +749,47 @@ static int pxamci_probe(struct platform_device *pdev)
|
749 | 749 | host->pdata->gpio_power_invert);
|
750 | 750 | }
|
751 | 751 |
|
752 |
| - if (gpio_is_valid(gpio_ro)) { |
| 752 | + /* FIXME: should we pass detection delay to debounce? */ |
| 753 | + ret = mmc_gpiod_request_cd(mmc, "cd", 0, false, 0, NULL); |
| 754 | + if (ret && ret != -ENOENT) { |
| 755 | + dev_err(dev, "Failed requesting gpio_cd\n"); |
| 756 | + goto out; |
| 757 | + } |
| 758 | + if (ret == -ENOENT && gpio_is_valid(gpio_cd)) { |
| 759 | + ret = mmc_gpio_request_cd(mmc, gpio_cd, 0); |
| 760 | + if (ret) { |
| 761 | + dev_err(dev, "Failed requesting gpio_cd %d\n", |
| 762 | + gpio_cd); |
| 763 | + } |
| 764 | + } |
| 765 | + |
| 766 | + ret = mmc_gpiod_request_ro(mmc, "wp", 0, false, 0, NULL); |
| 767 | + if (ret && ret != -ENOENT) { |
| 768 | + dev_err(dev, "Failed requesting gpio_ro\n"); |
| 769 | + goto out; |
| 770 | + } |
| 771 | + /* Try platform data instead */ |
| 772 | + if (ret == -ENOENT && gpio_is_valid(gpio_ro)) { |
753 | 773 | ret = mmc_gpio_request_ro(mmc, gpio_ro);
|
754 | 774 | if (ret) {
|
755 | 775 | dev_err(dev,
|
756 | 776 | "Failed requesting gpio_ro %d\n",
|
757 | 777 | gpio_ro);
|
758 | 778 | goto out;
|
759 |
| - } else { |
760 |
| - mmc->caps2 |= host->pdata->gpio_card_ro_invert ? |
761 |
| - 0 : MMC_CAP2_RO_ACTIVE_HIGH; |
762 | 779 | }
|
763 | 780 | }
|
764 |
| - |
765 |
| - if (gpio_is_valid(gpio_cd)) |
766 |
| - ret = mmc_gpio_request_cd(mmc, gpio_cd, 0); |
767 |
| - if (ret) { |
768 |
| - dev_err(dev, "Failed requesting gpio_cd %d\n", |
769 |
| - gpio_cd); |
770 |
| - goto out; |
| 781 | + if (!ret) { |
| 782 | + host->use_ro_gpio = true; |
| 783 | + mmc->caps2 |= host->pdata->gpio_card_ro_invert ? |
| 784 | + 0 : MMC_CAP2_RO_ACTIVE_HIGH; |
771 | 785 | }
|
772 | 786 |
|
773 | 787 | if (host->pdata->init)
|
774 | 788 | host->pdata->init(dev, pxamci_detect_irq, mmc);
|
775 | 789 |
|
776 | 790 | if (gpio_is_valid(gpio_power) && host->pdata->setpower)
|
777 | 791 | dev_warn(dev, "gpio_power and setpower() both defined\n");
|
778 |
| - if (gpio_is_valid(gpio_ro) && host->pdata->get_ro) |
| 792 | + if (host->use_ro_gpio && host->pdata->get_ro) |
779 | 793 | dev_warn(dev, "gpio_ro and get_ro() both defined\n");
|
780 | 794 | }
|
781 | 795 |
|
|
0 commit comments