]> git.baikalelectronics.ru Git - kernel.git/commit
clk: sunxi-ng: a31: Fix CLK_OUT_* clock ops
authorChen-Yu Tsai <wens@csie.org>
Sat, 17 Feb 2018 13:05:04 +0000 (21:05 +0800)
committerMaxime Ripard <maxime.ripard@bootlin.com>
Mon, 19 Feb 2018 07:59:50 +0000 (08:59 +0100)
commitd67615bd3f17074291114dc6540d221bb3a876de
tree315fd16e3c18cfdde4a7ea9c4ca2f0b37ed9cbdd
parentbcac507057f6668c45308343ba41f4c91a086136
clk: sunxi-ng: a31: Fix CLK_OUT_* clock ops

When support for the A31/A31s CCU was first added, the clock ops for
the CLK_OUT_* clocks was set to the wrong type. The clocks are MP-type,
but the ops was set for div (M) clocks. This went unnoticed until now.
This was because while they are different clocks, their data structures
aligned in a way that ccu_div_ops would access the second ccu_div_internal
and ccu_mux_internal structures, which were valid, if not incorrect.

Furthermore, the use of these CLK_OUT_* was for feeding a precise 32.768
kHz clock signal to the WiFi chip. This was achievable by using the parent
with the same clock rate and no divider. So the incorrect divider setting
did not affect this usage.

Commit a005e372a290 ("clk: sunxi-ng: Support fixed post-dividers on MP
style clocks") added a new field to the ccu_mp structure, which broke
the aforementioned alignment. Now the system crashes as div_ops tries
to look up a nonexistent table.

Reported-by: Philipp Rossak <embed3d@gmail.com>
Tested-by: Philipp Rossak <embed3d@gmail.com>
Fixes: 7289e3004e07 ("clk: sunxi-ng: Add A31/A31s clocks")
Cc: <stable@vger.kernel.org>
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
drivers/clk/sunxi-ng/ccu-sun6i-a31.c