Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55d70f5a authored by Ben Dooks's avatar Ben Dooks Committed by Pierre Ossman
Browse files

MMC: S3C24XX: Allow card-detect on non-IRQ capable pin



Add support to the S3C24XX MMC driver to have the card detect be on
a pin that is not IRQ capable.

Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 7c14450e
Loading
Loading
Loading
Loading
+17 −11
Original line number Diff line number Diff line
@@ -1150,8 +1150,6 @@ static int __devinit s3cmci_probe(struct platform_device *pdev, int is2440)
	host->pio_active 	= XFER_NONE;

	host->dma		= S3CMCI_DMA;
	host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
	s3c2410_gpio_cfgpin(host->pdata->gpio_detect, S3C2410_GPIO_IRQ);

	host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!host->mem) {
@@ -1197,15 +1195,21 @@ static int __devinit s3cmci_probe(struct platform_device *pdev, int is2440)

	disable_irq(host->irq);

	s3c2410_gpio_cfgpin(host->pdata->gpio_detect, S3C2410_GPIO_IRQ);
	set_irq_type(host->irq_cd, IRQT_BOTHEDGE);
	host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);

	if (request_irq(host->irq_cd, s3cmci_irq_cd, 0, DRIVER_NAME, host)) {
		dev_err(&pdev->dev,
			"failed to request card detect interrupt.\n");
	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_irq;
		}
	} else {
		dev_warn(&pdev->dev, "host detect has no irq available\n");
		s3c2410_gpio_cfgpin(host->pdata->gpio_detect,
				    S3C2410_GPIO_INPUT);
	}

	if (host->pdata->gpio_wprotect)
		s3c2410_gpio_cfgpin(host->pdata->gpio_wprotect,
@@ -1273,6 +1277,7 @@ static int __devinit s3cmci_probe(struct platform_device *pdev, int is2440)
	clk_put(host->clk);

 probe_free_irq_cd:
	if (host->irq_cd >= 0)
		free_irq(host->irq_cd, host);

 probe_free_irq:
@@ -1303,6 +1308,7 @@ static int __devexit s3cmci_remove(struct platform_device *pdev)
	tasklet_disable(&host->pio_tasklet);
	s3c2410_dma_free(S3CMCI_DMA, &s3cmci_dma_client);

	if (host->irq_cd >= 0)
		free_irq(host->irq_cd, host);
	free_irq(host->irq, host);