Skip to content

Commit

Permalink
s3cmci: add better support for no card detect or write protect available
Browse files Browse the repository at this point in the history
Add better support for omitting either the card detect or the write
protect GPIOs if the board does not support it.  Add the fields
no_wprotect and no_detect to the platform data which when set indicate the
absence of the respective GPIOs.

Note, this also fixes a minor bug where it tries to free IRQ0 if there is
no detect gpio available.

Signed-off-by: Ben Dooks <ben@simtec.co.uk>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Ben Dooks authored and torvalds committed Oct 1, 2009
1 parent 5a2c4fe commit 00acfae
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 21 deletions.
2 changes: 2 additions & 0 deletions arch/arm/plat-s3c24xx/include/plat/mci.h
Expand Up @@ -2,6 +2,8 @@
#define _ARCH_MCI_H

struct s3c24xx_mci_pdata {
unsigned int no_wprotect : 1;
unsigned int no_detect : 1;
unsigned int wprotect_invert : 1;
unsigned int detect_invert : 1; /* set => detect active high. */
unsigned int use_dma : 1;
Expand Down
46 changes: 25 additions & 21 deletions drivers/mmc/host/s3cmci.c
Expand Up @@ -1299,7 +1299,7 @@ static int s3cmci_get_ro(struct mmc_host *mmc)
struct s3c24xx_mci_pdata *pdata = host->pdata;
int ret;

if (pdata->gpio_wprotect == 0)
if (pdata->no_wprotect)
return 0;

ret = s3c2410_gpio_getpin(pdata->gpio_wprotect);
Expand Down Expand Up @@ -1647,30 +1647,34 @@ static int __devinit s3cmci_probe(struct platform_device *pdev)
disable_irq(host->irq);
host->irq_state = false;

if (host->pdata->gpio_detect) {
if (!host->pdata->no_detect) {
ret = gpio_request(host->pdata->gpio_detect, "s3cmci detect");
if (ret) {
dev_err(&pdev->dev, "failed to get detect gpio\n");
goto probe_free_irq;
}
}

host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);

if (host->irq_cd >= 0) {
if (request_irq(host->irq_cd, s3cmci_irq_cd,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
DRIVER_NAME, host)) {
dev_err(&pdev->dev, "can't get card detect irq.\n");
ret = -ENOENT;
goto probe_free_gpio_cd;
host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);

if (host->irq_cd >= 0) {
if (request_irq(host->irq_cd, s3cmci_irq_cd,
IRQF_TRIGGER_RISING |
IRQF_TRIGGER_FALLING,
DRIVER_NAME, host)) {
dev_err(&pdev->dev,
"can't get card detect irq.\n");
ret = -ENOENT;
goto probe_free_gpio_cd;
}
} else {
dev_warn(&pdev->dev,
"host detect has no irq available\n");
gpio_direction_input(host->pdata->gpio_detect);
}
} else {
dev_warn(&pdev->dev, "host detect has no irq available\n");
gpio_direction_input(host->pdata->gpio_detect);
}
} else
host->irq_cd = -1;

if (host->pdata->gpio_wprotect) {
if (!host->pdata->no_wprotect) {
ret = gpio_request(host->pdata->gpio_wprotect, "s3cmci wp");
if (ret) {
dev_err(&pdev->dev, "failed to get writeprotect\n");
Expand Down Expand Up @@ -1774,11 +1778,11 @@ static int __devinit s3cmci_probe(struct platform_device *pdev)
s3c2410_dma_free(host->dma, &s3cmci_dma_client);

probe_free_gpio_wp:
if (host->pdata->gpio_wprotect)
if (!host->pdata->no_wprotect)
gpio_free(host->pdata->gpio_wprotect);

probe_free_gpio_cd:
if (host->pdata->gpio_detect)
if (!host->pdata->no_detect)
gpio_free(host->pdata->gpio_detect);

probe_free_irq_cd:
Expand Down Expand Up @@ -1837,10 +1841,10 @@ static int __devexit s3cmci_remove(struct platform_device *pdev)

free_irq(host->irq, host);

if (pd->gpio_wprotect)
if (!pd->no_wprotect)
gpio_free(pd->gpio_wprotect);

if (pd->gpio_detect)
if (!pd->no_detect)
gpio_free(pd->gpio_detect);

for (i = S3C2410_GPE(5); i <= S3C2410_GPE(10); i++)
Expand Down

0 comments on commit 00acfae

Please sign in to comment.