diff options
| -rw-r--r-- | drivers/pwm/pwm-rcar.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/pwm/pwm-rcar.c b/drivers/pwm/pwm-rcar.c index f4d8767f804e..91d11f2e2fef 100644 --- a/drivers/pwm/pwm-rcar.c +++ b/drivers/pwm/pwm-rcar.c | |||
| @@ -258,11 +258,53 @@ static const struct of_device_id rcar_pwm_of_table[] = { | |||
| 258 | }; | 258 | }; |
| 259 | MODULE_DEVICE_TABLE(of, rcar_pwm_of_table); | 259 | MODULE_DEVICE_TABLE(of, rcar_pwm_of_table); |
| 260 | 260 | ||
| 261 | #ifdef CONFIG_PM_SLEEP | ||
| 262 | static struct pwm_device *rcar_pwm_dev_to_pwm_dev(struct device *dev) | ||
| 263 | { | ||
| 264 | struct platform_device *pdev = to_platform_device(dev); | ||
| 265 | struct rcar_pwm_chip *rcar_pwm = platform_get_drvdata(pdev); | ||
| 266 | struct pwm_chip *chip = &rcar_pwm->chip; | ||
| 267 | |||
| 268 | return &chip->pwms[0]; | ||
| 269 | } | ||
| 270 | |||
| 271 | static int rcar_pwm_suspend(struct device *dev) | ||
| 272 | { | ||
| 273 | struct pwm_device *pwm = rcar_pwm_dev_to_pwm_dev(dev); | ||
| 274 | |||
| 275 | if (!test_bit(PWMF_REQUESTED, &pwm->flags)) | ||
| 276 | return 0; | ||
| 277 | |||
| 278 | pm_runtime_put(dev); | ||
| 279 | |||
| 280 | return 0; | ||
| 281 | } | ||
| 282 | |||
| 283 | static int rcar_pwm_resume(struct device *dev) | ||
| 284 | { | ||
| 285 | struct pwm_device *pwm = rcar_pwm_dev_to_pwm_dev(dev); | ||
| 286 | |||
| 287 | if (!test_bit(PWMF_REQUESTED, &pwm->flags)) | ||
| 288 | return 0; | ||
| 289 | |||
| 290 | pm_runtime_get_sync(dev); | ||
| 291 | |||
| 292 | rcar_pwm_config(pwm->chip, pwm, pwm->state.duty_cycle, | ||
| 293 | pwm->state.period); | ||
| 294 | if (pwm_is_enabled(pwm)) | ||
| 295 | rcar_pwm_enable(pwm->chip, pwm); | ||
| 296 | |||
| 297 | return 0; | ||
| 298 | } | ||
| 299 | #endif /* CONFIG_PM_SLEEP */ | ||
| 300 | static SIMPLE_DEV_PM_OPS(rcar_pwm_pm_ops, rcar_pwm_suspend, rcar_pwm_resume); | ||
| 301 | |||
| 261 | static struct platform_driver rcar_pwm_driver = { | 302 | static struct platform_driver rcar_pwm_driver = { |
| 262 | .probe = rcar_pwm_probe, | 303 | .probe = rcar_pwm_probe, |
| 263 | .remove = rcar_pwm_remove, | 304 | .remove = rcar_pwm_remove, |
| 264 | .driver = { | 305 | .driver = { |
| 265 | .name = "pwm-rcar", | 306 | .name = "pwm-rcar", |
| 307 | .pm = &rcar_pwm_pm_ops, | ||
| 266 | .of_match_table = of_match_ptr(rcar_pwm_of_table), | 308 | .of_match_table = of_match_ptr(rcar_pwm_of_table), |
| 267 | } | 309 | } |
| 268 | }; | 310 | }; |
