|
13 | 13 | #include "gpiolib.h" |
14 | 14 | #include "gpiolib-sysfs.h" |
15 | 15 |
|
| 16 | +#define GPIO_IRQF_TRIGGER_NONE 0 |
16 | 17 | #define GPIO_IRQF_TRIGGER_FALLING BIT(0) |
17 | 18 | #define GPIO_IRQF_TRIGGER_RISING BIT(1) |
18 | 19 | #define GPIO_IRQF_TRIGGER_BOTH (GPIO_IRQF_TRIGGER_FALLING | \ |
@@ -218,54 +219,41 @@ static void gpio_sysfs_free_irq(struct device *dev) |
218 | 219 | sysfs_put(data->value_kn); |
219 | 220 | } |
220 | 221 |
|
221 | | -static const struct { |
222 | | - const char *name; |
223 | | - unsigned char flags; |
224 | | -} trigger_types[] = { |
225 | | - { "none", 0 }, |
226 | | - { "falling", GPIO_IRQF_TRIGGER_FALLING }, |
227 | | - { "rising", GPIO_IRQF_TRIGGER_RISING }, |
228 | | - { "both", GPIO_IRQF_TRIGGER_BOTH }, |
| 222 | +static const char * const trigger_names[] = { |
| 223 | + [GPIO_IRQF_TRIGGER_NONE] = "none", |
| 224 | + [GPIO_IRQF_TRIGGER_FALLING] = "falling", |
| 225 | + [GPIO_IRQF_TRIGGER_RISING] = "rising", |
| 226 | + [GPIO_IRQF_TRIGGER_BOTH] = "both", |
229 | 227 | }; |
230 | 228 |
|
231 | 229 | static ssize_t edge_show(struct device *dev, |
232 | 230 | struct device_attribute *attr, char *buf) |
233 | 231 | { |
234 | 232 | struct gpiod_data *data = dev_get_drvdata(dev); |
235 | | - int i; |
| 233 | + int flags; |
236 | 234 |
|
237 | 235 | mutex_lock(&data->mutex); |
238 | 236 |
|
239 | | - for (i = 0; i < ARRAY_SIZE(trigger_types); i++) { |
240 | | - if (data->irq_flags == trigger_types[i].flags) |
241 | | - break; |
242 | | - } |
| 237 | + flags = data->irq_flags; |
243 | 238 |
|
244 | 239 | mutex_unlock(&data->mutex); |
245 | 240 |
|
246 | | - if (i >= ARRAY_SIZE(trigger_types)) |
| 241 | + if (flags >= ARRAY_SIZE(trigger_names)) |
247 | 242 | return 0; |
248 | 243 |
|
249 | | - return sysfs_emit(buf, "%s\n", trigger_types[i].name); |
| 244 | + return sysfs_emit(buf, "%s\n", trigger_names[flags]); |
250 | 245 | } |
251 | 246 |
|
252 | 247 | static ssize_t edge_store(struct device *dev, |
253 | 248 | struct device_attribute *attr, const char *buf, size_t size) |
254 | 249 | { |
255 | 250 | struct gpiod_data *data = dev_get_drvdata(dev); |
256 | | - unsigned char flags; |
257 | 251 | ssize_t status = size; |
258 | | - int i; |
259 | | - |
260 | | - for (i = 0; i < ARRAY_SIZE(trigger_types); i++) { |
261 | | - if (sysfs_streq(trigger_types[i].name, buf)) |
262 | | - break; |
263 | | - } |
264 | | - |
265 | | - if (i == ARRAY_SIZE(trigger_types)) |
266 | | - return -EINVAL; |
| 252 | + int flags; |
267 | 253 |
|
268 | | - flags = trigger_types[i].flags; |
| 254 | + flags = sysfs_match_string(trigger_names, buf); |
| 255 | + if (flags < 0) |
| 256 | + return flags; |
269 | 257 |
|
270 | 258 | mutex_lock(&data->mutex); |
271 | 259 |
|
|
0 commit comments