diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-10 14:14:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-10 14:14:56 -0400 |
commit | 34ae0a6f05aee9f51fca17001b4a90703d434ae1 (patch) | |
tree | 3ccc8bedae647eb37f46e8ff9f39cdcd84a2f2ac /drivers/pwm/core.c | |
parent | 7d3107d26b522a0fe92af6279256fa65fe3db771 (diff) | |
parent | b388f15fd14c3ae62deb9a059464aa99b524ea4a (diff) |
Merge tag 'for-3.11-rc1' of git://gitorious.org/linux-pwm/linux-pwm
Pull pwm changes from Thierry Reding:
"A new driver supports driving PWM signals using the TPU unit found on
various Renesas SoCs. Furthermore support is added for the NXP
PCA9685 LED controller. Another big chunk is the sysfs interface
which has been in the works for quite some time.
The remaining patches are a random assortment of cleanups and fixes"
* tag 'for-3.11-rc1' of git://gitorious.org/linux-pwm/linux-pwm:
pwm: pwm-tiehrpwm: Use clk_enable/disable instead clk_prepare/unprepare.
pwm: pca9685: Fix wrong argument to set MODE1_SLEEP bit
pwm: renesas-tpu: Add MODULE_ALIAS to make module auto loading work
pwm: renesas-tpu: fix return value check in tpu_probe()
pwm: Add Renesas TPU PWM driver
pwm: Add sysfs interface
pwm: Fill in missing .owner fields
pwm: add pca9685 driver
pwm: atmel-tcb: prepare clk before calling enable
pwm: devm: alloc correct pointer size
pwm: mxs: Let device core handle pinctrl
MAINTAINERS: Update PWM subsystem entry
Diffstat (limited to 'drivers/pwm/core.c')
-rw-r--r-- | drivers/pwm/core.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index 32221cb0cbe7..dfbfbc521768 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c | |||
@@ -274,6 +274,8 @@ int pwmchip_add(struct pwm_chip *chip) | |||
274 | if (IS_ENABLED(CONFIG_OF)) | 274 | if (IS_ENABLED(CONFIG_OF)) |
275 | of_pwmchip_add(chip); | 275 | of_pwmchip_add(chip); |
276 | 276 | ||
277 | pwmchip_sysfs_export(chip); | ||
278 | |||
277 | out: | 279 | out: |
278 | mutex_unlock(&pwm_lock); | 280 | mutex_unlock(&pwm_lock); |
279 | return ret; | 281 | return ret; |
@@ -310,6 +312,8 @@ int pwmchip_remove(struct pwm_chip *chip) | |||
310 | 312 | ||
311 | free_pwms(chip); | 313 | free_pwms(chip); |
312 | 314 | ||
315 | pwmchip_sysfs_unexport(chip); | ||
316 | |||
313 | out: | 317 | out: |
314 | mutex_unlock(&pwm_lock); | 318 | mutex_unlock(&pwm_lock); |
315 | return ret; | 319 | return ret; |
@@ -402,10 +406,19 @@ EXPORT_SYMBOL_GPL(pwm_free); | |||
402 | */ | 406 | */ |
403 | int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | 407 | int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) |
404 | { | 408 | { |
409 | int err; | ||
410 | |||
405 | if (!pwm || duty_ns < 0 || period_ns <= 0 || duty_ns > period_ns) | 411 | if (!pwm || duty_ns < 0 || period_ns <= 0 || duty_ns > period_ns) |
406 | return -EINVAL; | 412 | return -EINVAL; |
407 | 413 | ||
408 | return pwm->chip->ops->config(pwm->chip, pwm, duty_ns, period_ns); | 414 | err = pwm->chip->ops->config(pwm->chip, pwm, duty_ns, period_ns); |
415 | if (err) | ||
416 | return err; | ||
417 | |||
418 | pwm->duty_cycle = duty_ns; | ||
419 | pwm->period = period_ns; | ||
420 | |||
421 | return 0; | ||
409 | } | 422 | } |
410 | EXPORT_SYMBOL_GPL(pwm_config); | 423 | EXPORT_SYMBOL_GPL(pwm_config); |
411 | 424 | ||
@@ -418,6 +431,8 @@ EXPORT_SYMBOL_GPL(pwm_config); | |||
418 | */ | 431 | */ |
419 | int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity) | 432 | int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity) |
420 | { | 433 | { |
434 | int err; | ||
435 | |||
421 | if (!pwm || !pwm->chip->ops) | 436 | if (!pwm || !pwm->chip->ops) |
422 | return -EINVAL; | 437 | return -EINVAL; |
423 | 438 | ||
@@ -427,7 +442,13 @@ int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity) | |||
427 | if (test_bit(PWMF_ENABLED, &pwm->flags)) | 442 | if (test_bit(PWMF_ENABLED, &pwm->flags)) |
428 | return -EBUSY; | 443 | return -EBUSY; |
429 | 444 | ||
430 | return pwm->chip->ops->set_polarity(pwm->chip, pwm, polarity); | 445 | err = pwm->chip->ops->set_polarity(pwm->chip, pwm, polarity); |
446 | if (err) | ||
447 | return err; | ||
448 | |||
449 | pwm->polarity = polarity; | ||
450 | |||
451 | return 0; | ||
431 | } | 452 | } |
432 | EXPORT_SYMBOL_GPL(pwm_set_polarity); | 453 | EXPORT_SYMBOL_GPL(pwm_set_polarity); |
433 | 454 | ||
@@ -694,7 +715,7 @@ struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id) | |||
694 | { | 715 | { |
695 | struct pwm_device **ptr, *pwm; | 716 | struct pwm_device **ptr, *pwm; |
696 | 717 | ||
697 | ptr = devres_alloc(devm_pwm_release, sizeof(**ptr), GFP_KERNEL); | 718 | ptr = devres_alloc(devm_pwm_release, sizeof(*ptr), GFP_KERNEL); |
698 | if (!ptr) | 719 | if (!ptr) |
699 | return ERR_PTR(-ENOMEM); | 720 | return ERR_PTR(-ENOMEM); |
700 | 721 | ||
@@ -724,7 +745,7 @@ struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np, | |||
724 | { | 745 | { |
725 | struct pwm_device **ptr, *pwm; | 746 | struct pwm_device **ptr, *pwm; |
726 | 747 | ||
727 | ptr = devres_alloc(devm_pwm_release, sizeof(**ptr), GFP_KERNEL); | 748 | ptr = devres_alloc(devm_pwm_release, sizeof(*ptr), GFP_KERNEL); |
728 | if (!ptr) | 749 | if (!ptr) |
729 | return ERR_PTR(-ENOMEM); | 750 | return ERR_PTR(-ENOMEM); |
730 | 751 | ||