diff options
author | Johan Hovold <johan@kernel.org> | 2015-05-04 11:10:36 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2015-05-12 04:47:08 -0400 |
commit | f0b7866a02370d9a03b0be497b9f88d982b8b67d (patch) | |
tree | b739d3238b374d5e9b89676d01d1eefb442e659e /drivers/gpio | |
parent | 54d9acd7540995b06a47974e3d06da7f68df9d4a (diff) |
gpio: sysfs: remove redundant export tests
The attribute operations will never be called for an unregistered device
so remove redundant checks for FLAG_EXPORT.
Note that kernfs will also guarantee that any active sysfs operation has
finished before the attribute is removed during deregistration.
Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/gpiolib-sysfs.c | 74 |
1 files changed, 23 insertions, 51 deletions
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index e4b079eec9bc..10baf31efe74 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c | |||
@@ -46,14 +46,10 @@ static ssize_t direction_show(struct device *dev, | |||
46 | 46 | ||
47 | mutex_lock(&sysfs_lock); | 47 | mutex_lock(&sysfs_lock); |
48 | 48 | ||
49 | if (!test_bit(FLAG_EXPORT, &desc->flags)) { | 49 | gpiod_get_direction(desc); |
50 | status = -EIO; | 50 | status = sprintf(buf, "%s\n", |
51 | } else { | ||
52 | gpiod_get_direction(desc); | ||
53 | status = sprintf(buf, "%s\n", | ||
54 | test_bit(FLAG_IS_OUT, &desc->flags) | 51 | test_bit(FLAG_IS_OUT, &desc->flags) |
55 | ? "out" : "in"); | 52 | ? "out" : "in"); |
56 | } | ||
57 | 53 | ||
58 | mutex_unlock(&sysfs_lock); | 54 | mutex_unlock(&sysfs_lock); |
59 | return status; | 55 | return status; |
@@ -67,9 +63,7 @@ static ssize_t direction_store(struct device *dev, | |||
67 | 63 | ||
68 | mutex_lock(&sysfs_lock); | 64 | mutex_lock(&sysfs_lock); |
69 | 65 | ||
70 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | 66 | if (sysfs_streq(buf, "high")) |
71 | status = -EIO; | ||
72 | else if (sysfs_streq(buf, "high")) | ||
73 | status = gpiod_direction_output_raw(desc, 1); | 67 | status = gpiod_direction_output_raw(desc, 1); |
74 | else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low")) | 68 | else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low")) |
75 | status = gpiod_direction_output_raw(desc, 0); | 69 | status = gpiod_direction_output_raw(desc, 0); |
@@ -91,10 +85,7 @@ static ssize_t value_show(struct device *dev, | |||
91 | 85 | ||
92 | mutex_lock(&sysfs_lock); | 86 | mutex_lock(&sysfs_lock); |
93 | 87 | ||
94 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | 88 | status = sprintf(buf, "%d\n", gpiod_get_value_cansleep(desc)); |
95 | status = -EIO; | ||
96 | else | ||
97 | status = sprintf(buf, "%d\n", gpiod_get_value_cansleep(desc)); | ||
98 | 89 | ||
99 | mutex_unlock(&sysfs_lock); | 90 | mutex_unlock(&sysfs_lock); |
100 | return status; | 91 | return status; |
@@ -108,11 +99,9 @@ static ssize_t value_store(struct device *dev, | |||
108 | 99 | ||
109 | mutex_lock(&sysfs_lock); | 100 | mutex_lock(&sysfs_lock); |
110 | 101 | ||
111 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | 102 | if (!test_bit(FLAG_IS_OUT, &desc->flags)) { |
112 | status = -EIO; | ||
113 | else if (!test_bit(FLAG_IS_OUT, &desc->flags)) | ||
114 | status = -EPERM; | 103 | status = -EPERM; |
115 | else { | 104 | } else { |
116 | long value; | 105 | long value; |
117 | 106 | ||
118 | status = kstrtol(buf, 0, &value); | 107 | status = kstrtol(buf, 0, &value); |
@@ -237,23 +226,18 @@ static ssize_t edge_show(struct device *dev, | |||
237 | struct device_attribute *attr, char *buf) | 226 | struct device_attribute *attr, char *buf) |
238 | { | 227 | { |
239 | const struct gpio_desc *desc = dev_get_drvdata(dev); | 228 | const struct gpio_desc *desc = dev_get_drvdata(dev); |
240 | ssize_t status; | 229 | unsigned long mask; |
230 | ssize_t status = 0; | ||
231 | int i; | ||
241 | 232 | ||
242 | mutex_lock(&sysfs_lock); | 233 | mutex_lock(&sysfs_lock); |
243 | 234 | ||
244 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | 235 | for (i = 0; i < ARRAY_SIZE(trigger_types); i++) { |
245 | status = -EIO; | 236 | mask = desc->flags & GPIO_TRIGGER_MASK; |
246 | else { | 237 | if (mask == trigger_types[i].flags) { |
247 | int i; | 238 | status = sprintf(buf, "%s\n", trigger_types[i].name); |
248 | 239 | break; | |
249 | status = 0; | 240 | } |
250 | for (i = 0; i < ARRAY_SIZE(trigger_types); i++) | ||
251 | if ((desc->flags & GPIO_TRIGGER_MASK) | ||
252 | == trigger_types[i].flags) { | ||
253 | status = sprintf(buf, "%s\n", | ||
254 | trigger_types[i].name); | ||
255 | break; | ||
256 | } | ||
257 | } | 241 | } |
258 | 242 | ||
259 | mutex_unlock(&sysfs_lock); | 243 | mutex_unlock(&sysfs_lock); |
@@ -275,13 +259,9 @@ static ssize_t edge_store(struct device *dev, | |||
275 | found: | 259 | found: |
276 | mutex_lock(&sysfs_lock); | 260 | mutex_lock(&sysfs_lock); |
277 | 261 | ||
278 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | 262 | status = gpio_setup_irq(desc, dev, trigger_types[i].flags); |
279 | status = -EIO; | 263 | if (!status) |
280 | else { | 264 | status = size; |
281 | status = gpio_setup_irq(desc, dev, trigger_types[i].flags); | ||
282 | if (!status) | ||
283 | status = size; | ||
284 | } | ||
285 | 265 | ||
286 | mutex_unlock(&sysfs_lock); | 266 | mutex_unlock(&sysfs_lock); |
287 | 267 | ||
@@ -322,10 +302,7 @@ static ssize_t active_low_show(struct device *dev, | |||
322 | 302 | ||
323 | mutex_lock(&sysfs_lock); | 303 | mutex_lock(&sysfs_lock); |
324 | 304 | ||
325 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | 305 | status = sprintf(buf, "%d\n", |
326 | status = -EIO; | ||
327 | else | ||
328 | status = sprintf(buf, "%d\n", | ||
329 | !!test_bit(FLAG_ACTIVE_LOW, &desc->flags)); | 306 | !!test_bit(FLAG_ACTIVE_LOW, &desc->flags)); |
330 | 307 | ||
331 | mutex_unlock(&sysfs_lock); | 308 | mutex_unlock(&sysfs_lock); |
@@ -338,18 +315,13 @@ static ssize_t active_low_store(struct device *dev, | |||
338 | { | 315 | { |
339 | struct gpio_desc *desc = dev_get_drvdata(dev); | 316 | struct gpio_desc *desc = dev_get_drvdata(dev); |
340 | ssize_t status; | 317 | ssize_t status; |
318 | long value; | ||
341 | 319 | ||
342 | mutex_lock(&sysfs_lock); | 320 | mutex_lock(&sysfs_lock); |
343 | 321 | ||
344 | if (!test_bit(FLAG_EXPORT, &desc->flags)) { | 322 | status = kstrtol(buf, 0, &value); |
345 | status = -EIO; | 323 | if (status == 0) |
346 | } else { | 324 | status = sysfs_set_active_low(desc, dev, value != 0); |
347 | long value; | ||
348 | |||
349 | status = kstrtol(buf, 0, &value); | ||
350 | if (status == 0) | ||
351 | status = sysfs_set_active_low(desc, dev, value != 0); | ||
352 | } | ||
353 | 325 | ||
354 | mutex_unlock(&sysfs_lock); | 326 | mutex_unlock(&sysfs_lock); |
355 | 327 | ||