aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pwm/pwm-lpss.c
diff options
context:
space:
mode:
authorQipeng Zha <qipeng.zha@intel.com>2015-10-26 06:58:27 -0400
committerThierry Reding <thierry.reding@gmail.com>2015-11-06 08:34:13 -0500
commitf080be27d7d9333e4815655a2cedab91c3aa7acc (patch)
tree102b1929216c09c2e26e7ecc9dc93e023c549635 /drivers/pwm/pwm-lpss.c
parent03f00e5311d5d0d3ac716121865cb967259980ca (diff)
pwm: lpss: Add support for runtime PM
To be able to save some power when PWM is not in use, add support for runtime PM for this driver. This also allows the platform to transition to low power S0ix states when the system is idle. Signed-off-by: Huiquan Zhong <huiquan.zhong@intel.com> Signed-off-by: Qipeng Zha <qipeng.zha@intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
Diffstat (limited to 'drivers/pwm/pwm-lpss.c')
-rw-r--r--drivers/pwm/pwm-lpss.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c
index df03b50f20dd..25044104003b 100644
--- a/drivers/pwm/pwm-lpss.c
+++ b/drivers/pwm/pwm-lpss.c
@@ -16,6 +16,7 @@
16#include <linux/io.h> 16#include <linux/io.h>
17#include <linux/kernel.h> 17#include <linux/kernel.h>
18#include <linux/module.h> 18#include <linux/module.h>
19#include <linux/pm_runtime.h>
19 20
20#include "pwm-lpss.h" 21#include "pwm-lpss.h"
21 22
@@ -105,6 +106,8 @@ static int pwm_lpss_config(struct pwm_chip *chip, struct pwm_device *pwm,
105 duty_ns = 1; 106 duty_ns = 1;
106 on_time_div = 255 - (255 * duty_ns / period_ns); 107 on_time_div = 255 - (255 * duty_ns / period_ns);
107 108
109 pm_runtime_get_sync(chip->dev);
110
108 ctrl = pwm_lpss_read(pwm); 111 ctrl = pwm_lpss_read(pwm);
109 ctrl &= ~(PWM_BASE_UNIT_MASK | PWM_ON_TIME_DIV_MASK); 112 ctrl &= ~(PWM_BASE_UNIT_MASK | PWM_ON_TIME_DIV_MASK);
110 ctrl |= (u16) base_unit << PWM_BASE_UNIT_SHIFT; 113 ctrl |= (u16) base_unit << PWM_BASE_UNIT_SHIFT;
@@ -113,11 +116,14 @@ static int pwm_lpss_config(struct pwm_chip *chip, struct pwm_device *pwm,
113 ctrl |= PWM_SW_UPDATE; 116 ctrl |= PWM_SW_UPDATE;
114 pwm_lpss_write(pwm, ctrl); 117 pwm_lpss_write(pwm, ctrl);
115 118
119 pm_runtime_put(chip->dev);
120
116 return 0; 121 return 0;
117} 122}
118 123
119static int pwm_lpss_enable(struct pwm_chip *chip, struct pwm_device *pwm) 124static int pwm_lpss_enable(struct pwm_chip *chip, struct pwm_device *pwm)
120{ 125{
126 pm_runtime_get_sync(chip->dev);
121 pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_ENABLE); 127 pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_ENABLE);
122 return 0; 128 return 0;
123} 129}
@@ -125,6 +131,7 @@ static int pwm_lpss_enable(struct pwm_chip *chip, struct pwm_device *pwm)
125static void pwm_lpss_disable(struct pwm_chip *chip, struct pwm_device *pwm) 131static void pwm_lpss_disable(struct pwm_chip *chip, struct pwm_device *pwm)
126{ 132{
127 pwm_lpss_write(pwm, pwm_lpss_read(pwm) & ~PWM_ENABLE); 133 pwm_lpss_write(pwm, pwm_lpss_read(pwm) & ~PWM_ENABLE);
134 pm_runtime_put(chip->dev);
128} 135}
129 136
130static const struct pwm_ops pwm_lpss_ops = { 137static const struct pwm_ops pwm_lpss_ops = {