Merge tag 'for-5.13/io_uring-2021-04-27' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / drivers / pwm / pwm-rockchip.c
index 389a5e1..6ad7d0a 100644 (file)
@@ -72,6 +72,10 @@ static void rockchip_pwm_get_state(struct pwm_chip *chip,
        if (ret)
                return;
 
+       ret = clk_enable(pc->clk);
+       if (ret)
+               return;
+
        clk_rate = clk_get_rate(pc->clk);
 
        tmp = readl_relaxed(pc->base + pc->data->regs.period);
@@ -90,6 +94,7 @@ static void rockchip_pwm_get_state(struct pwm_chip *chip,
        else
                state->polarity = PWM_POLARITY_NORMAL;
 
+       clk_disable(pc->clk);
        clk_disable(pc->pclk);
 }
 
@@ -189,6 +194,10 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
        if (ret)
                return ret;
 
+       ret = clk_enable(pc->clk);
+       if (ret)
+               return ret;
+
        pwm_get_state(pwm, &curstate);
        enabled = curstate.enabled;
 
@@ -208,6 +217,7 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
        }
 
 out:
+       clk_disable(pc->clk);
        clk_disable(pc->pclk);
 
        return ret;
@@ -288,6 +298,7 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
        const struct of_device_id *id;
        struct rockchip_pwm_chip *pc;
        u32 enable_conf, ctrl;
+       bool enabled;
        int ret, count;
 
        id = of_match_device(rockchip_pwm_dt_ids, &pdev->dev);
@@ -307,7 +318,7 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
                pc->clk = devm_clk_get(&pdev->dev, NULL);
                if (IS_ERR(pc->clk))
                        return dev_err_probe(&pdev->dev, PTR_ERR(pc->clk),
-                                            "Can't get bus clk\n");
+                                            "Can't get PWM clk\n");
        }
 
        count = of_count_phandle_with_args(pdev->dev.of_node,
@@ -326,13 +337,13 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
 
        ret = clk_prepare_enable(pc->clk);
        if (ret) {
-               dev_err(&pdev->dev, "Can't prepare enable bus clk: %d\n", ret);
+               dev_err(&pdev->dev, "Can't prepare enable PWM clk: %d\n", ret);
                return ret;
        }
 
-       ret = clk_prepare(pc->pclk);
+       ret = clk_prepare_enable(pc->pclk);
        if (ret) {
-               dev_err(&pdev->dev, "Can't prepare APB clk: %d\n", ret);
+               dev_err(&pdev->dev, "Can't prepare enable APB clk: %d\n", ret);
                goto err_clk;
        }
 
@@ -349,23 +360,26 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
                pc->chip.of_pwm_n_cells = 3;
        }
 
+       enable_conf = pc->data->enable_conf;
+       ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl);
+       enabled = (ctrl & enable_conf) == enable_conf;
+
        ret = pwmchip_add(&pc->chip);
        if (ret < 0) {
-               clk_unprepare(pc->clk);
                dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret);
                goto err_pclk;
        }
 
        /* Keep the PWM clk enabled if the PWM appears to be up and running. */
-       enable_conf = pc->data->enable_conf;
-       ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl);
-       if ((ctrl & enable_conf) != enable_conf)
+       if (!enabled)
                clk_disable(pc->clk);
 
+       clk_disable(pc->pclk);
+
        return 0;
 
 err_pclk:
-       clk_unprepare(pc->pclk);
+       clk_disable_unprepare(pc->pclk);
 err_clk:
        clk_disable_unprepare(pc->clk);