On Tue, Jan 12, 2021 at 03:27:21PM +0300, Dmitry Osipenko wrote: > The refcounting of the gate clocks has a bug causing the enable_refcnt > to underflow when unused clocks are disabled. This happens because clk > provider erroneously bumps the refcount if clock is enabled at a boot > time, which it shouldn't be doing, and it does this only for the gate > clocks, while peripheral clocks are using the same gate ops and the > peripheral clocks are missing the initial bump. Hence the refcount of > the peripheral clocks is 0 when unused clocks are disabled and then the > counter is decremented further by the gate ops, causing the integer > underflow. > > Fix this problem by removing the erroneous bump and by implementing the > disable_unused() callback, which disables the unused gates properly. > > The visible effect of the bug is such that the unused clocks are never > gated if a loaded kernel module grabs the unused clocks and starts to use > them. In practice this shouldn't cause any real problems for the drivers > and boards supported by the kernel today. > > Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx> > --- > drivers/clk/tegra/clk-periph-gate.c | 72 +++++++++++++++++++---------- > drivers/clk/tegra/clk-periph.c | 11 +++++ > 2 files changed, 58 insertions(+), 25 deletions(-) Acked-by: Thierry Reding <treding@xxxxxxxxxx>
Attachment:
signature.asc
Description: PGP signature