clk: bcm2835: pll_off should only update CM_PLL_ANARST
authorMartin Sperl <kernel@martin.sperl.org>
Mon, 29 Feb 2016 11:39:17 +0000 (11:39 +0000)
committerEric Anholt <eric@anholt.net>
Thu, 17 Mar 2016 17:42:17 +0000 (10:42 -0700)
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: 41691b8862e2 ("clk: bcm2835: Add support for programming the
audio domain clocks")

Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Eric Anholt <eric@anholt.net>
drivers/clk/bcm/clk-bcm2835.c

index c74ed3fd496dba5a8d4fa867257ee5030491a3c9..adbaa55e939c73dda976aec9bd2bcb3364f43063 100644 (file)
@@ -910,8 +910,14 @@ 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);
+       spin_lock(&cprman->regs_lock);
+       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)
This page took 0.025754 seconds and 5 git commands to generate.