aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hartleys@visionengravers.com>2013-06-11 13:38:59 -0400
committerThierry Reding <thierry.reding@gmail.com>2013-06-21 05:32:51 -0400
commit76abbdde2d95a3807d0dc6bf9f84d03d0dbd4f3d (patch)
tree63a5476d6fbf80ec90b813461ec7ec67ff462684
parent3dd0a909479c1d372341d749b4ff94cd638b57da (diff)
pwm: Add sysfs interface
Add a simple sysfs interface to the generic PWM framework. /sys/class/pwm/ `-- pwmchipN/ for each PWM chip |-- export (w/o) ask the kernel to export a PWM channel |-- npwm (r/o) number of PWM channels in this PWM chip |-- pwmX/ for each exported PWM channel | |-- duty_cycle (r/w) duty cycle (in nanoseconds) | |-- enable (r/w) enable/disable PWM | |-- period (r/w) period (in nanoseconds) | `-- polarity (r/w) polarity of PWM (normal/inversed) `-- unexport (w/o) return a PWM channel to the kernel Based on work by Lars Poeschel. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Thierry Reding <thierry.reding@gmail.com> Cc: Lars Poeschel <poeschel@lemonage.de> Cc: Ryan Mallon <rmallon@gmail.com> Cc: Rob Landley <rob@landley.net> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
-rw-r--r--Documentation/ABI/testing/sysfs-class-pwm79
-rw-r--r--Documentation/pwm.txt37
-rw-r--r--drivers/pwm/Kconfig4
-rw-r--r--drivers/pwm/Makefile1
-rw-r--r--drivers/pwm/core.c25
-rw-r--r--drivers/pwm/sysfs.c352
-rw-r--r--include/linux/pwm.h29
7 files changed, 524 insertions, 3 deletions
diff --git a/Documentation/ABI/testing/sysfs-class-pwm b/Documentation/ABI/testing/sysfs-class-pwm
new file mode 100644
index 000000000000..c479d77b67c5
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-class-pwm
@@ -0,0 +1,79 @@
1What: /sys/class/pwm/
2Date: May 2013
3KernelVersion: 3.11
4Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
5Description:
6 The pwm/ class sub-directory belongs to the Generic PWM
7 Framework and provides a sysfs interface for using PWM
8 channels.
9
10What: /sys/class/pwm/pwmchipN/
11Date: May 2013
12KernelVersion: 3.11
13Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
14Description:
15 A /sys/class/pwm/pwmchipN directory is created for each
16 probed PWM controller/chip where N is the base of the
17 PWM chip.
18
19What: /sys/class/pwm/pwmchipN/npwm
20Date: May 2013
21KernelVersion: 3.11
22Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
23Description:
24 The number of PWM channels supported by the PWM chip.
25
26What: /sys/class/pwm/pwmchipN/export
27Date: May 2013
28KernelVersion: 3.11
29Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
30Description:
31 Exports a PWM channel from the PWM chip for sysfs control.
32 Value is between 0 and /sys/class/pwm/pwmchipN/npwm - 1.
33
34What: /sys/class/pwm/pwmchipN/unexport
35Date: May 2013
36KernelVersion: 3.11
37Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
38Description:
39 Unexports a PWM channel.
40
41What: /sys/class/pwm/pwmchipN/pwmX
42Date: May 2013
43KernelVersion: 3.11
44Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
45Description:
46 A /sys/class/pwm/pwmchipN/pwmX directory is created for
47 each exported PWM channel where X is the exported PWM
48 channel number.
49
50What: /sys/class/pwm/pwmchipN/pwmX/period
51Date: May 2013
52KernelVersion: 3.11
53Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
54Description:
55 Sets the PWM signal period in nanoseconds.
56
57What: /sys/class/pwm/pwmchipN/pwmX/duty_cycle
58Date: May 2013
59KernelVersion: 3.11
60Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
61Description:
62 Sets the PWM signal duty cycle in nanoseconds.
63
64What: /sys/class/pwm/pwmchipN/pwmX/polarity
65Date: May 2013
66KernelVersion: 3.11
67Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
68Description:
69 Sets the output polarity of the PWM signal to "normal" or
70 "inversed".
71
72What: /sys/class/pwm/pwmchipN/pwmX/enable
73Date: May 2013
74KernelVersion: 3.11
75Contact: H Hartley Sweeten <hsweeten@visionengravers.com>
76Description:
77 Enable/disable the PWM signal.
78 0 is disabled
79 1 is enabled
diff --git a/Documentation/pwm.txt b/Documentation/pwm.txt
index 7d2b4c9b544b..1039b68fe9c6 100644
--- a/Documentation/pwm.txt
+++ b/Documentation/pwm.txt
@@ -45,6 +45,43 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
45 45
46To start/stop toggling the PWM output use pwm_enable()/pwm_disable(). 46To start/stop toggling the PWM output use pwm_enable()/pwm_disable().
47 47
48Using PWMs with the sysfs interface
49-----------------------------------
50
51If CONFIG_SYSFS is enabled in your kernel configuration a simple sysfs
52interface is provided to use the PWMs from userspace. It is exposed at
53/sys/class/pwm/. Each probed PWM controller/chip will be exported as
54pwmchipN, where N is the base of the PWM chip. Inside the directory you
55will find:
56
57npwm - The number of PWM channels this chip supports (read-only).
58
59export - Exports a PWM channel for use with sysfs (write-only).
60
61unexport - Unexports a PWM channel from sysfs (write-only).
62
63The PWM channels are numbered using a per-chip index from 0 to npwm-1.
64
65When a PWM channel is exported a pwmX directory will be created in the
66pwmchipN directory it is associated with, where X is the number of the
67channel that was exported. The following properties will then be available:
68
69period - The total period of the PWM signal (read/write).
70 Value is in nanoseconds and is the sum of the active and inactive
71 time of the PWM.
72
73duty_cycle - The active time of the PWM signal (read/write).
74 Value is in nanoseconds and must be less than the period.
75
76polarity - Changes the polarity of the PWM signal (read/write).
77 Writes to this property only work if the PWM chip supports changing
78 the polarity. The polarity can only be changed if the PWM is not
79 enabled. Value is the string "normal" or "inversed".
80
81enable - Enable/disable the PWM signal (read/write).
82 0 - disabled
83 1 - enabled
84
48Implementing a PWM driver 85Implementing a PWM driver
49------------------------- 86-------------------------
50 87
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
index d3fe3205d296..406a4d94ddb9 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
@@ -28,6 +28,10 @@ menuconfig PWM
28 28
29if PWM 29if PWM
30 30
31config PWM_SYSFS
32 bool
33 default y if SYSFS
34
31config PWM_AB8500 35config PWM_AB8500
32 tristate "AB8500 PWM support" 36 tristate "AB8500 PWM support"
33 depends on AB8500_CORE && ARCH_U8500 37 depends on AB8500_CORE && ARCH_U8500
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
index b3afc0a1800b..859692224044 100644
--- a/drivers/pwm/Makefile
+++ b/drivers/pwm/Makefile
@@ -1,4 +1,5 @@
1obj-$(CONFIG_PWM) += core.o 1obj-$(CONFIG_PWM) += core.o
2obj-$(CONFIG_PWM_SYSFS) += sysfs.o
2obj-$(CONFIG_PWM_AB8500) += pwm-ab8500.o 3obj-$(CONFIG_PWM_AB8500) += pwm-ab8500.o
3obj-$(CONFIG_PWM_ATMEL_TCB) += pwm-atmel-tcb.o 4obj-$(CONFIG_PWM_ATMEL_TCB) += pwm-atmel-tcb.o
4obj-$(CONFIG_PWM_BFIN) += pwm-bfin.o 5obj-$(CONFIG_PWM_BFIN) += pwm-bfin.o
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 0cf0f65eb037..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
277out: 279out:
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
313out: 317out:
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 */
403int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) 407int 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}
410EXPORT_SYMBOL_GPL(pwm_config); 423EXPORT_SYMBOL_GPL(pwm_config);
411 424
@@ -418,6 +431,8 @@ EXPORT_SYMBOL_GPL(pwm_config);
418 */ 431 */
419int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity) 432int 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}
432EXPORT_SYMBOL_GPL(pwm_set_polarity); 453EXPORT_SYMBOL_GPL(pwm_set_polarity);
433 454
diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c
new file mode 100644
index 000000000000..8ca5de316d3b
--- /dev/null
+++ b/drivers/pwm/sysfs.c
@@ -0,0 +1,352 @@
1/*
2 * A simple sysfs interface for the generic PWM framework
3 *
4 * Copyright (C) 2013 H Hartley Sweeten <hsweeten@visionengravers.com>
5 *
6 * Based on previous work by Lars Poeschel <poeschel@lemonage.de>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 */
18
19#include <linux/device.h>
20#include <linux/mutex.h>
21#include <linux/err.h>
22#include <linux/slab.h>
23#include <linux/kdev_t.h>
24#include <linux/pwm.h>
25
26struct pwm_export {
27 struct device child;
28 struct pwm_device *pwm;
29};
30
31static struct pwm_export *child_to_pwm_export(struct device *child)
32{
33 return container_of(child, struct pwm_export, child);
34}
35
36static struct pwm_device *child_to_pwm_device(struct device *child)
37{
38 struct pwm_export *export = child_to_pwm_export(child);
39
40 return export->pwm;
41}
42
43static ssize_t pwm_period_show(struct device *child,
44 struct device_attribute *attr,
45 char *buf)
46{
47 const struct pwm_device *pwm = child_to_pwm_device(child);
48
49 return sprintf(buf, "%u\n", pwm->period);
50}
51
52static ssize_t pwm_period_store(struct device *child,
53 struct device_attribute *attr,
54 const char *buf, size_t size)
55{
56 struct pwm_device *pwm = child_to_pwm_device(child);
57 unsigned int val;
58 int ret;
59
60 ret = kstrtouint(buf, 0, &val);
61 if (ret)
62 return ret;
63
64 ret = pwm_config(pwm, pwm->duty_cycle, val);
65
66 return ret ? : size;
67}
68
69static ssize_t pwm_duty_cycle_show(struct device *child,
70 struct device_attribute *attr,
71 char *buf)
72{
73 const struct pwm_device *pwm = child_to_pwm_device(child);
74
75 return sprintf(buf, "%u\n", pwm->duty_cycle);
76}
77
78static ssize_t pwm_duty_cycle_store(struct device *child,
79 struct device_attribute *attr,
80 const char *buf, size_t size)
81{
82 struct pwm_device *pwm = child_to_pwm_device(child);
83 unsigned int val;
84 int ret;
85
86 ret = kstrtouint(buf, 0, &val);
87 if (ret)
88 return ret;
89
90 ret = pwm_config(pwm, val, pwm->period);
91
92 return ret ? : size;
93}
94
95static ssize_t pwm_enable_show(struct device *child,
96 struct device_attribute *attr,
97 char *buf)
98{
99 const struct pwm_device *pwm = child_to_pwm_device(child);
100 int enabled = test_bit(PWMF_ENABLED, &pwm->flags);
101
102 return sprintf(buf, "%d\n", enabled);
103}
104
105static ssize_t pwm_enable_store(struct device *child,
106 struct device_attribute *attr,
107 const char *buf, size_t size)
108{
109 struct pwm_device *pwm = child_to_pwm_device(child);
110 int val, ret;
111
112 ret = kstrtoint(buf, 0, &val);
113 if (ret)
114 return ret;
115
116 switch (val) {
117 case 0:
118 pwm_disable(pwm);
119 break;
120 case 1:
121 ret = pwm_enable(pwm);
122 break;
123 default:
124 ret = -EINVAL;
125 break;
126 }
127
128 return ret ? : size;
129}
130
131static ssize_t pwm_polarity_show(struct device *child,
132 struct device_attribute *attr,
133 char *buf)
134{
135 const struct pwm_device *pwm = child_to_pwm_device(child);
136
137 return sprintf(buf, "%s\n", pwm->polarity ? "inversed" : "normal");
138}
139
140static ssize_t pwm_polarity_store(struct device *child,
141 struct device_attribute *attr,
142 const char *buf, size_t size)
143{
144 struct pwm_device *pwm = child_to_pwm_device(child);
145 enum pwm_polarity polarity;
146 int ret;
147
148 if (sysfs_streq(buf, "normal"))
149 polarity = PWM_POLARITY_NORMAL;
150 else if (sysfs_streq(buf, "inversed"))
151 polarity = PWM_POLARITY_INVERSED;
152 else
153 return -EINVAL;
154
155 ret = pwm_set_polarity(pwm, polarity);
156
157 return ret ? : size;
158}
159
160static DEVICE_ATTR(period, 0644, pwm_period_show, pwm_period_store);
161static DEVICE_ATTR(duty_cycle, 0644, pwm_duty_cycle_show, pwm_duty_cycle_store);
162static DEVICE_ATTR(enable, 0644, pwm_enable_show, pwm_enable_store);
163static DEVICE_ATTR(polarity, 0644, pwm_polarity_show, pwm_polarity_store);
164
165static struct attribute *pwm_attrs[] = {
166 &dev_attr_period.attr,
167 &dev_attr_duty_cycle.attr,
168 &dev_attr_enable.attr,
169 &dev_attr_polarity.attr,
170 NULL
171};
172
173static const struct attribute_group pwm_attr_group = {
174 .attrs = pwm_attrs,
175};
176
177static const struct attribute_group *pwm_attr_groups[] = {
178 &pwm_attr_group,
179 NULL,
180};
181
182static void pwm_export_release(struct device *child)
183{
184 struct pwm_export *export = child_to_pwm_export(child);
185
186 kfree(export);
187}
188
189static int pwm_export_child(struct device *parent, struct pwm_device *pwm)
190{
191 struct pwm_export *export;
192 int ret;
193
194 if (test_and_set_bit(PWMF_EXPORTED, &pwm->flags))
195 return -EBUSY;
196
197 export = kzalloc(sizeof(*export), GFP_KERNEL);
198 if (!export) {
199 clear_bit(PWMF_EXPORTED, &pwm->flags);
200 return -ENOMEM;
201 }
202
203 export->pwm = pwm;
204
205 export->child.release = pwm_export_release;
206 export->child.parent = parent;
207 export->child.devt = MKDEV(0, 0);
208 export->child.groups = pwm_attr_groups;
209 dev_set_name(&export->child, "pwm%u", pwm->hwpwm);
210
211 ret = device_register(&export->child);
212 if (ret) {
213 clear_bit(PWMF_EXPORTED, &pwm->flags);
214 kfree(export);
215 return ret;
216 }
217
218 return 0;
219}
220
221static int pwm_unexport_match(struct device *child, void *data)
222{
223 return child_to_pwm_device(child) == data;
224}
225
226static int pwm_unexport_child(struct device *parent, struct pwm_device *pwm)
227{
228 struct device *child;
229
230 if (!test_and_clear_bit(PWMF_EXPORTED, &pwm->flags))
231 return -ENODEV;
232
233 child = device_find_child(parent, pwm, pwm_unexport_match);
234 if (!child)
235 return -ENODEV;
236
237 /* for device_find_child() */
238 put_device(child);
239 device_unregister(child);
240 pwm_put(pwm);
241
242 return 0;
243}
244
245static ssize_t pwm_export_store(struct device *parent,
246 struct device_attribute *attr,
247 const char *buf, size_t len)
248{
249 struct pwm_chip *chip = dev_get_drvdata(parent);
250 struct pwm_device *pwm;
251 unsigned int hwpwm;
252 int ret;
253
254 ret = kstrtouint(buf, 0, &hwpwm);
255 if (ret < 0)
256 return ret;
257
258 if (hwpwm >= chip->npwm)
259 return -ENODEV;
260
261 pwm = pwm_request_from_chip(chip, hwpwm, "sysfs");
262 if (IS_ERR(pwm))
263 return PTR_ERR(pwm);
264
265 ret = pwm_export_child(parent, pwm);
266 if (ret < 0)
267 pwm_put(pwm);
268
269 return ret ? : len;
270}
271
272static ssize_t pwm_unexport_store(struct device *parent,
273 struct device_attribute *attr,
274 const char *buf, size_t len)
275{
276 struct pwm_chip *chip = dev_get_drvdata(parent);
277 unsigned int hwpwm;
278 int ret;
279
280 ret = kstrtouint(buf, 0, &hwpwm);
281 if (ret < 0)
282 return ret;
283
284 if (hwpwm >= chip->npwm)
285 return -ENODEV;
286
287 ret = pwm_unexport_child(parent, &chip->pwms[hwpwm]);
288
289 return ret ? : len;
290}
291
292static ssize_t pwm_npwm_show(struct device *parent,
293 struct device_attribute *attr,
294 char *buf)
295{
296 const struct pwm_chip *chip = dev_get_drvdata(parent);
297
298 return sprintf(buf, "%u\n", chip->npwm);
299}
300
301static struct device_attribute pwm_chip_attrs[] = {
302 __ATTR(export, 0200, NULL, pwm_export_store),
303 __ATTR(unexport, 0200, NULL, pwm_unexport_store),
304 __ATTR(npwm, 0444, pwm_npwm_show, NULL),
305 __ATTR_NULL,
306};
307
308static struct class pwm_class = {
309 .name = "pwm",
310 .owner = THIS_MODULE,
311 .dev_attrs = pwm_chip_attrs,
312};
313
314static int pwmchip_sysfs_match(struct device *parent, const void *data)
315{
316 return dev_get_drvdata(parent) == data;
317}
318
319void pwmchip_sysfs_export(struct pwm_chip *chip)
320{
321 struct device *parent;
322
323 /*
324 * If device_create() fails the pwm_chip is still usable by
325 * the kernel its just not exported.
326 */
327 parent = device_create(&pwm_class, chip->dev, MKDEV(0, 0), chip,
328 "pwmchip%d", chip->base);
329 if (IS_ERR(parent)) {
330 dev_warn(chip->dev,
331 "device_create failed for pwm_chip sysfs export\n");
332 }
333}
334
335void pwmchip_sysfs_unexport(struct pwm_chip *chip)
336{
337 struct device *parent;
338
339 parent = class_find_device(&pwm_class, NULL, chip,
340 pwmchip_sysfs_match);
341 if (parent) {
342 /* for class_find_device() */
343 put_device(parent);
344 device_unregister(parent);
345 }
346}
347
348static int __init pwm_sysfs_init(void)
349{
350 return class_register(&pwm_class);
351}
352subsys_initcall(pwm_sysfs_init);
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index a4df2042b79c..f0feafd184a0 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -76,6 +76,7 @@ enum pwm_polarity {
76enum { 76enum {
77 PWMF_REQUESTED = 1 << 0, 77 PWMF_REQUESTED = 1 << 0,
78 PWMF_ENABLED = 1 << 1, 78 PWMF_ENABLED = 1 << 1,
79 PWMF_EXPORTED = 1 << 2,
79}; 80};
80 81
81struct pwm_device { 82struct pwm_device {
@@ -86,7 +87,9 @@ struct pwm_device {
86 struct pwm_chip *chip; 87 struct pwm_chip *chip;
87 void *chip_data; 88 void *chip_data;
88 89
89 unsigned int period; /* in nanoseconds */ 90 unsigned int period; /* in nanoseconds */
91 unsigned int duty_cycle; /* in nanoseconds */
92 enum pwm_polarity polarity;
90}; 93};
91 94
92static inline void pwm_set_period(struct pwm_device *pwm, unsigned int period) 95static inline void pwm_set_period(struct pwm_device *pwm, unsigned int period)
@@ -100,6 +103,17 @@ static inline unsigned int pwm_get_period(struct pwm_device *pwm)
100 return pwm ? pwm->period : 0; 103 return pwm ? pwm->period : 0;
101} 104}
102 105
106static inline void pwm_set_duty_cycle(struct pwm_device *pwm, unsigned int duty)
107{
108 if (pwm)
109 pwm->duty_cycle = duty;
110}
111
112static inline unsigned int pwm_get_duty_cycle(struct pwm_device *pwm)
113{
114 return pwm ? pwm->duty_cycle : 0;
115}
116
103/* 117/*
104 * pwm_set_polarity - configure the polarity of a PWM signal 118 * pwm_set_polarity - configure the polarity of a PWM signal
105 */ 119 */
@@ -278,4 +292,17 @@ static inline void pwm_add_table(struct pwm_lookup *table, size_t num)
278} 292}
279#endif 293#endif
280 294
295#ifdef CONFIG_PWM_SYSFS
296void pwmchip_sysfs_export(struct pwm_chip *chip);
297void pwmchip_sysfs_unexport(struct pwm_chip *chip);
298#else
299static inline void pwmchip_sysfs_export(struct pwm_chip *chip)
300{
301}
302
303static inline void pwmchip_sysfs_unexport(struct pwm_chip *chip)
304{
305}
306#endif /* CONFIG_PWM_SYSFS */
307
281#endif /* __LINUX_PWM_H */ 308#endif /* __LINUX_PWM_H */