diff mbox

[v11,6/7] mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks

Message ID 1399591234-13089-6-git-send-email-afenkart@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Andreas Fenkart May 8, 2014, 11:20 p.m. UTC
These are predefined states of the driver model. When not present,
as if not set in the device tree, they become no-ops.
Explicitly selecting the default state is not needed since the
device core layer sets pin mux to "default" state before probe.
This is not the simplest implementation, on AM335x at least, we could
switch to idle at any point in the suspend hook, only the default state
needs to be set before writing to the irq registers or an IRQ might get
lost.

Signed-off-by: Andreas Fenkart <afenkart@gmail.com>

Comments

Balaji T K May 9, 2014, 5:11 p.m. UTC | #1
On Friday 09 May 2014 04:50 AM, Andreas Fenkart wrote:
> These are predefined states of the driver model. When not present,
> as if not set in the device tree, they become no-ops.
> Explicitly selecting the default state is not needed since the
> device core layer sets pin mux to "default" state before probe.
> This is not the simplest implementation, on AM335x at least, we could
> switch to idle at any point in the suspend hook, only the default state
> needs to be set before writing to the irq registers or an IRQ might get
> lost.
>
> Signed-off-by: Andreas Fenkart <afenkart@gmail.com>
>
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 47a5982..5a321f98 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -2032,7 +2032,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>   	const struct of_device_id *match;
>   	dma_cap_mask_t mask;
>   	unsigned tx_req, rx_req;
> -	struct pinctrl *pinctrl;
>   	const struct omap_mmc_of_data *data;
>
>   	apply_clk_hack(&pdev->dev);

Looks like this patches is not based on mmc-next[1]
Can you please rebase to mmc-next
[1] http://git.kernel.org/cgit/linux/kernel/git/cjb/mmc.git/log/?id=refs/heads/mmc-next

Other than that:

Acked-by: Balaji T K <balajitk@ti.com>

> @@ -2258,11 +2257,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>
>   	omap_hsmmc_disable_irq(host);
>
> -	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
> -	if (IS_ERR(pinctrl))
> -		dev_warn(&pdev->dev,
> -			"pins are not configured from the driver\n");
> -
>   	/*
>   	 * For now, only support SDIO interrupt if we have a separate
>   	 * wake-up interrupt configured from device tree. This is because
> @@ -2486,10 +2480,15 @@ static int omap_hsmmc_runtime_suspend(struct device *dev)
>   			goto abort;
>   		}
>
> +		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;
> +	} else {
> +		pinctrl_pm_select_idle_state(dev);
>   	}
> +
>   abort:
>   	spin_unlock_irqrestore(&host->irq_lock, flags);
>   	return ret;
> @@ -2513,9 +2512,14 @@ static int omap_hsmmc_runtime_resume(struct device *dev)
>   			host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
>   		}
>
> +		pinctrl_pm_select_default_state(host->dev);
> +
> +		/* irq lost, if pinmux incorrect */
>   		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
>   		OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
>   		OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
> +	} else {
> +		pinctrl_pm_select_default_state(host->dev);
>   	}
>   	spin_unlock_irqrestore(&host->irq_lock, flags);
>   	return 0;
>

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

Patch

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 47a5982..5a321f98 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -2032,7 +2032,6 @@  static int omap_hsmmc_probe(struct platform_device *pdev)
 	const struct of_device_id *match;
 	dma_cap_mask_t mask;
 	unsigned tx_req, rx_req;
-	struct pinctrl *pinctrl;
 	const struct omap_mmc_of_data *data;
 
 	apply_clk_hack(&pdev->dev);
@@ -2258,11 +2257,6 @@  static int omap_hsmmc_probe(struct platform_device *pdev)
 
 	omap_hsmmc_disable_irq(host);
 
-	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
-	if (IS_ERR(pinctrl))
-		dev_warn(&pdev->dev,
-			"pins are not configured from the driver\n");
-
 	/*
 	 * For now, only support SDIO interrupt if we have a separate
 	 * wake-up interrupt configured from device tree. This is because
@@ -2486,10 +2480,15 @@  static int omap_hsmmc_runtime_suspend(struct device *dev)
 			goto abort;
 		}
 
+		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;
+	} else {
+		pinctrl_pm_select_idle_state(dev);
 	}
+
 abort:
 	spin_unlock_irqrestore(&host->irq_lock, flags);
 	return ret;
@@ -2513,9 +2512,14 @@  static int omap_hsmmc_runtime_resume(struct device *dev)
 			host->flags &= ~HSMMC_WAKE_IRQ_ENABLED;
 		}
 
+		pinctrl_pm_select_default_state(host->dev);
+
+		/* irq lost, if pinmux incorrect */
 		OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
 		OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
 		OMAP_HSMMC_WRITE(host->base, IE, CIRQ_EN);
+	} else {
+		pinctrl_pm_select_default_state(host->dev);
 	}
 	spin_unlock_irqrestore(&host->irq_lock, flags);
 	return 0;