[PATCH] S3C: SDHCI: Add platform data parameters for GPIO external interrupts.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds platform parameters for external GPIO support for card
insertion/removal events. This is used for S3C SDHCI controllers that
does not use the SDCD pin for card detection.

Signed-off-by: Thomas Abraham <thomas.ab@xxxxxxxxxxx>
---
 arch/arm/plat-samsung/include/plat/sdhci.h |    7 ++++++
 drivers/mmc/host/sdhci-s3c.c               |   30 ++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/arch/arm/plat-samsung/include/plat/sdhci.h b/arch/arm/plat-samsung/include/plat/sdhci.h
index 7d07cd7..b0a0528 100644
--- a/arch/arm/plat-samsung/include/plat/sdhci.h
+++ b/arch/arm/plat-samsung/include/plat/sdhci.h
@@ -29,6 +29,9 @@ struct mmc_ios;
  *            is necessary the controllers and/or GPIO blocks require the
  *	      changing of driver-strength and other controls dependant on
  *	      the card and speed of operation.
+ * @cfg_ext_cd: Configure external interrupt line.
+ * @is_card_present: Returns status of card availability.
+ * @ext_cd: The external GPIO interrupt number to be used.
  *
  * Initialisation data specific to either the machine or the platform
  * for the device driver to use or call-back when configuring gpio or
@@ -45,6 +48,10 @@ struct s3c_sdhci_platdata {
 			    void __iomem *regbase,
 			    struct mmc_ios *ios,
 			    struct mmc_card *card);
+
+	void		(*cfg_ext_cd)(void);
+	unsigned int	(*is_card_present)(void);
+	unsigned int	ext_cd;
 };
 
 /**
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c
index ebb17ac..073b56f 100644
--- a/drivers/mmc/host/sdhci-s3c.c
+++ b/drivers/mmc/host/sdhci-s3c.c
@@ -212,6 +212,20 @@ static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock)
 	}
 }
 
+static irqreturn_t s3c_sdhci_irq_extcd(int irq, void *dev_id)
+{
+	struct sdhci_s3c *sc = dev_id;
+	u32 present = sc->pdata->is_card_present();
+
+	if (present)
+		sc->host->flags &= ~SDHCI_DEVICE_DEAD;
+	else
+		sc->host->flags |= SDHCI_DEVICE_DEAD;
+
+	tasklet_schedule(&sc->host->card_tasklet);
+	return IRQ_HANDLED;
+}
+
 static struct sdhci_ops sdhci_s3c_ops = {
 	.get_max_clock		= sdhci_s3c_get_max_clk,
 	.get_timeout_clock	= sdhci_s3c_get_timeout_clk,
@@ -346,14 +360,30 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
 	host->quirks |= (SDHCI_QUIRK_32BIT_DMA_ADDR |
 			 SDHCI_QUIRK_32BIT_DMA_SIZE);
 
+	if (pdata->cfg_ext_cd) {
+		pdata->cfg_ext_cd();
+		if (!pdata->is_card_present())
+			host->flags |= SDHCI_DEVICE_DEAD;
+	}
+
 	ret = sdhci_add_host(host);
 	if (ret) {
 		dev_err(dev, "sdhci_add_host() failed\n");
 		goto err_add_host;
 	}
 
+	if (pdata->cfg_ext_cd) {
+		ret = request_irq(pdata->ext_cd, s3c_sdhci_irq_extcd,
+			IRQF_SHARED, mmc_hostname(host->mmc), sc);
+		if (ret)
+			goto err_req_cdirq;
+	}
+
 	return 0;
 
+ err_req_cdirq:
+	sdhci_remove_host(host, 0);
+
  err_add_host:
 	release_resource(sc->ioarea);
 	kfree(sc->ioarea);
-- 
1.6.6.rc2

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux SoC Development]     [Linux Rockchip Development]     [Linux USB Development]     [Video for Linux]     [Linux Audio Users]     [Linux SCSI]     [Yosemite News]

  Powered by Linux