rk3368: voppwm: add voppwm function
authorDavid Wu <wdc@rock-chips.com>
Fri, 19 Dec 2014 11:11:42 +0000 (19:11 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Fri, 19 Dec 2014 11:27:31 +0000 (19:27 +0800)
Signed-off-by: David Wu <wdc@rock-chips.com>
arch/arm/boot/dts/rk3288.dtsi
arch/arm64/boot/dts/rk3368.dtsi
drivers/pwm/pwm-rockchip.c [changed mode: 0644->0755]

index 742d12a890a67da239835a21eabb69572bb237d0..c09ab0a047dada2778cf02e5d6791bb57794465c 100755 (executable)
                #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";
        };
 
                #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";
        };
 
index ed681543b9ea2b447956c84be46a231424008307..a2340222ac3895ace84328fa60495a14b9fd56fe 100755 (executable)
                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 {
old mode 100644 (file)
new mode 100755 (executable)
index d494cf9..288f1b4
@@ -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");