aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pwm/pwm-lpss.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-06-14 03:25:43 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-06-14 03:25:43 -0400
commit4b4bb99b6246007eccbc0731eae0b6742c24efa5 (patch)
treec81d34499eb1e89101741395ef345be43d6a7c71 /drivers/pwm/pwm-lpss.c
parent9bca19a01d50143b736f0f59eb3ccc05b1106172 (diff)
parent414c52b7899aa9097c2fa8444654a866e1df4a0c (diff)
Merge tag 'pwm/for-4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm
Pull pwm updates from Thierry Reding: "This contains a couple of fixes and cleanups for the Meson and ACPI/LPSS drivers as well as capture support for STM32. Note that given the cross- subsystem changes, the STM32 patches were merged through the MFD and PWM trees, both sharing an immutable branch" * tag 'pwm/for-4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm: pwm: stm32: Fix build warning with CONFIG_DMA_ENGINE disabled pwm: stm32: Enforce dependency on CONFIG_MFD_STM32_TIMERS ACPI / LPSS: Add missing prv_offset setting for byt/cht PWM devices pwm: lpss: platform: Save/restore the ctrl register over a suspend/resume dt-bindings: mfd: stm32-timers: Add support for dmas pwm: simplify getting .drvdata pwm: meson: Fix allocation of PWM channel array
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");