.. | .. |
---|
147 | 147 | return err; |
---|
148 | 148 | } |
---|
149 | 149 | |
---|
150 | | - return pwm_set_chip_data(pwm, channel); |
---|
| 150 | + return 0; |
---|
151 | 151 | } |
---|
152 | 152 | |
---|
153 | 153 | static void meson_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) |
---|
154 | 154 | { |
---|
155 | | - struct meson_pwm_channel *channel = pwm_get_chip_data(pwm); |
---|
| 155 | + struct meson_pwm *meson = to_meson_pwm(chip); |
---|
| 156 | + struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; |
---|
156 | 157 | |
---|
157 | 158 | if (channel) |
---|
158 | 159 | clk_disable_unprepare(channel->clk); |
---|
.. | .. |
---|
161 | 162 | static int meson_pwm_calc(struct meson_pwm *meson, struct pwm_device *pwm, |
---|
162 | 163 | const struct pwm_state *state) |
---|
163 | 164 | { |
---|
164 | | - struct meson_pwm_channel *channel = pwm_get_chip_data(pwm); |
---|
165 | | - unsigned int duty, period, pre_div, cnt, duty_cnt; |
---|
| 165 | + struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; |
---|
| 166 | + unsigned int pre_div, cnt, duty_cnt; |
---|
166 | 167 | unsigned long fin_freq; |
---|
| 168 | + u64 duty, period; |
---|
167 | 169 | |
---|
168 | 170 | duty = state->duty_cycle; |
---|
169 | 171 | period = state->period; |
---|
170 | 172 | |
---|
| 173 | + /* |
---|
| 174 | + * Note this is wrong. The result is an output wave that isn't really |
---|
| 175 | + * inverted and so is wrongly identified by .get_state as normal. |
---|
| 176 | + * Fixing this needs some care however as some machines might rely on |
---|
| 177 | + * this. |
---|
| 178 | + */ |
---|
171 | 179 | if (state->polarity == PWM_POLARITY_INVERSED) |
---|
172 | 180 | duty = period - duty; |
---|
173 | 181 | |
---|
.. | .. |
---|
179 | 187 | |
---|
180 | 188 | dev_dbg(meson->chip.dev, "fin_freq: %lu Hz\n", fin_freq); |
---|
181 | 189 | |
---|
182 | | - pre_div = div64_u64(fin_freq * (u64)period, NSEC_PER_SEC * 0xffffLL); |
---|
| 190 | + pre_div = div64_u64(fin_freq * period, NSEC_PER_SEC * 0xffffLL); |
---|
183 | 191 | if (pre_div > MISC_CLK_DIV_MASK) { |
---|
184 | 192 | dev_err(meson->chip.dev, "unable to get period pre_div\n"); |
---|
185 | 193 | return -EINVAL; |
---|
186 | 194 | } |
---|
187 | 195 | |
---|
188 | | - cnt = div64_u64(fin_freq * (u64)period, NSEC_PER_SEC * (pre_div + 1)); |
---|
| 196 | + cnt = div64_u64(fin_freq * period, NSEC_PER_SEC * (pre_div + 1)); |
---|
189 | 197 | if (cnt > 0xffff) { |
---|
190 | 198 | dev_err(meson->chip.dev, "unable to get period cnt\n"); |
---|
191 | 199 | return -EINVAL; |
---|
192 | 200 | } |
---|
193 | 201 | |
---|
194 | | - dev_dbg(meson->chip.dev, "period=%u pre_div=%u cnt=%u\n", period, |
---|
| 202 | + dev_dbg(meson->chip.dev, "period=%llu pre_div=%u cnt=%u\n", period, |
---|
195 | 203 | pre_div, cnt); |
---|
196 | 204 | |
---|
197 | 205 | if (duty == period) { |
---|
.. | .. |
---|
204 | 212 | channel->lo = cnt; |
---|
205 | 213 | } else { |
---|
206 | 214 | /* Then check is we can have the duty with the same pre_div */ |
---|
207 | | - duty_cnt = div64_u64(fin_freq * (u64)duty, |
---|
208 | | - NSEC_PER_SEC * (pre_div + 1)); |
---|
| 215 | + duty_cnt = div64_u64(fin_freq * duty, NSEC_PER_SEC * (pre_div + 1)); |
---|
209 | 216 | if (duty_cnt > 0xffff) { |
---|
210 | 217 | dev_err(meson->chip.dev, "unable to get duty cycle\n"); |
---|
211 | 218 | return -EINVAL; |
---|
212 | 219 | } |
---|
213 | 220 | |
---|
214 | | - dev_dbg(meson->chip.dev, "duty=%u pre_div=%u duty_cnt=%u\n", |
---|
| 221 | + dev_dbg(meson->chip.dev, "duty=%llu pre_div=%u duty_cnt=%u\n", |
---|
215 | 222 | duty, pre_div, duty_cnt); |
---|
216 | 223 | |
---|
217 | 224 | channel->pre_div = pre_div; |
---|
.. | .. |
---|
224 | 231 | |
---|
225 | 232 | static void meson_pwm_enable(struct meson_pwm *meson, struct pwm_device *pwm) |
---|
226 | 233 | { |
---|
227 | | - struct meson_pwm_channel *channel = pwm_get_chip_data(pwm); |
---|
| 234 | + struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; |
---|
228 | 235 | struct meson_pwm_channel_data *channel_data; |
---|
229 | 236 | unsigned long flags; |
---|
230 | 237 | u32 value; |
---|
.. | .. |
---|
267 | 274 | static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, |
---|
268 | 275 | const struct pwm_state *state) |
---|
269 | 276 | { |
---|
270 | | - struct meson_pwm_channel *channel = pwm_get_chip_data(pwm); |
---|
271 | 277 | struct meson_pwm *meson = to_meson_pwm(chip); |
---|
| 278 | + struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; |
---|
272 | 279 | int err = 0; |
---|
273 | 280 | |
---|
274 | 281 | if (!state) |
---|
.. | .. |
---|
366 | 373 | state->period = 0; |
---|
367 | 374 | state->duty_cycle = 0; |
---|
368 | 375 | } |
---|
| 376 | + state->polarity = PWM_POLARITY_NORMAL; |
---|
369 | 377 | } |
---|
370 | 378 | |
---|
371 | 379 | static const struct pwm_ops meson_pwm_ops = { |
---|
.. | .. |
---|
417 | 425 | }; |
---|
418 | 426 | |
---|
419 | 427 | static const char * const pwm_axg_ao_parent_names[] = { |
---|
420 | | - "aoclk81", "xtal", "fclk_div4", "fclk_div5" |
---|
| 428 | + "xtal", "axg_ao_clk81", "fclk_div4", "fclk_div5" |
---|
421 | 429 | }; |
---|
422 | 430 | |
---|
423 | 431 | static const struct meson_pwm_data pwm_axg_ao_data = { |
---|
.. | .. |
---|
426 | 434 | }; |
---|
427 | 435 | |
---|
428 | 436 | static const char * const pwm_g12a_ao_ab_parent_names[] = { |
---|
429 | | - "xtal", "aoclk81", "fclk_div4", "fclk_div5" |
---|
| 437 | + "xtal", "g12a_ao_clk81", "fclk_div4", "fclk_div5" |
---|
430 | 438 | }; |
---|
431 | 439 | |
---|
432 | 440 | static const struct meson_pwm_data pwm_g12a_ao_ab_data = { |
---|
.. | .. |
---|
435 | 443 | }; |
---|
436 | 444 | |
---|
437 | 445 | static const char * const pwm_g12a_ao_cd_parent_names[] = { |
---|
438 | | - "xtal", "aoclk81", |
---|
| 446 | + "xtal", "g12a_ao_clk81", |
---|
439 | 447 | }; |
---|
440 | 448 | |
---|
441 | 449 | static const struct meson_pwm_data pwm_g12a_ao_cd_data = { |
---|