On 09/20/2018 06:47 PM, Tony Lindgren wrote: > * Grygorii Strashko <grygorii.strashko@xxxxxx> [180920 23:05]: >> On 09/20/2018 02:35 PM, Tony Lindgren wrote: >>> +static int __maybe_unused omap_gpio_runtime_suspend(struct device *dev) >>> +{ >>> + struct platform_device *pdev = to_platform_device(dev); >>> + struct gpio_bank *bank = platform_get_drvdata(pdev); >>> + unsigned long flags; >>> + int error = 0; >>> + >>> + raw_spin_lock_irqsave(&bank->lock, flags); >>> + /* Must be idled only by CPU_CLUSTER_PM_ENTER? */ >>> + if (bank->irq_usage) { >>> + error = -EBUSY; >> >> Sry, I didn't get how will it work with suspend to ram? >> omap_device will call this handler and, seems, abort suspend always >> if gpio bank has gpios requested as IRQ. Am I missing smth? > > Heh yeah we have _od_suspend_noirq() call pm_generic_suspend_noirq() > which will succeed. But note how after that omap_device_idle() gets > called only if pm_generic_runtime_suspend() == 0 and we still allow > supend with no error. Ah, sry, You are right - ret not updated in this case > > So for gpio interrupts there's nothing that needs to be done at that > point and the cpu_pm notifier will take care of things just before > suspend. So, just to summarize: - gpio requested (incl irq) - is_suspended = true: no actions - no gpio irqs requested - is_suspended = false: idle->omap_gpio_idle/unidle suspend->omap_gpio_runtime_suspend/resume - gpio irqs requested - is_suspended = false: idle->omap_gpio_idle/unidle suspend->omap_gpio_idle/unidle > > Do you have any better ideas? No. It's looks good - thanks, but i'd like to try it, so will get back. -- regards, -grygorii