gpiolib: sysfs: Simplify edge handling in the code
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 9 Feb 2022 11:31:17 +0000 (13:31 +0200)
committerBartosz Golaszewski <brgl@bgdev.pl>
Wed, 16 Feb 2022 15:03:08 +0000 (16:03 +0100)
Instead of keeping specific data structure for IRQ trigger types, switch
to array of trigger names and use index as a type.

The code is in maintenance mode and that array is not going to grow.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
drivers/gpio/gpiolib-sysfs.c

index 5f26bee..a34dc75 100644 (file)
@@ -13,6 +13,7 @@
 #include "gpiolib.h"
 #include "gpiolib-sysfs.h"
 
+#define GPIO_IRQF_TRIGGER_NONE         0
 #define GPIO_IRQF_TRIGGER_FALLING      BIT(0)
 #define GPIO_IRQF_TRIGGER_RISING       BIT(1)
 #define GPIO_IRQF_TRIGGER_BOTH         (GPIO_IRQF_TRIGGER_FALLING | \
@@ -218,54 +219,41 @@ static void gpio_sysfs_free_irq(struct device *dev)
        sysfs_put(data->value_kn);
 }
 
-static const struct {
-       const char *name;
-       unsigned char flags;
-} trigger_types[] = {
-       { "none",    0 },
-       { "falling", GPIO_IRQF_TRIGGER_FALLING },
-       { "rising",  GPIO_IRQF_TRIGGER_RISING },
-       { "both",    GPIO_IRQF_TRIGGER_BOTH },
+static const char * const trigger_names[] = {
+       [GPIO_IRQF_TRIGGER_NONE]        = "none",
+       [GPIO_IRQF_TRIGGER_FALLING]     = "falling",
+       [GPIO_IRQF_TRIGGER_RISING]      = "rising",
+       [GPIO_IRQF_TRIGGER_BOTH]        = "both",
 };
 
 static ssize_t edge_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
        struct gpiod_data *data = dev_get_drvdata(dev);
-       int i;
+       int flags;
 
        mutex_lock(&data->mutex);
 
-       for (i = 0; i < ARRAY_SIZE(trigger_types); i++) {
-               if (data->irq_flags == trigger_types[i].flags)
-                       break;
-       }
+       flags = data->irq_flags;
 
        mutex_unlock(&data->mutex);
 
-       if (i >= ARRAY_SIZE(trigger_types))
+       if (flags >= ARRAY_SIZE(trigger_names))
                return 0;
 
-       return sysfs_emit(buf, "%s\n", trigger_types[i].name);
+       return sysfs_emit(buf, "%s\n", trigger_names[flags]);
 }
 
 static ssize_t edge_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t size)
 {
        struct gpiod_data *data = dev_get_drvdata(dev);
-       unsigned char flags;
        ssize_t status = size;
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(trigger_types); i++) {
-               if (sysfs_streq(trigger_types[i].name, buf))
-                       break;
-       }
-
-       if (i == ARRAY_SIZE(trigger_types))
-               return -EINVAL;
+       int flags;
 
-       flags = trigger_types[i].flags;
+       flags = sysfs_match_string(trigger_names, buf);
+       if (flags < 0)
+               return flags;
 
        mutex_lock(&data->mutex);