* Kevin Hilman <[EMAIL PROTECTED]> [080320 01:54]:
> When building as a module, the board support code (which is compiled
> in) cannot directly call the driver code (which may be in a module.)
> 
> This patch the separates the card-detect IRQ usage into board-specific
> code and driver code, and adds a couple slot-specific items to the MMC
> platform data.
> 
> Tested on 3430SDP ES2.

Pushing today.

Tony



> 
> Signed-off-by: Kevin Hilman <[EMAIL PROTECTED]>
> ---
>  arch/arm/mach-omap2/board-sdp-hsmmc.c |   19 ++++++-------------
>  drivers/mmc/host/omap_hsmmc.c         |   25 ++++++++++++++++++++++---
>  include/asm-arm/arch-omap/mmc.h       |    5 ++++-
>  3 files changed, 32 insertions(+), 17 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/board-sdp-hsmmc.c 
> b/arch/arm/mach-omap2/board-sdp-hsmmc.c
> index 90e8def..7661a79 100644
> --- a/arch/arm/mach-omap2/board-sdp-hsmmc.c
> +++ b/arch/arm/mach-omap2/board-sdp-hsmmc.c
> @@ -19,7 +19,7 @@
>  #include <asm/arch/board.h>
>  #include <asm/io.h>
>  
> -#ifdef CONFIG_MMC_OMAP_HS
> +#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
>  
>  #define VMMC1_DEV_GRP                0x27
>  #define P1_DEV_GRP           0x20
> @@ -35,13 +35,9 @@
>  #define MMC1_CD_IRQ          0
>  #define MMC2_CD_IRQ          1
>  
> -static irqreturn_t mmc_omap_cd_handler(int irq, void *dev_id)
> +static int sdp_mmc_card_detect(int irq)
>  {
> -     int detect;
> -
> -     detect = twl4030_get_gpio_datain(MMC1_CD_IRQ);
> -     omap_mmc_notify_card_detect(dev_id, 0, detect);
> -     return IRQ_HANDLED;
> +     return twl4030_get_gpio_datain(irq - IH_TWL4030_GPIO_BASE);
>  }
>  
>  /*
> @@ -72,11 +68,6 @@ static int sdp_mmc_late_init(struct device *dev)
>       if (ret != 0)
>               goto err;
>  
> -     ret = request_irq(TWL4030_GPIO_IRQ_NO(MMC1_CD_IRQ),
> -             mmc_omap_cd_handler, IRQF_DISABLED, "MMC1_CD_IRQ", dev);
> -     if (ret < 0)
> -             goto err;
> -
>       return ret;
>  err:
>       dev_err(dev, "Failed to configure TWL4030 GPIO IRQ\n");
> @@ -89,7 +80,6 @@ static void sdp_mmc_cleanup(struct device *dev)
>       int ret = 0;
>  
>       ret = twl4030_free_gpio(MMC1_CD_IRQ);
> -     free_irq(TWL4030_GPIO_IRQ_NO(MMC1_CD_IRQ), dev);
>       if (ret != 0)
>               dev_err(dev, "Failed to configure TWL4030 GPIO IRQ\n");
>  }
> @@ -259,6 +249,9 @@ static struct omap_mmc_platform_data sdp_mmc_data = {
>               .ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34 |
>                                               MMC_VDD_165_195,
>               .name                   = "first slot",
> +
> +             .card_detect_irq        = TWL4030_GPIO_IRQ_NO(MMC1_CD_IRQ),
> +             .card_detect            = sdp_mmc_card_detect,
>       },
>  };
>  
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 3d4a7d1..047c64d 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -432,11 +432,14 @@ static void mmc_omap_detect(struct work_struct *work)
>  /*
>   * ISR for handling card insertion and removal
>   */
> -void omap_mmc_notify_card_detect(struct device *dev, int slot, int detected)
> +static irqreturn_t omap_mmc_cd_handler(int irq, void *dev_id)
>  {
> -     struct mmc_omap_host *host = dev_get_drvdata(dev);
> -     host->carddetect = detected;
> +     struct mmc_omap_host *host = (struct mmc_omap_host *)dev_id;
> +
> +     host->carddetect = mmc_slot(host).card_detect(irq);
>       schedule_work(&host->mmc_carddetect_work);
> +
> +     return IRQ_HANDLED;
>  }
>  
>  /*
> @@ -797,9 +800,23 @@ static int __init omap_mmc_probe(struct platform_device 
> *pdev)
>               goto irq_err;
>       }
>  
> +     /* Request IRQ for card detect */
> +     if ((mmc_slot(host).card_detect_irq) && (mmc_slot(host).card_detect)) {
> +             ret = request_irq(mmc_slot(host).card_detect_irq,
> +                               omap_mmc_cd_handler, IRQF_DISABLED, "MMC CD",
> +                               host);
> +             if (ret) {
> +                     dev_dbg(mmc_dev(host->mmc),
> +                             "Unable to grab MMC CD IRQ");
> +                     free_irq(host->irq, host);
> +                     goto irq_err;
> +             }
> +     }
> +
>       INIT_WORK(&host->mmc_carddetect_work, mmc_omap_detect);
>       if (pdata->init != NULL) {
>               if (pdata->init(&pdev->dev) != 0) {
> +                     free_irq(mmc_slot(host).card_detect_irq, host);
>                       free_irq(host->irq, host);
>                       goto irq_err;
>               }
> @@ -843,6 +860,8 @@ static int omap_mmc_remove(struct platform_device *pdev)
>       if (host) {
>               host->pdata->cleanup(&pdev->dev);
>               free_irq(host->irq, host);
> +             if (mmc_slot(host).card_detect_irq)
> +                     free_irq(mmc_slot(host).card_detect_irq, host);
>               flush_scheduled_work();
>  
>               clk_disable(host->fclk);
> diff --git a/include/asm-arm/arch-omap/mmc.h b/include/asm-arm/arch-omap/mmc.h
> index 4d40db0..3c2f2c1 100644
> --- a/include/asm-arm/arch-omap/mmc.h
> +++ b/include/asm-arm/arch-omap/mmc.h
> @@ -55,13 +55,16 @@ struct omap_mmc_platform_data {
>  
>               const char *name;
>               u32 ocr_mask;
> +
> +             /* Card detection IRQs */
> +             int card_detect_irq;
> +             int (* card_detect)(int irq);
>       } slots[OMAP_MMC_MAX_SLOTS];
>  };
>  
>  extern void omap_set_mmc_info(int host, const struct omap_mmc_platform_data 
> *info);
>  
>  /* called from board-specific card detection service routine */
> -extern void omap_mmc_notify_card_detect(struct device *dev, int slot, int 
> detected);
>  extern void omap_mmc_notify_cover_event(struct device *dev, int slot, int 
> is_closed);
>  
>  #endif
> -- 
> 1.5.4.1.162.g72eef
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to