Commit 4ad91a22 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Thierry Reding

pwm: Make it explicit that pwm_apply_state() might sleep

At least some implementations sleep. So mark pwm_apply_state() with a
might_sleep() to make callers aware. In the worst case this uncovers a
valid atomic user, then we revert this patch and at least gained some more
knowledge and then can work on a concept similar to
gpio_get_value/gpio_get_value_cansleep.
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
parent 27d9a4d6
...@@ -532,6 +532,15 @@ int pwm_apply_state(struct pwm_device *pwm, const struct pwm_state *state) ...@@ -532,6 +532,15 @@ int pwm_apply_state(struct pwm_device *pwm, const struct pwm_state *state)
struct pwm_chip *chip; struct pwm_chip *chip;
int err; int err;
/*
* Some lowlevel driver's implementations of .apply() make use of
* mutexes, also with some drivers only returning when the new
* configuration is active calling pwm_apply_state() from atomic context
* is a bad idea. So make it explicit that calling this function might
* sleep.
*/
might_sleep();
if (!pwm || !state || !state->period || if (!pwm || !state || !state->period ||
state->duty_cycle > state->period) state->duty_cycle > state->period)
return -EINVAL; return -EINVAL;
......
...@@ -441,6 +441,7 @@ static inline void pwm_free(struct pwm_device *pwm) ...@@ -441,6 +441,7 @@ static inline void pwm_free(struct pwm_device *pwm)
static inline int pwm_apply_state(struct pwm_device *pwm, static inline int pwm_apply_state(struct pwm_device *pwm,
const struct pwm_state *state) const struct pwm_state *state)
{ {
might_sleep();
return -ENOTSUPP; return -ENOTSUPP;
} }
...@@ -452,6 +453,7 @@ static inline int pwm_adjust_config(struct pwm_device *pwm) ...@@ -452,6 +453,7 @@ static inline int pwm_adjust_config(struct pwm_device *pwm)
static inline int pwm_config(struct pwm_device *pwm, int duty_ns, static inline int pwm_config(struct pwm_device *pwm, int duty_ns,
int period_ns) int period_ns)
{ {
might_sleep();
return -EINVAL; return -EINVAL;
} }
...@@ -464,11 +466,13 @@ static inline int pwm_capture(struct pwm_device *pwm, ...@@ -464,11 +466,13 @@ static inline int pwm_capture(struct pwm_device *pwm,
static inline int pwm_enable(struct pwm_device *pwm) static inline int pwm_enable(struct pwm_device *pwm)
{ {
might_sleep();
return -EINVAL; return -EINVAL;
} }
static inline void pwm_disable(struct pwm_device *pwm) static inline void pwm_disable(struct pwm_device *pwm)
{ {
might_sleep();
} }
static inline int pwm_set_chip_data(struct pwm_device *pwm, void *data) static inline int pwm_set_chip_data(struct pwm_device *pwm, void *data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment