From: 许盛飞 Date: Tue, 6 May 2014 02:40:49 +0000 (+0800) Subject: PWM: improvement pwm-clk setting X-Git-Tag: firefly_0821_release~5367 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a2790ef688218b71616a4c3ec83a79eca5733046;p=firefly-linux-kernel-4.4.55.git PWM: improvement pwm-clk setting --- diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c index 6ac796bbab97..25c321d49749 100644 --- a/drivers/pwm/pwm-rockchip.c +++ b/drivers/pwm/pwm-rockchip.c @@ -195,11 +195,6 @@ static int rk_pwm_config_v1(struct pwm_chip *chip, struct pwm_device *pwm, /* NOTE: the clock to PWM has to be enabled first before writing to the registers. */ -#if PWM_CLK - ret = clk_enable(pc->clk); - if (ret) - return ret; -#endif spin_lock_irqsave(lock, flags); conf |= (prescale << DW_PWM_PRESCALE); @@ -310,10 +305,6 @@ static int rk_pwm_config_v2(struct pwm_chip *chip, struct pwm_device *pwm, * NOTE: the clock to PWM has to be enabled first before writing to the * registers. */ - - ret = clk_enable(pc->clk); - if (ret) - return ret; spin_lock_irqsave(lock, flags); conf |= (prescale << RK_PWM_PRESCALE); @@ -364,8 +355,7 @@ static void rk_pwm_resume_v2(struct pwm_chip *chip, struct pwm_device *pwm) dsb(); rk_pwm_writel(pc, pwm->hwpwm, PWM_REG_CTRL,pc->pwm_ctrl); } -//#define grf_readl(offset) readl_relaxed(RK_GRF_VIRT + offset) -//#define grf_writel(v, offset) do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0) + /* config for rockchip,pwm*/ static int rk_pwm_config_v3(struct pwm_chip *chip, struct pwm_device *pwm, int duty_ns, int period_ns) @@ -426,10 +416,11 @@ static int rk_pwm_config_v3(struct pwm_chip *chip, struct pwm_device *pwm, * NOTE: the clock to PWM has to be enabled first before writing to the * registers. */ - +#if 0 ret = clk_enable(pc->clk); if (ret) return ret; +#endif spin_lock_irqsave(lock, flags); conf |= (prescale << RK_PWM_PRESCALE); @@ -443,15 +434,8 @@ static int rk_pwm_config_v3(struct pwm_chip *chip, struct pwm_device *pwm, rk_pwm_writel(pc, pwm->hwpwm, VOP_REG_CNTR,0); dsb(); rk_pwm_writel(pc, pwm->hwpwm, VOP_REG_CTRL,on|conf); -#if 0 - //grf_writel(0x00030002,0x6c); - DBG("VOP iomux 0x%x\n", grf_readl(0x6c)); - DBG("VOP_REG_CTRL0x%x\n", rk_pwm_readl(pc, pwm->hwpwm, VOP_REG_CTRL)); - DBG("PWM_REG_DUTY0x%x\n", rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_DUTY)); - DBG("PWM_REG_PERIOD 0x%x\n", rk_pwm_readl(pc, pwm->hwpwm, PWM_REG_PERIOD)); - DBG("VOP_REG_CNTR 0x%x\n", rk_pwm_readl(pc, pwm->hwpwm, VOP_REG_CNTR)); -#endif - spin_unlock_irqrestore(lock, flags); + + spin_unlock_irqrestore(lock, flags); return 0; } @@ -494,18 +478,24 @@ 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); + if (ret) + return ret; + ret = pc->config(chip, pwm, duty_ns, period_ns); + + clk_disable_unprepare(pc->clk); return 0; } static int rk_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) { struct rk_pwm_chip *pc = to_rk_pwm_chip(chip); - int rc = 0; + int ret = 0; - rc = clk_enable(pc->clk); - if (rc) - return rc; + ret = clk_prepare_enable(pc->clk); + if (ret) + return ret; pc->set_enable(chip, pwm,true); return 0; @@ -516,7 +506,9 @@ static void rk_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) struct rk_pwm_chip *pc = to_rk_pwm_chip(chip); pc->set_enable(chip, pwm,false); - clk_disable(pc->clk); + + clk_disable_unprepare(pc->clk); + } static const struct pwm_ops rk_pwm_ops = { @@ -585,16 +577,7 @@ static int rk_pwm_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed to allocate memory\n"); return -ENOMEM; } -#if 0 - r = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!r) { - dev_err(&pdev->dev, "no memory resources defined\n"); - return -ENODEV; - } - pc->base = devm_ioremap_resource(&pdev->dev, r); - if (IS_ERR(pc->base)) - return PTR_ERR(pc->base); -#endif + pc->base = of_iomap(np, 0); if (IS_ERR(pc->base)){ printk("PWM base ERR \n"); @@ -616,25 +599,15 @@ static int rk_pwm_probe(struct platform_device *pdev) pc->chip.npwm = NUM_PWM; pc->lock = __SPIN_LOCK_UNLOCKED(PWM##spinlock_num); spinlock_num ++; -#if PWM_CLK - ret = clk_prepare(pc->clk); - if (ret) - return ret; -#endif - ret = clk_enable(pc->clk); - if (ret) { - clk_unprepare(pc->clk); - return ret; - } /* 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); ret = pwmchip_add(&pc->chip); - if (ret < 0) { - clk_unprepare(pc->clk); - dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret); + if (ret < 0){ + printk("failed to add pwm\n"); + return ret; } - + DBG("%s end \n",__FUNCTION__); return ret; }