Message ID | 1398670860-30695-5-git-send-email-afenkart@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Monday 28 April 2014 01:10 PM, Andreas Fenkart wrote: > These are predefined states of the driver model. When not present, > as if not set in the device tree, they simple become no-ops. > So it is always safe to call them. > This is not the simplest implementation, on AM335x at least, we could > witch 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 76fe3bd..9cc0d21 100644 > --- a/drivers/mmc/host/omap_hsmmc.c > +++ b/drivers/mmc/host/omap_hsmmc.c > @@ -1992,7 +1992,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; > > match = of_match_device(of_match_ptr(omap_mmc_of_match), &pdev->dev); > @@ -2215,11 +2214,7 @@ 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"); > + pinctrl_pm_select_default_state(host->dev); This can be removed, since device core layer sets pin mux to "default" state before probe. -- 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 --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 76fe3bd..9cc0d21 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -1992,7 +1992,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; match = of_match_device(of_match_ptr(omap_mmc_of_match), &pdev->dev); @@ -2215,11 +2214,7 @@ 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"); + pinctrl_pm_select_default_state(host->dev); /* * For now, only support SDIO interrupt if we have a separate @@ -2443,9 +2438,13 @@ 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); @@ -2470,9 +2469,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;
These are predefined states of the driver model. When not present, as if not set in the device tree, they simple become no-ops. So it is always safe to call them. This is not the simplest implementation, on AM335x at least, we could witch 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>