|
@@ -137,9 +137,14 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args)
|
|
{
|
|
{
|
|
struct pwm_device *pwm;
|
|
struct pwm_device *pwm;
|
|
|
|
|
|
|
|
+ /* check, whether the driver supports a third cell for flags */
|
|
if (pc->of_pwm_n_cells < 3)
|
|
if (pc->of_pwm_n_cells < 3)
|
|
return ERR_PTR(-EINVAL);
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
|
|
|
|
+ /* flags in the third cell are optional */
|
|
|
|
+ if (args->args_count < 2)
|
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
|
+
|
|
if (args->args[0] >= pc->npwm)
|
|
if (args->args[0] >= pc->npwm)
|
|
return ERR_PTR(-EINVAL);
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
|
|
@@ -148,11 +153,10 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args)
|
|
return pwm;
|
|
return pwm;
|
|
|
|
|
|
pwm->args.period = args->args[1];
|
|
pwm->args.period = args->args[1];
|
|
|
|
+ pwm->args.polarity = PWM_POLARITY_NORMAL;
|
|
|
|
|
|
- if (args->args[2] & PWM_POLARITY_INVERTED)
|
|
|
|
|
|
+ if (args->args_count > 2 && args->args[2] & PWM_POLARITY_INVERTED)
|
|
pwm->args.polarity = PWM_POLARITY_INVERSED;
|
|
pwm->args.polarity = PWM_POLARITY_INVERSED;
|
|
- else
|
|
|
|
- pwm->args.polarity = PWM_POLARITY_NORMAL;
|
|
|
|
|
|
|
|
return pwm;
|
|
return pwm;
|
|
}
|
|
}
|
|
@@ -163,9 +167,14 @@ of_pwm_simple_xlate(struct pwm_chip *pc, const struct of_phandle_args *args)
|
|
{
|
|
{
|
|
struct pwm_device *pwm;
|
|
struct pwm_device *pwm;
|
|
|
|
|
|
|
|
+ /* sanity check driver support */
|
|
if (pc->of_pwm_n_cells < 2)
|
|
if (pc->of_pwm_n_cells < 2)
|
|
return ERR_PTR(-EINVAL);
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
|
|
|
|
+ /* all cells are required */
|
|
|
|
+ if (args->args_count != pc->of_pwm_n_cells)
|
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
|
+
|
|
if (args->args[0] >= pc->npwm)
|
|
if (args->args[0] >= pc->npwm)
|
|
return ERR_PTR(-EINVAL);
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
|
|
@@ -674,13 +683,6 @@ struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id)
|
|
goto put;
|
|
goto put;
|
|
}
|
|
}
|
|
|
|
|
|
- if (args.args_count != pc->of_pwm_n_cells) {
|
|
|
|
- pr_debug("%s: wrong #pwm-cells for %s\n", np->full_name,
|
|
|
|
- args.np->full_name);
|
|
|
|
- pwm = ERR_PTR(-EINVAL);
|
|
|
|
- goto put;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
pwm = pc->of_xlate(pc, &args);
|
|
pwm = pc->of_xlate(pc, &args);
|
|
if (IS_ERR(pwm))
|
|
if (IS_ERR(pwm))
|
|
goto put;
|
|
goto put;
|