diff options
-rw-r--r-- | arch/arm/plat-s3c24xx/include/plat/mci.h | 2 | ||||
-rw-r--r-- | drivers/mmc/host/s3cmci.c | 46 |
2 files changed, 27 insertions, 21 deletions
diff --git a/arch/arm/plat-s3c24xx/include/plat/mci.h b/arch/arm/plat-s3c24xx/include/plat/mci.h index f1bd6d4198d4..c2cef6139683 100644 --- a/arch/arm/plat-s3c24xx/include/plat/mci.h +++ b/arch/arm/plat-s3c24xx/include/plat/mci.h | |||
@@ -2,6 +2,8 @@ | |||
2 | #define _ARCH_MCI_H | 2 | #define _ARCH_MCI_H |
3 | 3 | ||
4 | struct s3c24xx_mci_pdata { | 4 | struct s3c24xx_mci_pdata { |
5 | unsigned int no_wprotect : 1; | ||
6 | unsigned int no_detect : 1; | ||
5 | unsigned int wprotect_invert : 1; | 7 | unsigned int wprotect_invert : 1; |
6 | unsigned int detect_invert : 1; /* set => detect active high. */ | 8 | unsigned int detect_invert : 1; /* set => detect active high. */ |
7 | unsigned int use_dma : 1; | 9 | unsigned int use_dma : 1; |
diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c index 4b627ca16cca..99b74a351020 100644 --- a/drivers/mmc/host/s3cmci.c +++ b/drivers/mmc/host/s3cmci.c | |||
@@ -1299,7 +1299,7 @@ static int s3cmci_get_ro(struct mmc_host *mmc) | |||
1299 | struct s3c24xx_mci_pdata *pdata = host->pdata; | 1299 | struct s3c24xx_mci_pdata *pdata = host->pdata; |
1300 | int ret; | 1300 | int ret; |
1301 | 1301 | ||
1302 | if (pdata->gpio_wprotect == 0) | 1302 | if (pdata->no_wprotect) |
1303 | return 0; | 1303 | return 0; |
1304 | 1304 | ||
1305 | ret = s3c2410_gpio_getpin(pdata->gpio_wprotect); | 1305 | ret = s3c2410_gpio_getpin(pdata->gpio_wprotect); |
@@ -1647,30 +1647,34 @@ static int __devinit s3cmci_probe(struct platform_device *pdev) | |||
1647 | disable_irq(host->irq); | 1647 | disable_irq(host->irq); |
1648 | host->irq_state = false; | 1648 | host->irq_state = false; |
1649 | 1649 | ||
1650 | if (host->pdata->gpio_detect) { | 1650 | if (!host->pdata->no_detect) { |
1651 | ret = gpio_request(host->pdata->gpio_detect, "s3cmci detect"); | 1651 | ret = gpio_request(host->pdata->gpio_detect, "s3cmci detect"); |
1652 | if (ret) { | 1652 | if (ret) { |
1653 | dev_err(&pdev->dev, "failed to get detect gpio\n"); | 1653 | dev_err(&pdev->dev, "failed to get detect gpio\n"); |
1654 | goto probe_free_irq; | 1654 | goto probe_free_irq; |
1655 | } | 1655 | } |
1656 | } | ||
1657 | |||
1658 | host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect); | ||
1659 | 1656 | ||
1660 | if (host->irq_cd >= 0) { | 1657 | host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect); |
1661 | if (request_irq(host->irq_cd, s3cmci_irq_cd, | 1658 | |
1662 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 1659 | if (host->irq_cd >= 0) { |
1663 | DRIVER_NAME, host)) { | 1660 | if (request_irq(host->irq_cd, s3cmci_irq_cd, |
1664 | dev_err(&pdev->dev, "can't get card detect irq.\n"); | 1661 | IRQF_TRIGGER_RISING | |
1665 | ret = -ENOENT; | 1662 | IRQF_TRIGGER_FALLING, |
1666 | goto probe_free_gpio_cd; | 1663 | DRIVER_NAME, host)) { |
1664 | dev_err(&pdev->dev, | ||
1665 | "can't get card detect irq.\n"); | ||
1666 | ret = -ENOENT; | ||
1667 | goto probe_free_gpio_cd; | ||
1668 | } | ||
1669 | } else { | ||
1670 | dev_warn(&pdev->dev, | ||
1671 | "host detect has no irq available\n"); | ||
1672 | gpio_direction_input(host->pdata->gpio_detect); | ||
1667 | } | 1673 | } |
1668 | } else { | 1674 | } else |
1669 | dev_warn(&pdev->dev, "host detect has no irq available\n"); | 1675 | host->irq_cd = -1; |
1670 | gpio_direction_input(host->pdata->gpio_detect); | ||
1671 | } | ||
1672 | 1676 | ||
1673 | if (host->pdata->gpio_wprotect) { | 1677 | if (!host->pdata->no_wprotect) { |
1674 | ret = gpio_request(host->pdata->gpio_wprotect, "s3cmci wp"); | 1678 | ret = gpio_request(host->pdata->gpio_wprotect, "s3cmci wp"); |
1675 | if (ret) { | 1679 | if (ret) { |
1676 | dev_err(&pdev->dev, "failed to get writeprotect\n"); | 1680 | dev_err(&pdev->dev, "failed to get writeprotect\n"); |
@@ -1774,11 +1778,11 @@ static int __devinit s3cmci_probe(struct platform_device *pdev) | |||
1774 | s3c2410_dma_free(host->dma, &s3cmci_dma_client); | 1778 | s3c2410_dma_free(host->dma, &s3cmci_dma_client); |
1775 | 1779 | ||
1776 | probe_free_gpio_wp: | 1780 | probe_free_gpio_wp: |
1777 | if (host->pdata->gpio_wprotect) | 1781 | if (!host->pdata->no_wprotect) |
1778 | gpio_free(host->pdata->gpio_wprotect); | 1782 | gpio_free(host->pdata->gpio_wprotect); |
1779 | 1783 | ||
1780 | probe_free_gpio_cd: | 1784 | probe_free_gpio_cd: |
1781 | if (host->pdata->gpio_detect) | 1785 | if (!host->pdata->no_detect) |
1782 | gpio_free(host->pdata->gpio_detect); | 1786 | gpio_free(host->pdata->gpio_detect); |
1783 | 1787 | ||
1784 | probe_free_irq_cd: | 1788 | probe_free_irq_cd: |
@@ -1837,10 +1841,10 @@ static int __devexit s3cmci_remove(struct platform_device *pdev) | |||
1837 | 1841 | ||
1838 | free_irq(host->irq, host); | 1842 | free_irq(host->irq, host); |
1839 | 1843 | ||
1840 | if (pd->gpio_wprotect) | 1844 | if (!pd->no_wprotect) |
1841 | gpio_free(pd->gpio_wprotect); | 1845 | gpio_free(pd->gpio_wprotect); |
1842 | 1846 | ||
1843 | if (pd->gpio_detect) | 1847 | if (!pd->no_detect) |
1844 | gpio_free(pd->gpio_detect); | 1848 | gpio_free(pd->gpio_detect); |
1845 | 1849 | ||
1846 | for (i = S3C2410_GPE(5); i <= S3C2410_GPE(10); i++) | 1850 | for (i = S3C2410_GPE(5); i <= S3C2410_GPE(10); i++) |