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@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. 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@xxxxxxxxxxxxxxx > 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. -- 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