[PATCH v4] GPIO PL061: Adding Clk framework support
From: Russell King - ARM Linux <hidden>
Date: 2010-07-10 07:19:13
On Sat, Jul 10, 2010 at 01:55:26AM +0200, Linus Walleij wrote:
This looks mostly good to me (comments below) but will have as a side effect that all clock frameworks on all platforms using PrimeCells will need to be initialized *before* the PrimeCell devices are added.
No it doesn't - it needs the clock API to be initialized before the first driver is probed. As drivers are registered during the initcalls, later than postcore level
quoted
- ? ? ? id = amba_lookup(pcdrv->id_table, pcdev); + ? ? ? ? ? ? ? ret = pcdrv->probe(pcdev, id); + ? ? ? ? ? ? ? if (ret == 0) + ? ? ? ? ? ? ? ? ? ? ? break;So this means you always turn on the block clock at probe, and then leave it on if the probe was successful.
Correct, which is what drivers currently expect. This is also why two additional amba_* callbacks are supplied - if it is appropriate for a driver to disable their bus clock after being probed, they can do that but they have to participate in that. Basically, they have to call amba_bus_clk_disable() on successful probe, and then amba_bus_clk_enable() each time that they want to access their registers, followed by an amba_bus_clk_disable() when they've finished. Finally, they must call amba_bus_clk_enable() in their remove method and avoid amba_bus_clk_disable() before returning.
For drivers that need to conserve power, also the block clock has to be gated when the device is not in use, sometimes since that affects some hardware that keep track of the usecount of the clock tree for a larger region of silicon, so the power savings can be drastic.
You can't have the core code doing that. If you unconditionally turn the bus clock off after probe, what happens when a driver receives an interrupt and tries to access its registers? Hint: the core code can't know that the driver has registered an IRQ handler.