From: 黄涛 Date: Mon, 20 Sep 2010 03:58:55 +0000 (+0800) Subject: clock: 获取/设置clk时,不关闭中断(除改变arm clk),只关闭软中断(dsp会在timer中访问),避免断音。减小dsp变频时的delay X-Git-Tag: firefly_0821_release~11126 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2b02c3c48193608db03bb30e6e67cb4f348d039c;p=firefly-linux-kernel-4.4.55.git clock: 获取/设置clk时,不关闭中断(除改变arm clk),只关闭软中断(dsp会在timer中访问),避免断音。减小dsp变频时的delay --- diff --git a/arch/arm/mach-rk2818/clock.c b/arch/arm/mach-rk2818/clock.c index a1a392e9f752..527d57d6babf 100644 --- a/arch/arm/mach-rk2818/clock.c +++ b/arch/arm/mach-rk2818/clock.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -405,7 +406,7 @@ static int rockchip_scu_set_arm_pllclk_hw(const struct rockchip_pll_set *ps) .flags = _flags, \ } -struct rockchip_pll_set arm_pll[] = { +static const struct rockchip_pll_set arm_pll[] = { // clk_hz = 24*clkf/(clkr*clkod) clkr clkf clkod hdiv pdiv flags (pdiv=1,2,4,no 3!!) ARM_PLL(576 * SCU_CLK_MHZ, 4, 96, 1, 12, 31, 41, 1), ARM_PLL(384 * SCU_CLK_MHZ, 3, 96, 2, 8, 21, 41, 1), @@ -554,12 +555,11 @@ static int rockchip_scu_set_dsp_pllclk_hw(const struct rockchip_pll_set *ps) const int delay = OTHER_PLL_DELAY; if (ps->clk_hz == 24 * SCU_CLK_MHZ) { - unsigned long arm_freq_mhz = arm_clk.rate / SCU_CLK_MHZ; dsp_pll_clk_slow_mode(1); /* 20100615,HSL@RK,when power down,set pll out=300 M. */ scu_writel_force(ps->pll_con, SCU_DPLL_CON); pr_debug("set 24M clk, dsp power down\n"); - tcm_udelay(delay, arm_freq_mhz); + tcm_udelay(1, 600); scu_writel_force(scu_readl(SCU_DPLL_CON) | PLL_PD, SCU_DPLL_CON); } else { u32 reg_val; @@ -590,7 +590,7 @@ static int rockchip_scu_set_dsp_pllclk_hw(const struct rockchip_pll_set *ps) .pll_con = PLL_SAT | PLL_FAST | PLL_CLKR(nr-1) | PLL_CLKF(nf-1) | PLL_CLKOD(od-1), \ } -struct rockchip_pll_set dsp_pll[] = { +static const struct rockchip_pll_set dsp_pll[] = { // clk_hz = 24*clkf/(clkr*clkod) clkr clkf clkod DSP_PLL(600 * SCU_CLK_MHZ, 6, 150, 1), DSP_PLL(560 * SCU_CLK_MHZ, 6, 140, 1), @@ -1258,14 +1258,14 @@ static int __clk_enable(struct clk *clk) int clk_enable(struct clk *clk) { int ret = 0; - unsigned long flags; if (clk == NULL || IS_ERR(clk)) return -EINVAL; - spin_lock_irqsave(&clockfw_lock, flags); + WARN_ON(in_irq()); + spin_lock_bh(&clockfw_lock); ret = __clk_enable(clk); - spin_unlock_irqrestore(&clockfw_lock, flags); + spin_unlock_bh(&clockfw_lock); return ret; } @@ -1284,12 +1284,11 @@ static void __clk_disable(struct clk *clk) void clk_disable(struct clk *clk) { - unsigned long flags; - if (clk == NULL || IS_ERR(clk)) return; - spin_lock_irqsave(&clockfw_lock, flags); + WARN_ON(in_irq()); + spin_lock_bh(&clockfw_lock); if (clk->usecount == 0) { printk(KERN_ERR "Trying disable clock %s with 0 usecount\n", clk->name); WARN_ON(1); @@ -1299,21 +1298,21 @@ void clk_disable(struct clk *clk) __clk_disable(clk); out: - spin_unlock_irqrestore(&clockfw_lock, flags); + spin_unlock_bh(&clockfw_lock); } EXPORT_SYMBOL(clk_disable); unsigned long clk_get_rate(struct clk *clk) { - unsigned long flags; unsigned long ret; if (clk == NULL || IS_ERR(clk)) return 0; - spin_lock_irqsave(&clockfw_lock, flags); + WARN_ON(in_irq()); + spin_lock_bh(&clockfw_lock); ret = clk->rate; - spin_unlock_irqrestore(&clockfw_lock, flags); + spin_unlock_bh(&clockfw_lock); return ret; } @@ -1337,15 +1336,15 @@ static long __clk_round_rate(struct clk *clk, unsigned long rate) long clk_round_rate(struct clk *clk, unsigned long rate) { - unsigned long flags; long ret = 0; if (clk == NULL || IS_ERR(clk)) return ret; - spin_lock_irqsave(&clockfw_lock, flags); + WARN_ON(in_irq()); + spin_lock_bh(&clockfw_lock); ret = __clk_round_rate(clk, rate); - spin_unlock_irqrestore(&clockfw_lock, flags); + spin_unlock_bh(&clockfw_lock); return ret; } @@ -1369,13 +1368,13 @@ static int __clk_set_rate(struct clk *clk, unsigned long rate) int clk_set_rate(struct clk *clk, unsigned long rate) { - unsigned long flags; int ret = -EINVAL; if (clk == NULL || IS_ERR(clk)) return ret; - spin_lock_irqsave(&clockfw_lock, flags); + WARN_ON(in_irq()); + spin_lock_bh(&clockfw_lock); if (rate == clk->rate) { ret = 0; goto out; @@ -1387,7 +1386,7 @@ int clk_set_rate(struct clk *clk, unsigned long rate) propagate_rate(clk); } out: - spin_unlock_irqrestore(&clockfw_lock, flags); + spin_unlock_bh(&clockfw_lock); return ret; } @@ -1395,7 +1394,6 @@ EXPORT_SYMBOL(clk_set_rate); int clk_set_parent(struct clk *clk, struct clk *parent) { - unsigned long flags; int ret = -EINVAL; if (clk == NULL || IS_ERR(clk) || parent == NULL || IS_ERR(parent)) @@ -1404,7 +1402,8 @@ int clk_set_parent(struct clk *clk, struct clk *parent) if (clk->set_parent == NULL) return ret; - spin_lock_irqsave(&clockfw_lock, flags); + WARN_ON(in_irq()); + spin_lock_bh(&clockfw_lock); if (clk->usecount == 0) { ret = clk->set_parent(clk, parent); if (ret == 0) { @@ -1415,7 +1414,7 @@ int clk_set_parent(struct clk *clk, struct clk *parent) } } else ret = -EBUSY; - spin_unlock_irqrestore(&clockfw_lock, flags); + spin_unlock_bh(&clockfw_lock); return ret; } @@ -1473,11 +1472,10 @@ static void recalculate_root_clocks(void) void clk_recalculate_root_clocks(void) { - unsigned long flags; - - spin_lock_irqsave(&clockfw_lock, flags); + WARN_ON(in_irq()); + spin_lock_bh(&clockfw_lock); recalculate_root_clocks(); - spin_unlock_irqrestore(&clockfw_lock, flags); + spin_unlock_bh(&clockfw_lock); } /**