All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] S3C: SDHCI: Add platform data parameters for GPIO external interrupts.
@ 2010-03-09 13:37 Thomas Abraham
  2010-05-04  7:15 ` Ben Dooks
  0 siblings, 1 reply; 2+ messages in thread
From: Thomas Abraham @ 2010-03-09 13:37 UTC (permalink / raw)
  To: linux-samsung-soc

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@samsung.com>
---
 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

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] S3C: SDHCI: Add platform data parameters for GPIO external interrupts.
  2010-03-09 13:37 [PATCH] S3C: SDHCI: Add platform data parameters for GPIO external interrupts Thomas Abraham
@ 2010-05-04  7:15 ` Ben Dooks
  0 siblings, 0 replies; 2+ messages in thread
From: Ben Dooks @ 2010-05-04  7:15 UTC (permalink / raw)
  To: Thomas Abraham; +Cc: linux-samsung-soc

On Tue, Mar 09, 2010 at 07:07:05PM +0530, Thomas Abraham wrote:
> 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@samsung.com>
> ---
>  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.

Do you really need cfg_ext_cd?

>   * 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@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
-- 
Ben

Q:      What's a light-year?
A:      One-third less calories than a regular year.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-05-04  7:15 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-09 13:37 [PATCH] S3C: SDHCI: Add platform data parameters for GPIO external interrupts Thomas Abraham
2010-05-04  7:15 ` Ben Dooks

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.