clk: tegra: Fix refcounting of gate clocks
authorDmitry Osipenko <digetx@gmail.com>
Sun, 16 May 2021 16:30:34 +0000 (19:30 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 19 Jul 2021 07:44:43 +0000 (09:44 +0200)
commitdc5bacea9462cf8e17340eb666e6c4d4b9a1e4bd
tree29f8a1a599ee83e256c54ed3b6f65b9a0017483f
parent315988817aa770044fbb9e16af5c0dd9344da188
clk: tegra: Fix refcounting of gate clocks

[ Upstream commit c592c8a28f5821e880ac6675781cd8a151b0737c ]

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.

Acked-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/clk/tegra/clk-periph-gate.c
drivers/clk/tegra/clk-periph.c