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