Thread (16 messages) 16 messages, 4 authors, 2016-02-17

serial: clk: bcm2835: Strange effects when using aux-uart in console

From: Stefan Wahren <hidden>
Date: 2016-02-16 19:29:47
Also in: linux-clk, linux-serial

Hi Martin,
quoted hunk ↗ jump to hunk
Martin Sperl [off-list ref] hat am 16. Februar 2016 um 17:31
geschrieben:


quoted
On 13.02.2016, at 21:45, Stefan Wahren [off-list ref] wrote:


According to the datasheet busy bit shouldn't be set while changing the
clock.
So this isn't good. I hope this could be fixed, too.
I had hoped that the patch by Eric:
"clk: bcm2835: Fix setting of PLL divider clock rates"
would fix the issue, but that was unfortunately not the case.

Some more investigation using the debugfs patch I had posted,
which exposes the registers showed that:
plld_per_a2w had a value of 4 before starting getty
and a value of 0 after starting getty.

That made me investigate why this value was changed and I found
the culprit in the form of:
@@ -1167,7 +1171,9 @@ static void bcm2835_pll_divider_off(struct clk_hw *hw)
cprman_write(cprman, data->cm_reg,
(cprman_read(cprman, data->cm_reg) &
~data->load_mask) | data->hold_mask);
- cprman_write(cprman, data->a2w_reg, A2W_PLL_CHANNEL_DISABLE);
+ cprman_write(cprman, data->a2w_reg,
+ cprman_read(cprman, data->a2w_reg) |
+ A2W_PLL_CHANNEL_DISABLE);
}
good job. This change make sense because the divider value shouldn't be zero.

But maybe we should protect the RMW by a lock like in bcm2835_clock_off?
quoted hunk ↗ jump to hunk
after that (with plld itself marked as ?prepared? during probe) everything is
working fine.

bcm2835_pll_off shows a similar pattern, but patching that
the same way:
@@ -955,8 +955,12 @@ static void bcm2835_pll_off(struct clk_hw *hw)
struct bcm2835_cprman *cprman = pll->cprman;
const struct bcm2835_pll_data *data = pll->data;

- cprman_write(cprman, data->cm_ctrl_reg, CM_PLL_ANARST);
- cprman_write(cprman, data->a2w_ctrl_reg, A2W_PLL_CTRL_PWRDN);
+ cprman_write(cprman, data->cm_ctrl_reg,
+ cprman_read(cprman, data->cm_ctrl_reg) |
+ CM_PLL_ANARST);
+ cprman_write(cprman, data->a2w_ctrl_reg,
+ cprman_read(cprman, data->a2w_ctrl_reg) |
+ A2W_PLL_CTRL_PWRDN);
}

does not resolve the issue - the system crashes - but without he pll
lock message?
Without the knowledge about the registers it's hard to say what exactly causes
the crash.

Regards
Stefan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help