ARM: OMAP4: clock: Lock PLLs in the right sequence
On OMAP4 we have clk_set_rate()s being done for a few
DPLL clock nodes, as part of the clock init code, since
the bootloaders no longer locks these DPLLs.
So we have a clk_set_rate() done for a ABE DPLL node (which
inturn locks it) followed by a clk_set_rate() for the USB DPLL.
With USB DPLL being in bypass, we have this parent->child
relationship thats formed while the clocks get registered.
dpll_abe_ck
|
V
dpll_abe_x2_ck
|
V
dpll_abe_m3x2_ck
|
V
usb_hs_clk_div_ck
|
V
dpll_usb_ck
This is because usb_hs_clk_div_ck is bypass clock for dpll_usb_ck.
So with this parent->child relationship in place, a clk_set_rate()
on ABE DPLL results eventually in a clk_set_rate() call on USB DPLL,
because CCF does a clk_change_rate() (as part of clk_set_rate()) on
all downstream clocks resulting from a rate change on the top clock.
So its important that we lock USB DPLL before we lock ABE DPLL.
Without which we see these error logs at boot.
[These error logs will not be seen if using a bootloader that locks
USB DPLL]
[ 0.000000] clock: dpll_usb_ck failed transition to 'locked'
[ 0.000000] Division by zero in kernel.
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted
3.10.0-03445-gfb2af00-dirty #7
[ 0.000000] [<
c001bfe8>] (unwind_backtrace+0x0/0xf4) from [<
c001868c>] (show_stack+0x10/0x14)
[ 0.000000] [<
c001868c>] (show_stack+0x10/0x14) from [<
c02deb28>] (Ldiv0+0x8/0x10)
[ 0.000000] [<
c02deb28>] (Ldiv0+0x8/0x10) from [<
c0477030>] (clk_divider_set_rate+0x10/0x114)
[ 0.000000] [<
c0477030>] (clk_divider_set_rate+0x10/0x114) from [<
c0476ef4>] (clk_change_rate+0x38/0xb8)
[ 0.000000] [<
c0476ef4>] (clk_change_rate+0x38/0xb8) from [<
c0476f5c>] (clk_change_rate+0xa0/0xb8)
[ 0.000000] Division by zero in kernel.
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted
3.10.0-03445-gfb2af00-dirty #7
[ 0.000000] [<
c001bfe8>] (unwind_backtrace+0x0/0xf4) from [<
c001868c>] (show_stack+0x10/0x14)
[ 0.000000] [<
c001868c>] (show_stack+0x10/0x14) from [<
c02deb28>] (Ldiv0+0x8/0x10)
[ 0.000000] [<
c02deb28>] (Ldiv0+0x8/0x10) from [<
c0477030>] (clk_divider_set_rate+0x10/0x114)
[ 0.000000] [<
c0477030>] (clk_divider_set_rate+0x10/0x114) from [<
c0476ef4>] (clk_change_rate+0x38/0xb8)
[ 0.000000] [<
c0476ef4>] (clk_change_rate+0x38/0xb8) from [<
c0476f5c>] (clk_change_rate+0xa0/0xb8)
[ 0.000000] Division by zero in kernel.
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted
3.10.0-03445-gfb2af00-dirty #7
[ 0.000000] [<
c001bfe8>] (unwind_backtrace+0x0/0xf4) from [<
c001868c>] (show_stack+0x10/0x14)
[ 0.000000] [<
c001868c>] (show_stack+0x10/0x14) from [<
c02deb28>] (Ldiv0+0x8/0x10)
[ 0.000000] [<
c02deb28>] (Ldiv0+0x8/0x10) from [<
c0477030>] (clk_divider_set_rate+0x10/0x114)
[ 0.000000] [<
c0477030>] (clk_divider_set_rate+0x10/0x114) from [<
c0476ef4>] (clk_change_rate+0x38/0xb8)
[ 0.000000] [<
c0476ef4>] (clk_change_rate+0x38/0xb8) from [<
c0476f5c>] (clk_change_rate+0xa0/0xb8)
[ 0.000000] Division by zero in kernel.
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted
3.10.0-03445-gfb2af00-dirty #7
[ 0.000000] [<
c001bfe8>] (unwind_backtrace+0x0/0xf4) from [<
c001868c>] (show_stack+0x10/0x14)
[ 0.000000] [<
c001868c>] (show_stack+0x10/0x14) from [<
c02deb28>] (Ldiv0+0x8/0x10)
[ 0.000000] [<
c02deb28>] (Ldiv0+0x8/0x10) from [<
c0477030>] (clk_divider_set_rate+0x10/0x114)
[ 0.000000] [<
c0477030>] (clk_divider_set_rate+0x10/0x114) from [<
c0476ef4>] (clk_change_rate+0x38/0xb8)
[ 0.000000] [<
c0476ef4>] (clk_change_rate+0x38/0xb8) from [<
c0476f5c>] (clk_change_rate+0xa0/0xb8)
[ 0.000000] Division by zero in kernel.
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted
3.10.0-03445-gfb2af00-dirty #7
[ 0.000000] [<
c001bfe8>] (unwind_backtrace+0x0/0xf4) from [<
c001868c>] (show_stack+0x10/0x14)
[ 0.000000] [<
c001868c>] (show_stack+0x10/0x14) from [<
c02deb28>] (Ldiv0+0x8/0x10)
[ 0.000000] [<
c02deb28>] (Ldiv0+0x8/0x10) from [<
c0477030>] (clk_divider_set_rate+0x10/0x114)
[ 0.000000] [<
c0477030>] (clk_divider_set_rate+0x10/0x114) from [<
c0476ef4>] (clk_change_rate+0x38/0xb8)
[ 0.000000] [<
c0476ef4>] (clk_change_rate+0x38/0xb8) from [<
c0476f5c>] (clk_change_rate+0xa0/0xb8)
[ 0.000000] Division by zero in kernel.
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted
3.10.0-03445-gfb2af00-dirty #7
[ 0.000000] [<
c001bfe8>] (unwind_backtrace+0x0/0xf4) from [<
c001868c>] (show_stack+0x10/0x14)
[ 0.000000] [<
c001868c>] (show_stack+0x10/0x14) from [<
c02deb28>] (Ldiv0+0x8/0x10)
[ 0.000000] [<
c02deb28>] (Ldiv0+0x8/0x10) from [<
c0477030>] (clk_divider_set_rate+0x10/0x114)
[ 0.000000] [<
c0477030>] (clk_divider_set_rate+0x10/0x114) from [<
c0476ef4>] (clk_change_rate+0x38/0xb8)
[ 0.000000] [<
c0476ef4>] (clk_change_rate+0x38/0xb8) from [<
c0476f5c>] (clk_change_rate+0xa0/0xb8)
[ 0.000000] clock: trace_clk_div_ck: could not find divisor for target rate 0 for parent pmd_trace_clk_mux_ck
[ 0.000000] Division by zero in kernel.
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>