xref: /linux/drivers/gpio/gpio-sim.c (revision adc4fb9c814b5d5cc6021022900fd5eb0b3c8165)
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	4 /* Max 3 properties + sentinel. */
43  #define GPIO_SIM_NUM_ATTRS	3 /* value, pull and sentinel */
44  
45  static DEFINE_IDA(gpio_sim_ida);
46  
47  struct 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  
59  struct gpio_sim_attribute {
60  	struct device_attribute dev_attr;
61  	unsigned int offset;
62  };
63  
64  static struct gpio_sim_attribute *
to_gpio_sim_attr(struct device_attribute * dev_attr)65  to_gpio_sim_attr(struct device_attribute *dev_attr)
66  {
67  	return container_of(dev_attr, struct gpio_sim_attribute, dev_attr);
68  }
69  
gpio_sim_apply_pull(struct gpio_sim_chip * chip,unsigned int offset,int value)70  static 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  
103  set_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  
109  set_pull:
110  	__assign_bit(offset, chip->pull_map, value);
111  	return 0;
112  }
113  
gpio_sim_get(struct gpio_chip * gc,unsigned int offset)114  static 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  
gpio_sim_set(struct gpio_chip * gc,unsigned int offset,int value)123  static 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  
gpio_sim_get_multiple(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)133  static 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  
gpio_sim_set_multiple(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)144  static 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  
gpio_sim_direction_output(struct gpio_chip * gc,unsigned int offset,int value)156  static 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  
gpio_sim_direction_input(struct gpio_chip * gc,unsigned int offset)169  static 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  
gpio_sim_get_direction(struct gpio_chip * gc,unsigned int offset)179  static 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  
gpio_sim_set_config(struct gpio_chip * gc,unsigned int offset,unsigned long config)190  static 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  
gpio_sim_to_irq(struct gpio_chip * gc,unsigned int offset)207  static 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  
gpio_sim_request(struct gpio_chip * gc,unsigned int offset)214  static 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  
gpio_sim_free(struct gpio_chip * gc,unsigned int offset)224  static 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  
gpio_sim_irq_requested(struct irq_domain * domain,irq_hw_number_t hwirq,void * data)235  static 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  
gpio_sim_irq_released(struct irq_domain * domain,irq_hw_number_t hwirq,void * data)243  static 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  
251  static 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  
gpio_sim_dbg_show(struct seq_file * seq,struct gpio_chip * gc)256  static 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",
266  			   gc->base + i,
267  			   label ?: "<unused>",
268  			   test_bit(i, chip->direction_map) ? "input" :
269  				test_bit(i, chip->value_map) ? "output-high" :
270  							       "output-low",
271  			   test_bit(i, chip->pull_map) ? "pull-up" :
272  							 "pull-down");
273  }
274  
gpio_sim_sysfs_val_show(struct device * dev,struct device_attribute * attr,char * buf)275  static ssize_t gpio_sim_sysfs_val_show(struct device *dev,
276  				       struct device_attribute *attr, char *buf)
277  {
278  	struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
279  	struct gpio_sim_chip *chip = dev_get_drvdata(dev);
280  	int val;
281  
282  	scoped_guard(mutex, &chip->lock)
283  		val = !!test_bit(line_attr->offset, chip->value_map);
284  
285  	return sysfs_emit(buf, "%d\n", val);
286  }
287  
gpio_sim_sysfs_val_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)288  static ssize_t gpio_sim_sysfs_val_store(struct device *dev,
289  					struct device_attribute *attr,
290  					const char *buf, size_t count)
291  {
292  	/*
293  	 * Not assigning this function will result in write() returning -EIO
294  	 * which is confusing. Return -EPERM explicitly.
295  	 */
296  	return -EPERM;
297  }
298  
299  static const char *const gpio_sim_sysfs_pull_strings[] = {
300  	[0]	= "pull-down",
301  	[1]	= "pull-up",
302  };
303  
gpio_sim_sysfs_pull_show(struct device * dev,struct device_attribute * attr,char * buf)304  static ssize_t gpio_sim_sysfs_pull_show(struct device *dev,
305  					struct device_attribute *attr,
306  					char *buf)
307  {
308  	struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
309  	struct gpio_sim_chip *chip = dev_get_drvdata(dev);
310  	int pull;
311  
312  	scoped_guard(mutex, &chip->lock)
313  		pull = !!test_bit(line_attr->offset, chip->pull_map);
314  
315  	return sysfs_emit(buf, "%s\n", gpio_sim_sysfs_pull_strings[pull]);
316  }
317  
gpio_sim_sysfs_pull_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t len)318  static ssize_t gpio_sim_sysfs_pull_store(struct device *dev,
319  					 struct device_attribute *attr,
320  					 const char *buf, size_t len)
321  {
322  	struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
323  	struct gpio_sim_chip *chip = dev_get_drvdata(dev);
324  	int ret, pull;
325  
326  	pull = sysfs_match_string(gpio_sim_sysfs_pull_strings, buf);
327  	if (pull < 0)
328  		return pull;
329  
330  	ret = gpio_sim_apply_pull(chip, line_attr->offset, pull);
331  	if (ret)
332  		return ret;
333  
334  	return len;
335  }
336  
gpio_sim_put_device(void * data)337  static void gpio_sim_put_device(void *data)
338  {
339  	struct device *dev = data;
340  
341  	put_device(dev);
342  }
343  
gpio_sim_dispose_mappings(void * data)344  static void gpio_sim_dispose_mappings(void *data)
345  {
346  	struct gpio_sim_chip *chip = data;
347  	unsigned int i;
348  
349  	for (i = 0; i < chip->gc.ngpio; i++)
350  		irq_dispose_mapping(irq_find_mapping(chip->irq_sim, i));
351  }
352  
gpio_sim_sysfs_remove(void * data)353  static void gpio_sim_sysfs_remove(void *data)
354  {
355  	struct gpio_sim_chip *chip = data;
356  
357  	sysfs_remove_groups(&chip->dev->kobj, chip->attr_groups);
358  }
359  
gpio_sim_setup_sysfs(struct gpio_sim_chip * chip)360  static int gpio_sim_setup_sysfs(struct gpio_sim_chip *chip)
361  {
362  	struct device_attribute *val_dev_attr, *pull_dev_attr;
363  	struct gpio_sim_attribute *val_attr, *pull_attr;
364  	unsigned int num_lines = chip->gc.ngpio;
365  	struct device *dev = chip->gc.parent;
366  	struct attribute_group *attr_group;
367  	struct attribute **attrs;
368  	int i, ret;
369  
370  	chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups),
371  					 num_lines + 1, GFP_KERNEL);
372  	if (!chip->attr_groups)
373  		return -ENOMEM;
374  
375  	for (i = 0; i < num_lines; i++) {
376  		attr_group = devm_kzalloc(dev, sizeof(*attr_group), GFP_KERNEL);
377  		attrs = devm_kcalloc(dev, GPIO_SIM_NUM_ATTRS, sizeof(*attrs),
378  				     GFP_KERNEL);
379  		val_attr = devm_kzalloc(dev, sizeof(*val_attr), GFP_KERNEL);
380  		pull_attr = devm_kzalloc(dev, sizeof(*pull_attr), GFP_KERNEL);
381  		if (!attr_group || !attrs || !val_attr || !pull_attr)
382  			return -ENOMEM;
383  
384  		attr_group->name = devm_kasprintf(dev, GFP_KERNEL,
385  						  "sim_gpio%u", i);
386  		if (!attr_group->name)
387  			return -ENOMEM;
388  
389  		val_attr->offset = pull_attr->offset = i;
390  
391  		val_dev_attr = &val_attr->dev_attr;
392  		pull_dev_attr = &pull_attr->dev_attr;
393  
394  		sysfs_attr_init(&val_dev_attr->attr);
395  		sysfs_attr_init(&pull_dev_attr->attr);
396  
397  		val_dev_attr->attr.name = "value";
398  		pull_dev_attr->attr.name = "pull";
399  
400  		val_dev_attr->attr.mode = pull_dev_attr->attr.mode = 0644;
401  
402  		val_dev_attr->show = gpio_sim_sysfs_val_show;
403  		val_dev_attr->store = gpio_sim_sysfs_val_store;
404  		pull_dev_attr->show = gpio_sim_sysfs_pull_show;
405  		pull_dev_attr->store = gpio_sim_sysfs_pull_store;
406  
407  		attrs[0] = &val_dev_attr->attr;
408  		attrs[1] = &pull_dev_attr->attr;
409  
410  		attr_group->attrs = attrs;
411  		chip->attr_groups[i] = attr_group;
412  	}
413  
414  	ret = sysfs_create_groups(&chip->dev->kobj, chip->attr_groups);
415  	if (ret)
416  		return ret;
417  
418  	return devm_add_action_or_reset(dev, gpio_sim_sysfs_remove, chip);
419  }
420  
gpio_sim_add_bank(struct fwnode_handle * swnode,struct device * dev)421  static int gpio_sim_add_bank(struct fwnode_handle *swnode, struct device *dev)
422  {
423  	struct gpio_sim_chip *chip;
424  	struct gpio_chip *gc;
425  	const char *label;
426  	u32 num_lines;
427  	int ret;
428  
429  	ret = fwnode_property_read_u32(swnode, "ngpios", &num_lines);
430  	if (ret)
431  		return ret;
432  
433  	if (num_lines > GPIO_SIM_NGPIO_MAX)
434  		return -ERANGE;
435  
436  	ret = fwnode_property_read_string(swnode, "gpio-sim,label", &label);
437  	if (ret) {
438  		label = devm_kasprintf(dev, GFP_KERNEL, "%s:%pfwP",
439  				       dev_name(dev), swnode);
440  		if (!label)
441  			return -ENOMEM;
442  	}
443  
444  	chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
445  	if (!chip)
446  		return -ENOMEM;
447  
448  	chip->request_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL);
449  	if (!chip->request_map)
450  		return -ENOMEM;
451  
452  	chip->direction_map = devm_bitmap_alloc(dev, num_lines, GFP_KERNEL);
453  	if (!chip->direction_map)
454  		return -ENOMEM;
455  
456  	/* Default to input mode. */
457  	bitmap_fill(chip->direction_map, num_lines);
458  
459  	chip->value_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL);
460  	if (!chip->value_map)
461  		return -ENOMEM;
462  
463  	chip->pull_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL);
464  	if (!chip->pull_map)
465  		return -ENOMEM;
466  
467  	chip->irq_sim = devm_irq_domain_create_sim_full(dev, swnode, num_lines,
468  							&gpio_sim_irq_sim_ops,
469  							chip);
470  	if (IS_ERR(chip->irq_sim))
471  		return PTR_ERR(chip->irq_sim);
472  
473  	ret = devm_add_action_or_reset(dev, gpio_sim_dispose_mappings, chip);
474  	if (ret)
475  		return ret;
476  
477  	ret = devm_mutex_init(dev, &chip->lock);
478  	if (ret)
479  		return ret;
480  
481  	gc = &chip->gc;
482  	gc->base = -1;
483  	gc->ngpio = num_lines;
484  	gc->label = label;
485  	gc->owner = THIS_MODULE;
486  	gc->parent = dev;
487  	gc->fwnode = swnode;
488  	gc->get = gpio_sim_get;
489  	gc->set_rv = gpio_sim_set;
490  	gc->get_multiple = gpio_sim_get_multiple;
491  	gc->set_multiple_rv = 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;
501  
502  	ret = devm_gpiochip_add_data(dev, gc, chip);
503  	if (ret)
504  		return ret;
505  
506  	chip->dev = device_find_child(dev, swnode, device_match_fwnode);
507  	if (!chip->dev)
508  		return -ENODEV;
509  
510  	ret = devm_add_action_or_reset(dev, gpio_sim_put_device, chip->dev);
511  	if (ret)
512  		return ret;
513  
514  	/* Used by sysfs callbacks. */
515  	dev_set_drvdata(chip->dev, chip);
516  
517  	return gpio_sim_setup_sysfs(chip);
518  }
519  
gpio_sim_probe(struct platform_device * pdev)520  static int gpio_sim_probe(struct platform_device *pdev)
521  {
522  	struct device *dev = &pdev->dev;
523  	int ret;
524  
525  	device_for_each_child_node_scoped(dev, swnode) {
526  		ret = gpio_sim_add_bank(swnode, dev);
527  		if (ret)
528  			return ret;
529  	}
530  
531  	return 0;
532  }
533  
534  static const struct of_device_id gpio_sim_of_match[] = {
535  	{ .compatible = "gpio-simulator" },
536  	{ }
537  };
538  MODULE_DEVICE_TABLE(of, gpio_sim_of_match);
539  
540  static struct platform_driver gpio_sim_driver = {
541  	.driver = {
542  		.name = "gpio-sim",
543  		.of_match_table = gpio_sim_of_match,
544  	},
545  	.probe = gpio_sim_probe,
546  };
547  
548  struct gpio_sim_device {
549  	struct dev_sync_probe_data probe_data;
550  	struct config_group group;
551  
552  	int id;
553  
554  	/*
555  	 * Each configfs filesystem operation is protected with the subsystem
556  	 * mutex. Each separate attribute is protected with the buffer mutex.
557  	 * This structure however can be modified by callbacks of different
558  	 * attributes so we need another lock.
559  	 *
560  	 * We use this lock for protecting all data structures owned by this
561  	 * object too.
562  	 */
563  	struct mutex lock;
564  
565  	struct gpiod_hog *hogs;
566  
567  	struct list_head bank_list;
568  };
569  
to_gpio_sim_device(struct config_item * item)570  static struct gpio_sim_device *to_gpio_sim_device(struct config_item *item)
571  {
572  	struct config_group *group = to_config_group(item);
573  
574  	return container_of(group, struct gpio_sim_device, group);
575  }
576  
577  struct gpio_sim_bank {
578  	struct config_group group;
579  
580  	/*
581  	 * We could have used the ci_parent field of the config_item but
582  	 * configfs is stupid and calls the item's release callback after
583  	 * already having cleared the parent pointer even though the parent
584  	 * is guaranteed to survive the child...
585  	 *
586  	 * So we need to store the pointer to the parent struct here. We can
587  	 * dereference it anywhere we need with no checks and no locking as
588  	 * it's guaranteed to survive the children and protected by configfs
589  	 * locks.
590  	 *
591  	 * Same for other structures.
592  	 */
593  	struct gpio_sim_device *parent;
594  	struct list_head siblings;
595  
596  	char *label;
597  	unsigned int num_lines;
598  
599  	struct list_head line_list;
600  
601  	struct fwnode_handle *swnode;
602  };
603  
to_gpio_sim_bank(struct config_item * item)604  static struct gpio_sim_bank *to_gpio_sim_bank(struct config_item *item)
605  {
606  	struct config_group *group = to_config_group(item);
607  
608  	return container_of(group, struct gpio_sim_bank, group);
609  }
610  
gpio_sim_bank_has_label(struct gpio_sim_bank * bank)611  static bool gpio_sim_bank_has_label(struct gpio_sim_bank *bank)
612  {
613  	return bank->label && *bank->label;
614  }
615  
616  static struct gpio_sim_device *
gpio_sim_bank_get_device(struct gpio_sim_bank * bank)617  gpio_sim_bank_get_device(struct gpio_sim_bank *bank)
618  {
619  	return bank->parent;
620  }
621  
622  struct gpio_sim_hog;
623  
624  struct gpio_sim_line {
625  	struct config_group group;
626  
627  	struct gpio_sim_bank *parent;
628  	struct list_head siblings;
629  
630  	unsigned int offset;
631  	char *name;
632  
633  	/* There can only be one hog per line. */
634  	struct gpio_sim_hog *hog;
635  };
636  
to_gpio_sim_line(struct config_item * item)637  static 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  
644  static struct gpio_sim_device *
gpio_sim_line_get_device(struct gpio_sim_line * line)645  gpio_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  
652  struct gpio_sim_hog {
653  	struct config_item item;
654  	struct gpio_sim_line *parent;
655  
656  	char *name;
657  	int dir;
658  };
659  
to_gpio_sim_hog(struct config_item * item)660  static 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  
gpio_sim_hog_get_device(struct gpio_sim_hog * hog)665  static 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  
gpio_sim_device_is_live(struct gpio_sim_device * dev)672  static 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  
gpio_sim_strdup_trimmed(const char * str,size_t count)679  static 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  
gpio_sim_device_config_dev_name_show(struct config_item * item,char * page)690  static 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  
705  CONFIGFS_ATTR_RO(gpio_sim_device_config_, dev_name);
706  
707  static ssize_t
gpio_sim_device_config_live_show(struct config_item * item,char * page)708  gpio_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  
gpio_sim_get_line_names_size(struct gpio_sim_bank * bank)719  static 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  
734  static void
gpio_sim_set_line_names(struct gpio_sim_bank * bank,char ** line_names)735  gpio_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  
gpio_sim_remove_hogs(struct gpio_sim_device * dev)747  static void gpio_sim_remove_hogs(struct gpio_sim_device *dev)
748  {
749  	struct gpiod_hog *hog;
750  
751  	if (!dev->hogs)
752  		return;
753  
754  	gpiod_remove_hogs(dev->hogs);
755  
756  	for (hog = dev->hogs; hog->chip_label; hog++) {
757  		kfree(hog->chip_label);
758  		kfree(hog->line_name);
759  	}
760  
761  	kfree(dev->hogs);
762  	dev->hogs = NULL;
763  }
764  
gpio_sim_add_hogs(struct gpio_sim_device * dev)765  static int gpio_sim_add_hogs(struct gpio_sim_device *dev)
766  {
767  	unsigned int num_hogs = 0, idx = 0;
768  	struct gpio_sim_bank *bank;
769  	struct gpio_sim_line *line;
770  	struct gpiod_hog *hog;
771  
772  	list_for_each_entry(bank, &dev->bank_list, siblings) {
773  		list_for_each_entry(line, &bank->line_list, siblings) {
774  			if (line->offset >= bank->num_lines)
775  				continue;
776  
777  			if (line->hog)
778  				num_hogs++;
779  		}
780  	}
781  
782  	if (!num_hogs)
783  		return 0;
784  
785  	/* Allocate one more for the sentinel. */
786  	dev->hogs = kcalloc(num_hogs + 1, sizeof(*dev->hogs), GFP_KERNEL);
787  	if (!dev->hogs)
788  		return -ENOMEM;
789  
790  	list_for_each_entry(bank, &dev->bank_list, siblings) {
791  		list_for_each_entry(line, &bank->line_list, siblings) {
792  			if (line->offset >= bank->num_lines)
793  				continue;
794  
795  			if (!line->hog)
796  				continue;
797  
798  			hog = &dev->hogs[idx++];
799  
800  			/*
801  			 * We need to make this string manually because at this
802  			 * point the device doesn't exist yet and so dev_name()
803  			 * is not available.
804  			 */
805  			if (gpio_sim_bank_has_label(bank))
806  				hog->chip_label = kstrdup(bank->label,
807  							  GFP_KERNEL);
808  			else
809  				hog->chip_label = kasprintf(GFP_KERNEL,
810  							"gpio-sim.%u:%pfwP",
811  							dev->id,
812  							bank->swnode);
813  			if (!hog->chip_label) {
814  				gpio_sim_remove_hogs(dev);
815  				return -ENOMEM;
816  			}
817  
818  			/*
819  			 * We need to duplicate this because the hog config
820  			 * item can be removed at any time (and we can't block
821  			 * it) and gpiolib doesn't make a deep copy of the hog
822  			 * data.
823  			 */
824  			if (line->hog->name) {
825  				hog->line_name = kstrdup(line->hog->name,
826  							 GFP_KERNEL);
827  				if (!hog->line_name) {
828  					gpio_sim_remove_hogs(dev);
829  					return -ENOMEM;
830  				}
831  			}
832  
833  			hog->chip_hwnum = line->offset;
834  			hog->dflags = line->hog->dir;
835  		}
836  	}
837  
838  	gpiod_add_hogs(dev->hogs);
839  
840  	return 0;
841  }
842  
843  static struct fwnode_handle *
gpio_sim_make_bank_swnode(struct gpio_sim_bank * bank,struct fwnode_handle * parent)844  gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank,
845  			  struct fwnode_handle *parent)
846  {
847  	struct property_entry properties[GPIO_SIM_PROP_MAX];
848  	unsigned int prop_idx = 0, line_names_size;
849  	char **line_names __free(kfree) = NULL;
850  
851  	memset(properties, 0, sizeof(properties));
852  
853  	properties[prop_idx++] = PROPERTY_ENTRY_U32("ngpios", bank->num_lines);
854  
855  	if (gpio_sim_bank_has_label(bank))
856  		properties[prop_idx++] = PROPERTY_ENTRY_STRING("gpio-sim,label",
857  							       bank->label);
858  
859  	line_names_size = gpio_sim_get_line_names_size(bank);
860  	if (line_names_size) {
861  		line_names = kcalloc(line_names_size, sizeof(*line_names),
862  				     GFP_KERNEL);
863  		if (!line_names)
864  			return ERR_PTR(-ENOMEM);
865  
866  		gpio_sim_set_line_names(bank, line_names);
867  
868  		properties[prop_idx++] = PROPERTY_ENTRY_STRING_ARRAY_LEN(
869  						"gpio-line-names",
870  						line_names, line_names_size);
871  	}
872  
873  	return fwnode_create_software_node(properties, parent);
874  }
875  
gpio_sim_remove_swnode_recursive(struct fwnode_handle * swnode)876  static void gpio_sim_remove_swnode_recursive(struct fwnode_handle *swnode)
877  {
878  	struct fwnode_handle *child;
879  
880  	fwnode_for_each_child_node(swnode, child)
881  		fwnode_remove_software_node(child);
882  
883  	fwnode_remove_software_node(swnode);
884  }
885  
gpio_sim_bank_labels_non_unique(struct gpio_sim_device * dev)886  static bool gpio_sim_bank_labels_non_unique(struct gpio_sim_device *dev)
887  {
888  	struct gpio_sim_bank *this, *pos;
889  
890  	list_for_each_entry(this, &dev->bank_list, siblings) {
891  		list_for_each_entry(pos, &dev->bank_list, siblings) {
892  			if (this == pos || (!this->label || !pos->label))
893  				continue;
894  
895  			if (strcmp(this->label, pos->label) == 0)
896  				return true;
897  		}
898  	}
899  
900  	return false;
901  }
902  
gpio_sim_device_activate(struct gpio_sim_device * dev)903  static int gpio_sim_device_activate(struct gpio_sim_device *dev)
904  {
905  	struct platform_device_info pdevinfo;
906  	struct fwnode_handle *swnode;
907  	struct gpio_sim_bank *bank;
908  	int ret;
909  
910  	lockdep_assert_held(&dev->lock);
911  
912  	if (list_empty(&dev->bank_list))
913  		return -ENODATA;
914  
915  	/*
916  	 * Non-unique GPIO device labels are a corner-case we don't support
917  	 * as it would interfere with machine hogging mechanism and has little
918  	 * use in real life.
919  	 */
920  	if (gpio_sim_bank_labels_non_unique(dev))
921  		return -EINVAL;
922  
923  	memset(&pdevinfo, 0, sizeof(pdevinfo));
924  
925  	swnode = fwnode_create_software_node(NULL, NULL);
926  	if (IS_ERR(swnode))
927  		return PTR_ERR(swnode);
928  
929  	list_for_each_entry(bank, &dev->bank_list, siblings) {
930  		bank->swnode = gpio_sim_make_bank_swnode(bank, swnode);
931  		if (IS_ERR(bank->swnode)) {
932  			ret = PTR_ERR(bank->swnode);
933  			gpio_sim_remove_swnode_recursive(swnode);
934  			return ret;
935  		}
936  	}
937  
938  	ret = gpio_sim_add_hogs(dev);
939  	if (ret) {
940  		gpio_sim_remove_swnode_recursive(swnode);
941  		return ret;
942  	}
943  
944  	pdevinfo.name = "gpio-sim";
945  	pdevinfo.fwnode = swnode;
946  	pdevinfo.id = dev->id;
947  
948  	ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo);
949  	if (ret) {
950  		gpio_sim_remove_hogs(dev);
951  		gpio_sim_remove_swnode_recursive(swnode);
952  		return ret;
953  	}
954  
955  	return 0;
956  }
957  
gpio_sim_device_deactivate(struct gpio_sim_device * dev)958  static void gpio_sim_device_deactivate(struct gpio_sim_device *dev)
959  {
960  	struct fwnode_handle *swnode;
961  
962  	lockdep_assert_held(&dev->lock);
963  
964  	swnode = dev_fwnode(&dev->probe_data.pdev->dev);
965  	dev_sync_probe_unregister(&dev->probe_data);
966  	gpio_sim_remove_hogs(dev);
967  	gpio_sim_remove_swnode_recursive(swnode);
968  }
969  
970  static void
gpio_sim_device_lockup_configfs(struct gpio_sim_device * dev,bool lock)971  gpio_sim_device_lockup_configfs(struct gpio_sim_device *dev, bool lock)
972  {
973  	struct configfs_subsystem *subsys = dev->group.cg_subsys;
974  	struct gpio_sim_bank *bank;
975  	struct gpio_sim_line *line;
976  	struct config_item *item;
977  
978  	/*
979  	 * The device only needs to depend on leaf entries. This is
980  	 * sufficient to lock up all the configfs entries that the
981  	 * instantiated, alive device depends on.
982  	 */
983  	list_for_each_entry(bank, &dev->bank_list, siblings) {
984  		list_for_each_entry(line, &bank->line_list, siblings) {
985  			item = line->hog ? &line->hog->item
986  					 : &line->group.cg_item;
987  
988  			if (lock)
989  				WARN_ON(configfs_depend_item_unlocked(subsys,
990  								      item));
991  			else
992  				configfs_undepend_item_unlocked(item);
993  		}
994  	}
995  }
996  
997  static ssize_t
gpio_sim_device_config_live_store(struct config_item * item,const char * page,size_t count)998  gpio_sim_device_config_live_store(struct config_item *item,
999  				  const char *page, size_t count)
1000  {
1001  	struct gpio_sim_device *dev = to_gpio_sim_device(item);
1002  	bool live;
1003  	int ret;
1004  
1005  	ret = kstrtobool(page, &live);
1006  	if (ret)
1007  		return ret;
1008  
1009  	if (live)
1010  		gpio_sim_device_lockup_configfs(dev, true);
1011  
1012  	scoped_guard(mutex, &dev->lock) {
1013  		if (live == gpio_sim_device_is_live(dev))
1014  			ret = -EPERM;
1015  		else if (live)
1016  			ret = gpio_sim_device_activate(dev);
1017  		else
1018  			gpio_sim_device_deactivate(dev);
1019  	}
1020  
1021  	/*
1022  	 * Undepend is required only if device disablement (live == 0)
1023  	 * succeeds or if device enablement (live == 1) fails.
1024  	 */
1025  	if (live == !!ret)
1026  		gpio_sim_device_lockup_configfs(dev, false);
1027  
1028  	return ret ?: count;
1029  }
1030  
1031  CONFIGFS_ATTR(gpio_sim_device_config_, live);
1032  
1033  static struct configfs_attribute *gpio_sim_device_config_attrs[] = {
1034  	&gpio_sim_device_config_attr_dev_name,
1035  	&gpio_sim_device_config_attr_live,
1036  	NULL
1037  };
1038  
1039  struct gpio_sim_chip_name_ctx {
1040  	struct fwnode_handle *swnode;
1041  	char *page;
1042  };
1043  
gpio_sim_emit_chip_name(struct device * dev,void * data)1044  static int gpio_sim_emit_chip_name(struct device *dev, void *data)
1045  {
1046  	struct gpio_sim_chip_name_ctx *ctx = data;
1047  
1048  	/* This would be the sysfs device exported in /sys/class/gpio. */
1049  	if (dev->class)
1050  		return 0;
1051  
1052  	if (device_match_fwnode(dev, ctx->swnode))
1053  		return sprintf(ctx->page, "%s\n", dev_name(dev));
1054  
1055  	return 0;
1056  }
1057  
gpio_sim_bank_config_chip_name_show(struct config_item * item,char * page)1058  static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item,
1059  						   char *page)
1060  {
1061  	struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1062  	struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1063  	struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page };
1064  
1065  	guard(mutex)(&dev->lock);
1066  
1067  	if (gpio_sim_device_is_live(dev))
1068  		return device_for_each_child(&dev->probe_data.pdev->dev, &ctx,
1069  					     gpio_sim_emit_chip_name);
1070  
1071  	return sprintf(page, "none\n");
1072  }
1073  
1074  CONFIGFS_ATTR_RO(gpio_sim_bank_config_, chip_name);
1075  
1076  static ssize_t
gpio_sim_bank_config_label_show(struct config_item * item,char * page)1077  gpio_sim_bank_config_label_show(struct config_item *item, char *page)
1078  {
1079  	struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1080  	struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1081  
1082  	guard(mutex)(&dev->lock);
1083  
1084  	return sprintf(page, "%s\n", bank->label ?: "");
1085  }
1086  
gpio_sim_bank_config_label_store(struct config_item * item,const char * page,size_t count)1087  static ssize_t gpio_sim_bank_config_label_store(struct config_item *item,
1088  						const char *page, size_t count)
1089  {
1090  	struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1091  	struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1092  	char *trimmed;
1093  
1094  	guard(mutex)(&dev->lock);
1095  
1096  	if (gpio_sim_device_is_live(dev))
1097  		return -EBUSY;
1098  
1099  	trimmed = gpio_sim_strdup_trimmed(page, count);
1100  	if (!trimmed)
1101  		return -ENOMEM;
1102  
1103  	kfree(bank->label);
1104  	bank->label = trimmed;
1105  
1106  	return count;
1107  }
1108  
1109  CONFIGFS_ATTR(gpio_sim_bank_config_, label);
1110  
1111  static ssize_t
gpio_sim_bank_config_num_lines_show(struct config_item * item,char * page)1112  gpio_sim_bank_config_num_lines_show(struct config_item *item, char *page)
1113  {
1114  	struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1115  	struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1116  
1117  	guard(mutex)(&dev->lock);
1118  
1119  	return sprintf(page, "%u\n", bank->num_lines);
1120  }
1121  
1122  static ssize_t
gpio_sim_bank_config_num_lines_store(struct config_item * item,const char * page,size_t count)1123  gpio_sim_bank_config_num_lines_store(struct config_item *item,
1124  				     const char *page, size_t count)
1125  {
1126  	struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1127  	struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1128  	unsigned int num_lines;
1129  	int ret;
1130  
1131  	ret = kstrtouint(page, 0, &num_lines);
1132  	if (ret)
1133  		return ret;
1134  
1135  	if (num_lines == 0)
1136  		return -EINVAL;
1137  
1138  	guard(mutex)(&dev->lock);
1139  
1140  	if (gpio_sim_device_is_live(dev))
1141  		return -EBUSY;
1142  
1143  	bank->num_lines = num_lines;
1144  
1145  	return count;
1146  }
1147  
1148  CONFIGFS_ATTR(gpio_sim_bank_config_, num_lines);
1149  
1150  static struct configfs_attribute *gpio_sim_bank_config_attrs[] = {
1151  	&gpio_sim_bank_config_attr_chip_name,
1152  	&gpio_sim_bank_config_attr_label,
1153  	&gpio_sim_bank_config_attr_num_lines,
1154  	NULL
1155  };
1156  
1157  static ssize_t
gpio_sim_line_config_name_show(struct config_item * item,char * page)1158  gpio_sim_line_config_name_show(struct config_item *item, char *page)
1159  {
1160  	struct gpio_sim_line *line = to_gpio_sim_line(item);
1161  	struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1162  
1163  	guard(mutex)(&dev->lock);
1164  
1165  	return sprintf(page, "%s\n", line->name ?: "");
1166  }
1167  
gpio_sim_line_config_name_store(struct config_item * item,const char * page,size_t count)1168  static ssize_t gpio_sim_line_config_name_store(struct config_item *item,
1169  					       const char *page, size_t count)
1170  {
1171  	struct gpio_sim_line *line = to_gpio_sim_line(item);
1172  	struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1173  	char *trimmed;
1174  
1175  	guard(mutex)(&dev->lock);
1176  
1177  	if (gpio_sim_device_is_live(dev))
1178  		return -EBUSY;
1179  
1180  	trimmed = gpio_sim_strdup_trimmed(page, count);
1181  	if (!trimmed)
1182  		return -ENOMEM;
1183  
1184  	kfree(line->name);
1185  	line->name = trimmed;
1186  
1187  	return count;
1188  }
1189  
1190  CONFIGFS_ATTR(gpio_sim_line_config_, name);
1191  
1192  static struct configfs_attribute *gpio_sim_line_config_attrs[] = {
1193  	&gpio_sim_line_config_attr_name,
1194  	NULL
1195  };
1196  
gpio_sim_hog_config_name_show(struct config_item * item,char * page)1197  static ssize_t gpio_sim_hog_config_name_show(struct config_item *item,
1198  					     char *page)
1199  {
1200  	struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1201  	struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1202  
1203  	guard(mutex)(&dev->lock);
1204  
1205  	return sprintf(page, "%s\n", hog->name ?: "");
1206  }
1207  
gpio_sim_hog_config_name_store(struct config_item * item,const char * page,size_t count)1208  static ssize_t gpio_sim_hog_config_name_store(struct config_item *item,
1209  					      const char *page, size_t count)
1210  {
1211  	struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1212  	struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1213  	char *trimmed;
1214  
1215  	guard(mutex)(&dev->lock);
1216  
1217  	if (gpio_sim_device_is_live(dev))
1218  		return -EBUSY;
1219  
1220  	trimmed = gpio_sim_strdup_trimmed(page, count);
1221  	if (!trimmed)
1222  		return -ENOMEM;
1223  
1224  	kfree(hog->name);
1225  	hog->name = trimmed;
1226  
1227  	return count;
1228  }
1229  
1230  CONFIGFS_ATTR(gpio_sim_hog_config_, name);
1231  
gpio_sim_hog_config_direction_show(struct config_item * item,char * page)1232  static ssize_t gpio_sim_hog_config_direction_show(struct config_item *item,
1233  						  char *page)
1234  {
1235  	struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1236  	struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1237  	char *repr;
1238  	int dir;
1239  
1240  	scoped_guard(mutex, &dev->lock)
1241  		dir = hog->dir;
1242  
1243  	switch (dir) {
1244  	case GPIOD_IN:
1245  		repr = "input";
1246  		break;
1247  	case GPIOD_OUT_HIGH:
1248  		repr = "output-high";
1249  		break;
1250  	case GPIOD_OUT_LOW:
1251  		repr = "output-low";
1252  		break;
1253  	default:
1254  		/* This would be a programmer bug. */
1255  		WARN(1, "Unexpected hog direction value: %d", dir);
1256  		return -EINVAL;
1257  	}
1258  
1259  	return sprintf(page, "%s\n", repr);
1260  }
1261  
1262  static ssize_t
gpio_sim_hog_config_direction_store(struct config_item * item,const char * page,size_t count)1263  gpio_sim_hog_config_direction_store(struct config_item *item,
1264  				    const char *page, size_t count)
1265  {
1266  	struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1267  	struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1268  	int dir;
1269  
1270  	guard(mutex)(&dev->lock);
1271  
1272  	if (gpio_sim_device_is_live(dev))
1273  		return -EBUSY;
1274  
1275  	if (sysfs_streq(page, "input"))
1276  		dir = GPIOD_IN;
1277  	else if (sysfs_streq(page, "output-high"))
1278  		dir = GPIOD_OUT_HIGH;
1279  	else if (sysfs_streq(page, "output-low"))
1280  		dir = GPIOD_OUT_LOW;
1281  	else
1282  		return -EINVAL;
1283  
1284  	hog->dir = dir;
1285  
1286  	return count;
1287  }
1288  
1289  CONFIGFS_ATTR(gpio_sim_hog_config_, direction);
1290  
1291  static struct configfs_attribute *gpio_sim_hog_config_attrs[] = {
1292  	&gpio_sim_hog_config_attr_name,
1293  	&gpio_sim_hog_config_attr_direction,
1294  	NULL
1295  };
1296  
gpio_sim_hog_config_item_release(struct config_item * item)1297  static void gpio_sim_hog_config_item_release(struct config_item *item)
1298  {
1299  	struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
1300  	struct gpio_sim_line *line = hog->parent;
1301  	struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
1302  
1303  	scoped_guard(mutex, &dev->lock)
1304  		line->hog = NULL;
1305  
1306  	kfree(hog->name);
1307  	kfree(hog);
1308  }
1309  
1310  static struct configfs_item_operations gpio_sim_hog_config_item_ops = {
1311  	.release	= gpio_sim_hog_config_item_release,
1312  };
1313  
1314  static const struct config_item_type gpio_sim_hog_config_type = {
1315  	.ct_item_ops	= &gpio_sim_hog_config_item_ops,
1316  	.ct_attrs	= gpio_sim_hog_config_attrs,
1317  	.ct_owner	= THIS_MODULE,
1318  };
1319  
1320  static struct config_item *
gpio_sim_line_config_make_hog_item(struct config_group * group,const char * name)1321  gpio_sim_line_config_make_hog_item(struct config_group *group, const char *name)
1322  {
1323  	struct gpio_sim_line *line = to_gpio_sim_line(&group->cg_item);
1324  	struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1325  	struct gpio_sim_hog *hog;
1326  
1327  	if (strcmp(name, "hog") != 0)
1328  		return ERR_PTR(-EINVAL);
1329  
1330  	guard(mutex)(&dev->lock);
1331  
1332  	hog = kzalloc(sizeof(*hog), GFP_KERNEL);
1333  	if (!hog)
1334  		return ERR_PTR(-ENOMEM);
1335  
1336  	config_item_init_type_name(&hog->item, name,
1337  				   &gpio_sim_hog_config_type);
1338  
1339  	hog->dir = GPIOD_IN;
1340  	hog->name = NULL;
1341  	hog->parent = line;
1342  	line->hog = hog;
1343  
1344  	return &hog->item;
1345  }
1346  
gpio_sim_line_config_group_release(struct config_item * item)1347  static void gpio_sim_line_config_group_release(struct config_item *item)
1348  {
1349  	struct gpio_sim_line *line = to_gpio_sim_line(item);
1350  	struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
1351  
1352  	scoped_guard(mutex, &dev->lock)
1353  		list_del(&line->siblings);
1354  
1355  	kfree(line->name);
1356  	kfree(line);
1357  }
1358  
1359  static struct configfs_item_operations gpio_sim_line_config_item_ops = {
1360  	.release	= gpio_sim_line_config_group_release,
1361  };
1362  
1363  static struct configfs_group_operations gpio_sim_line_config_group_ops = {
1364  	.make_item	= gpio_sim_line_config_make_hog_item,
1365  };
1366  
1367  static const struct config_item_type gpio_sim_line_config_type = {
1368  	.ct_item_ops	= &gpio_sim_line_config_item_ops,
1369  	.ct_group_ops	= &gpio_sim_line_config_group_ops,
1370  	.ct_attrs	= gpio_sim_line_config_attrs,
1371  	.ct_owner       = THIS_MODULE,
1372  };
1373  
1374  static struct config_group *
gpio_sim_bank_config_make_line_group(struct config_group * group,const char * name)1375  gpio_sim_bank_config_make_line_group(struct config_group *group,
1376  				     const char *name)
1377  {
1378  	struct gpio_sim_bank *bank = to_gpio_sim_bank(&group->cg_item);
1379  	struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1380  	struct gpio_sim_line *line;
1381  	unsigned int offset;
1382  	int ret, nchar;
1383  
1384  	ret = sscanf(name, "line%u%n", &offset, &nchar);
1385  	if (ret != 1 || nchar != strlen(name))
1386  		return ERR_PTR(-EINVAL);
1387  
1388  	guard(mutex)(&dev->lock);
1389  
1390  	if (gpio_sim_device_is_live(dev))
1391  		return ERR_PTR(-EBUSY);
1392  
1393  	line = kzalloc(sizeof(*line), GFP_KERNEL);
1394  	if (!line)
1395  		return ERR_PTR(-ENOMEM);
1396  
1397  	config_group_init_type_name(&line->group, name,
1398  				    &gpio_sim_line_config_type);
1399  
1400  	line->parent = bank;
1401  	line->offset = offset;
1402  	list_add_tail(&line->siblings, &bank->line_list);
1403  
1404  	return &line->group;
1405  }
1406  
gpio_sim_bank_config_group_release(struct config_item * item)1407  static void gpio_sim_bank_config_group_release(struct config_item *item)
1408  {
1409  	struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
1410  	struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
1411  
1412  	scoped_guard(mutex, &dev->lock)
1413  		list_del(&bank->siblings);
1414  
1415  	kfree(bank->label);
1416  	kfree(bank);
1417  }
1418  
1419  static struct configfs_item_operations gpio_sim_bank_config_item_ops = {
1420  	.release	= gpio_sim_bank_config_group_release,
1421  };
1422  
1423  static struct configfs_group_operations gpio_sim_bank_config_group_ops = {
1424  	.make_group	= gpio_sim_bank_config_make_line_group,
1425  };
1426  
1427  static const struct config_item_type gpio_sim_bank_config_group_type = {
1428  	.ct_item_ops	= &gpio_sim_bank_config_item_ops,
1429  	.ct_group_ops	= &gpio_sim_bank_config_group_ops,
1430  	.ct_attrs	= gpio_sim_bank_config_attrs,
1431  	.ct_owner	= THIS_MODULE,
1432  };
1433  
1434  static struct config_group *
gpio_sim_device_config_make_bank_group(struct config_group * group,const char * name)1435  gpio_sim_device_config_make_bank_group(struct config_group *group,
1436  				       const char *name)
1437  {
1438  	struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item);
1439  	struct gpio_sim_bank *bank;
1440  
1441  	guard(mutex)(&dev->lock);
1442  
1443  	if (gpio_sim_device_is_live(dev))
1444  		return ERR_PTR(-EBUSY);
1445  
1446  	bank = kzalloc(sizeof(*bank), GFP_KERNEL);
1447  	if (!bank)
1448  		return ERR_PTR(-ENOMEM);
1449  
1450  	config_group_init_type_name(&bank->group, name,
1451  				    &gpio_sim_bank_config_group_type);
1452  	bank->num_lines = 1;
1453  	bank->parent = dev;
1454  	INIT_LIST_HEAD(&bank->line_list);
1455  	list_add_tail(&bank->siblings, &dev->bank_list);
1456  
1457  	return &bank->group;
1458  }
1459  
gpio_sim_device_config_group_release(struct config_item * item)1460  static void gpio_sim_device_config_group_release(struct config_item *item)
1461  {
1462  	struct gpio_sim_device *dev = to_gpio_sim_device(item);
1463  
1464  	scoped_guard(mutex, &dev->lock) {
1465  		if (gpio_sim_device_is_live(dev))
1466  			gpio_sim_device_deactivate(dev);
1467  	}
1468  
1469  	mutex_destroy(&dev->lock);
1470  	ida_free(&gpio_sim_ida, dev->id);
1471  	kfree(dev);
1472  }
1473  
1474  static struct configfs_item_operations gpio_sim_device_config_item_ops = {
1475  	.release	= gpio_sim_device_config_group_release,
1476  };
1477  
1478  static struct configfs_group_operations gpio_sim_device_config_group_ops = {
1479  	.make_group	= gpio_sim_device_config_make_bank_group,
1480  };
1481  
1482  static const struct config_item_type gpio_sim_device_config_group_type = {
1483  	.ct_item_ops	= &gpio_sim_device_config_item_ops,
1484  	.ct_group_ops	= &gpio_sim_device_config_group_ops,
1485  	.ct_attrs	= gpio_sim_device_config_attrs,
1486  	.ct_owner	= THIS_MODULE,
1487  };
1488  
1489  static struct config_group *
gpio_sim_config_make_device_group(struct config_group * group,const char * name)1490  gpio_sim_config_make_device_group(struct config_group *group, const char *name)
1491  {
1492  	int id;
1493  
1494  	struct gpio_sim_device *dev __free(kfree) = kzalloc(sizeof(*dev),
1495  							    GFP_KERNEL);
1496  	if (!dev)
1497  		return ERR_PTR(-ENOMEM);
1498  
1499  	id = ida_alloc(&gpio_sim_ida, GFP_KERNEL);
1500  	if (id < 0)
1501  		return ERR_PTR(id);
1502  
1503  	config_group_init_type_name(&dev->group, name,
1504  				    &gpio_sim_device_config_group_type);
1505  	dev->id = id;
1506  	mutex_init(&dev->lock);
1507  	INIT_LIST_HEAD(&dev->bank_list);
1508  
1509  	dev_sync_probe_init(&dev->probe_data);
1510  
1511  	return &no_free_ptr(dev)->group;
1512  }
1513  
1514  static struct configfs_group_operations gpio_sim_config_group_ops = {
1515  	.make_group	= gpio_sim_config_make_device_group,
1516  };
1517  
1518  static const struct config_item_type gpio_sim_config_type = {
1519  	.ct_group_ops	= &gpio_sim_config_group_ops,
1520  	.ct_owner	= THIS_MODULE,
1521  };
1522  
1523  static struct configfs_subsystem gpio_sim_config_subsys = {
1524  	.su_group = {
1525  		.cg_item = {
1526  			.ci_namebuf	= "gpio-sim",
1527  			.ci_type	= &gpio_sim_config_type,
1528  		},
1529  	},
1530  };
1531  
gpio_sim_init(void)1532  static int __init gpio_sim_init(void)
1533  {
1534  	int ret;
1535  
1536  	ret = platform_driver_register(&gpio_sim_driver);
1537  	if (ret) {
1538  		pr_err("Error %d while registering the platform driver\n", ret);
1539  		return ret;
1540  	}
1541  
1542  	config_group_init(&gpio_sim_config_subsys.su_group);
1543  	mutex_init(&gpio_sim_config_subsys.su_mutex);
1544  	ret = configfs_register_subsystem(&gpio_sim_config_subsys);
1545  	if (ret) {
1546  		pr_err("Error %d while registering the configfs subsystem %s\n",
1547  		       ret, gpio_sim_config_subsys.su_group.cg_item.ci_namebuf);
1548  		mutex_destroy(&gpio_sim_config_subsys.su_mutex);
1549  		platform_driver_unregister(&gpio_sim_driver);
1550  		return ret;
1551  	}
1552  
1553  	return 0;
1554  }
1555  module_init(gpio_sim_init);
1556  
gpio_sim_exit(void)1557  static void __exit gpio_sim_exit(void)
1558  {
1559  	configfs_unregister_subsystem(&gpio_sim_config_subsys);
1560  	mutex_destroy(&gpio_sim_config_subsys.su_mutex);
1561  	platform_driver_unregister(&gpio_sim_driver);
1562  }
1563  module_exit(gpio_sim_exit);
1564  
1565  MODULE_AUTHOR("Bartosz Golaszewski <brgl@bgdev.pl>");
1566  MODULE_DESCRIPTION("GPIO Simulator Module");
1567  MODULE_LICENSE("GPL");
1568