diff options
Diffstat (limited to 'drivers/pwm/core.c')
-rw-r--r-- | drivers/pwm/core.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index f5acdaa52707..780cb6b8a8f0 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c | |||
@@ -32,6 +32,9 @@ | |||
32 | 32 | ||
33 | #define MAX_PWMS 1024 | 33 | #define MAX_PWMS 1024 |
34 | 34 | ||
35 | /* flags in the third cell of the DT PWM specifier */ | ||
36 | #define PWM_SPEC_POLARITY (1 << 0) | ||
37 | |||
35 | static DEFINE_MUTEX(pwm_lookup_lock); | 38 | static DEFINE_MUTEX(pwm_lookup_lock); |
36 | static LIST_HEAD(pwm_lookup_list); | 39 | static LIST_HEAD(pwm_lookup_list); |
37 | static DEFINE_MUTEX(pwm_lock); | 40 | static DEFINE_MUTEX(pwm_lock); |
@@ -129,6 +132,31 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label) | |||
129 | return 0; | 132 | return 0; |
130 | } | 133 | } |
131 | 134 | ||
135 | struct pwm_device * | ||
136 | of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args) | ||
137 | { | ||
138 | struct pwm_device *pwm; | ||
139 | |||
140 | if (pc->of_pwm_n_cells < 3) | ||
141 | return ERR_PTR(-EINVAL); | ||
142 | |||
143 | if (args->args[0] >= pc->npwm) | ||
144 | return ERR_PTR(-EINVAL); | ||
145 | |||
146 | pwm = pwm_request_from_chip(pc, args->args[0], NULL); | ||
147 | if (IS_ERR(pwm)) | ||
148 | return pwm; | ||
149 | |||
150 | pwm_set_period(pwm, args->args[1]); | ||
151 | |||
152 | if (args->args[2] & PWM_SPEC_POLARITY) | ||
153 | pwm_set_polarity(pwm, PWM_POLARITY_INVERSED); | ||
154 | else | ||
155 | pwm_set_polarity(pwm, PWM_POLARITY_NORMAL); | ||
156 | |||
157 | return pwm; | ||
158 | } | ||
159 | |||
132 | static struct pwm_device * | 160 | static struct pwm_device * |
133 | of_pwm_simple_xlate(struct pwm_chip *pc, const struct of_phandle_args *args) | 161 | of_pwm_simple_xlate(struct pwm_chip *pc, const struct of_phandle_args *args) |
134 | { | 162 | { |