Re: [PATCH 5/5] mmc: omap_hsmmc: Change wake-up interrupt to use generic wakeirq

From: Ulf Hansson
Date: Mon May 25 2015 - 04:38:48 EST


On 14 May 2015 at 01:36, Tony Lindgren <tony@xxxxxxxxxxx> wrote:
> We can now use generic wakeirq handling and remove the custom handling
> for the wake-up interrupts.
>
> Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx>

Rafael, if you are fine with it, please take this one through your
linux-pm tree.

Acked-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx>

Kind regards
Uffe

> ---
> drivers/mmc/host/omap_hsmmc.c | 51 +++++++------------------------------------
> 1 file changed, 8 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 9df2b68..5fbf4d8 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -43,6 +43,7 @@
> #include <linux/regulator/consumer.h>
> #include <linux/pinctrl/consumer.h>
> #include <linux/pm_runtime.h>
> +#include <linux/pm_wakeirq.h>
> #include <linux/platform_data/hsmmc-omap.h>
>
> /* OMAP HSMMC Host Controller Registers */
> @@ -218,7 +219,6 @@ struct omap_hsmmc_host {
> unsigned int flags;
> #define AUTO_CMD23 (1 << 0) /* Auto CMD23 support */
> #define HSMMC_SDIO_IRQ_ENABLED (1 << 1) /* SDIO irq enabled */
> -#define HSMMC_WAKE_IRQ_ENABLED (1 << 2)
> struct omap_hsmmc_next next_data;
> struct omap_hsmmc_platform_data *pdata;
>
> @@ -1117,22 +1117,6 @@ static irqreturn_t omap_hsmmc_irq(int irq, void *dev_id)
> return IRQ_HANDLED;
> }
>
> -static irqreturn_t omap_hsmmc_wake_irq(int irq, void *dev_id)
> -{
> - struct omap_hsmmc_host *host = dev_id;
> -
> - /* cirq is level triggered, disable to avoid infinite loop */
> - spin_lock(&host->irq_lock);
> - if (host->flags & HSMMC_WAKE_IRQ_ENABLED) {
> - disable_irq_nosync(host->wake_irq);
> - host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
> - }
> - spin_unlock(&host->irq_lock);
> - pm_request_resume(host->dev); /* no use counter */
> -
> - return IRQ_HANDLED;
> -}
> -
> static void set_sd_bus_power(struct omap_hsmmc_host *host)
> {
> unsigned long i;
> @@ -1665,7 +1649,6 @@ static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
>
> static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
> {
> - struct mmc_host *mmc = host->mmc;
> int ret;
>
> /*
> @@ -1677,11 +1660,7 @@ static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
> if (!host->dev->of_node || !host->wake_irq)
> return -ENODEV;
>
> - /* Prevent auto-enabling of IRQ */
> - irq_set_status_flags(host->wake_irq, IRQ_NOAUTOEN);
> - ret = devm_request_irq(host->dev, host->wake_irq, omap_hsmmc_wake_irq,
> - IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> - mmc_hostname(mmc), host);
> + ret = dev_pm_request_wake_irq(host->dev, host->wake_irq, NULL, 0, NULL);
> if (ret) {
> dev_err(mmc_dev(host->mmc), "Unable to request wake IRQ\n");
> goto err;
> @@ -1718,7 +1697,7 @@ static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
> return 0;
>
> err_free_irq:
> - devm_free_irq(host->dev, host->wake_irq, host);
> + dev_pm_free_wake_irq(host->dev);
> err:
> dev_warn(host->dev, "no SDIO IRQ support, falling back to polling\n");
> host->wake_irq = 0;
> @@ -2007,6 +1986,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
> omap_hsmmc_ops.multi_io_quirk = omap_hsmmc_multi_io_quirk;
> }
>
> + device_init_wakeup(&pdev->dev, true);
> pm_runtime_enable(host->dev);
> pm_runtime_get_sync(host->dev);
> pm_runtime_set_autosuspend_delay(host->dev, MMC_AUTOSUSPEND_DELAY);
> @@ -2147,6 +2127,7 @@ err_slot_name:
> if (host->use_reg)
> omap_hsmmc_reg_put(host);
> err_irq:
> + device_init_wakeup(&pdev->dev, false);
> if (host->tx_chan)
> dma_release_channel(host->tx_chan);
> if (host->rx_chan)
> @@ -2178,6 +2159,7 @@ static int omap_hsmmc_remove(struct platform_device *pdev)
>
> pm_runtime_put_sync(host->dev);
> pm_runtime_disable(host->dev);
> + device_init_wakeup(&pdev->dev, false);
> if (host->dbclk)
> clk_disable_unprepare(host->dbclk);
>
> @@ -2204,11 +2186,6 @@ static int omap_hsmmc_suspend(struct device *dev)
> OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
> }
>
> - /* do not wake up due to sdio irq */
> - if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
> - !(host->mmc->pm_flags & MMC_PM_WAKE_SDIO_IRQ))
> - disable_irq(host->wake_irq);
> -
> if (host->dbclk)
> clk_disable_unprepare(host->dbclk);
>
> @@ -2233,11 +2210,6 @@ static int omap_hsmmc_resume(struct device *dev)
> omap_hsmmc_conf_bus_power(host);
>
> omap_hsmmc_protect_card(host);
> -
> - if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
> - !(host->mmc->pm_flags & MMC_PM_WAKE_SDIO_IRQ))
> - enable_irq(host->wake_irq);
> -
> pm_runtime_mark_last_busy(host->dev);
> pm_runtime_put_autosuspend(host->dev);
> return 0;
> @@ -2277,10 +2249,7 @@ static int omap_hsmmc_runtime_suspend(struct device *dev)
> }
>
> pinctrl_pm_select_idle_state(dev);
> -
> - WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED);
> - enable_irq(host->wake_irq);
> - host->flags |= HSMMC_WAKE_IRQ_ENABLED;
> + dev_pm_enable_wake_irq(host->dev);
> } else {
> pinctrl_pm_select_idle_state(dev);
> }
> @@ -2302,11 +2271,7 @@ static int omap_hsmmc_runtime_resume(struct device *dev)
> spin_lock_irqsave(&host->irq_lock, flags);
> if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) &&
> (host->flags & HSMMC_SDIO_IRQ_ENABLED)) {
> - /* sdio irq flag can't change while in runtime suspend */
> - if (host->flags & HSMMC_WAKE_IRQ_ENABLED) {
> - disable_irq_nosync(host->wake_irq);
> - host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
> - }
> + dev_pm_disable_wake_irq(host->dev);
>
> pinctrl_pm_select_default_state(host->dev);
>
> --
> 2.1.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/