From: 许盛飞 Date: Tue, 2 Sep 2014 11:51:09 +0000 (+0800) Subject: pwm: to solve the bug : X-Git-Tag: firefly_0821_release~4769^2~1 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=6e2002dd9c8cb1dd2380312f9854e92a071e2e15;p=firefly-linux-kernel-4.4.55.git pwm: to solve the bug : [10:33:29:984]<4>[ 127.237239] [] (__mutex_lock_slowpath+0x1c0/0x22c) from [] (mutex_lock+0x30/0x48) [10:33:30:000]<4>[ 127.237255] [] (mutex_lock+0x30/0x48) from [] (clk_prepare_lock+0x48/0xe0) [10:33:30:015]<4>[ 127.237269] [] (clk_prepare_lock+0x48/0xe0) from [] (clk_prepare+0xc/0x24) [10:33:30:031]<4>[ 127.237285] [] (clk_prepare+0xc/0x24) from [] (rk_pwm_config+0x20/0x74) [10:33:30:031]<4>[ 127.237300] [] (rk_pwm_config+0x20/0x74) from [] (pwm_config+0x54/0x60) [10:33:30:031]<4>[ 127.237317] [] (pwm_config+0x54/0x60) from [] (pwm_regulator_set_voltage+0xd0/0xf4) --- diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c index a15b38d75b80..137b58ab230d 100644 --- a/drivers/pwm/pwm-rockchip.c +++ b/drivers/pwm/pwm-rockchip.c @@ -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);