diff options
| author | Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> | 2018-03-13 04:18:18 -0400 |
|---|---|---|
| committer | Thierry Reding <thierry.reding@gmail.com> | 2018-03-27 19:27:10 -0400 |
| commit | 6873842235d678a245a378669f35e145df2441b9 (patch) | |
| tree | 55d816b80307661b9445960ade1c1ca21f23a4f6 | |
| parent | f2e6142cdc10b1b7edea8d65b07293f152e4d110 (diff) | |
pwm: rcar: Add suspend/resume support
This patch adds suspend/resume support for Renesas PWM driver.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
| -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 | }; |
