summaryrefslogtreecommitdiff
path: root/drivers/pwm/core.c
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@free-electrons.com>2016-05-17 14:27:25 +0200
committerHuang, Tao <huangtao@rock-chips.com>2017-03-06 18:28:40 +0800
commit394b99f37dd199599e383024dc40aa84eec6de3e (patch)
tree80473a37b56a388572e38cf2083bd1cfde1476a8 /drivers/pwm/core.c
parent55d922eb73a185fef9b89ad758a04db25846c850 (diff)
UPSTREAM: pwm: Fix pwm_apply_args() call sites
pwm_apply_args() is supposed to initialize a PWM device according to the arguments provided by the DT or the PWM lookup, but this function was called inside pwm_device_request(), which in turn was called before the core had a chance to initialize the pwm->args fields. Fix that by calling pwm_apply_args directly in pwm_get() and of_pwm_get() after initializing pwm->args field. This commit also fixes an invalid pointer dereference introduced by commit e39c0df1be5a ("pwm: Introduce the pwm_args concept"). Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Fixes: e39c0df1be5a ("pwm: Introduce the pwm_args concept") Signed-off-by: Thierry Reding <thierry.reding@gmail.com> (cherry picked from commit fbd45a12988e75a48d392feb8b0e5feb5d612513) Change-Id: I9746f4ada57a6cc8155bafe662a63c82338c223a Signed-off-by: David Wu <david.wu@rock-chips.com>
Diffstat (limited to 'drivers/pwm/core.c')
-rw-r--r--drivers/pwm/core.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 8fbd7c5d34b6..7bb31429886e 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -129,13 +129,6 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label)
set_bit(PWMF_REQUESTED, &pwm->flags);
pwm->label = label;
- /*
- * FIXME: This should be removed once all PWM users properly make use
- * of struct pwm_args to initialize the PWM device. As long as this is
- * here, the PWM state and hardware state can get out of sync.
- */
- pwm_apply_args(pwm);
-
return 0;
}
@@ -630,6 +623,13 @@ struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id)
pwm->label = con_id;
+ /*
+ * FIXME: This should be removed once all PWM users properly make use
+ * of struct pwm_args to initialize the PWM device. As long as this is
+ * here, the PWM state and hardware state can get out of sync.
+ */
+ pwm_apply_args(pwm);
+
put:
of_node_put(args.np);
@@ -757,13 +757,20 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id)
if (!chip)
goto out;
- pwm->args.period = chosen->period;
- pwm->args.polarity = chosen->polarity;
-
pwm = pwm_request_from_chip(chip, chosen->index, con_id ?: dev_id);
if (IS_ERR(pwm))
goto out;
+ pwm->args.period = chosen->period;
+ pwm->args.polarity = chosen->polarity;
+
+ /*
+ * FIXME: This should be removed once all PWM users properly make use
+ * of struct pwm_args to initialize the PWM device. As long as this is
+ * here, the PWM state and hardware state can get out of sync.
+ */
+ pwm_apply_args(pwm);
+
out:
mutex_unlock(&pwm_lookup_lock);
return pwm;