diff options
Diffstat (limited to 'drivers/pwm/pwm-lpss.c')
| -rw-r--r-- | drivers/pwm/pwm-lpss.c | 30 | 
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 @@  /* Size of each PWM register space if multiple */  #define PWM_SIZE			0x400 +#define MAX_PWMS			4 +  struct pwm_lpss_chip {  	struct pwm_chip chip;  	void __iomem *regs;  	const struct pwm_lpss_boardinfo *info; +	u32 saved_ctrl[MAX_PWMS];  };  static 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,  	unsigned long c;  	int ret; +	if (WARN_ON(info->npwm > MAX_PWMS)) +		return ERR_PTR(-ENODEV); +  	lpwm = devm_kzalloc(dev, sizeof(*lpwm), GFP_KERNEL);  	if (!lpwm)  		return ERR_PTR(-ENOMEM); @@ -212,6 +218,30 @@ int pwm_lpss_remove(struct pwm_lpss_chip *lpwm)  }  EXPORT_SYMBOL_GPL(pwm_lpss_remove); +int pwm_lpss_suspend(struct device *dev) +{ +	struct pwm_lpss_chip *lpwm = dev_get_drvdata(dev); +	int i; + +	for (i = 0; i < lpwm->info->npwm; i++) +		lpwm->saved_ctrl[i] = readl(lpwm->regs + i * PWM_SIZE + PWM); + +	return 0; +} +EXPORT_SYMBOL_GPL(pwm_lpss_suspend); + +int pwm_lpss_resume(struct device *dev) +{ +	struct pwm_lpss_chip *lpwm = dev_get_drvdata(dev); +	int i; + +	for (i = 0; i < lpwm->info->npwm; i++) +		writel(lpwm->saved_ctrl[i], lpwm->regs + i * PWM_SIZE + PWM); + +	return 0; +} +EXPORT_SYMBOL_GPL(pwm_lpss_resume); +  MODULE_DESCRIPTION("PWM driver for Intel LPSS");  MODULE_AUTHOR("Mika Westerberg <[email protected]>");  MODULE_LICENSE("GPL v2");  |