diff options
author | Afzal Mohammed | 2012-03-08 08:24:47 -0600 |
---|---|---|
committer | Philip, Avinash | 2012-03-13 08:20:13 -0500 |
commit | 171a29fad9a2d24f3e5ba7a42f3c304f47430108 (patch) | |
tree | 2ea33b0868b64f32eee49ac7f4c5651995716366 | |
parent | 87136b5169577877639e347a974c8e8503bec7d6 (diff) | |
download | sitara-epos-kernel-171a29fad9a2d24f3e5ba7a42f3c304f47430108.tar.gz sitara-epos-kernel-171a29fad9a2d24f3e5ba7a42f3c304f47430108.tar.xz sitara-epos-kernel-171a29fad9a2d24f3e5ba7a42f3c304f47430108.zip |
PWM: ecap: suspend-resume support
1. Incorporate suspend-resume. In addition to the
registers that are configured by driver, CAP1,
that is shadowed by CAP3 (APRD) register has
to be restored.
2. Removes check of clock use count
Signed-off-by: Afzal Mohammed <afzal@ti.com>
Signed-off-by: Philip, Avinash <avinashphilip@ti.com>
-rw-r--r-- | drivers/pwm/ecap.c | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/drivers/pwm/ecap.c b/drivers/pwm/ecap.c index 2964e0207389..63c240573a22 100644 --- a/drivers/pwm/ecap.c +++ b/drivers/pwm/ecap.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <plat/config_pwm.h> | 26 | #include <plat/config_pwm.h> |
27 | 27 | ||
28 | #define TIMER_CTR_REG 0x0 | 28 | #define TIMER_CTR_REG 0x0 |
29 | #define CAPTURE_1_REG 0x08 | ||
29 | #define CAPTURE_2_REG 0x0c | 30 | #define CAPTURE_2_REG 0x0c |
30 | #define CAPTURE_3_REG 0x10 | 31 | #define CAPTURE_3_REG 0x10 |
31 | #define CAPTURE_4_REG 0x14 | 32 | #define CAPTURE_4_REG 0x14 |
@@ -38,6 +39,16 @@ | |||
38 | #define ECTRL2_PLSL_LOW BIT(10) | 39 | #define ECTRL2_PLSL_LOW BIT(10) |
39 | #define ECTRL2_SYNC_EN BIT(5) | 40 | #define ECTRL2_SYNC_EN BIT(5) |
40 | 41 | ||
42 | struct ecap_regs { | ||
43 | unsigned tsctr; | ||
44 | unsigned cap1; | ||
45 | unsigned cap2; | ||
46 | unsigned cap3; | ||
47 | unsigned cap4; | ||
48 | unsigned short ecctl2; | ||
49 | unsigned short clkconfig; | ||
50 | }; | ||
51 | |||
41 | struct ecap_pwm { | 52 | struct ecap_pwm { |
42 | struct pwm_device pwm; | 53 | struct pwm_device pwm; |
43 | struct pwm_device_ops ops; | 54 | struct pwm_device_ops ops; |
@@ -47,6 +58,7 @@ struct ecap_pwm { | |||
47 | u8 version; | 58 | u8 version; |
48 | void __iomem *config_mem_base; | 59 | void __iomem *config_mem_base; |
49 | struct device *dev; | 60 | struct device *dev; |
61 | struct ecap_regs ctx; | ||
50 | }; | 62 | }; |
51 | 63 | ||
52 | static inline struct ecap_pwm *to_ecap_pwm(const struct pwm_device *p) | 64 | static inline struct ecap_pwm *to_ecap_pwm(const struct pwm_device *p) |
@@ -332,12 +344,41 @@ err_clk_get: | |||
332 | } | 344 | } |
333 | 345 | ||
334 | #ifdef CONFIG_PM | 346 | #ifdef CONFIG_PM |
347 | |||
348 | void ecap_save_reg(struct ecap_pwm *ep) | ||
349 | { | ||
350 | pm_runtime_get_sync(ep->dev); | ||
351 | |||
352 | ep->ctx.ecctl2 = readw(ep->mmio_base + CAPTURE_CTRL2_REG); | ||
353 | ep->ctx.tsctr = readl(ep->mmio_base + TIMER_CTR_REG); | ||
354 | ep->ctx.cap1 = readl(ep->mmio_base + CAPTURE_1_REG); | ||
355 | ep->ctx.cap2 = readl(ep->mmio_base + CAPTURE_2_REG); | ||
356 | ep->ctx.cap4 = readl(ep->mmio_base + CAPTURE_4_REG); | ||
357 | ep->ctx.cap3 = readl(ep->mmio_base + CAPTURE_3_REG); | ||
358 | |||
359 | ep->ctx.clkconfig = readw(ep->config_mem_base + PWMSS_CLKCONFIG); | ||
360 | |||
361 | pm_runtime_put_sync(ep->dev); | ||
362 | } | ||
363 | |||
364 | void ecap_restore_reg(struct ecap_pwm *ep) | ||
365 | { | ||
366 | writew(ep->ctx.clkconfig, ep->config_mem_base + PWMSS_CLKCONFIG); | ||
367 | |||
368 | writel(ep->ctx.cap3, ep->mmio_base + CAPTURE_3_REG); | ||
369 | writel(ep->ctx.cap4, ep->mmio_base + CAPTURE_4_REG); | ||
370 | writel(ep->ctx.cap2, ep->mmio_base + CAPTURE_2_REG); | ||
371 | writel(ep->ctx.cap1, ep->mmio_base + CAPTURE_1_REG); | ||
372 | writel(ep->ctx.tsctr, ep->mmio_base + TIMER_CTR_REG); | ||
373 | writew(ep->ctx.ecctl2, ep->mmio_base + CAPTURE_CTRL2_REG); | ||
374 | } | ||
375 | |||
335 | static int ecap_suspend(struct platform_device *pdev, pm_message_t state) | 376 | static int ecap_suspend(struct platform_device *pdev, pm_message_t state) |
336 | { | 377 | { |
337 | struct ecap_pwm *ep = platform_get_drvdata(pdev); | 378 | struct ecap_pwm *ep = platform_get_drvdata(pdev); |
338 | 379 | ||
339 | if (ep->clk->usecount > 0) | 380 | ecap_save_reg(ep); |
340 | pm_runtime_put_sync(ep->dev); | 381 | pm_runtime_put_sync(ep->dev); |
341 | 382 | ||
342 | return 0; | 383 | return 0; |
343 | } | 384 | } |
@@ -348,6 +389,8 @@ static int ecap_resume(struct platform_device *pdev) | |||
348 | 389 | ||
349 | pm_runtime_get_sync(ep->dev); | 390 | pm_runtime_get_sync(ep->dev); |
350 | 391 | ||
392 | ecap_restore_reg(ep); | ||
393 | |||
351 | return 0; | 394 | return 0; |
352 | } | 395 | } |
353 | 396 | ||