return 0;
  }
  
 -static int __devexit lpc32xx_pwm_remove(struct platform_device *pdev)
 +static int lpc32xx_pwm_remove(struct platform_device *pdev)
  {
        struct lpc32xx_pwm_chip *lpc32xx = platform_get_drvdata(pdev);
+       unsigned int i;
+ 
+       for (i = 0; i < lpc32xx->chip.npwm; i++)
+               pwm_disable(&lpc32xx->chip.pwms[i]);
  
-       clk_disable(lpc32xx->clk);
        return pwmchip_remove(&lpc32xx->chip);
  }
  
 
        .owner          = THIS_MODULE,
  };
  
 -static int __devinit ecap_pwm_probe(struct platform_device *pdev)
+ static const struct of_device_id ecap_of_match[] = {
+       { .compatible   = "ti,am33xx-ecap" },
+       {},
+ };
+ MODULE_DEVICE_TABLE(of, ecap_of_match);
+ 
 +static int ecap_pwm_probe(struct platform_device *pdev)
  {
        int ret;
        struct resource *r;
        }
  
        pm_runtime_enable(&pdev->dev);
+       pm_runtime_get_sync(&pdev->dev);
+ 
+       status = pwmss_submodule_state_change(pdev->dev.parent,
+                       PWMSS_ECAPCLK_EN);
+       if (!(status & PWMSS_ECAPCLK_EN_ACK)) {
+               dev_err(&pdev->dev, "PWMSS config space clock enable failed\n");
+               ret = -EINVAL;
+               goto pwmss_clk_failure;
+       }
+ 
+       pm_runtime_put_sync(&pdev->dev);
+ 
        platform_set_drvdata(pdev, pc);
        return 0;
+ 
+ pwmss_clk_failure:
+       pm_runtime_put_sync(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+       pwmchip_remove(&pc->chip);
+       return ret;
  }
  
 -static int __devexit ecap_pwm_remove(struct platform_device *pdev)
 +static int ecap_pwm_remove(struct platform_device *pdev)
  {
        struct ecap_pwm_chip *pc = platform_get_drvdata(pdev);
  
  
  static struct platform_driver ecap_pwm_driver = {
        .driver = {
-               .name = "ecap",
+               .name   = "ecap",
+               .owner  = THIS_MODULE,
+               .of_match_table = ecap_of_match,
        },
        .probe = ecap_pwm_probe,
 -      .remove = __devexit_p(ecap_pwm_remove),
 +      .remove = ecap_pwm_remove,
  };
  
  module_platform_driver(ecap_pwm_driver);
 
        .owner          = THIS_MODULE,
  };
  
 -static int __devinit ehrpwm_pwm_probe(struct platform_device *pdev)
+ static const struct of_device_id ehrpwm_of_match[] = {
+       { .compatible   = "ti,am33xx-ehrpwm" },
+       {},
+ };
+ MODULE_DEVICE_TABLE(of, ehrpwm_of_match);
+ 
 +static int ehrpwm_pwm_probe(struct platform_device *pdev)
  {
        int ret;
        struct resource *r;
        }
  
        pm_runtime_enable(&pdev->dev);
+       pm_runtime_get_sync(&pdev->dev);
+ 
+       status = pwmss_submodule_state_change(pdev->dev.parent,
+                       PWMSS_EPWMCLK_EN);
+       if (!(status & PWMSS_EPWMCLK_EN_ACK)) {
+               dev_err(&pdev->dev, "PWMSS config space clock enable failed\n");
+               ret = -EINVAL;
+               goto pwmss_clk_failure;
+       }
+ 
+       pm_runtime_put_sync(&pdev->dev);
+ 
        platform_set_drvdata(pdev, pc);
        return 0;
+ 
+ pwmss_clk_failure:
+       pm_runtime_put_sync(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+       pwmchip_remove(&pc->chip);
+       return ret;
  }
  
 -static int __devexit ehrpwm_pwm_remove(struct platform_device *pdev)
 +static int ehrpwm_pwm_remove(struct platform_device *pdev)
  {
        struct ehrpwm_pwm_chip *pc = platform_get_drvdata(pdev);
  
  
  static struct platform_driver ehrpwm_pwm_driver = {
        .driver = {
-               .name = "ehrpwm",
+               .name   = "ehrpwm",
+               .owner  = THIS_MODULE,
+               .of_match_table = ehrpwm_of_match,
        },
        .probe = ehrpwm_pwm_probe,
 -      .remove = __devexit_p(ehrpwm_pwm_remove),
 +      .remove = ehrpwm_pwm_remove,
  };
  
  module_platform_driver(ehrpwm_pwm_driver);