On Wed, 26 Aug 2015, Maxime Coquelin wrote:This is the case:
Hi Lee,The I2C driver in this instance is not a knowledgeable driver and
On 08/26/2015 08:54 AM, Lee Jones wrote:
On Tue, 25 Aug 2015, Michael Turquette wrote:How do you differentiate between a knowledgeable and
Maybe I am the one missing something? My goal was to allow the consumerMy take is that a critical clock should only be disabled when a
driver to gate the critical clock. So we need clk_disable_unused to
actually disable the clock for that to work.
I think you are suggesting that clk_disable_unused should *not* disable
the clock if it is critical. Can you confirm that?
knowledgeable driver wants to gate it for a specific purpose [probably
using clk_disable()]. Once the aforementioned driver no longer has a
use for the clock [whether that happens with clk_unprepare_disable()
or clk_put() ...] the clock should be ungated and be provided with
critical status once more.
Let's take the example of the clock used by the i2c on STi SoCs.
This clock is used by i2c, and is also critical to the system, but
only i2c takes it.
At first transfer, the i2c will enable the clock and then disables it.
What we would expect here is that the clk_disable does not gate the
clock, even if only user since the hand-off flag has been set.
Else, system will freeze.
should not be taking a reference to a critical clock.
I don't see why a clock used by i2c could not be a critical clock, if it is used by other parts of the system that cannot be represented as drivers, and rely on the clock to be always on.
In the example you provide, the real issue is that the I2C driver uses
one of the critical clock's siblings. Without this framework, if it
gives up the reference to its own clock and there are no users of any
sibling clocks, the parent is gated. This has the unfortunate effect
of gating the entire family, critical clock included.