1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * GPIO testing driver based on configfs.
5 * Copyright (C) 2021 Bartosz Golaszewski <brgl@bgdev.pl>
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 #include <linux/array_size.h>
11 #include <linux/bitmap.h>
12 #include <linux/cleanup.h>
13 #include <linux/completion.h>
14 #include <linux/configfs.h>
15 #include <linux/device.h>
16 #include <linux/err.h>
17 #include <linux/gpio/consumer.h>
18 #include <linux/gpio/driver.h>
19 #include <linux/gpio/machine.h>
20 #include <linux/idr.h>
21 #include <linux/interrupt.h>
22 #include <linux/irq.h>
23 #include <linux/irq_sim.h>
24 #include <linux/list.h>
25 #include <linux/lockdep.h>
26 #include <linux/minmax.h>
27 #include <linux/mod_devicetable.h>
28 #include <linux/module.h>
29 #include <linux/mutex.h>
30 #include <linux/notifier.h>
31 #include <linux/platform_device.h>
32 #include <linux/property.h>
33 #include <linux/seq_file.h>
34 #include <linux/slab.h>
35 #include <linux/string.h>
36 #include <linux/string_helpers.h>
37 #include <linux/sysfs.h>
38 #include <linux/types.h>
40 #define GPIO_SIM_NGPIO_MAX 1024
41 #define GPIO_SIM_PROP_MAX 4 /* Max 3 properties + sentinel. */
42 #define GPIO_SIM_NUM_ATTRS 3 /* value, pull and sentinel */
44 static DEFINE_IDA(gpio_sim_ida
);
46 struct gpio_sim_chip
{
49 unsigned long *request_map
;
50 unsigned long *direction_map
;
51 unsigned long *value_map
;
52 unsigned long *pull_map
;
53 struct irq_domain
*irq_sim
;
55 const struct attribute_group
**attr_groups
;
58 struct gpio_sim_attribute
{
59 struct device_attribute dev_attr
;
63 static struct gpio_sim_attribute
*
64 to_gpio_sim_attr(struct device_attribute
*dev_attr
)
66 return container_of(dev_attr
, struct gpio_sim_attribute
, dev_attr
);
69 static int gpio_sim_apply_pull(struct gpio_sim_chip
*chip
,
70 unsigned int offset
, int value
)
72 int irq
, irq_type
, ret
;
74 guard(mutex
)(&chip
->lock
);
76 if (test_bit(offset
, chip
->request_map
) &&
77 test_bit(offset
, chip
->direction_map
)) {
78 if (value
== !!test_bit(offset
, chip
->value_map
))
82 * This is fine - it just means, nobody is listening
83 * for interrupts on this line, otherwise
84 * irq_create_mapping() would have been called from
85 * the to_irq() callback.
87 irq
= irq_find_mapping(chip
->irq_sim
, offset
);
91 irq_type
= irq_get_trigger_type(irq
);
93 if ((value
&& (irq_type
& IRQ_TYPE_EDGE_RISING
)) ||
94 (!value
&& (irq_type
& IRQ_TYPE_EDGE_FALLING
))) {
95 ret
= irq_set_irqchip_state(irq
, IRQCHIP_STATE_PENDING
,
103 /* Change the value unless we're actively driving the line. */
104 if (!test_bit(offset
, chip
->request_map
) ||
105 test_bit(offset
, chip
->direction_map
))
106 __assign_bit(offset
, chip
->value_map
, value
);
109 __assign_bit(offset
, chip
->pull_map
, value
);
113 static int gpio_sim_get(struct gpio_chip
*gc
, unsigned int offset
)
115 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
117 guard(mutex
)(&chip
->lock
);
119 return !!test_bit(offset
, chip
->value_map
);
122 static void gpio_sim_set(struct gpio_chip
*gc
, unsigned int offset
, int value
)
124 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
126 scoped_guard(mutex
, &chip
->lock
)
127 __assign_bit(offset
, chip
->value_map
, value
);
130 static int gpio_sim_get_multiple(struct gpio_chip
*gc
,
131 unsigned long *mask
, unsigned long *bits
)
133 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
135 scoped_guard(mutex
, &chip
->lock
)
136 bitmap_replace(bits
, bits
, chip
->value_map
, mask
, gc
->ngpio
);
141 static void gpio_sim_set_multiple(struct gpio_chip
*gc
,
142 unsigned long *mask
, unsigned long *bits
)
144 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
146 scoped_guard(mutex
, &chip
->lock
)
147 bitmap_replace(chip
->value_map
, chip
->value_map
, bits
, mask
,
151 static int gpio_sim_direction_output(struct gpio_chip
*gc
,
152 unsigned int offset
, int value
)
154 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
156 scoped_guard(mutex
, &chip
->lock
) {
157 __clear_bit(offset
, chip
->direction_map
);
158 __assign_bit(offset
, chip
->value_map
, value
);
164 static int gpio_sim_direction_input(struct gpio_chip
*gc
, unsigned int offset
)
166 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
168 scoped_guard(mutex
, &chip
->lock
)
169 __set_bit(offset
, chip
->direction_map
);
174 static int gpio_sim_get_direction(struct gpio_chip
*gc
, unsigned int offset
)
176 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
179 scoped_guard(mutex
, &chip
->lock
)
180 direction
= !!test_bit(offset
, chip
->direction_map
);
182 return direction
? GPIO_LINE_DIRECTION_IN
: GPIO_LINE_DIRECTION_OUT
;
185 static int gpio_sim_set_config(struct gpio_chip
*gc
, unsigned int offset
,
186 unsigned long config
)
188 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
190 switch (pinconf_to_config_param(config
)) {
191 case PIN_CONFIG_BIAS_PULL_UP
:
192 return gpio_sim_apply_pull(chip
, offset
, 1);
193 case PIN_CONFIG_BIAS_PULL_DOWN
:
194 return gpio_sim_apply_pull(chip
, offset
, 0);
202 static int gpio_sim_to_irq(struct gpio_chip
*gc
, unsigned int offset
)
204 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
206 return irq_create_mapping(chip
->irq_sim
, offset
);
209 static int gpio_sim_request(struct gpio_chip
*gc
, unsigned int offset
)
211 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
213 scoped_guard(mutex
, &chip
->lock
)
214 __set_bit(offset
, chip
->request_map
);
219 static void gpio_sim_free(struct gpio_chip
*gc
, unsigned int offset
)
221 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
223 scoped_guard(mutex
, &chip
->lock
) {
224 __assign_bit(offset
, chip
->value_map
,
225 !!test_bit(offset
, chip
->pull_map
));
226 __clear_bit(offset
, chip
->request_map
);
230 static int gpio_sim_irq_requested(struct irq_domain
*domain
,
231 irq_hw_number_t hwirq
, void *data
)
233 struct gpio_sim_chip
*chip
= data
;
235 return gpiochip_lock_as_irq(&chip
->gc
, hwirq
);
238 static void gpio_sim_irq_released(struct irq_domain
*domain
,
239 irq_hw_number_t hwirq
, void *data
)
241 struct gpio_sim_chip
*chip
= data
;
243 gpiochip_unlock_as_irq(&chip
->gc
, hwirq
);
246 static const struct irq_sim_ops gpio_sim_irq_sim_ops
= {
247 .irq_sim_irq_requested
= gpio_sim_irq_requested
,
248 .irq_sim_irq_released
= gpio_sim_irq_released
,
251 static void gpio_sim_dbg_show(struct seq_file
*seq
, struct gpio_chip
*gc
)
253 struct gpio_sim_chip
*chip
= gpiochip_get_data(gc
);
257 guard(mutex
)(&chip
->lock
);
259 for_each_hwgpio(gc
, i
, label
)
260 seq_printf(seq
, " gpio-%-3d (%s) %s,%s\n",
263 test_bit(i
, chip
->direction_map
) ? "input" :
264 test_bit(i
, chip
->value_map
) ? "output-high" :
266 test_bit(i
, chip
->pull_map
) ? "pull-up" :
270 static ssize_t
gpio_sim_sysfs_val_show(struct device
*dev
,
271 struct device_attribute
*attr
, char *buf
)
273 struct gpio_sim_attribute
*line_attr
= to_gpio_sim_attr(attr
);
274 struct gpio_sim_chip
*chip
= dev_get_drvdata(dev
);
277 scoped_guard(mutex
, &chip
->lock
)
278 val
= !!test_bit(line_attr
->offset
, chip
->value_map
);
280 return sysfs_emit(buf
, "%d\n", val
);
283 static ssize_t
gpio_sim_sysfs_val_store(struct device
*dev
,
284 struct device_attribute
*attr
,
285 const char *buf
, size_t count
)
288 * Not assigning this function will result in write() returning -EIO
289 * which is confusing. Return -EPERM explicitly.
294 static const char *const gpio_sim_sysfs_pull_strings
[] = {
299 static ssize_t
gpio_sim_sysfs_pull_show(struct device
*dev
,
300 struct device_attribute
*attr
,
303 struct gpio_sim_attribute
*line_attr
= to_gpio_sim_attr(attr
);
304 struct gpio_sim_chip
*chip
= dev_get_drvdata(dev
);
307 scoped_guard(mutex
, &chip
->lock
)
308 pull
= !!test_bit(line_attr
->offset
, chip
->pull_map
);
310 return sysfs_emit(buf
, "%s\n", gpio_sim_sysfs_pull_strings
[pull
]);
313 static ssize_t
gpio_sim_sysfs_pull_store(struct device
*dev
,
314 struct device_attribute
*attr
,
315 const char *buf
, size_t len
)
317 struct gpio_sim_attribute
*line_attr
= to_gpio_sim_attr(attr
);
318 struct gpio_sim_chip
*chip
= dev_get_drvdata(dev
);
321 pull
= sysfs_match_string(gpio_sim_sysfs_pull_strings
, buf
);
325 ret
= gpio_sim_apply_pull(chip
, line_attr
->offset
, pull
);
332 static void gpio_sim_put_device(void *data
)
334 struct device
*dev
= data
;
339 static void gpio_sim_dispose_mappings(void *data
)
341 struct gpio_sim_chip
*chip
= data
;
344 for (i
= 0; i
< chip
->gc
.ngpio
; i
++)
345 irq_dispose_mapping(irq_find_mapping(chip
->irq_sim
, i
));
348 static void gpio_sim_sysfs_remove(void *data
)
350 struct gpio_sim_chip
*chip
= data
;
352 sysfs_remove_groups(&chip
->dev
->kobj
, chip
->attr_groups
);
355 static int gpio_sim_setup_sysfs(struct gpio_sim_chip
*chip
)
357 struct device_attribute
*val_dev_attr
, *pull_dev_attr
;
358 struct gpio_sim_attribute
*val_attr
, *pull_attr
;
359 unsigned int num_lines
= chip
->gc
.ngpio
;
360 struct device
*dev
= chip
->gc
.parent
;
361 struct attribute_group
*attr_group
;
362 struct attribute
**attrs
;
365 chip
->attr_groups
= devm_kcalloc(dev
, sizeof(*chip
->attr_groups
),
366 num_lines
+ 1, GFP_KERNEL
);
367 if (!chip
->attr_groups
)
370 for (i
= 0; i
< num_lines
; i
++) {
371 attr_group
= devm_kzalloc(dev
, sizeof(*attr_group
), GFP_KERNEL
);
372 attrs
= devm_kcalloc(dev
, GPIO_SIM_NUM_ATTRS
, sizeof(*attrs
),
374 val_attr
= devm_kzalloc(dev
, sizeof(*val_attr
), GFP_KERNEL
);
375 pull_attr
= devm_kzalloc(dev
, sizeof(*pull_attr
), GFP_KERNEL
);
376 if (!attr_group
|| !attrs
|| !val_attr
|| !pull_attr
)
379 attr_group
->name
= devm_kasprintf(dev
, GFP_KERNEL
,
381 if (!attr_group
->name
)
384 val_attr
->offset
= pull_attr
->offset
= i
;
386 val_dev_attr
= &val_attr
->dev_attr
;
387 pull_dev_attr
= &pull_attr
->dev_attr
;
389 sysfs_attr_init(&val_dev_attr
->attr
);
390 sysfs_attr_init(&pull_dev_attr
->attr
);
392 val_dev_attr
->attr
.name
= "value";
393 pull_dev_attr
->attr
.name
= "pull";
395 val_dev_attr
->attr
.mode
= pull_dev_attr
->attr
.mode
= 0644;
397 val_dev_attr
->show
= gpio_sim_sysfs_val_show
;
398 val_dev_attr
->store
= gpio_sim_sysfs_val_store
;
399 pull_dev_attr
->show
= gpio_sim_sysfs_pull_show
;
400 pull_dev_attr
->store
= gpio_sim_sysfs_pull_store
;
402 attrs
[0] = &val_dev_attr
->attr
;
403 attrs
[1] = &pull_dev_attr
->attr
;
405 attr_group
->attrs
= attrs
;
406 chip
->attr_groups
[i
] = attr_group
;
409 ret
= sysfs_create_groups(&chip
->dev
->kobj
, chip
->attr_groups
);
413 return devm_add_action_or_reset(dev
, gpio_sim_sysfs_remove
, chip
);
416 static int gpio_sim_dev_match_fwnode(struct device
*dev
, void *data
)
418 return device_match_fwnode(dev
, data
);
421 static int gpio_sim_add_bank(struct fwnode_handle
*swnode
, struct device
*dev
)
423 struct gpio_sim_chip
*chip
;
424 struct gpio_chip
*gc
;
429 ret
= fwnode_property_read_u32(swnode
, "ngpios", &num_lines
);
433 if (num_lines
> GPIO_SIM_NGPIO_MAX
)
436 ret
= fwnode_property_read_string(swnode
, "gpio-sim,label", &label
);
438 label
= devm_kasprintf(dev
, GFP_KERNEL
, "%s:%pfwP",
439 dev_name(dev
), swnode
);
444 chip
= devm_kzalloc(dev
, sizeof(*chip
), GFP_KERNEL
);
448 chip
->request_map
= devm_bitmap_zalloc(dev
, num_lines
, GFP_KERNEL
);
449 if (!chip
->request_map
)
452 chip
->direction_map
= devm_bitmap_alloc(dev
, num_lines
, GFP_KERNEL
);
453 if (!chip
->direction_map
)
456 /* Default to input mode. */
457 bitmap_fill(chip
->direction_map
, num_lines
);
459 chip
->value_map
= devm_bitmap_zalloc(dev
, num_lines
, GFP_KERNEL
);
460 if (!chip
->value_map
)
463 chip
->pull_map
= devm_bitmap_zalloc(dev
, num_lines
, GFP_KERNEL
);
467 chip
->irq_sim
= devm_irq_domain_create_sim_full(dev
, swnode
, num_lines
,
468 &gpio_sim_irq_sim_ops
,
470 if (IS_ERR(chip
->irq_sim
))
471 return PTR_ERR(chip
->irq_sim
);
473 ret
= devm_add_action_or_reset(dev
, gpio_sim_dispose_mappings
, chip
);
477 ret
= devm_mutex_init(dev
, &chip
->lock
);
483 gc
->ngpio
= num_lines
;
485 gc
->owner
= THIS_MODULE
;
488 gc
->get
= gpio_sim_get
;
489 gc
->set
= gpio_sim_set
;
490 gc
->get_multiple
= gpio_sim_get_multiple
;
491 gc
->set_multiple
= gpio_sim_set_multiple
;
492 gc
->direction_output
= gpio_sim_direction_output
;
493 gc
->direction_input
= gpio_sim_direction_input
;
494 gc
->get_direction
= gpio_sim_get_direction
;
495 gc
->set_config
= gpio_sim_set_config
;
496 gc
->to_irq
= gpio_sim_to_irq
;
497 gc
->request
= gpio_sim_request
;
498 gc
->free
= gpio_sim_free
;
499 gc
->dbg_show
= PTR_IF(IS_ENABLED(CONFIG_DEBUG_FS
), gpio_sim_dbg_show
);
500 gc
->can_sleep
= true;
502 ret
= devm_gpiochip_add_data(dev
, gc
, chip
);
506 chip
->dev
= device_find_child(dev
, swnode
, gpio_sim_dev_match_fwnode
);
510 ret
= devm_add_action_or_reset(dev
, gpio_sim_put_device
, chip
->dev
);
514 /* Used by sysfs callbacks. */
515 dev_set_drvdata(chip
->dev
, chip
);
517 return gpio_sim_setup_sysfs(chip
);
520 static int gpio_sim_probe(struct platform_device
*pdev
)
522 struct device
*dev
= &pdev
->dev
;
525 device_for_each_child_node_scoped(dev
, swnode
) {
526 ret
= gpio_sim_add_bank(swnode
, dev
);
534 static const struct of_device_id gpio_sim_of_match
[] = {
535 { .compatible
= "gpio-simulator" },
538 MODULE_DEVICE_TABLE(of
, gpio_sim_of_match
);
540 static struct platform_driver gpio_sim_driver
= {
543 .of_match_table
= gpio_sim_of_match
,
545 .probe
= gpio_sim_probe
,
548 struct gpio_sim_device
{
549 struct config_group group
;
552 * If pdev is NULL, the device is 'pending' (waiting for configuration).
553 * Once the pointer is assigned, the device has been created and the
556 struct platform_device
*pdev
;
560 * Each configfs filesystem operation is protected with the subsystem
561 * mutex. Each separate attribute is protected with the buffer mutex.
562 * This structure however can be modified by callbacks of different
563 * attributes so we need another lock.
565 * We use this lock for protecting all data structures owned by this
571 * This is used to synchronously wait for the driver's probe to complete
572 * and notify the user-space about any errors.
574 struct notifier_block bus_notifier
;
575 struct completion probe_completion
;
578 struct gpiod_hog
*hogs
;
580 struct list_head bank_list
;
583 /* This is called with dev->lock already taken. */
584 static int gpio_sim_bus_notifier_call(struct notifier_block
*nb
,
585 unsigned long action
, void *data
)
587 struct gpio_sim_device
*simdev
= container_of(nb
,
588 struct gpio_sim_device
,
590 struct device
*dev
= data
;
593 snprintf(devname
, sizeof(devname
), "gpio-sim.%u", simdev
->id
);
595 if (!device_match_name(dev
, devname
))
598 if (action
== BUS_NOTIFY_BOUND_DRIVER
)
599 simdev
->driver_bound
= true;
600 else if (action
== BUS_NOTIFY_DRIVER_NOT_BOUND
)
601 simdev
->driver_bound
= false;
605 complete(&simdev
->probe_completion
);
610 static struct gpio_sim_device
*to_gpio_sim_device(struct config_item
*item
)
612 struct config_group
*group
= to_config_group(item
);
614 return container_of(group
, struct gpio_sim_device
, group
);
617 struct gpio_sim_bank
{
618 struct config_group group
;
621 * We could have used the ci_parent field of the config_item but
622 * configfs is stupid and calls the item's release callback after
623 * already having cleared the parent pointer even though the parent
624 * is guaranteed to survive the child...
626 * So we need to store the pointer to the parent struct here. We can
627 * dereference it anywhere we need with no checks and no locking as
628 * it's guaranteed to survive the children and protected by configfs
631 * Same for other structures.
633 struct gpio_sim_device
*parent
;
634 struct list_head siblings
;
637 unsigned int num_lines
;
639 struct list_head line_list
;
641 struct fwnode_handle
*swnode
;
644 static struct gpio_sim_bank
*to_gpio_sim_bank(struct config_item
*item
)
646 struct config_group
*group
= to_config_group(item
);
648 return container_of(group
, struct gpio_sim_bank
, group
);
651 static bool gpio_sim_bank_has_label(struct gpio_sim_bank
*bank
)
653 return bank
->label
&& *bank
->label
;
656 static struct gpio_sim_device
*
657 gpio_sim_bank_get_device(struct gpio_sim_bank
*bank
)
664 struct gpio_sim_line
{
665 struct config_group group
;
667 struct gpio_sim_bank
*parent
;
668 struct list_head siblings
;
673 /* There can only be one hog per line. */
674 struct gpio_sim_hog
*hog
;
677 static struct gpio_sim_line
*to_gpio_sim_line(struct config_item
*item
)
679 struct config_group
*group
= to_config_group(item
);
681 return container_of(group
, struct gpio_sim_line
, group
);
684 static struct gpio_sim_device
*
685 gpio_sim_line_get_device(struct gpio_sim_line
*line
)
687 struct gpio_sim_bank
*bank
= line
->parent
;
689 return gpio_sim_bank_get_device(bank
);
692 struct gpio_sim_hog
{
693 struct config_item item
;
694 struct gpio_sim_line
*parent
;
700 static struct gpio_sim_hog
*to_gpio_sim_hog(struct config_item
*item
)
702 return container_of(item
, struct gpio_sim_hog
, item
);
705 static struct gpio_sim_device
*gpio_sim_hog_get_device(struct gpio_sim_hog
*hog
)
707 struct gpio_sim_line
*line
= hog
->parent
;
709 return gpio_sim_line_get_device(line
);
712 static bool gpio_sim_device_is_live(struct gpio_sim_device
*dev
)
714 lockdep_assert_held(&dev
->lock
);
719 static char *gpio_sim_strdup_trimmed(const char *str
, size_t count
)
723 trimmed
= kstrndup(skip_spaces(str
), count
, GFP_KERNEL
);
727 return strim(trimmed
);
730 static ssize_t
gpio_sim_device_config_dev_name_show(struct config_item
*item
,
733 struct gpio_sim_device
*dev
= to_gpio_sim_device(item
);
734 struct platform_device
*pdev
;
736 guard(mutex
)(&dev
->lock
);
740 return sprintf(page
, "%s\n", dev_name(&pdev
->dev
));
742 return sprintf(page
, "gpio-sim.%d\n", dev
->id
);
745 CONFIGFS_ATTR_RO(gpio_sim_device_config_
, dev_name
);
748 gpio_sim_device_config_live_show(struct config_item
*item
, char *page
)
750 struct gpio_sim_device
*dev
= to_gpio_sim_device(item
);
753 scoped_guard(mutex
, &dev
->lock
)
754 live
= gpio_sim_device_is_live(dev
);
756 return sprintf(page
, "%c\n", live
? '1' : '0');
759 static unsigned int gpio_sim_get_line_names_size(struct gpio_sim_bank
*bank
)
761 struct gpio_sim_line
*line
;
762 unsigned int size
= 0;
764 list_for_each_entry(line
, &bank
->line_list
, siblings
) {
765 if (!line
->name
|| (line
->offset
>= bank
->num_lines
))
768 size
= max(size
, line
->offset
+ 1);
775 gpio_sim_set_line_names(struct gpio_sim_bank
*bank
, char **line_names
)
777 struct gpio_sim_line
*line
;
779 list_for_each_entry(line
, &bank
->line_list
, siblings
) {
780 if (!line
->name
|| (line
->offset
>= bank
->num_lines
))
783 line_names
[line
->offset
] = line
->name
;
787 static void gpio_sim_remove_hogs(struct gpio_sim_device
*dev
)
789 struct gpiod_hog
*hog
;
794 gpiod_remove_hogs(dev
->hogs
);
796 for (hog
= dev
->hogs
; hog
->chip_label
; hog
++) {
797 kfree(hog
->chip_label
);
798 kfree(hog
->line_name
);
805 static int gpio_sim_add_hogs(struct gpio_sim_device
*dev
)
807 unsigned int num_hogs
= 0, idx
= 0;
808 struct gpio_sim_bank
*bank
;
809 struct gpio_sim_line
*line
;
810 struct gpiod_hog
*hog
;
812 list_for_each_entry(bank
, &dev
->bank_list
, siblings
) {
813 list_for_each_entry(line
, &bank
->line_list
, siblings
) {
814 if (line
->offset
>= bank
->num_lines
)
825 /* Allocate one more for the sentinel. */
826 dev
->hogs
= kcalloc(num_hogs
+ 1, sizeof(*dev
->hogs
), GFP_KERNEL
);
830 list_for_each_entry(bank
, &dev
->bank_list
, siblings
) {
831 list_for_each_entry(line
, &bank
->line_list
, siblings
) {
832 if (line
->offset
>= bank
->num_lines
)
838 hog
= &dev
->hogs
[idx
++];
841 * We need to make this string manually because at this
842 * point the device doesn't exist yet and so dev_name()
845 if (gpio_sim_bank_has_label(bank
))
846 hog
->chip_label
= kstrdup(bank
->label
,
849 hog
->chip_label
= kasprintf(GFP_KERNEL
,
853 if (!hog
->chip_label
) {
854 gpio_sim_remove_hogs(dev
);
859 * We need to duplicate this because the hog config
860 * item can be removed at any time (and we can't block
861 * it) and gpiolib doesn't make a deep copy of the hog
864 if (line
->hog
->name
) {
865 hog
->line_name
= kstrdup(line
->hog
->name
,
867 if (!hog
->line_name
) {
868 gpio_sim_remove_hogs(dev
);
873 hog
->chip_hwnum
= line
->offset
;
874 hog
->dflags
= line
->hog
->dir
;
878 gpiod_add_hogs(dev
->hogs
);
883 static struct fwnode_handle
*
884 gpio_sim_make_bank_swnode(struct gpio_sim_bank
*bank
,
885 struct fwnode_handle
*parent
)
887 struct property_entry properties
[GPIO_SIM_PROP_MAX
];
888 unsigned int prop_idx
= 0, line_names_size
;
889 char **line_names
__free(kfree
) = NULL
;
891 memset(properties
, 0, sizeof(properties
));
893 properties
[prop_idx
++] = PROPERTY_ENTRY_U32("ngpios", bank
->num_lines
);
895 if (gpio_sim_bank_has_label(bank
))
896 properties
[prop_idx
++] = PROPERTY_ENTRY_STRING("gpio-sim,label",
899 line_names_size
= gpio_sim_get_line_names_size(bank
);
900 if (line_names_size
) {
901 line_names
= kcalloc(line_names_size
, sizeof(*line_names
),
904 return ERR_PTR(-ENOMEM
);
906 gpio_sim_set_line_names(bank
, line_names
);
908 properties
[prop_idx
++] = PROPERTY_ENTRY_STRING_ARRAY_LEN(
910 line_names
, line_names_size
);
913 return fwnode_create_software_node(properties
, parent
);
916 static void gpio_sim_remove_swnode_recursive(struct fwnode_handle
*swnode
)
918 struct fwnode_handle
*child
;
920 fwnode_for_each_child_node(swnode
, child
)
921 fwnode_remove_software_node(child
);
923 fwnode_remove_software_node(swnode
);
926 static bool gpio_sim_bank_labels_non_unique(struct gpio_sim_device
*dev
)
928 struct gpio_sim_bank
*this, *pos
;
930 list_for_each_entry(this, &dev
->bank_list
, siblings
) {
931 list_for_each_entry(pos
, &dev
->bank_list
, siblings
) {
932 if (this == pos
|| (!this->label
|| !pos
->label
))
935 if (strcmp(this->label
, pos
->label
) == 0)
943 static int gpio_sim_device_activate(struct gpio_sim_device
*dev
)
945 struct platform_device_info pdevinfo
;
946 struct fwnode_handle
*swnode
;
947 struct platform_device
*pdev
;
948 struct gpio_sim_bank
*bank
;
951 lockdep_assert_held(&dev
->lock
);
953 if (list_empty(&dev
->bank_list
))
957 * Non-unique GPIO device labels are a corner-case we don't support
958 * as it would interfere with machine hogging mechanism and has little
961 if (gpio_sim_bank_labels_non_unique(dev
))
964 memset(&pdevinfo
, 0, sizeof(pdevinfo
));
966 swnode
= fwnode_create_software_node(NULL
, NULL
);
968 return PTR_ERR(swnode
);
970 list_for_each_entry(bank
, &dev
->bank_list
, siblings
) {
971 bank
->swnode
= gpio_sim_make_bank_swnode(bank
, swnode
);
972 if (IS_ERR(bank
->swnode
)) {
973 ret
= PTR_ERR(bank
->swnode
);
974 gpio_sim_remove_swnode_recursive(swnode
);
979 ret
= gpio_sim_add_hogs(dev
);
981 gpio_sim_remove_swnode_recursive(swnode
);
985 pdevinfo
.name
= "gpio-sim";
986 pdevinfo
.fwnode
= swnode
;
987 pdevinfo
.id
= dev
->id
;
989 reinit_completion(&dev
->probe_completion
);
990 dev
->driver_bound
= false;
991 bus_register_notifier(&platform_bus_type
, &dev
->bus_notifier
);
993 pdev
= platform_device_register_full(&pdevinfo
);
995 bus_unregister_notifier(&platform_bus_type
, &dev
->bus_notifier
);
996 gpio_sim_remove_hogs(dev
);
997 gpio_sim_remove_swnode_recursive(swnode
);
998 return PTR_ERR(pdev
);
1001 wait_for_completion(&dev
->probe_completion
);
1002 bus_unregister_notifier(&platform_bus_type
, &dev
->bus_notifier
);
1004 if (!dev
->driver_bound
) {
1005 /* Probe failed, check kernel log. */
1006 platform_device_unregister(pdev
);
1007 gpio_sim_remove_hogs(dev
);
1008 gpio_sim_remove_swnode_recursive(swnode
);
1017 static void gpio_sim_device_deactivate(struct gpio_sim_device
*dev
)
1019 struct fwnode_handle
*swnode
;
1021 lockdep_assert_held(&dev
->lock
);
1023 swnode
= dev_fwnode(&dev
->pdev
->dev
);
1024 platform_device_unregister(dev
->pdev
);
1025 gpio_sim_remove_hogs(dev
);
1026 gpio_sim_remove_swnode_recursive(swnode
);
1031 gpio_sim_device_config_live_store(struct config_item
*item
,
1032 const char *page
, size_t count
)
1034 struct gpio_sim_device
*dev
= to_gpio_sim_device(item
);
1038 ret
= kstrtobool(page
, &live
);
1042 guard(mutex
)(&dev
->lock
);
1044 if (live
== gpio_sim_device_is_live(dev
))
1047 ret
= gpio_sim_device_activate(dev
);
1049 gpio_sim_device_deactivate(dev
);
1051 return ret
?: count
;
1054 CONFIGFS_ATTR(gpio_sim_device_config_
, live
);
1056 static struct configfs_attribute
*gpio_sim_device_config_attrs
[] = {
1057 &gpio_sim_device_config_attr_dev_name
,
1058 &gpio_sim_device_config_attr_live
,
1062 struct gpio_sim_chip_name_ctx
{
1063 struct fwnode_handle
*swnode
;
1067 static int gpio_sim_emit_chip_name(struct device
*dev
, void *data
)
1069 struct gpio_sim_chip_name_ctx
*ctx
= data
;
1071 /* This would be the sysfs device exported in /sys/class/gpio. */
1075 if (device_match_fwnode(dev
, ctx
->swnode
))
1076 return sprintf(ctx
->page
, "%s\n", dev_name(dev
));
1081 static ssize_t
gpio_sim_bank_config_chip_name_show(struct config_item
*item
,
1084 struct gpio_sim_bank
*bank
= to_gpio_sim_bank(item
);
1085 struct gpio_sim_device
*dev
= gpio_sim_bank_get_device(bank
);
1086 struct gpio_sim_chip_name_ctx ctx
= { bank
->swnode
, page
};
1088 guard(mutex
)(&dev
->lock
);
1090 if (gpio_sim_device_is_live(dev
))
1091 return device_for_each_child(&dev
->pdev
->dev
, &ctx
,
1092 gpio_sim_emit_chip_name
);
1094 return sprintf(page
, "none\n");
1097 CONFIGFS_ATTR_RO(gpio_sim_bank_config_
, chip_name
);
1100 gpio_sim_bank_config_label_show(struct config_item
*item
, char *page
)
1102 struct gpio_sim_bank
*bank
= to_gpio_sim_bank(item
);
1103 struct gpio_sim_device
*dev
= gpio_sim_bank_get_device(bank
);
1105 guard(mutex
)(&dev
->lock
);
1107 return sprintf(page
, "%s\n", bank
->label
?: "");
1110 static ssize_t
gpio_sim_bank_config_label_store(struct config_item
*item
,
1111 const char *page
, size_t count
)
1113 struct gpio_sim_bank
*bank
= to_gpio_sim_bank(item
);
1114 struct gpio_sim_device
*dev
= gpio_sim_bank_get_device(bank
);
1117 guard(mutex
)(&dev
->lock
);
1119 if (gpio_sim_device_is_live(dev
))
1122 trimmed
= gpio_sim_strdup_trimmed(page
, count
);
1127 bank
->label
= trimmed
;
1132 CONFIGFS_ATTR(gpio_sim_bank_config_
, label
);
1135 gpio_sim_bank_config_num_lines_show(struct config_item
*item
, char *page
)
1137 struct gpio_sim_bank
*bank
= to_gpio_sim_bank(item
);
1138 struct gpio_sim_device
*dev
= gpio_sim_bank_get_device(bank
);
1140 guard(mutex
)(&dev
->lock
);
1142 return sprintf(page
, "%u\n", bank
->num_lines
);
1146 gpio_sim_bank_config_num_lines_store(struct config_item
*item
,
1147 const char *page
, size_t count
)
1149 struct gpio_sim_bank
*bank
= to_gpio_sim_bank(item
);
1150 struct gpio_sim_device
*dev
= gpio_sim_bank_get_device(bank
);
1151 unsigned int num_lines
;
1154 ret
= kstrtouint(page
, 0, &num_lines
);
1161 guard(mutex
)(&dev
->lock
);
1163 if (gpio_sim_device_is_live(dev
))
1166 bank
->num_lines
= num_lines
;
1171 CONFIGFS_ATTR(gpio_sim_bank_config_
, num_lines
);
1173 static struct configfs_attribute
*gpio_sim_bank_config_attrs
[] = {
1174 &gpio_sim_bank_config_attr_chip_name
,
1175 &gpio_sim_bank_config_attr_label
,
1176 &gpio_sim_bank_config_attr_num_lines
,
1181 gpio_sim_line_config_name_show(struct config_item
*item
, char *page
)
1183 struct gpio_sim_line
*line
= to_gpio_sim_line(item
);
1184 struct gpio_sim_device
*dev
= gpio_sim_line_get_device(line
);
1186 guard(mutex
)(&dev
->lock
);
1188 return sprintf(page
, "%s\n", line
->name
?: "");
1191 static ssize_t
gpio_sim_line_config_name_store(struct config_item
*item
,
1192 const char *page
, size_t count
)
1194 struct gpio_sim_line
*line
= to_gpio_sim_line(item
);
1195 struct gpio_sim_device
*dev
= gpio_sim_line_get_device(line
);
1198 guard(mutex
)(&dev
->lock
);
1200 if (gpio_sim_device_is_live(dev
))
1203 trimmed
= gpio_sim_strdup_trimmed(page
, count
);
1208 line
->name
= trimmed
;
1213 CONFIGFS_ATTR(gpio_sim_line_config_
, name
);
1215 static struct configfs_attribute
*gpio_sim_line_config_attrs
[] = {
1216 &gpio_sim_line_config_attr_name
,
1220 static ssize_t
gpio_sim_hog_config_name_show(struct config_item
*item
,
1223 struct gpio_sim_hog
*hog
= to_gpio_sim_hog(item
);
1224 struct gpio_sim_device
*dev
= gpio_sim_hog_get_device(hog
);
1226 guard(mutex
)(&dev
->lock
);
1228 return sprintf(page
, "%s\n", hog
->name
?: "");
1231 static ssize_t
gpio_sim_hog_config_name_store(struct config_item
*item
,
1232 const char *page
, size_t count
)
1234 struct gpio_sim_hog
*hog
= to_gpio_sim_hog(item
);
1235 struct gpio_sim_device
*dev
= gpio_sim_hog_get_device(hog
);
1238 guard(mutex
)(&dev
->lock
);
1240 if (gpio_sim_device_is_live(dev
))
1243 trimmed
= gpio_sim_strdup_trimmed(page
, count
);
1248 hog
->name
= trimmed
;
1253 CONFIGFS_ATTR(gpio_sim_hog_config_
, name
);
1255 static ssize_t
gpio_sim_hog_config_direction_show(struct config_item
*item
,
1258 struct gpio_sim_hog
*hog
= to_gpio_sim_hog(item
);
1259 struct gpio_sim_device
*dev
= gpio_sim_hog_get_device(hog
);
1263 scoped_guard(mutex
, &dev
->lock
)
1270 case GPIOD_OUT_HIGH
:
1271 repr
= "output-high";
1274 repr
= "output-low";
1277 /* This would be a programmer bug. */
1278 WARN(1, "Unexpected hog direction value: %d", dir
);
1282 return sprintf(page
, "%s\n", repr
);
1286 gpio_sim_hog_config_direction_store(struct config_item
*item
,
1287 const char *page
, size_t count
)
1289 struct gpio_sim_hog
*hog
= to_gpio_sim_hog(item
);
1290 struct gpio_sim_device
*dev
= gpio_sim_hog_get_device(hog
);
1293 guard(mutex
)(&dev
->lock
);
1295 if (gpio_sim_device_is_live(dev
))
1298 if (sysfs_streq(page
, "input"))
1300 else if (sysfs_streq(page
, "output-high"))
1301 dir
= GPIOD_OUT_HIGH
;
1302 else if (sysfs_streq(page
, "output-low"))
1303 dir
= GPIOD_OUT_LOW
;
1312 CONFIGFS_ATTR(gpio_sim_hog_config_
, direction
);
1314 static struct configfs_attribute
*gpio_sim_hog_config_attrs
[] = {
1315 &gpio_sim_hog_config_attr_name
,
1316 &gpio_sim_hog_config_attr_direction
,
1320 static void gpio_sim_hog_config_item_release(struct config_item
*item
)
1322 struct gpio_sim_hog
*hog
= to_gpio_sim_hog(item
);
1323 struct gpio_sim_line
*line
= hog
->parent
;
1324 struct gpio_sim_device
*dev
= gpio_sim_hog_get_device(hog
);
1326 scoped_guard(mutex
, &dev
->lock
)
1333 static struct configfs_item_operations gpio_sim_hog_config_item_ops
= {
1334 .release
= gpio_sim_hog_config_item_release
,
1337 static const struct config_item_type gpio_sim_hog_config_type
= {
1338 .ct_item_ops
= &gpio_sim_hog_config_item_ops
,
1339 .ct_attrs
= gpio_sim_hog_config_attrs
,
1340 .ct_owner
= THIS_MODULE
,
1343 static struct config_item
*
1344 gpio_sim_line_config_make_hog_item(struct config_group
*group
, const char *name
)
1346 struct gpio_sim_line
*line
= to_gpio_sim_line(&group
->cg_item
);
1347 struct gpio_sim_device
*dev
= gpio_sim_line_get_device(line
);
1348 struct gpio_sim_hog
*hog
;
1350 if (strcmp(name
, "hog") != 0)
1351 return ERR_PTR(-EINVAL
);
1353 guard(mutex
)(&dev
->lock
);
1355 hog
= kzalloc(sizeof(*hog
), GFP_KERNEL
);
1357 return ERR_PTR(-ENOMEM
);
1359 config_item_init_type_name(&hog
->item
, name
,
1360 &gpio_sim_hog_config_type
);
1362 hog
->dir
= GPIOD_IN
;
1370 static void gpio_sim_line_config_group_release(struct config_item
*item
)
1372 struct gpio_sim_line
*line
= to_gpio_sim_line(item
);
1373 struct gpio_sim_device
*dev
= gpio_sim_line_get_device(line
);
1375 scoped_guard(mutex
, &dev
->lock
)
1376 list_del(&line
->siblings
);
1382 static struct configfs_item_operations gpio_sim_line_config_item_ops
= {
1383 .release
= gpio_sim_line_config_group_release
,
1386 static struct configfs_group_operations gpio_sim_line_config_group_ops
= {
1387 .make_item
= gpio_sim_line_config_make_hog_item
,
1390 static const struct config_item_type gpio_sim_line_config_type
= {
1391 .ct_item_ops
= &gpio_sim_line_config_item_ops
,
1392 .ct_group_ops
= &gpio_sim_line_config_group_ops
,
1393 .ct_attrs
= gpio_sim_line_config_attrs
,
1394 .ct_owner
= THIS_MODULE
,
1397 static struct config_group
*
1398 gpio_sim_bank_config_make_line_group(struct config_group
*group
,
1401 struct gpio_sim_bank
*bank
= to_gpio_sim_bank(&group
->cg_item
);
1402 struct gpio_sim_device
*dev
= gpio_sim_bank_get_device(bank
);
1403 struct gpio_sim_line
*line
;
1404 unsigned int offset
;
1407 ret
= sscanf(name
, "line%u%n", &offset
, &nchar
);
1408 if (ret
!= 1 || nchar
!= strlen(name
))
1409 return ERR_PTR(-EINVAL
);
1411 guard(mutex
)(&dev
->lock
);
1413 if (gpio_sim_device_is_live(dev
))
1414 return ERR_PTR(-EBUSY
);
1416 line
= kzalloc(sizeof(*line
), GFP_KERNEL
);
1418 return ERR_PTR(-ENOMEM
);
1420 config_group_init_type_name(&line
->group
, name
,
1421 &gpio_sim_line_config_type
);
1423 line
->parent
= bank
;
1424 line
->offset
= offset
;
1425 list_add_tail(&line
->siblings
, &bank
->line_list
);
1427 return &line
->group
;
1430 static void gpio_sim_bank_config_group_release(struct config_item
*item
)
1432 struct gpio_sim_bank
*bank
= to_gpio_sim_bank(item
);
1433 struct gpio_sim_device
*dev
= gpio_sim_bank_get_device(bank
);
1435 scoped_guard(mutex
, &dev
->lock
)
1436 list_del(&bank
->siblings
);
1442 static struct configfs_item_operations gpio_sim_bank_config_item_ops
= {
1443 .release
= gpio_sim_bank_config_group_release
,
1446 static struct configfs_group_operations gpio_sim_bank_config_group_ops
= {
1447 .make_group
= gpio_sim_bank_config_make_line_group
,
1450 static const struct config_item_type gpio_sim_bank_config_group_type
= {
1451 .ct_item_ops
= &gpio_sim_bank_config_item_ops
,
1452 .ct_group_ops
= &gpio_sim_bank_config_group_ops
,
1453 .ct_attrs
= gpio_sim_bank_config_attrs
,
1454 .ct_owner
= THIS_MODULE
,
1457 static struct config_group
*
1458 gpio_sim_device_config_make_bank_group(struct config_group
*group
,
1461 struct gpio_sim_device
*dev
= to_gpio_sim_device(&group
->cg_item
);
1462 struct gpio_sim_bank
*bank
;
1464 guard(mutex
)(&dev
->lock
);
1466 if (gpio_sim_device_is_live(dev
))
1467 return ERR_PTR(-EBUSY
);
1469 bank
= kzalloc(sizeof(*bank
), GFP_KERNEL
);
1471 return ERR_PTR(-ENOMEM
);
1473 config_group_init_type_name(&bank
->group
, name
,
1474 &gpio_sim_bank_config_group_type
);
1475 bank
->num_lines
= 1;
1477 INIT_LIST_HEAD(&bank
->line_list
);
1478 list_add_tail(&bank
->siblings
, &dev
->bank_list
);
1480 return &bank
->group
;
1483 static void gpio_sim_device_config_group_release(struct config_item
*item
)
1485 struct gpio_sim_device
*dev
= to_gpio_sim_device(item
);
1487 scoped_guard(mutex
, &dev
->lock
) {
1488 if (gpio_sim_device_is_live(dev
))
1489 gpio_sim_device_deactivate(dev
);
1492 mutex_destroy(&dev
->lock
);
1493 ida_free(&gpio_sim_ida
, dev
->id
);
1497 static struct configfs_item_operations gpio_sim_device_config_item_ops
= {
1498 .release
= gpio_sim_device_config_group_release
,
1501 static struct configfs_group_operations gpio_sim_device_config_group_ops
= {
1502 .make_group
= gpio_sim_device_config_make_bank_group
,
1505 static const struct config_item_type gpio_sim_device_config_group_type
= {
1506 .ct_item_ops
= &gpio_sim_device_config_item_ops
,
1507 .ct_group_ops
= &gpio_sim_device_config_group_ops
,
1508 .ct_attrs
= gpio_sim_device_config_attrs
,
1509 .ct_owner
= THIS_MODULE
,
1512 static struct config_group
*
1513 gpio_sim_config_make_device_group(struct config_group
*group
, const char *name
)
1517 struct gpio_sim_device
*dev
__free(kfree
) = kzalloc(sizeof(*dev
),
1520 return ERR_PTR(-ENOMEM
);
1522 id
= ida_alloc(&gpio_sim_ida
, GFP_KERNEL
);
1526 config_group_init_type_name(&dev
->group
, name
,
1527 &gpio_sim_device_config_group_type
);
1529 mutex_init(&dev
->lock
);
1530 INIT_LIST_HEAD(&dev
->bank_list
);
1532 dev
->bus_notifier
.notifier_call
= gpio_sim_bus_notifier_call
;
1533 init_completion(&dev
->probe_completion
);
1535 return &no_free_ptr(dev
)->group
;
1538 static struct configfs_group_operations gpio_sim_config_group_ops
= {
1539 .make_group
= gpio_sim_config_make_device_group
,
1542 static const struct config_item_type gpio_sim_config_type
= {
1543 .ct_group_ops
= &gpio_sim_config_group_ops
,
1544 .ct_owner
= THIS_MODULE
,
1547 static struct configfs_subsystem gpio_sim_config_subsys
= {
1550 .ci_namebuf
= "gpio-sim",
1551 .ci_type
= &gpio_sim_config_type
,
1556 static int __init
gpio_sim_init(void)
1560 ret
= platform_driver_register(&gpio_sim_driver
);
1562 pr_err("Error %d while registering the platform driver\n", ret
);
1566 config_group_init(&gpio_sim_config_subsys
.su_group
);
1567 mutex_init(&gpio_sim_config_subsys
.su_mutex
);
1568 ret
= configfs_register_subsystem(&gpio_sim_config_subsys
);
1570 pr_err("Error %d while registering the configfs subsystem %s\n",
1571 ret
, gpio_sim_config_subsys
.su_group
.cg_item
.ci_namebuf
);
1572 mutex_destroy(&gpio_sim_config_subsys
.su_mutex
);
1573 platform_driver_unregister(&gpio_sim_driver
);
1579 module_init(gpio_sim_init
);
1581 static void __exit
gpio_sim_exit(void)
1583 configfs_unregister_subsystem(&gpio_sim_config_subsys
);
1584 mutex_destroy(&gpio_sim_config_subsys
.su_mutex
);
1585 platform_driver_unregister(&gpio_sim_driver
);
1587 module_exit(gpio_sim_exit
);
1589 MODULE_AUTHOR("Bartosz Golaszewski <brgl@bgdev.pl>");
1590 MODULE_DESCRIPTION("GPIO Simulator Module");
1591 MODULE_LICENSE("GPL");