aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2015-05-04 11:10:36 -0400
committerLinus Walleij <linus.walleij@linaro.org>2015-05-12 04:47:08 -0400
commitf0b7866a02370d9a03b0be497b9f88d982b8b67d (patch)
treeb739d3238b374d5e9b89676d01d1eefb442e659e /drivers/gpio
parent54d9acd7540995b06a47974e3d06da7f68df9d4a (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.c74
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,
275found: 259found:
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