Commit 97978a44 authored by Andreas Fenkart's avatar Andreas Fenkart Committed by Ulf Hansson

mmc: omap_hsmmc: switch default/idle pinctrl states in runtime hooks

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.
Acked-by: default avatarBalaji T K <balajitk@ti.com>
Signed-off-by: default avatarAndreas Fenkart <afenkart@gmail.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent f945901f
...@@ -1998,7 +1998,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev) ...@@ -1998,7 +1998,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
const struct of_device_id *match; const struct of_device_id *match;
dma_cap_mask_t mask; dma_cap_mask_t mask;
unsigned tx_req, rx_req; unsigned tx_req, rx_req;
struct pinctrl *pinctrl;
const struct omap_mmc_of_data *data; const struct omap_mmc_of_data *data;
void __iomem *base; void __iomem *base;
...@@ -2212,11 +2211,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev) ...@@ -2212,11 +2211,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
omap_hsmmc_disable_irq(host); 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 * For now, only support SDIO interrupt if we have a separate
* wake-up interrupt configured from device tree. This is because * wake-up interrupt configured from device tree. This is because
...@@ -2418,10 +2412,15 @@ static int omap_hsmmc_runtime_suspend(struct device *dev) ...@@ -2418,10 +2412,15 @@ static int omap_hsmmc_runtime_suspend(struct device *dev)
goto abort; goto abort;
} }
pinctrl_pm_select_idle_state(dev);
WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED); WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED);
enable_irq(host->wake_irq); enable_irq(host->wake_irq);
host->flags |= HSMMC_WAKE_IRQ_ENABLED; host->flags |= HSMMC_WAKE_IRQ_ENABLED;
} else {
pinctrl_pm_select_idle_state(dev);
} }
abort: abort:
spin_unlock_irqrestore(&host->irq_lock, flags); spin_unlock_irqrestore(&host->irq_lock, flags);
return ret; return ret;
...@@ -2445,9 +2444,14 @@ static int omap_hsmmc_runtime_resume(struct device *dev) ...@@ -2445,9 +2444,14 @@ static int omap_hsmmc_runtime_resume(struct device *dev)
host->flags &= ~HSMMC_WAKE_IRQ_ENABLED; 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, STAT, STAT_CLEAR);
OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN); OMAP_HSMMC_WRITE(host->base, ISE, CIRQ_EN);
OMAP_HSMMC_WRITE(host->base, IE, 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); spin_unlock_irqrestore(&host->irq_lock, flags);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment