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 | }; |