return ret;
 
        if (cdata->pwm_num_devs) {
-               pc->pwm_clk = of_clk_get_by_name(dev->of_node, "pwm");
+               pc->pwm_clk = devm_clk_get_prepared(dev, "pwm");
                if (IS_ERR(pc->pwm_clk)) {
                        dev_err(dev, "failed to get PWM clock\n");
                        return PTR_ERR(pc->pwm_clk);
                }
-
-               ret = clk_prepare(pc->pwm_clk);
-               if (ret) {
-                       dev_err(dev, "failed to prepare clock\n");
-                       return ret;
-               }
        }
 
        if (cdata->cpt_num_devs) {
-               pc->cpt_clk = of_clk_get_by_name(dev->of_node, "capture");
+               pc->cpt_clk = devm_clk_get_prepared(dev, "capture");
                if (IS_ERR(pc->cpt_clk)) {
                        dev_err(dev, "failed to get PWM capture clock\n");
                        return PTR_ERR(pc->cpt_clk);
                }
 
-               ret = clk_prepare(pc->cpt_clk);
-               if (ret) {
-                       dev_err(dev, "failed to prepare clock\n");
-                       return ret;
-               }
-
                cdata->ddata = devm_kzalloc(dev, cdata->cpt_num_devs * sizeof(*cdata->ddata), GFP_KERNEL);
                if (!cdata->ddata)
                        return -ENOMEM;
                mutex_init(&ddata->lock);
        }
 
-       ret = pwmchip_add(chip);
-       if (ret < 0) {
-               clk_unprepare(pc->pwm_clk);
-               clk_unprepare(pc->cpt_clk);
-               return ret;
-       }
-
-       platform_set_drvdata(pdev, chip);
-
-       return 0;
-}
-
-static void sti_pwm_remove(struct platform_device *pdev)
-{
-       struct pwm_chip *chip = platform_get_drvdata(pdev);
-       struct sti_pwm_chip *pc = to_sti_pwmchip(chip);
-
-       pwmchip_remove(chip);
-
-       clk_unprepare(pc->pwm_clk);
-       clk_unprepare(pc->cpt_clk);
+       return devm_pwmchip_add(dev, chip);
 }
 
 static const struct of_device_id sti_pwm_of_match[] = {
                .of_match_table = sti_pwm_of_match,
        },
        .probe = sti_pwm_probe,
-       .remove_new = sti_pwm_remove,
 };
 module_platform_driver(sti_pwm_driver);