From: David Wu Date: Fri, 19 Dec 2014 11:11:42 +0000 (+0800) Subject: rk3368: voppwm: add voppwm function X-Git-Tag: firefly_0821_release~4158^2~505 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b633fe40c5d71713e909cdb2b24a2bd5960c0839;p=firefly-linux-kernel-4.4.55.git rk3368: voppwm: add voppwm function Signed-off-by: David Wu --- diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 742d12a890a6..c09ab0a047da 100755 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -822,8 +822,8 @@ #pwm-cells = <2>; pinctrl-names = "default"; pinctrl-0 = <&vop1_pwm_pin>; - clocks = <&clk_gates13 11>; - clock-names = "pclk_pwm"; + clocks = <&clk_gates13 11>, <&clk_gates15 7>, <&clk_gates15 8>; + clock-names = "pclk_pwm", "aclk_lcdc", "hclk_lcdc"; status = "disabled"; }; @@ -833,8 +833,8 @@ #pwm-cells = <2>; pinctrl-names = "default"; pinctrl-0 = <&vop0_pwm_pin>; - clocks = <&clk_gates13 10>; - clock-names = "pclk_pwm"; + clocks = <&clk_gates13 10>, <&clk_gates15 5>, <&clk_gates15 6>; + clock-names = "pclk_pwm", "aclk_lcdc", "hclk_lcdc"; status = "disabled"; }; diff --git a/arch/arm64/boot/dts/rk3368.dtsi b/arch/arm64/boot/dts/rk3368.dtsi index ed681543b9ea..a2340222ac38 100755 --- a/arch/arm64/boot/dts/rk3368.dtsi +++ b/arch/arm64/boot/dts/rk3368.dtsi @@ -796,6 +796,17 @@ status = "disabled"; }; + voppwm: pwm@ff9301a0 { + compatible = "rockchip,vop-pwm"; + reg = <0x0 0xff9301a0 0x0 0x10>; + #pwm-cells = <2>; + pinctrl-names = "default"; + pinctrl-0 = <&vop_pwm_pin>; + clocks = <&clk_gates4 2>, <&clk_gates16 5>, <&clk_gates16 6>; + clock-names = "pclk_pwm", "aclk_lcdc", "hclk_lcdc"; + status = "disabled"; + }; + dvfs { vd_arm: vd_arm { diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c old mode 100644 new mode 100755 index d494cf90e809..288f1b4a164d --- a/drivers/pwm/pwm-rockchip.c +++ b/drivers/pwm/pwm-rockchip.c @@ -97,6 +97,8 @@ module_param_named(dbg_level, pwm_dbg_level, int, 0644); struct rk_pwm_chip { void __iomem *base; struct clk *clk; + struct clk *aclk_lcdc; + struct clk *hclk_lcdc; struct pwm_chip chip; unsigned int pwm_id; spinlock_t lock; @@ -471,8 +473,24 @@ static int rk_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, if (ret) return ret; + if (pc->aclk_lcdc) { + ret = clk_enable(pc->aclk_lcdc); + if (ret) + return ret; + } + if (pc->hclk_lcdc) { + ret = clk_enable(pc->hclk_lcdc); + if (ret) + return ret; + } + ret = pc->config(chip, pwm, duty_ns, period_ns); + if (pc->aclk_lcdc) + clk_disable(pc->aclk_lcdc); + if (pc->hclk_lcdc) + clk_disable(pc->hclk_lcdc); + clk_disable(pc->clk); return 0; @@ -486,6 +504,17 @@ static int rk_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) if (ret) return ret; + if (pc->aclk_lcdc) { + ret = clk_enable(pc->aclk_lcdc); + if (ret) + return ret; + } + if (pc->hclk_lcdc) { + ret = clk_enable(pc->hclk_lcdc); + if (ret) + return ret; + } + pc->set_enable(chip, pwm,true); return 0; } @@ -496,6 +525,11 @@ static void rk_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) pc->set_enable(chip, pwm,false); + if (pc->aclk_lcdc) + clk_disable(pc->aclk_lcdc); + if (pc->hclk_lcdc) + clk_disable(pc->hclk_lcdc); + clk_disable(pc->clk); } @@ -568,14 +602,31 @@ static int rk_pwm_probe(struct platform_device *pdev) } pc->base = of_iomap(np, 0); - if (IS_ERR(pc->base)){ + if (IS_ERR(pc->base)) { printk("PWM base ERR \n"); return PTR_ERR(pc->base); } - pc->clk = devm_clk_get(&pdev->dev,"pclk_pwm"); + pc->clk = devm_clk_get(&pdev->dev, "pclk_pwm"); if (IS_ERR(pc->clk)) return PTR_ERR(pc->clk); + if (of_device_is_compatible(np, "rockchip,vop-pwm")) { + pc->aclk_lcdc = devm_clk_get(&pdev->dev, "aclk_lcdc"); + if (IS_ERR(pc->aclk_lcdc)) + return PTR_ERR(pc->aclk_lcdc); + + pc->hclk_lcdc = devm_clk_get(&pdev->dev, "hclk_lcdc"); + if (IS_ERR(pc->hclk_lcdc)) + return PTR_ERR(pc->hclk_lcdc); + + ret = clk_prepare(pc->aclk_lcdc); + if (ret) + return ret; + clk_prepare(pc->hclk_lcdc); + if (ret) + return ret; + } + platform_set_drvdata(pdev, pc); data = of_id->data; pc->config = data->config; @@ -587,10 +638,14 @@ 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); + ret = clk_prepare(pc->clk); + if (ret) + 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); + /* 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){ printk("failed to add pwm\n");