| .. | .. |
|---|
| 13 | 13 | #include <linux/mfd/stm32-lptimer.h> |
|---|
| 14 | 14 | #include <linux/module.h> |
|---|
| 15 | 15 | #include <linux/of.h> |
|---|
| 16 | +#include <linux/pinctrl/consumer.h> |
|---|
| 16 | 17 | #include <linux/platform_device.h> |
|---|
| 17 | 18 | #include <linux/pwm.h> |
|---|
| 18 | 19 | |
|---|
| .. | .. |
|---|
| 31 | 32 | #define STM32_LPTIM_MAX_PRESCALER 128 |
|---|
| 32 | 33 | |
|---|
| 33 | 34 | static int stm32_pwm_lp_apply(struct pwm_chip *chip, struct pwm_device *pwm, |
|---|
| 34 | | - struct pwm_state *state) |
|---|
| 35 | + const struct pwm_state *state) |
|---|
| 35 | 36 | { |
|---|
| 36 | 37 | struct stm32_pwm_lp *priv = to_stm32_pwm_lp(chip); |
|---|
| 37 | 38 | unsigned long long prd, div, dty; |
|---|
| .. | .. |
|---|
| 60 | 61 | do_div(div, NSEC_PER_SEC); |
|---|
| 61 | 62 | if (!div) { |
|---|
| 62 | 63 | /* Clock is too slow to achieve requested period. */ |
|---|
| 63 | | - dev_dbg(priv->chip.dev, "Can't reach %u ns\n", state->period); |
|---|
| 64 | + dev_dbg(priv->chip.dev, "Can't reach %llu ns\n", state->period); |
|---|
| 64 | 65 | return -EINVAL; |
|---|
| 65 | 66 | } |
|---|
| 66 | 67 | |
|---|
| .. | .. |
|---|
| 126 | 127 | |
|---|
| 127 | 128 | /* ensure CMP & ARR registers are properly written */ |
|---|
| 128 | 129 | ret = regmap_read_poll_timeout(priv->regmap, STM32_LPTIM_ISR, val, |
|---|
| 129 | | - (val & STM32_LPTIM_CMPOK_ARROK), |
|---|
| 130 | + (val & STM32_LPTIM_CMPOK_ARROK) == STM32_LPTIM_CMPOK_ARROK, |
|---|
| 130 | 131 | 100, 1000); |
|---|
| 131 | 132 | if (ret) { |
|---|
| 132 | 133 | dev_err(priv->chip.dev, "ARR/CMP registers write issue\n"); |
|---|
| .. | .. |
|---|
| 227 | 228 | return pwmchip_remove(&priv->chip); |
|---|
| 228 | 229 | } |
|---|
| 229 | 230 | |
|---|
| 231 | +static int __maybe_unused stm32_pwm_lp_suspend(struct device *dev) |
|---|
| 232 | +{ |
|---|
| 233 | + struct stm32_pwm_lp *priv = dev_get_drvdata(dev); |
|---|
| 234 | + struct pwm_state state; |
|---|
| 235 | + |
|---|
| 236 | + pwm_get_state(&priv->chip.pwms[0], &state); |
|---|
| 237 | + if (state.enabled) { |
|---|
| 238 | + dev_err(dev, "The consumer didn't stop us (%s)\n", |
|---|
| 239 | + priv->chip.pwms[0].label); |
|---|
| 240 | + return -EBUSY; |
|---|
| 241 | + } |
|---|
| 242 | + |
|---|
| 243 | + return pinctrl_pm_select_sleep_state(dev); |
|---|
| 244 | +} |
|---|
| 245 | + |
|---|
| 246 | +static int __maybe_unused stm32_pwm_lp_resume(struct device *dev) |
|---|
| 247 | +{ |
|---|
| 248 | + return pinctrl_pm_select_default_state(dev); |
|---|
| 249 | +} |
|---|
| 250 | + |
|---|
| 251 | +static SIMPLE_DEV_PM_OPS(stm32_pwm_lp_pm_ops, stm32_pwm_lp_suspend, |
|---|
| 252 | + stm32_pwm_lp_resume); |
|---|
| 253 | + |
|---|
| 230 | 254 | static const struct of_device_id stm32_pwm_lp_of_match[] = { |
|---|
| 231 | 255 | { .compatible = "st,stm32-pwm-lp", }, |
|---|
| 232 | 256 | {}, |
|---|
| .. | .. |
|---|
| 239 | 263 | .driver = { |
|---|
| 240 | 264 | .name = "stm32-pwm-lp", |
|---|
| 241 | 265 | .of_match_table = of_match_ptr(stm32_pwm_lp_of_match), |
|---|
| 266 | + .pm = &stm32_pwm_lp_pm_ops, |
|---|
| 242 | 267 | }, |
|---|
| 243 | 268 | }; |
|---|
| 244 | 269 | module_platform_driver(stm32_pwm_lp_driver); |
|---|