diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2011-01-28 03:40:40 -0500 |
---|---|---|
committer | Thierry Reding <thierry.reding@avionic-design.de> | 2012-06-15 06:56:50 -0400 |
commit | 0c2498f1660878339350bea8d18550b1b87ca055 (patch) | |
tree | a1509cfa2de90c8a35be4594af5daa79896f7662 /Documentation/pwm.txt | |
parent | cfaf025112d3856637ff34a767ef785ef5cf2ca9 (diff) |
pwm: Add PWM framework support
This patch adds framework support for PWM (pulse width modulation) devices.
The is a barebone PWM API already in the kernel under include/linux/pwm.h,
but it does not allow for multiple drivers as each of them implements the
pwm_*() functions.
There are other PWM framework patches around from Bill Gatliff. Unlike
his framework this one does not change the existing API for PWMs so that
this framework can act as a drop in replacement for the existing API.
Why another framework?
Several people argue that there should not be another framework for PWMs
but they should be integrated into one of the existing frameworks like led
or hwmon. Unlike these frameworks the PWM framework is agnostic to the
purpose of the PWM. In fact, a PWM can drive a LED, but this makes the
LED framework a user of a PWM, like already done in leds-pwm.c. The gpio
framework also is not suitable for PWMs. Every gpio could be turned into
a PWM using timer based toggling, but on the other hand not every PWM hardware
device can be turned into a gpio due to the lack of hardware capabilities.
This patch does not try to improve the PWM API yet, this could be done in
subsequent patches.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: Kurt Van Dijck <kurt.van.dijck@eia.be>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Matthias Kaehlcke <matthias@kaehlcke.net>
Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Reviewed-by: Shawn Guo <shawn.guo@linaro.org>
[thierry.reding@avionic-design.de: fixup typos, kerneldoc comments]
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Diffstat (limited to 'Documentation/pwm.txt')
-rw-r--r-- | Documentation/pwm.txt | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/Documentation/pwm.txt b/Documentation/pwm.txt new file mode 100644 index 000000000000..03e39d145911 --- /dev/null +++ b/Documentation/pwm.txt | |||
@@ -0,0 +1,54 @@ | |||
1 | Pulse Width Modulation (PWM) interface | ||
2 | |||
3 | This provides an overview about the Linux PWM interface | ||
4 | |||
5 | PWMs are commonly used for controlling LEDs, fans or vibrators in | ||
6 | cell phones. PWMs with a fixed purpose have no need implementing | ||
7 | the Linux PWM API (although they could). However, PWMs are often | ||
8 | found as discrete devices on SoCs which have no fixed purpose. It's | ||
9 | up to the board designer to connect them to LEDs or fans. To provide | ||
10 | this kind of flexibility the generic PWM API exists. | ||
11 | |||
12 | Identifying PWMs | ||
13 | ---------------- | ||
14 | |||
15 | Users of the legacy PWM API use unique IDs to refer to PWM devices. One | ||
16 | goal of the new PWM framework is to get rid of this global namespace. | ||
17 | |||
18 | Using PWMs | ||
19 | ---------- | ||
20 | |||
21 | A PWM can be requested using pwm_request() and freed after usage with | ||
22 | pwm_free(). After being requested a PWM has to be configured using | ||
23 | |||
24 | int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns); | ||
25 | |||
26 | To start/stop toggling the PWM output use pwm_enable()/pwm_disable(). | ||
27 | |||
28 | Implementing a PWM driver | ||
29 | ------------------------- | ||
30 | |||
31 | Currently there are two ways to implement pwm drivers. Traditionally | ||
32 | there only has been the barebone API meaning that each driver has | ||
33 | to implement the pwm_*() functions itself. This means that it's impossible | ||
34 | to have multiple PWM drivers in the system. For this reason it's mandatory | ||
35 | for new drivers to use the generic PWM framework. | ||
36 | A new PWM device can be added using pwmchip_add() and removed again with | ||
37 | pwmchip_remove(). pwmchip_add() takes a filled in struct pwm_chip as | ||
38 | argument which provides the ops and the pwm id to the framework. | ||
39 | |||
40 | Locking | ||
41 | ------- | ||
42 | |||
43 | The PWM core list manipulations are protected by a mutex, so pwm_request() | ||
44 | and pwm_free() may not be called from an atomic context. Currently the | ||
45 | PWM core does not enforce any locking to pwm_enable(), pwm_disable() and | ||
46 | pwm_config(), so the calling context is currently driver specific. This | ||
47 | is an issue derived from the former barebone API and should be fixed soon. | ||
48 | |||
49 | Helpers | ||
50 | ------- | ||
51 | |||
52 | Currently a PWM can only be configured with period_ns and duty_ns. For several | ||
53 | use cases freq_hz and duty_percent might be better. Instead of calculating | ||
54 | this in your driver please consider adding appropriate helpers to the framework. | ||