aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAfzal Mohammed2012-03-08 08:24:47 -0600
committerPhilip, Avinash2012-03-13 08:20:13 -0500
commit171a29fad9a2d24f3e5ba7a42f3c304f47430108 (patch)
tree2ea33b0868b64f32eee49ac7f4c5651995716366
parent87136b5169577877639e347a974c8e8503bec7d6 (diff)
downloadsitara-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.c47
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
42struct 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
41struct ecap_pwm { 52struct 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
52static inline struct ecap_pwm *to_ecap_pwm(const struct pwm_device *p) 64static 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
348void 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
364void 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
335static int ecap_suspend(struct platform_device *pdev, pm_message_t state) 376static 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