pwm: to solve the bug :
author许盛飞 <xsf@rock-chips.com>
Tue, 2 Sep 2014 11:51:09 +0000 (19:51 +0800)
committer许盛飞 <xsf@rock-chips.com>
Tue, 2 Sep 2014 11:51:09 +0000 (19:51 +0800)
[10:33:29:984]<4>[  127.237239] [<c07b5200>] (__mutex_lock_slowpath+0x1c0/0x22c) from [<c07b529c>] (mutex_lock+0x30/0x48)
[10:33:30:000]<4>[  127.237255] [<c07b529c>] (mutex_lock+0x30/0x48) from [<c057d32c>] (clk_prepare_lock+0x48/0xe0)
[10:33:30:015]<4>[  127.237269] [<c057d32c>] (clk_prepare_lock+0x48/0xe0) from [<c057eea4>] (clk_prepare+0xc/0x24)
[10:33:30:031]<4>[  127.237285] [<c057eea4>] (clk_prepare+0xc/0x24) from [<c0282df8>] (rk_pwm_config+0x20/0x74)
[10:33:30:031]<4>[  127.237300] [<c0282df8>] (rk_pwm_config+0x20/0x74) from [<c0281904>] (pwm_config+0x54/0x60)
[10:33:30:031]<4>[  127.237317] [<c0281904>] (pwm_config+0x54/0x60) from [<c02c0528>] (pwm_regulator_set_voltage+0xd0/0xf4)

drivers/pwm/pwm-rockchip.c

index a15b38d75b809b54e91703068b6dc5e703aa6672..137b58ab230d4d54567a12893e2a60a2e55c6c9c 100644 (file)
@@ -467,13 +467,13 @@ static int  rk_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
        struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
        int ret;
        
-       ret = clk_prepare_enable(pc->clk);
+       ret = clk_enable(pc->clk);
        if (ret)
                return ret;
 
        ret = pc->config(chip, pwm, duty_ns, period_ns);
-       
-       clk_disable_unprepare(pc->clk);
+
+       clk_disable(pc->clk);
 
        return 0;
 }
@@ -482,7 +482,7 @@ static int rk_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
        struct rk_pwm_chip *pc = to_rk_pwm_chip(chip);
        int ret = 0;
 
-       ret = clk_prepare_enable(pc->clk);
+       ret = clk_enable(pc->clk);
        if (ret)
                return ret;
 
@@ -496,7 +496,7 @@ static void rk_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
 
        pc->set_enable(chip, pwm,false);
 
-       clk_disable_unprepare(pc->clk);
+       clk_disable(pc->clk);
 
 }
 
@@ -587,6 +587,7 @@ static int rk_pwm_probe(struct platform_device *pdev)
        pc->chip.base = -1;
        pc->chip.npwm = NUM_PWM;
        spin_lock_init(&pc->lock);
+       clk_prepare(pc->clk);
 
        /* Following enables PWM chip, channels would still be enabled individually through their control register */
        DBG("npwm = %d, of_pwm_ncells =%d \n", pc->chip.npwm,pc->chip.of_pwm_n_cells);