aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>2018-03-13 04:18:18 -0400
committerThierry Reding <thierry.reding@gmail.com>2018-03-27 19:27:10 -0400
commit6873842235d678a245a378669f35e145df2441b9 (patch)
tree55d816b80307661b9445960ade1c1ca21f23a4f6
parentf2e6142cdc10b1b7edea8d65b07293f152e4d110 (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.c42
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};
259MODULE_DEVICE_TABLE(of, rcar_pwm_of_table); 259MODULE_DEVICE_TABLE(of, rcar_pwm_of_table);
260 260
261#ifdef CONFIG_PM_SLEEP
262static 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
271static 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
283static 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 */
300static SIMPLE_DEV_PM_OPS(rcar_pwm_pm_ops, rcar_pwm_suspend, rcar_pwm_resume);
301
261static struct platform_driver rcar_pwm_driver = { 302static 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};