All of lore.kernel.org
 help / color / mirror / Atom feed
* Lack of suspend/resume/shutdown ordering between GPIO providers and consumers
@ 2018-04-24 22:58 Florian Fainelli
  2018-04-25 15:00 ` Rob Herring
  2018-04-25 18:06   ` Grygorii Strashko
  0 siblings, 2 replies; 17+ messages in thread
From: Florian Fainelli @ 2018-04-24 22:58 UTC (permalink / raw)
  To: linux-kernel, linux-gpio, devicetree, dmitry.torokhov,
	jeffy.chen, enric.balletbo, josephl, opendmb, rjw

Hi Linus, Rafael, all

Our GPIO controller driver: gpio-brcmstb.c has a shutdown callback which
gets invoked when the system is brought into poweroff aka S5. So far so
good, except that we also wish to use gpio_keys.c as a possible wake-up
source, so we may have a number of GPIO pins declared as gpio-keys that
allow the system to wake-up from deep slumber.

Recently we noticed that we could easily get into a state where
gpio-brcmstb.c::brcmstb_gpio_shutdown() gets called first, and then
gpio_keys.c::gpio_keys_suspend() gets called later, which is too late to
have the enable_irq_wake() call do anything sensible since we have
suspend its parent interrupt controller before. This is completely
expected unfortunately because these two drivers are both platform
device instances with no connection to one another except via Device
Tree and the use of the GPIOLIB APIs.

First solution is to make sure that gpio-keys nodes are declared in
Device Tree *before* the GPIO controller. This works because Device Tree
nodes are probed in the order in which they are declared in Device Tree
and that directly influences the order in which platform devices are
created. Problem with that is that this is easy to miss and it may not
work with overlays, kexec reconstructing DT etc. etc.

Another possible solution would be have the GPIO controller nodes have
the GPIO consumers nodes such as gpio-keys, gpio-leds etc., and that
would allow the Linux device driver model to create an appropriate
child/parent relationship. This would unfortunately require Device Tree
changes everywhere to make that consistent, and it would be a special
case, because not all GPIO consumers are eligible as child nodes of
their parent GPIO controller, there are plenty of other consumers that
are not suitable for being moved under a parent GPIO controller node.
This would also mean that we need to "probe" GPIO controller nodes to
populate their child nodes (e.g: of_platform_bus_populate).

I am thinking a more generic solution might involve some more complex
tracking of the provider <-> consumer, but there is room for breakage.

Do you have any idea how to best solve that?

Thanks!
-- 
Florian

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2018-05-15  0:26 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-24 22:58 Lack of suspend/resume/shutdown ordering between GPIO providers and consumers Florian Fainelli
2018-04-25 15:00 ` Rob Herring
2018-04-25 18:14   ` Dmitry Torokhov
2018-04-25 21:32     ` Rafael J. Wysocki
2018-05-14 23:46     ` Florian Fainelli
2018-05-15  0:26       ` Dmitry Torokhov
2018-04-25 18:06 ` Grygorii Strashko
2018-04-25 18:06   ` Grygorii Strashko
2018-04-25 18:29   ` Florian Fainelli
2018-04-25 18:47     ` Grygorii Strashko
2018-04-25 18:47       ` Grygorii Strashko
2018-04-25 18:57       ` Florian Fainelli
2018-04-25 19:10         ` Grygorii Strashko
2018-04-25 19:10           ` Grygorii Strashko
2018-04-25 19:29           ` Grygorii Strashko
2018-04-25 19:29             ` Grygorii Strashko
2018-04-25 21:35             ` Rafael J. Wysocki

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.