aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pwm/pwm-lpss.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pwm/pwm-lpss.c')
-rw-r--r--drivers/pwm/pwm-lpss.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c
index 8db0d40ccacd..4721a264bac2 100644
--- a/drivers/pwm/pwm-lpss.c
+++ b/drivers/pwm/pwm-lpss.c
@@ -32,10 +32,13 @@
32/* Size of each PWM register space if multiple */ 32/* Size of each PWM register space if multiple */
33#define PWM_SIZE 0x400 33#define PWM_SIZE 0x400
34 34
35#define MAX_PWMS 4
36
35struct pwm_lpss_chip { 37struct pwm_lpss_chip {
36 struct pwm_chip chip; 38 struct pwm_chip chip;
37 void __iomem *regs; 39 void __iomem *regs;
38 const struct pwm_lpss_boardinfo *info; 40 const struct pwm_lpss_boardinfo *info;
41 u32 saved_ctrl[MAX_PWMS];
39}; 42};
40 43
41static inline struct pwm_lpss_chip *to_lpwm(struct pwm_chip *chip) 44static inline struct pwm_lpss_chip *to_lpwm(struct pwm_chip *chip)
@@ -177,6 +180,9 @@ struct pwm_lpss_chip *pwm_lpss_probe(struct device *dev, struct resource *r,
177 unsigned long c; 180 unsigned long c;
178 int ret; 181 int ret;
179 182
183 if (WARN_ON(info->npwm > MAX_PWMS))
184 return ERR_PTR(-ENODEV);
185
180 lpwm = devm_kzalloc(dev, sizeof(*lpwm), GFP_KERNEL); 186 lpwm = devm_kzalloc(dev, sizeof(*lpwm), GFP_KERNEL);
181 if (!lpwm) 187 if (!lpwm)
182 return ERR_PTR(-ENOMEM); 188 return ERR_PTR(-ENOMEM);
@@ -212,6 +218,30 @@ int pwm_lpss_remove(struct pwm_lpss_chip *lpwm)
212} 218}
213EXPORT_SYMBOL_GPL(pwm_lpss_remove); 219EXPORT_SYMBOL_GPL(pwm_lpss_remove);
214 220
221int pwm_lpss_suspend(struct device *dev)
222{
223 struct pwm_lpss_chip *lpwm = dev_get_drvdata(dev);
224 int i;
225
226 for (i = 0; i < lpwm->info->npwm; i++)
227 lpwm->saved_ctrl[i] = readl(lpwm->regs + i * PWM_SIZE + PWM);
228
229 return 0;
230}
231EXPORT_SYMBOL_GPL(pwm_lpss_suspend);
232
233int pwm_lpss_resume(struct device *dev)
234{
235 struct pwm_lpss_chip *lpwm = dev_get_drvdata(dev);
236 int i;
237
238 for (i = 0; i < lpwm->info->npwm; i++)
239 writel(lpwm->saved_ctrl[i], lpwm->regs + i * PWM_SIZE + PWM);
240
241 return 0;
242}
243EXPORT_SYMBOL_GPL(pwm_lpss_resume);
244
215MODULE_DESCRIPTION("PWM driver for Intel LPSS"); 245MODULE_DESCRIPTION("PWM driver for Intel LPSS");
216MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>"); 246MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
217MODULE_LICENSE("GPL v2"); 247MODULE_LICENSE("GPL v2");