Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * GPIO testing driver based on configfs.
4 *
5 * Copyright (C) 2021 Bartosz Golaszewski <brgl@bgdev.pl>
6 */
7
8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9
10#include <linux/array_size.h>
11#include <linux/bitmap.h>
12#include <linux/cleanup.h>
13#include <linux/configfs.h>
14#include <linux/device.h>
15#include <linux/err.h>
16#include <linux/gpio/consumer.h>
17#include <linux/gpio/driver.h>
18#include <linux/gpio/machine.h>
19#include <linux/idr.h>
20#include <linux/interrupt.h>
21#include <linux/irq.h>
22#include <linux/irq_sim.h>
23#include <linux/list.h>
24#include <linux/lockdep.h>
25#include <linux/minmax.h>
26#include <linux/mod_devicetable.h>
27#include <linux/module.h>
28#include <linux/mutex.h>
29#include <linux/notifier.h>
30#include <linux/platform_device.h>
31#include <linux/property.h>
32#include <linux/seq_file.h>
33#include <linux/slab.h>
34#include <linux/string.h>
35#include <linux/string_helpers.h>
36#include <linux/sysfs.h>
37#include <linux/types.h>
38
39#include "dev-sync-probe.h"
40
41#define GPIO_SIM_NGPIO_MAX 1024
42#define GPIO_SIM_PROP_MAX 5 /* Max 4 properties + sentinel. */
43#define GPIO_SIM_NUM_ATTRS 3 /* value, pull and sentinel */
44
45static DEFINE_IDA(gpio_sim_ida);
46
47struct gpio_sim_chip {
48 struct gpio_chip gc;
49 struct device *dev;
50 unsigned long *request_map;
51 unsigned long *direction_map;
52 unsigned long *value_map;
53 unsigned long *pull_map;
54 struct irq_domain *irq_sim;
55 struct mutex lock;
56 const struct attribute_group **attr_groups;
57};
58
59struct gpio_sim_attribute {
60 struct device_attribute dev_attr;
61 unsigned int offset;
62};
63
64static struct gpio_sim_attribute *
65to_gpio_sim_attr(struct device_attribute *dev_attr)
66{
67 return container_of(dev_attr, struct gpio_sim_attribute, dev_attr);
68}
69
70static int gpio_sim_apply_pull(struct gpio_sim_chip *chip,
71 unsigned int offset, int value)
72{
73 int irq, irq_type, ret;
74
75 guard(mutex)(&chip->lock);
76
77 if (test_bit(offset, chip->request_map) &&
78 test_bit(offset, chip->direction_map)) {
79 if (value == !!test_bit(offset, chip->value_map))
80 goto set_pull;
81
82 /*
83 * This is fine - it just means, nobody is listening
84 * for interrupts on this line, otherwise
85 * irq_create_mapping() would have been called from
86 * the to_irq() callback.
87 */
88 irq = irq_find_mapping(chip->irq_sim, offset);
89 if (!irq)
90 goto set_value;
91
92 irq_type = irq_get_trigger_type(irq);
93
94 if ((value && (irq_type & IRQ_TYPE_EDGE_RISING)) ||
95 (!value && (irq_type & IRQ_TYPE_EDGE_FALLING))) {
96 ret = irq_set_irqchip_state(irq, IRQCHIP_STATE_PENDING,
97 true);
98 if (ret)
99 goto set_pull;
100 }
101 }
102
103set_value:
104 /* Change the value unless we're actively driving the line. */
105 if (!test_bit(offset, chip->request_map) ||
106 test_bit(offset, chip->direction_map))
107 __assign_bit(offset, chip->value_map, value);
108
109set_pull:
110 __assign_bit(offset, chip->pull_map, value);
111 return 0;
112}
113
114static int gpio_sim_get(struct gpio_chip *gc, unsigned int offset)
115{
116 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
117
118 guard(mutex)(&chip->lock);
119
120 return !!test_bit(offset, chip->value_map);
121}
122
123static int gpio_sim_set(struct gpio_chip *gc, unsigned int offset, int value)
124{
125 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
126
127 scoped_guard(mutex, &chip->lock)
128 __assign_bit(offset, chip->value_map, value);
129
130 return 0;
131}
132
133static int gpio_sim_get_multiple(struct gpio_chip *gc,
134 unsigned long *mask, unsigned long *bits)
135{
136 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
137
138 scoped_guard(mutex, &chip->lock)
139 bitmap_replace(bits, bits, chip->value_map, mask, gc->ngpio);
140
141 return 0;
142}
143
144static int gpio_sim_set_multiple(struct gpio_chip *gc,
145 unsigned long *mask, unsigned long *bits)
146{
147 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
148
149 scoped_guard(mutex, &chip->lock)
150 bitmap_replace(chip->value_map, chip->value_map, bits, mask,
151 gc->ngpio);
152
153 return 0;
154}
155
156static int gpio_sim_direction_output(struct gpio_chip *gc,
157 unsigned int offset, int value)
158{
159 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
160
161 scoped_guard(mutex, &chip->lock) {
162 __clear_bit(offset, chip->direction_map);
163 __assign_bit(offset, chip->value_map, value);
164 }
165
166 return 0;
167}
168
169static int gpio_sim_direction_input(struct gpio_chip *gc, unsigned int offset)
170{
171 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
172
173 scoped_guard(mutex, &chip->lock)
174 __set_bit(offset, chip->direction_map);
175
176 return 0;
177}
178
179static int gpio_sim_get_direction(struct gpio_chip *gc, unsigned int offset)
180{
181 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
182 int direction;
183
184 scoped_guard(mutex, &chip->lock)
185 direction = !!test_bit(offset, chip->direction_map);
186
187 return direction ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
188}
189
190static int gpio_sim_set_config(struct gpio_chip *gc, unsigned int offset,
191 unsigned long config)
192{
193 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
194
195 switch (pinconf_to_config_param(config)) {
196 case PIN_CONFIG_BIAS_PULL_UP:
197 return gpio_sim_apply_pull(chip, offset, 1);
198 case PIN_CONFIG_BIAS_PULL_DOWN:
199 return gpio_sim_apply_pull(chip, offset, 0);
200 default:
201 break;
202 }
203
204 return -ENOTSUPP;
205}
206
207static int gpio_sim_to_irq(struct gpio_chip *gc, unsigned int offset)
208{
209 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
210
211 return irq_create_mapping(chip->irq_sim, offset);
212}
213
214static int gpio_sim_request(struct gpio_chip *gc, unsigned int offset)
215{
216 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
217
218 scoped_guard(mutex, &chip->lock)
219 __set_bit(offset, chip->request_map);
220
221 return 0;
222}
223
224static void gpio_sim_free(struct gpio_chip *gc, unsigned int offset)
225{
226 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
227
228 scoped_guard(mutex, &chip->lock) {
229 __assign_bit(offset, chip->value_map,
230 !!test_bit(offset, chip->pull_map));
231 __clear_bit(offset, chip->request_map);
232 }
233}
234
235static int gpio_sim_irq_requested(struct irq_domain *domain,
236 irq_hw_number_t hwirq, void *data)
237{
238 struct gpio_sim_chip *chip = data;
239
240 return gpiochip_lock_as_irq(&chip->gc, hwirq);
241}
242
243static void gpio_sim_irq_released(struct irq_domain *domain,
244 irq_hw_number_t hwirq, void *data)
245{
246 struct gpio_sim_chip *chip = data;
247
248 gpiochip_unlock_as_irq(&chip->gc, hwirq);
249}
250
251static const struct irq_sim_ops gpio_sim_irq_sim_ops = {
252 .irq_sim_irq_requested = gpio_sim_irq_requested,
253 .irq_sim_irq_released = gpio_sim_irq_released,
254};
255
256static void gpio_sim_dbg_show(struct seq_file *seq, struct gpio_chip *gc)
257{
258 struct gpio_sim_chip *chip = gpiochip_get_data(gc);
259 const char *label;
260 int i;
261
262 guard(mutex)(&chip->lock);
263
264 for_each_hwgpio(gc, i, label)
265 seq_printf(seq, " gpio-%-3d (%s) %s,%s\n", i,
266 label ?: "<unused>",
267 test_bit(i, chip->direction_map) ? "input" :
268 test_bit(i, chip->value_map) ? "output-high" :
269 "output-low",
270 test_bit(i, chip->pull_map) ? "pull-up" :
271 "pull-down");
272}
273
274static ssize_t gpio_sim_sysfs_val_show(struct device *dev,
275 struct device_attribute *attr, char *buf)
276{
277 struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
278 struct gpio_sim_chip *chip = dev_get_drvdata(dev);
279 int val;
280
281 scoped_guard(mutex, &chip->lock)
282 val = !!test_bit(line_attr->offset, chip->value_map);
283
284 return sysfs_emit(buf, "%d\n", val);
285}
286
287static ssize_t gpio_sim_sysfs_val_store(struct device *dev,
288 struct device_attribute *attr,
289 const char *buf, size_t count)
290{
291 /*
292 * Not assigning this function will result in write() returning -EIO
293 * which is confusing. Return -EPERM explicitly.
294 */
295 return -EPERM;
296}
297
298static const char *const gpio_sim_sysfs_pull_strings[] = {
299 [0] = "pull-down",
300 [1] = "pull-up",
301};
302
303static ssize_t gpio_sim_sysfs_pull_show(struct device *dev,
304 struct device_attribute *attr,
305 char *buf)
306{
307 struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
308 struct gpio_sim_chip *chip = dev_get_drvdata(dev);
309 int pull;
310
311 scoped_guard(mutex, &chip->lock)
312 pull = !!test_bit(line_attr->offset, chip->pull_map);
313
314 return sysfs_emit(buf, "%s\n", gpio_sim_sysfs_pull_strings[pull]);
315}
316
317static ssize_t gpio_sim_sysfs_pull_store(struct device *dev,
318 struct device_attribute *attr,
319 const char *buf, size_t len)
320{
321 struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
322 struct gpio_sim_chip *chip = dev_get_drvdata(dev);
323 int ret, pull;
324
325 pull = sysfs_match_string(gpio_sim_sysfs_pull_strings, buf);
326 if (pull < 0)
327 return pull;
328
329 ret = gpio_sim_apply_pull(chip, line_attr->offset, pull);
330 if (ret)
331 return ret;
332
333 return len;
334}
335
336static void gpio_sim_put_device(void *data)
337{
338 struct device *dev = data;
339
340 put_device(dev);
341}
342
343static void gpio_sim_dispose_mappings(void *data)
344{
345 struct gpio_sim_chip *chip = data;
346 unsigned int i;
347
348 for (i = 0; i < chip->gc.ngpio; i++)
349 irq_dispose_mapping(irq_find_mapping(chip->irq_sim, i));
350}
351
352static void gpio_sim_sysfs_remove(void *data)
353{
354 struct gpio_sim_chip *chip = data;
355
356 sysfs_remove_groups(&chip->dev->kobj, chip->attr_groups);
357}
358
359static int gpio_sim_setup_sysfs(struct gpio_sim_chip *chip)
360{
361 struct device_attribute *val_dev_attr, *pull_dev_attr;
362 struct gpio_sim_attribute *val_attr, *pull_attr;
363 unsigned int num_lines = chip->gc.ngpio;
364 struct device *dev = chip->gc.parent;
365 struct attribute_group *attr_group;
366 struct attribute **attrs;
367 int i, ret;
368
369 chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups),
370 num_lines + 1, GFP_KERNEL);
371 if (!chip->attr_groups)
372 return -ENOMEM;
373
374 for (i = 0; i < num_lines; i++) {
375 attr_group = devm_kzalloc(dev, sizeof(*attr_group), GFP_KERNEL);
376 attrs = devm_kcalloc(dev, GPIO_SIM_NUM_ATTRS, sizeof(*attrs),
377 GFP_KERNEL);
378 val_attr = devm_kzalloc(dev, sizeof(*val_attr), GFP_KERNEL);
379 pull_attr = devm_kzalloc(dev, sizeof(*pull_attr), GFP_KERNEL);
380 if (!attr_group || !attrs || !val_attr || !pull_attr)
381 return -ENOMEM;
382
383 attr_group->name = devm_kasprintf(dev, GFP_KERNEL,
384 "sim_gpio%u", i);
385 if (!attr_group->name)
386 return -ENOMEM;
387
388 val_attr->offset = pull_attr->offset = i;
389
390 val_dev_attr = &val_attr->dev_attr;
391 pull_dev_attr = &pull_attr->dev_attr;
392
393 sysfs_attr_init(&val_dev_attr->attr);
394 sysfs_attr_init(&pull_dev_attr->attr);
395
396 val_dev_attr->attr.name = "value";
397 pull_dev_attr->attr.name = "pull";
398
399 val_dev_attr->attr.mode = pull_dev_attr->attr.mode = 0644;
400
401 val_dev_attr->show = gpio_sim_sysfs_val_show;
402 val_dev_attr->store = gpio_sim_sysfs_val_store;
403 pull_dev_attr->show = gpio_sim_sysfs_pull_show;
404 pull_dev_attr->store = gpio_sim_sysfs_pull_store;
405
406 attrs[0] = &val_dev_attr->attr;
407 attrs[1] = &pull_dev_attr->attr;
408
409 attr_group->attrs = attrs;
410 chip->attr_groups[i] = attr_group;
411 }
412
413 ret = sysfs_create_groups(&chip->dev->kobj, chip->attr_groups);
414 if (ret)
415 return ret;
416
417 return devm_add_action_or_reset(dev, gpio_sim_sysfs_remove, chip);
418}
419
420static int gpio_sim_add_bank(struct fwnode_handle *swnode, struct device *dev)
421{
422 struct gpio_sim_chip *chip;
423 struct gpio_chip *gc;
424 const char *label;
425 u32 num_lines;
426 int ret;
427
428 ret = fwnode_property_read_u32(swnode, "ngpios", &num_lines);
429 if (ret)
430 return ret;
431
432 if (num_lines > GPIO_SIM_NGPIO_MAX)
433 return -ERANGE;
434
435 ret = fwnode_property_read_string(swnode, "gpio-sim,label", &label);
436 if (ret) {
437 label = devm_kasprintf(dev, GFP_KERNEL, "%s:%pfwP",
438 dev_name(dev), swnode);
439 if (!label)
440 return -ENOMEM;
441 }
442
443 chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
444 if (!chip)
445 return -ENOMEM;
446
447 chip->request_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL);
448 if (!chip->request_map)
449 return -ENOMEM;
450
451 chip->direction_map = devm_bitmap_alloc(dev, num_lines, GFP_KERNEL);
452 if (!chip->direction_map)
453 return -ENOMEM;
454
455 /* Default to input mode. */
456 bitmap_fill(chip->direction_map, num_lines);
457
458 chip->value_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL);
459 if (!chip->value_map)
460 return -ENOMEM;
461
462 chip->pull_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL);
463 if (!chip->pull_map)
464 return -ENOMEM;
465
466 chip->irq_sim = devm_irq_domain_create_sim_full(dev, swnode, num_lines,
467 &gpio_sim_irq_sim_ops,
468 chip);
469 if (IS_ERR(chip->irq_sim))
470 return PTR_ERR(chip->irq_sim);
471
472 ret = devm_add_action_or_reset(dev, gpio_sim_dispose_mappings, chip);
473 if (ret)
474 return ret;
475
476 ret = devm_mutex_init(dev, &chip->lock);
477 if (ret)
478 return ret;
479
480 gc = &chip->gc;
481 gc->base = -1;
482 gc->ngpio = num_lines;
483 gc->label = label;
484 gc->owner = THIS_MODULE;
485 gc->parent = dev;
486 gc->fwnode = swnode;
487 gc->get = gpio_sim_get;
488 gc->set = gpio_sim_set;
489 gc->get_multiple = gpio_sim_get_multiple;
490 gc->set_multiple = gpio_sim_set_multiple;
491 gc->direction_output = gpio_sim_direction_output;
492 gc->direction_input = gpio_sim_direction_input;
493 gc->get_direction = gpio_sim_get_direction;
494 gc->set_config = gpio_sim_set_config;
495 gc->to_irq = gpio_sim_to_irq;
496 gc->request = gpio_sim_request;
497 gc->free = gpio_sim_free;
498 gc->dbg_show = PTR_IF(IS_ENABLED(CONFIG_DEBUG_FS), gpio_sim_dbg_show);
499 gc->can_sleep = true;
500
501 ret = devm_gpiochip_add_data(dev, gc, chip);
502 if (ret)
503 return ret;
504
505 chip->dev = device_find_child(dev, swnode, device_match_fwnode);
506 if (!chip->dev)
507 return -ENODEV;
508
509 ret = devm_add_action_or_reset(dev, gpio_sim_put_device, chip->dev);
510 if (ret)
511 return ret;
512
513 /* Used by sysfs callbacks. */
514 dev_set_drvdata(chip->dev, chip);
515
516 return gpio_sim_setup_sysfs(chip);
517}
518
519static int gpio_sim_probe(struct platform_device *pdev)
520{
521 struct device *dev = &pdev->dev;
522 int ret;
523
524 device_for_each_child_node_scoped(dev, swnode) {
525 ret = gpio_sim_add_bank(swnode, dev);
526 if (ret)
527 return ret;
528 }
529
530 return 0;
531}
532
533static const struct of_device_id gpio_sim_of_match[] = {
534 { .compatible = "gpio-simulator" },
535 { }
536};
537MODULE_DEVICE_TABLE(of, gpio_sim_of_match);
538
539static struct platform_driver gpio_sim_driver = {
540 .driver = {
541 .name = "gpio-sim",
542 .of_match_table = gpio_sim_of_match,
543 },
544 .probe = gpio_sim_probe,
545};
546
547struct gpio_sim_device {
548 struct dev_sync_probe_data probe_data;
549 struct config_group group;
550
551 int id;
552
553 /*
554 * Each configfs filesystem operation is protected with the subsystem
555 * mutex. Each separate attribute is protected with the buffer mutex.
556 * This structure however can be modified by callbacks of different
557 * attributes so we need another lock.
558 *
559 * We use this lock for protecting all data structures owned by this
560 * object too.
561 */
562 struct mutex lock;
563
564 struct gpiod_hog *hogs;
565
566 struct list_head bank_list;
567};
568
569static struct gpio_sim_device *to_gpio_sim_device(struct config_item *item)
570{
571 struct config_group *group = to_config_group(item);
572
573 return container_of(group, struct gpio_sim_device, group);
574}
575
576struct gpio_sim_bank {
577 struct config_group group;
578
579 /*
580 * We could have used the ci_parent field of the config_item but
581 * configfs is stupid and calls the item's release callback after
582 * already having cleared the parent pointer even though the parent
583 * is guaranteed to survive the child...
584 *
585 * So we need to store the pointer to the parent struct here. We can
586 * dereference it anywhere we need with no checks and no locking as
587 * it's guaranteed to survive the children and protected by configfs
588 * locks.
589 *
590 * Same for other structures.
591 */
592 struct gpio_sim_device *parent;
593 struct list_head siblings;
594
595 char *label;
596 unsigned int num_lines;
597
598 struct list_head line_list;
599
600 struct fwnode_handle *swnode;
601};
602
603static struct gpio_sim_bank *to_gpio_sim_bank(struct config_item *item)
604{
605 struct config_group *group = to_config_group(item);
606
607 return container_of(group, struct gpio_sim_bank, group);
608}
609
610static bool gpio_sim_bank_has_label(struct gpio_sim_bank *bank)
611{
612 return bank->label && *bank->label;
613}
614
615static struct gpio_sim_device *
616gpio_sim_bank_get_device(struct gpio_sim_bank *bank)
617{
618 return bank->parent;
619}
620
621struct gpio_sim_hog;
622
623struct gpio_sim_line {
624 struct config_group group;
625
626 struct gpio_sim_bank *parent;
627 struct list_head siblings;
628
629 unsigned int offset;
630 char *name;
631 bool valid;
632
633 /* There can only be one hog per line. */
634 struct gpio_sim_hog *hog;
635};
636
637static struct gpio_sim_line *to_gpio_sim_line(struct config_item *item)
638{
639 struct config_group *group = to_config_group(item);
640
641 return container_of(group, struct gpio_sim_line, group);
642}
643
644static struct gpio_sim_device *
645gpio_sim_line_get_device(struct gpio_sim_line *line)
646{
647 struct gpio_sim_bank *bank = line->parent;
648
649 return gpio_sim_bank_get_device(bank);
650}
651
652struct gpio_sim_hog {
653 struct config_item item;
654 struct gpio_sim_line *parent;
655
656 char *name;
657 int dir;
658};
659
660static struct gpio_sim_hog *to_gpio_sim_hog(struct config_item *item)
661{
662 return container_of(item, struct gpio_sim_hog, item);
663}
664
665static struct gpio_sim_device *gpio_sim_hog_get_device(struct gpio_sim_hog *hog)
666{
667 struct gpio_sim_line *line = hog->parent;
668
669 return gpio_sim_line_get_device(line);
670}
671
672static bool gpio_sim_device_is_live(struct gpio_sim_device *dev)
673{
674 lockdep_assert_held(&dev->lock);
675
676 return !!dev->probe_data.pdev;
677}
678
679static char *gpio_sim_strdup_trimmed(const char *str, size_t count)
680{
681 char *trimmed;
682
683 trimmed = kstrndup(skip_spaces(str), count, GFP_KERNEL);
684 if (!trimmed)
685 return NULL;
686
687 return strim(trimmed);
688}
689
690static ssize_t gpio_sim_device_config_dev_name_show(struct config_item *item,
691 char *page)
692{
693 struct gpio_sim_device *dev = to_gpio_sim_device(item);
694 struct platform_device *pdev;
695
696 guard(mutex)(&dev->lock);
697
698 pdev = dev->probe_data.pdev;
699 if (pdev)
700 return sprintf(page, "%s\n", dev_name(&pdev->dev));
701
702 return sprintf(page, "gpio-sim.%d\n", dev->id);
703}
704
705CONFIGFS_ATTR_RO(gpio_sim_device_config_, dev_name);
706
707static ssize_t
708gpio_sim_device_config_live_show(struct config_item *item, char *page)
709{
710 struct gpio_sim_device *dev = to_gpio_sim_device(item);
711 bool live;
712
713 scoped_guard(mutex, &dev->lock)
714 live = gpio_sim_device_is_live(dev);
715
716 return sprintf(page, "%c\n", live ? '1' : '0');
717}
718
719static unsigned int gpio_sim_get_line_names_size(struct gpio_sim_bank *bank)
720{
721 struct gpio_sim_line *line;
722 unsigned int size = 0;
723
724 list_for_each_entry(line, &bank->line_list, siblings) {
725 if (!line->name || (line->offset >= bank->num_lines))
726 continue;
727
728 size = max(size, line->offset + 1);
729 }
730
731 return size;
732}
733
734static void
735gpio_sim_set_line_names(struct gpio_sim_bank *bank, char **line_names)
736{
737 struct gpio_sim_line *line;
738
739 list_for_each_entry(line, &bank->line_list, siblings) {
740 if (!line->name || (line->offset >= bank->num_lines))
741 continue;
742
743 line_names[line->offset] = line->name;
744 }
745}
746
747static unsigned int gpio_sim_get_reserved_ranges_size(struct gpio_sim_bank *bank)
748{
749 struct gpio_sim_line *line;
750 unsigned int size = 0;
751
752 list_for_each_entry(line, &bank->line_list, siblings) {
753 if (line->valid)
754 continue;
755
756 size += 2;
757 }
758
759 return size;
760}
761
762static void gpio_sim_set_reserved_ranges(struct gpio_sim_bank *bank,
763 u32 *ranges)
764{
765 struct gpio_sim_line *line;
766 int i = 0;
767
768 list_for_each_entry(line, &bank->line_list, siblings) {
769 if (line->valid)
770 continue;
771
772 ranges[i++] = line->offset;
773 ranges[i++] = 1;
774 }
775}
776
777static void gpio_sim_remove_hogs(struct gpio_sim_device *dev)
778{
779 struct gpiod_hog *hog;
780
781 if (!dev->hogs)
782 return;
783
784 gpiod_remove_hogs(dev->hogs);
785
786 for (hog = dev->hogs; hog->chip_label; hog++) {
787 kfree(hog->chip_label);
788 kfree(hog->line_name);
789 }
790
791 kfree(dev->hogs);
792 dev->hogs = NULL;
793}
794
795static int gpio_sim_add_hogs(struct gpio_sim_device *dev)
796{
797 unsigned int num_hogs = 0, idx = 0;
798 struct gpio_sim_bank *bank;
799 struct gpio_sim_line *line;
800 struct gpiod_hog *hog;
801
802 list_for_each_entry(bank, &dev->bank_list, siblings) {
803 list_for_each_entry(line, &bank->line_list, siblings) {
804 if (line->offset >= bank->num_lines)
805 continue;
806
807 if (line->hog)
808 num_hogs++;
809 }
810 }
811
812 if (!num_hogs)
813 return 0;
814
815 /* Allocate one more for the sentinel. */
816 dev->hogs = kcalloc(num_hogs + 1, sizeof(*dev->hogs), GFP_KERNEL);
817 if (!dev->hogs)
818 return -ENOMEM;
819
820 list_for_each_entry(bank, &dev->bank_list, siblings) {
821 list_for_each_entry(line, &bank->line_list, siblings) {
822 if (line->offset >= bank->num_lines)
823 continue;
824
825 if (!line->hog)
826 continue;
827
828 hog = &dev->hogs[idx++];
829
830 /*
831 * We need to make this string manually because at this
832 * point the device doesn't exist yet and so dev_name()
833 * is not available.
834 */
835 if (gpio_sim_bank_has_label(bank))
836 hog->chip_label = kstrdup(bank->label,
837 GFP_KERNEL);
838 else
839 hog->chip_label = kasprintf(GFP_KERNEL,
840 "gpio-sim.%u:%pfwP",
841 dev->id,
842 bank->swnode);
843 if (!hog->chip_label) {
844 gpio_sim_remove_hogs(dev);
845 return -ENOMEM;
846 }
847
848 /*
849 * We need to duplicate this because the hog config
850 * item can be removed at any time (and we can't block
851 * it) and gpiolib doesn't make a deep copy of the hog
852 * data.
853 */
854 if (line->hog->name) {
855 hog->line_name = kstrdup(line->hog->name,
856 GFP_KERNEL);
857 if (!hog->line_name) {
858 gpio_sim_remove_hogs(dev);
859 return -ENOMEM;
860 }
861 }
862
863 hog->chip_hwnum = line->offset;
864 hog->dflags = line->hog->dir;
865 }
866 }
867
868 gpiod_add_hogs(dev->hogs);
869
870 return 0;
871}
872
873static struct fwnode_handle *
874gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank,
875 struct fwnode_handle *parent)
876{
877 unsigned int prop_idx = 0, line_names_size, ranges_size;
878 struct property_entry properties[GPIO_SIM_PROP_MAX];
879 char **line_names __free(kfree) = NULL;
880 u32 *ranges __free(kfree) = NULL;
881
882 memset(properties, 0, sizeof(properties));
883
884 properties[prop_idx++] = PROPERTY_ENTRY_U32("ngpios", bank->num_lines);
885
886 if (gpio_sim_bank_has_label(bank))
887 properties[prop_idx++] = PROPERTY_ENTRY_STRING("gpio-sim,label",
888 bank->label);
889
890 line_names_size = gpio_sim_get_line_names_size(bank);
891 if (line_names_size) {
892 line_names = kcalloc(line_names_size, sizeof(*line_names),
893 GFP_KERNEL);
894 if (!line_names)
895 return ERR_PTR(-ENOMEM);
896
897 gpio_sim_set_line_names(bank, line_names);
898
899 properties[prop_idx++] = PROPERTY_ENTRY_STRING_ARRAY_LEN(
900 "gpio-line-names",
901 line_names, line_names_size);
902 }
903
904 ranges_size = gpio_sim_get_reserved_ranges_size(bank);
905 if (ranges_size) {
906 ranges = kcalloc(ranges_size, sizeof(u32), GFP_KERNEL);
907 if (!ranges)
908 return ERR_PTR(-ENOMEM);
909
910 gpio_sim_set_reserved_ranges(bank, ranges);
911
912 properties[prop_idx++] = PROPERTY_ENTRY_U32_ARRAY_LEN(
913 "gpio-reserved-ranges",
914 ranges, ranges_size);
915 }
916
917 return fwnode_create_software_node(properties, parent);
918}
919
920static void gpio_sim_remove_swnode_recursive(struct fwnode_handle *swnode)
921{
922 struct fwnode_handle *child;
923
924 fwnode_for_each_child_node(swnode, child)
925 fwnode_remove_software_node(child);
926
927 fwnode_remove_software_node(swnode);
928}
929
930static bool gpio_sim_bank_labels_non_unique(struct gpio_sim_device *dev)
931{
932 struct gpio_sim_bank *this, *pos;
933
934 list_for_each_entry(this, &dev->bank_list, siblings) {
935 list_for_each_entry(pos, &dev->bank_list, siblings) {
936 if (this == pos || (!this->label || !pos->label))
937 continue;
938
939 if (strcmp(this->label, pos->label) == 0)
940 return true;
941 }
942 }
943
944 return false;
945}
946
947static int gpio_sim_device_activate(struct gpio_sim_device *dev)
948{
949 struct platform_device_info pdevinfo;
950 struct fwnode_handle *swnode;
951 struct gpio_sim_bank *bank;
952 int ret;
953
954 lockdep_assert_held(&dev->lock);
955
956 if (list_empty(&dev->bank_list))
957 return -ENODATA;
958
959 /*
960 * Non-unique GPIO device labels are a corner-case we don't support
961 * as it would interfere with machine hogging mechanism and has little
962 * use in real life.
963 */
964 if (gpio_sim_bank_labels_non_unique(dev))
965 return -EINVAL;
966
967 memset(&pdevinfo, 0, sizeof(pdevinfo));
968
969 swnode = fwnode_create_software_node(NULL, NULL);
970 if (IS_ERR(swnode))
971 return PTR_ERR(swnode);
972
973 list_for_each_entry(bank, &dev->bank_list, siblings) {
974 bank->swnode = gpio_sim_make_bank_swnode(bank, swnode);
975 if (IS_ERR(bank->swnode)) {
976 ret = PTR_ERR(bank->swnode);
977 gpio_sim_remove_swnode_recursive(swnode);
978 return ret;
979 }
980 }
981
982 ret = gpio_sim_add_hogs(dev);
983 if (ret) {
984 gpio_sim_remove_swnode_recursive(swnode);
985 return ret;
986 }
987
988 pdevinfo.name = "gpio-sim";
989 pdevinfo.fwnode = swnode;
990 pdevinfo.id = dev->id;
991
992 ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo);
993 if (ret) {
994 gpio_sim_remove_hogs(dev);
995 gpio_sim_remove_swnode_recursive(swnode);
996 return ret;
997 }
998
999 return 0;
1000}
1001
1002static void gpio_sim_device_deactivate(struct gpio_sim_device *dev)
1003{
1004 struct fwnode_handle *swnode;
1005
1006 lockdep_assert_held(&dev->lock);
1007
1008 swnode = dev_fwnode(&dev->probe_data.pdev->dev);
1009 dev_sync_probe_unregister(&dev->probe_data);
1010 gpio_sim_remove_hogs(dev);
1011 gpio_sim_remove_swnode_recursive(swnode);
1012}
1013
1014static void
1015gpio_sim_device_lockup_configfs(struct gpio_sim_device *dev, bool lock)
1016{
1017 struct configfs_subsystem *subsys = dev->group.cg_subsys;
1018 struct gpio_sim_bank *bank;
1019 struct gpio_sim_line *line;
1020 struct config_item *item;
1021
1022 /*
1023 * The device only needs to depend on leaf entries. This is
1024 * sufficient to lock up all the configfs entries that the
1025 * instantiated, alive device depends on.
1026 */
1027 list_for_each_entry(bank, &dev->bank_list, siblings) {
1028 list_for_each_entry(line, &bank->line_list, siblings) {
1029 item = line->hog ? &line->hog->item
1030 : &line->group.cg_item;
1031
1032 if (lock)
1033 WARN_ON(configfs_depend_item_unlocked(subsys,
1034 item));
1035 else
1036 configfs_undepend_item_unlocked(item);
1037 }
1038 }
1039}
1040
1041static ssize_t
1042gpio_sim_device_config_live_store(struct config_item *item,
1043 const char *page, size_t count)
1044{
1045 struct gpio_sim_device *dev = to_gpio_sim_device(item);
1046 bool live;
1047 int ret;
1048
1049 ret = kstrtobool(page, &live);
1050 if (ret)
1051 return ret;
1052
1053 if (live)
1054 gpio_sim_device_lockup_configfs(dev, true);
1055
1056 scoped_guard(mutex, &dev->lock) {
1057 if (live == gpio_sim_device_is_live(dev))
1058 ret = -EPERM;
1059 else if (live)
1060 ret = gpio_sim_device_activate(dev);
1061 else
1062 gpio_sim_device_deactivate(dev);
1063 }
1064
1065 /*
1066 * Undepend is required only if device disablement (live == 0)
1067 * succeeds or if device enablement (live == 1) fails.
1068 */
1069 if (live == !!ret)
1070 gpio_sim_device_lockup_configfs(dev, false);
1071
1072 return ret ?: count;
1073}
1074
1075CONFIGFS_ATTR(gpio_sim_device_config_, live);
1076
1077static struct configfs_attribute *gpio_sim_device_config_attrs[] = {
1078 &gpio_sim_device_config_attr_dev_name,
1079 &gpio_sim_device_config_attr_live,
1080 NULL
1081};
1082
1083struct gpio_sim_chip_name_ctx {
1084 struct fwnode_handle *swnode;
1085 char *page;
1086};
1087
1088static int gpio_sim_emit_chip_name(struct device *dev, void *data)
1089{
1090 struct gpio_sim_chip_name_ctx *ctx = data;
1091
1092 /* This would be the sysfs device exported in /sys/class/gpio. */
1093 if (dev->class)
1094 return 0;
1095
1096 if (device_match_fwnode(dev, ctx->swnode))
1097 return sprintf(ctx->page, "%s\n", dev_name(dev));
1098
1099 return 0;
1100}
1101
1102static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item,
1103 char *page)
1104{
1105 struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1106 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1107 struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page };
1108
1109 guard(mutex)(&dev->lock);
1110
1111 if (gpio_sim_device_is_live(dev))
1112 return device_for_each_child(&dev->probe_data.pdev->dev, &ctx,
1113 gpio_sim_emit_chip_name);
1114
1115 return sprintf(page, "none\n");
1116}
1117
1118CONFIGFS_ATTR_RO(gpio_sim_bank_config_, chip_name);
1119
1120static ssize_t
1121gpio_sim_bank_config_label_show(struct config_item *item, char *page)
1122{
1123 struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1124 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1125
1126 guard(mutex)(&dev->lock);
1127
1128 return sprintf(page, "%s\n", bank->label ?: "");
1129}
1130
1131static ssize_t gpio_sim_bank_config_label_store(struct config_item *item,
1132 const char *page, size_t count)
1133{
1134 struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1135 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1136 char *trimmed;
1137
1138 guard(mutex)(&dev->lock);
1139
1140 if (gpio_sim_device_is_live(dev))
1141 return -EBUSY;
1142
1143 trimmed = gpio_sim_strdup_trimmed(page, count);
1144 if (!trimmed)
1145 return -ENOMEM;
1146
1147 kfree(bank->label);
1148 bank->label = trimmed;
1149
1150 return count;
1151}
1152
1153CONFIGFS_ATTR(gpio_sim_bank_config_, label);
1154
1155static ssize_t
1156gpio_sim_bank_config_num_lines_show(struct config_item *item, char *page)
1157{
1158 struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1159 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1160
1161 guard(mutex)(&dev->lock);
1162
1163 return sprintf(page, "%u\n", bank->num_lines);
1164}
1165
1166static ssize_t
1167gpio_sim_bank_config_num_lines_store(struct config_item *item,
1168 const char *page, size_t count)
1169{
1170 struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1171 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1172 unsigned int num_lines;
1173 int ret;
1174
1175 ret = kstrtouint(page, 0, &num_lines);
1176 if (ret)
1177 return ret;
1178
1179 if (num_lines == 0)
1180 return -EINVAL;
1181
1182 guard(mutex)(&dev->lock);
1183
1184 if (gpio_sim_device_is_live(dev))
1185 return -EBUSY;
1186
1187 bank->num_lines = num_lines;
1188
1189 return count;
1190}
1191
1192CONFIGFS_ATTR(gpio_sim_bank_config_, num_lines);
1193
1194static struct configfs_attribute *gpio_sim_bank_config_attrs[] = {
1195 &gpio_sim_bank_config_attr_chip_name,
1196 &gpio_sim_bank_config_attr_label,
1197 &gpio_sim_bank_config_attr_num_lines,
1198 NULL
1199};
1200
1201static ssize_t
1202gpio_sim_line_config_name_show(struct config_item *item, char *page)
1203{
1204 struct gpio_sim_line *line = to_gpio_sim_line(item);
1205 struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1206
1207 guard(mutex)(&dev->lock);
1208
1209 return sprintf(page, "%s\n", line->name ?: "");
1210}
1211
1212static ssize_t gpio_sim_line_config_name_store(struct config_item *item,
1213 const char *page, size_t count)
1214{
1215 struct gpio_sim_line *line = to_gpio_sim_line(item);
1216 struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1217 char *trimmed;
1218
1219 guard(mutex)(&dev->lock);
1220
1221 if (gpio_sim_device_is_live(dev))
1222 return -EBUSY;
1223
1224 trimmed = gpio_sim_strdup_trimmed(page, count);
1225 if (!trimmed)
1226 return -ENOMEM;
1227
1228 kfree(line->name);
1229 line->name = trimmed;
1230
1231 return count;
1232}
1233
1234CONFIGFS_ATTR(gpio_sim_line_config_, name);
1235
1236static ssize_t
1237gpio_sim_line_config_valid_show(struct config_item *item, char *page)
1238{
1239 struct gpio_sim_line *line = to_gpio_sim_line(item);
1240 struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1241
1242 guard(mutex)(&dev->lock);
1243
1244 return sprintf(page, "%c\n", line->valid ? '1' : '0');
1245}
1246
1247static ssize_t gpio_sim_line_config_valid_store(struct config_item *item,
1248 const char *page, size_t count)
1249{
1250 struct gpio_sim_line *line = to_gpio_sim_line(item);
1251 struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1252 bool valid;
1253 int ret;
1254
1255 ret = kstrtobool(page, &valid);
1256 if (ret)
1257 return ret;
1258
1259 guard(mutex)(&dev->lock);
1260
1261 line->valid = valid;
1262
1263 return count;
1264}
1265
1266CONFIGFS_ATTR(gpio_sim_line_config_, valid);
1267
1268static struct configfs_attribute *gpio_sim_line_config_attrs[] = {
1269 &gpio_sim_line_config_attr_name,
1270 &gpio_sim_line_config_attr_valid,
1271 NULL
1272};
1273
1274static ssize_t gpio_sim_hog_config_name_show(struct config_item *item,
1275 char *page)
1276{
1277 struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1278 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1279
1280 guard(mutex)(&dev->lock);
1281
1282 return sprintf(page, "%s\n", hog->name ?: "");
1283}
1284
1285static ssize_t gpio_sim_hog_config_name_store(struct config_item *item,
1286 const char *page, size_t count)
1287{
1288 struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1289 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1290 char *trimmed;
1291
1292 guard(mutex)(&dev->lock);
1293
1294 if (gpio_sim_device_is_live(dev))
1295 return -EBUSY;
1296
1297 trimmed = gpio_sim_strdup_trimmed(page, count);
1298 if (!trimmed)
1299 return -ENOMEM;
1300
1301 kfree(hog->name);
1302 hog->name = trimmed;
1303
1304 return count;
1305}
1306
1307CONFIGFS_ATTR(gpio_sim_hog_config_, name);
1308
1309static ssize_t gpio_sim_hog_config_direction_show(struct config_item *item,
1310 char *page)
1311{
1312 struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1313 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1314 char *repr;
1315 int dir;
1316
1317 scoped_guard(mutex, &dev->lock)
1318 dir = hog->dir;
1319
1320 switch (dir) {
1321 case GPIOD_IN:
1322 repr = "input";
1323 break;
1324 case GPIOD_OUT_HIGH:
1325 repr = "output-high";
1326 break;
1327 case GPIOD_OUT_LOW:
1328 repr = "output-low";
1329 break;
1330 default:
1331 /* This would be a programmer bug. */
1332 WARN(1, "Unexpected hog direction value: %d", dir);
1333 return -EINVAL;
1334 }
1335
1336 return sprintf(page, "%s\n", repr);
1337}
1338
1339static ssize_t
1340gpio_sim_hog_config_direction_store(struct config_item *item,
1341 const char *page, size_t count)
1342{
1343 struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1344 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1345 int dir;
1346
1347 guard(mutex)(&dev->lock);
1348
1349 if (gpio_sim_device_is_live(dev))
1350 return -EBUSY;
1351
1352 if (sysfs_streq(page, "input"))
1353 dir = GPIOD_IN;
1354 else if (sysfs_streq(page, "output-high"))
1355 dir = GPIOD_OUT_HIGH;
1356 else if (sysfs_streq(page, "output-low"))
1357 dir = GPIOD_OUT_LOW;
1358 else
1359 return -EINVAL;
1360
1361 hog->dir = dir;
1362
1363 return count;
1364}
1365
1366CONFIGFS_ATTR(gpio_sim_hog_config_, direction);
1367
1368static struct configfs_attribute *gpio_sim_hog_config_attrs[] = {
1369 &gpio_sim_hog_config_attr_name,
1370 &gpio_sim_hog_config_attr_direction,
1371 NULL
1372};
1373
1374static void gpio_sim_hog_config_item_release(struct config_item *item)
1375{
1376 struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1377 struct gpio_sim_line *line = hog->parent;
1378 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1379
1380 scoped_guard(mutex, &dev->lock)
1381 line->hog = NULL;
1382
1383 kfree(hog->name);
1384 kfree(hog);
1385}
1386
1387static struct configfs_item_operations gpio_sim_hog_config_item_ops = {
1388 .release = gpio_sim_hog_config_item_release,
1389};
1390
1391static const struct config_item_type gpio_sim_hog_config_type = {
1392 .ct_item_ops = &gpio_sim_hog_config_item_ops,
1393 .ct_attrs = gpio_sim_hog_config_attrs,
1394 .ct_owner = THIS_MODULE,
1395};
1396
1397static struct config_item *
1398gpio_sim_line_config_make_hog_item(struct config_group *group, const char *name)
1399{
1400 struct gpio_sim_line *line = to_gpio_sim_line(&group->cg_item);
1401 struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1402 struct gpio_sim_hog *hog;
1403
1404 if (strcmp(name, "hog") != 0)
1405 return ERR_PTR(-EINVAL);
1406
1407 guard(mutex)(&dev->lock);
1408
1409 hog = kzalloc(sizeof(*hog), GFP_KERNEL);
1410 if (!hog)
1411 return ERR_PTR(-ENOMEM);
1412
1413 config_item_init_type_name(&hog->item, name,
1414 &gpio_sim_hog_config_type);
1415
1416 hog->dir = GPIOD_IN;
1417 hog->name = NULL;
1418 hog->parent = line;
1419 line->hog = hog;
1420
1421 return &hog->item;
1422}
1423
1424static void gpio_sim_line_config_group_release(struct config_item *item)
1425{
1426 struct gpio_sim_line *line = to_gpio_sim_line(item);
1427 struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1428
1429 scoped_guard(mutex, &dev->lock)
1430 list_del(&line->siblings);
1431
1432 kfree(line->name);
1433 kfree(line);
1434}
1435
1436static struct configfs_item_operations gpio_sim_line_config_item_ops = {
1437 .release = gpio_sim_line_config_group_release,
1438};
1439
1440static struct configfs_group_operations gpio_sim_line_config_group_ops = {
1441 .make_item = gpio_sim_line_config_make_hog_item,
1442};
1443
1444static const struct config_item_type gpio_sim_line_config_type = {
1445 .ct_item_ops = &gpio_sim_line_config_item_ops,
1446 .ct_group_ops = &gpio_sim_line_config_group_ops,
1447 .ct_attrs = gpio_sim_line_config_attrs,
1448 .ct_owner = THIS_MODULE,
1449};
1450
1451static struct config_group *
1452gpio_sim_bank_config_make_line_group(struct config_group *group,
1453 const char *name)
1454{
1455 struct gpio_sim_bank *bank = to_gpio_sim_bank(&group->cg_item);
1456 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1457 struct gpio_sim_line *line;
1458 unsigned int offset;
1459 int ret, nchar;
1460
1461 ret = sscanf(name, "line%u%n", &offset, &nchar);
1462 if (ret != 1 || nchar != strlen(name))
1463 return ERR_PTR(-EINVAL);
1464
1465 guard(mutex)(&dev->lock);
1466
1467 if (gpio_sim_device_is_live(dev))
1468 return ERR_PTR(-EBUSY);
1469
1470 line = kzalloc(sizeof(*line), GFP_KERNEL);
1471 if (!line)
1472 return ERR_PTR(-ENOMEM);
1473
1474 config_group_init_type_name(&line->group, name,
1475 &gpio_sim_line_config_type);
1476
1477 line->parent = bank;
1478 line->offset = offset;
1479 line->valid = true;
1480 list_add_tail(&line->siblings, &bank->line_list);
1481
1482 return &line->group;
1483}
1484
1485static void gpio_sim_bank_config_group_release(struct config_item *item)
1486{
1487 struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1488 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1489
1490 scoped_guard(mutex, &dev->lock)
1491 list_del(&bank->siblings);
1492
1493 kfree(bank->label);
1494 kfree(bank);
1495}
1496
1497static struct configfs_item_operations gpio_sim_bank_config_item_ops = {
1498 .release = gpio_sim_bank_config_group_release,
1499};
1500
1501static struct configfs_group_operations gpio_sim_bank_config_group_ops = {
1502 .make_group = gpio_sim_bank_config_make_line_group,
1503};
1504
1505static const struct config_item_type gpio_sim_bank_config_group_type = {
1506 .ct_item_ops = &gpio_sim_bank_config_item_ops,
1507 .ct_group_ops = &gpio_sim_bank_config_group_ops,
1508 .ct_attrs = gpio_sim_bank_config_attrs,
1509 .ct_owner = THIS_MODULE,
1510};
1511
1512static struct config_group *
1513gpio_sim_device_config_make_bank_group(struct config_group *group,
1514 const char *name)
1515{
1516 struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item);
1517 struct gpio_sim_bank *bank;
1518
1519 guard(mutex)(&dev->lock);
1520
1521 if (gpio_sim_device_is_live(dev))
1522 return ERR_PTR(-EBUSY);
1523
1524 bank = kzalloc(sizeof(*bank), GFP_KERNEL);
1525 if (!bank)
1526 return ERR_PTR(-ENOMEM);
1527
1528 config_group_init_type_name(&bank->group, name,
1529 &gpio_sim_bank_config_group_type);
1530 bank->num_lines = 1;
1531 bank->parent = dev;
1532 INIT_LIST_HEAD(&bank->line_list);
1533 list_add_tail(&bank->siblings, &dev->bank_list);
1534
1535 return &bank->group;
1536}
1537
1538static void gpio_sim_device_config_group_release(struct config_item *item)
1539{
1540 struct gpio_sim_device *dev = to_gpio_sim_device(item);
1541
1542 scoped_guard(mutex, &dev->lock) {
1543 if (gpio_sim_device_is_live(dev))
1544 gpio_sim_device_deactivate(dev);
1545 }
1546
1547 mutex_destroy(&dev->lock);
1548 ida_free(&gpio_sim_ida, dev->id);
1549 kfree(dev);
1550}
1551
1552static struct configfs_item_operations gpio_sim_device_config_item_ops = {
1553 .release = gpio_sim_device_config_group_release,
1554};
1555
1556static struct configfs_group_operations gpio_sim_device_config_group_ops = {
1557 .make_group = gpio_sim_device_config_make_bank_group,
1558};
1559
1560static const struct config_item_type gpio_sim_device_config_group_type = {
1561 .ct_item_ops = &gpio_sim_device_config_item_ops,
1562 .ct_group_ops = &gpio_sim_device_config_group_ops,
1563 .ct_attrs = gpio_sim_device_config_attrs,
1564 .ct_owner = THIS_MODULE,
1565};
1566
1567static struct config_group *
1568gpio_sim_config_make_device_group(struct config_group *group, const char *name)
1569{
1570 int id;
1571
1572 struct gpio_sim_device *dev __free(kfree) = kzalloc(sizeof(*dev),
1573 GFP_KERNEL);
1574 if (!dev)
1575 return ERR_PTR(-ENOMEM);
1576
1577 id = ida_alloc(&gpio_sim_ida, GFP_KERNEL);
1578 if (id < 0)
1579 return ERR_PTR(id);
1580
1581 config_group_init_type_name(&dev->group, name,
1582 &gpio_sim_device_config_group_type);
1583 dev->id = id;
1584 mutex_init(&dev->lock);
1585 INIT_LIST_HEAD(&dev->bank_list);
1586
1587 dev_sync_probe_init(&dev->probe_data);
1588
1589 return &no_free_ptr(dev)->group;
1590}
1591
1592static struct configfs_group_operations gpio_sim_config_group_ops = {
1593 .make_group = gpio_sim_config_make_device_group,
1594};
1595
1596static const struct config_item_type gpio_sim_config_type = {
1597 .ct_group_ops = &gpio_sim_config_group_ops,
1598 .ct_owner = THIS_MODULE,
1599};
1600
1601static struct configfs_subsystem gpio_sim_config_subsys = {
1602 .su_group = {
1603 .cg_item = {
1604 .ci_namebuf = "gpio-sim",
1605 .ci_type = &gpio_sim_config_type,
1606 },
1607 },
1608};
1609
1610static int __init gpio_sim_init(void)
1611{
1612 int ret;
1613
1614 ret = platform_driver_register(&gpio_sim_driver);
1615 if (ret) {
1616 pr_err("Error %d while registering the platform driver\n", ret);
1617 return ret;
1618 }
1619
1620 config_group_init(&gpio_sim_config_subsys.su_group);
1621 mutex_init(&gpio_sim_config_subsys.su_mutex);
1622 ret = configfs_register_subsystem(&gpio_sim_config_subsys);
1623 if (ret) {
1624 pr_err("Error %d while registering the configfs subsystem %s\n",
1625 ret, gpio_sim_config_subsys.su_group.cg_item.ci_namebuf);
1626 mutex_destroy(&gpio_sim_config_subsys.su_mutex);
1627 platform_driver_unregister(&gpio_sim_driver);
1628 return ret;
1629 }
1630
1631 return 0;
1632}
1633module_init(gpio_sim_init);
1634
1635static void __exit gpio_sim_exit(void)
1636{
1637 configfs_unregister_subsystem(&gpio_sim_config_subsys);
1638 mutex_destroy(&gpio_sim_config_subsys.su_mutex);
1639 platform_driver_unregister(&gpio_sim_driver);
1640}
1641module_exit(gpio_sim_exit);
1642
1643MODULE_AUTHOR("Bartosz Golaszewski <brgl@bgdev.pl>");
1644MODULE_DESCRIPTION("GPIO Simulator Module");
1645MODULE_LICENSE("GPL");