Commit 11e3690a authored by Martin Sperl's avatar Martin Sperl Committed by Greg Kroah-Hartman

clk: bcm2835: pll_off should only update CM_PLL_ANARST

commit 6727f086 upstream.

bcm2835_pll_off is currently assigning CM_PLL_ANARST to the control
register, which may lose the other bits that are currently set by the
clock dividers.

It also now locks during the read/modify/write cycle of both
registers.

Fixes: 41691b88 ("clk: bcm2835: Add support for programming the
audio domain clocks")
Signed-off-by: default avatarMartin Sperl <kernel@martin.sperl.org>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
Reviewed-by: default avatarEric Anholt <eric@anholt.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 528b498e
...@@ -910,8 +910,14 @@ static void bcm2835_pll_off(struct clk_hw *hw) ...@@ -910,8 +910,14 @@ static void bcm2835_pll_off(struct clk_hw *hw)
struct bcm2835_cprman *cprman = pll->cprman; struct bcm2835_cprman *cprman = pll->cprman;
const struct bcm2835_pll_data *data = pll->data; const struct bcm2835_pll_data *data = pll->data;
cprman_write(cprman, data->cm_ctrl_reg, CM_PLL_ANARST); spin_lock(&cprman->regs_lock);
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);
spin_unlock(&cprman->regs_lock);
} }
static int bcm2835_pll_on(struct clk_hw *hw) static int bcm2835_pll_on(struct clk_hw *hw)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment