xref: /linux/drivers/gpio/gpio-virtuser.c (revision 6e7fd890f1d6ac83805409e9c346240de2705584)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Configurable virtual GPIO consumer module.
4  *
5  * Copyright (C) 2023-2024 Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
6  */
7 
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9 
10 #include <linux/array_size.h>
11 #include <linux/atomic.h>
12 #include <linux/bitmap.h>
13 #include <linux/cleanup.h>
14 #include <linux/completion.h>
15 #include <linux/configfs.h>
16 #include <linux/debugfs.h>
17 #include <linux/device.h>
18 #include <linux/err.h>
19 #include <linux/gpio/consumer.h>
20 #include <linux/gpio/machine.h>
21 #include <linux/idr.h>
22 #include <linux/interrupt.h>
23 #include <linux/irq_work.h>
24 #include <linux/limits.h>
25 #include <linux/list.h>
26 #include <linux/lockdep.h>
27 #include <linux/mod_devicetable.h>
28 #include <linux/module.h>
29 #include <linux/mutex.h>
30 #include <linux/notifier.h>
31 #include <linux/of.h>
32 #include <linux/overflow.h>
33 #include <linux/platform_device.h>
34 #include <linux/printk.h>
35 #include <linux/property.h>
36 #include <linux/slab.h>
37 #include <linux/string_helpers.h>
38 #include <linux/types.h>
39 
40 #define GPIO_VIRTUSER_NAME_BUF_LEN 32
41 
42 static DEFINE_IDA(gpio_virtuser_ida);
43 static struct dentry *gpio_virtuser_dbg_root;
44 
45 struct gpio_virtuser_attr_data {
46 	union {
47 		struct gpio_desc *desc;
48 		struct gpio_descs *descs;
49 	};
50 	struct dentry *dbgfs_dir;
51 };
52 
53 struct gpio_virtuser_line_array_data {
54 	struct gpio_virtuser_attr_data ad;
55 };
56 
57 struct gpio_virtuser_line_data {
58 	struct gpio_virtuser_attr_data ad;
59 	char consumer[GPIO_VIRTUSER_NAME_BUF_LEN];
60 	struct mutex consumer_lock;
61 	unsigned int debounce;
62 	atomic_t irq;
63 	atomic_t irq_count;
64 };
65 
66 struct gpio_virtuser_dbgfs_attr_descr {
67 	const char *name;
68 	const struct file_operations *fops;
69 };
70 
71 struct gpio_virtuser_irq_work_context {
72 	struct irq_work work;
73 	struct completion work_completion;
74 	union {
75 		struct {
76 			struct gpio_desc *desc;
77 			int dir;
78 			int val;
79 			int ret;
80 		};
81 		struct {
82 			struct gpio_descs *descs;
83 			unsigned long *values;
84 		};
85 	};
86 };
87 
88 static struct gpio_virtuser_irq_work_context *
89 to_gpio_virtuser_irq_work_context(struct irq_work *work)
90 {
91 	return container_of(work, struct gpio_virtuser_irq_work_context, work);
92 }
93 
94 static void
95 gpio_virtuser_init_irq_work_context(struct gpio_virtuser_irq_work_context *ctx)
96 {
97 	memset(ctx, 0, sizeof(*ctx));
98 	init_completion(&ctx->work_completion);
99 }
100 
101 static void
102 gpio_virtuser_irq_work_queue_sync(struct gpio_virtuser_irq_work_context *ctx)
103 {
104 	irq_work_queue(&ctx->work);
105 	wait_for_completion(&ctx->work_completion);
106 }
107 
108 static void gpio_virtuser_dbgfs_emit_value_array(char *buf,
109 						 unsigned long *values,
110 						 size_t num_values)
111 {
112 	size_t i;
113 
114 	for (i = 0; i < num_values; i++)
115 		buf[i] = test_bit(i, values) ? '1' : '0';
116 
117 	buf[i++] = '\n';
118 }
119 
120 static void gpio_virtuser_get_value_array_atomic(struct irq_work *work)
121 {
122 	struct gpio_virtuser_irq_work_context *ctx =
123 				to_gpio_virtuser_irq_work_context(work);
124 	struct gpio_descs *descs = ctx->descs;
125 
126 	ctx->ret = gpiod_get_array_value(descs->ndescs, descs->desc,
127 					 descs->info, ctx->values);
128 	complete(&ctx->work_completion);
129 }
130 
131 static int gpio_virtuser_get_array_value(struct gpio_descs *descs,
132 					 unsigned long *values, bool atomic)
133 {
134 	struct gpio_virtuser_irq_work_context ctx;
135 
136 	if (!atomic)
137 		return gpiod_get_array_value_cansleep(descs->ndescs,
138 						      descs->desc,
139 						      descs->info, values);
140 
141 	gpio_virtuser_init_irq_work_context(&ctx);
142 	ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_get_value_array_atomic);
143 	ctx.descs = descs;
144 	ctx.values = values;
145 
146 	gpio_virtuser_irq_work_queue_sync(&ctx);
147 
148 	return ctx.ret;
149 }
150 
151 static ssize_t gpio_virtuser_value_array_do_read(struct file *file,
152 						 char __user *user_buf,
153 						 size_t size, loff_t *ppos,
154 						 bool atomic)
155 {
156 	struct gpio_virtuser_line_data *data = file->private_data;
157 	struct gpio_descs *descs = data->ad.descs;
158 	size_t bufsize;
159 	int ret;
160 
161 	unsigned long *values __free(bitmap) = bitmap_zalloc(descs->ndescs,
162 							     GFP_KERNEL);
163 	if (!values)
164 		return -ENOMEM;
165 
166 	ret = gpio_virtuser_get_array_value(descs, values, atomic);
167 	if (ret)
168 		return ret;
169 
170 	bufsize = descs->ndescs + 2;
171 
172 	char *buf __free(kfree) = kzalloc(bufsize, GFP_KERNEL);
173 	if (!buf)
174 		return -ENOMEM;
175 
176 	gpio_virtuser_dbgfs_emit_value_array(buf, values, descs->ndescs);
177 
178 	return simple_read_from_buffer(user_buf, size, ppos, buf,
179 				       descs->ndescs + 1);
180 }
181 
182 static int gpio_virtuser_dbgfs_parse_value_array(const char *buf,
183 						 size_t len,
184 						 unsigned long *values)
185 {
186 	size_t i;
187 
188 	for (i = 0; i < len; i++) {
189 		if (buf[i] == '0')
190 			clear_bit(i, values);
191 		else if (buf[i] == '1')
192 			set_bit(i, values);
193 		else
194 			return -EINVAL;
195 	}
196 
197 	return 0;
198 }
199 
200 static void gpio_virtuser_set_value_array_atomic(struct irq_work *work)
201 {
202 	struct gpio_virtuser_irq_work_context *ctx =
203 				to_gpio_virtuser_irq_work_context(work);
204 	struct gpio_descs *descs = ctx->descs;
205 
206 	ctx->ret = gpiod_set_array_value(descs->ndescs, descs->desc,
207 					 descs->info, ctx->values);
208 	complete(&ctx->work_completion);
209 }
210 
211 static int gpio_virtuser_set_array_value(struct gpio_descs *descs,
212 					 unsigned long *values, bool atomic)
213 {
214 	struct gpio_virtuser_irq_work_context ctx;
215 
216 	if (!atomic)
217 		return gpiod_set_array_value_cansleep(descs->ndescs,
218 						      descs->desc,
219 						      descs->info, values);
220 
221 	gpio_virtuser_init_irq_work_context(&ctx);
222 	ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_set_value_array_atomic);
223 	ctx.descs = descs;
224 	ctx.values = values;
225 
226 	gpio_virtuser_irq_work_queue_sync(&ctx);
227 
228 	return ctx.ret;
229 }
230 
231 static ssize_t gpio_virtuser_value_array_do_write(struct file *file,
232 						  const char __user *user_buf,
233 						  size_t count, loff_t *ppos,
234 						  bool atomic)
235 {
236 	struct gpio_virtuser_line_data *data = file->private_data;
237 	struct gpio_descs *descs = data->ad.descs;
238 	int ret;
239 
240 	if (count - 1 != descs->ndescs)
241 		return -EINVAL;
242 
243 	char *buf __free(kfree) = kzalloc(count, GFP_KERNEL);
244 	if (!buf)
245 		return -ENOMEM;
246 
247 	ret = simple_write_to_buffer(buf, count, ppos, user_buf, count);
248 	if (ret < 0)
249 		return ret;
250 
251 	unsigned long *values __free(bitmap) = bitmap_zalloc(descs->ndescs,
252 							     GFP_KERNEL);
253 	if (!values)
254 		return -ENOMEM;
255 
256 	ret = gpio_virtuser_dbgfs_parse_value_array(buf, count - 1, values);
257 	if (ret)
258 		return ret;
259 
260 	ret = gpio_virtuser_set_array_value(descs, values, atomic);
261 	if (ret)
262 		return ret;
263 
264 	return count;
265 }
266 
267 static ssize_t gpio_virtuser_value_array_read(struct file *file,
268 					      char __user *user_buf,
269 					      size_t count, loff_t *ppos)
270 {
271 	return gpio_virtuser_value_array_do_read(file, user_buf, count, ppos,
272 						 false);
273 }
274 
275 static ssize_t gpio_virtuser_value_array_write(struct file *file,
276 					       const char __user *user_buf,
277 					       size_t count, loff_t *ppos)
278 {
279 	return gpio_virtuser_value_array_do_write(file, user_buf, count, ppos,
280 						  false);
281 }
282 
283 static const struct file_operations gpio_virtuser_value_array_fops = {
284 	.read = gpio_virtuser_value_array_read,
285 	.write = gpio_virtuser_value_array_write,
286 	.open = simple_open,
287 	.owner = THIS_MODULE,
288 	.llseek = default_llseek,
289 };
290 
291 static ssize_t
292 gpio_virtuser_value_array_atomic_read(struct file *file, char __user *user_buf,
293 				      size_t count, loff_t *ppos)
294 {
295 	return gpio_virtuser_value_array_do_read(file, user_buf, count, ppos,
296 						 true);
297 }
298 
299 static ssize_t
300 gpio_virtuser_value_array_atomic_write(struct file *file,
301 				       const char __user *user_buf,
302 				       size_t count, loff_t *ppos)
303 {
304 	return gpio_virtuser_value_array_do_write(file, user_buf, count, ppos,
305 						  true);
306 }
307 
308 static const struct file_operations gpio_virtuser_value_array_atomic_fops = {
309 	.read = gpio_virtuser_value_array_atomic_read,
310 	.write = gpio_virtuser_value_array_atomic_write,
311 	.open = simple_open,
312 	.owner = THIS_MODULE,
313 	.llseek = default_llseek,
314 };
315 
316 static void gpio_virtuser_do_get_direction_atomic(struct irq_work *work)
317 {
318 	struct gpio_virtuser_irq_work_context *ctx =
319 				to_gpio_virtuser_irq_work_context(work);
320 
321 	ctx->ret = gpiod_get_direction(ctx->desc);
322 	complete(&ctx->work_completion);
323 }
324 
325 static int gpio_virtuser_get_direction_atomic(struct gpio_desc *desc)
326 {
327 	struct gpio_virtuser_irq_work_context ctx;
328 
329 	gpio_virtuser_init_irq_work_context(&ctx);
330 	ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_do_get_direction_atomic);
331 	ctx.desc = desc;
332 
333 	gpio_virtuser_irq_work_queue_sync(&ctx);
334 
335 	return ctx.ret;
336 }
337 
338 static ssize_t gpio_virtuser_direction_do_read(struct file *file,
339 					       char __user *user_buf,
340 					       size_t size, loff_t *ppos,
341 					       bool atomic)
342 {
343 	struct gpio_virtuser_line_data *data = file->private_data;
344 	struct gpio_desc *desc = data->ad.desc;
345 	char buf[32];
346 	int dir;
347 
348 	if (!atomic)
349 		dir = gpiod_get_direction(desc);
350 	else
351 		dir = gpio_virtuser_get_direction_atomic(desc);
352 	if (dir < 0)
353 		return dir;
354 
355 	snprintf(buf, sizeof(buf), "%s\n", dir ? "input" : "output");
356 
357 	return simple_read_from_buffer(user_buf, size, ppos, buf, strlen(buf));
358 }
359 
360 static int gpio_virtuser_set_direction(struct gpio_desc *desc, int dir, int val)
361 {
362 	if (dir)
363 		return gpiod_direction_input(desc);
364 
365 	return gpiod_direction_output(desc, val);
366 }
367 
368 static void gpio_virtuser_do_set_direction_atomic(struct irq_work *work)
369 {
370 	struct gpio_virtuser_irq_work_context *ctx =
371 				to_gpio_virtuser_irq_work_context(work);
372 
373 	ctx->ret = gpio_virtuser_set_direction(ctx->desc, ctx->dir, ctx->val);
374 	complete(&ctx->work_completion);
375 }
376 
377 static int gpio_virtuser_set_direction_atomic(struct gpio_desc *desc,
378 					      int dir, int val)
379 {
380 	struct gpio_virtuser_irq_work_context ctx;
381 
382 	gpio_virtuser_init_irq_work_context(&ctx);
383 	ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_do_set_direction_atomic);
384 	ctx.desc = desc;
385 	ctx.dir = dir;
386 	ctx.val = val;
387 
388 	gpio_virtuser_irq_work_queue_sync(&ctx);
389 
390 	return ctx.ret;
391 }
392 
393 static ssize_t gpio_virtuser_direction_do_write(struct file *file,
394 						const char __user *user_buf,
395 						size_t count, loff_t *ppos,
396 						bool atomic)
397 {
398 	struct gpio_virtuser_line_data *data = file->private_data;
399 	struct gpio_desc *desc = data->ad.desc;
400 	char buf[32], *trimmed;
401 	int ret, dir, val = 0;
402 
403 	ret = simple_write_to_buffer(buf, sizeof(buf), ppos, user_buf, count);
404 	if (ret < 0)
405 		return ret;
406 
407 	trimmed = strim(buf);
408 
409 	if (strcmp(trimmed, "input") == 0) {
410 		dir = 1;
411 	} else if (strcmp(trimmed, "output-high") == 0) {
412 		dir = 0;
413 		val = 1;
414 	} else if (strcmp(trimmed, "output-low") == 0) {
415 		dir = val = 0;
416 	} else {
417 		return -EINVAL;
418 	}
419 
420 	if (!atomic)
421 		ret = gpio_virtuser_set_direction(desc, dir, val);
422 	else
423 		ret = gpio_virtuser_set_direction_atomic(desc, dir, val);
424 	if (ret)
425 		return ret;
426 
427 	return count;
428 }
429 
430 static ssize_t gpio_virtuser_direction_read(struct file *file,
431 					    char __user *user_buf,
432 					    size_t size, loff_t *ppos)
433 {
434 	return gpio_virtuser_direction_do_read(file, user_buf, size, ppos,
435 					       false);
436 }
437 
438 static ssize_t gpio_virtuser_direction_write(struct file *file,
439 					     const char __user *user_buf,
440 					     size_t count, loff_t *ppos)
441 {
442 	return gpio_virtuser_direction_do_write(file, user_buf, count, ppos,
443 						false);
444 }
445 
446 static const struct file_operations gpio_virtuser_direction_fops = {
447 	.read = gpio_virtuser_direction_read,
448 	.write = gpio_virtuser_direction_write,
449 	.open = simple_open,
450 	.owner = THIS_MODULE,
451 	.llseek = default_llseek,
452 };
453 
454 static ssize_t gpio_virtuser_direction_atomic_read(struct file *file,
455 						   char __user *user_buf,
456 						   size_t size, loff_t *ppos)
457 {
458 	return gpio_virtuser_direction_do_read(file, user_buf, size, ppos,
459 					       true);
460 }
461 
462 static ssize_t gpio_virtuser_direction_atomic_write(struct file *file,
463 						    const char __user *user_buf,
464 						    size_t count, loff_t *ppos)
465 {
466 	return gpio_virtuser_direction_do_write(file, user_buf, count, ppos,
467 						true);
468 }
469 
470 static const struct file_operations gpio_virtuser_direction_atomic_fops = {
471 	.read = gpio_virtuser_direction_atomic_read,
472 	.write = gpio_virtuser_direction_atomic_write,
473 	.open = simple_open,
474 	.owner = THIS_MODULE,
475 	.llseek = default_llseek,
476 };
477 
478 static int gpio_virtuser_value_get(void *data, u64 *val)
479 {
480 	struct gpio_virtuser_line_data *ld = data;
481 	int ret;
482 
483 	ret = gpiod_get_value_cansleep(ld->ad.desc);
484 	if (ret < 0)
485 		return ret;
486 
487 	*val = ret;
488 
489 	return 0;
490 }
491 
492 static int gpio_virtuser_value_set(void *data, u64 val)
493 {
494 	struct gpio_virtuser_line_data *ld = data;
495 
496 	if (val > 1)
497 		return -EINVAL;
498 
499 	gpiod_set_value_cansleep(ld->ad.desc, (int)val);
500 
501 	return 0;
502 }
503 
504 DEFINE_DEBUGFS_ATTRIBUTE(gpio_virtuser_value_fops,
505 			 gpio_virtuser_value_get,
506 			 gpio_virtuser_value_set,
507 			 "%llu\n");
508 
509 static void gpio_virtuser_get_value_atomic(struct irq_work *work)
510 {
511 	struct gpio_virtuser_irq_work_context *ctx =
512 				to_gpio_virtuser_irq_work_context(work);
513 
514 	ctx->val = gpiod_get_value(ctx->desc);
515 	complete(&ctx->work_completion);
516 }
517 
518 static int gpio_virtuser_value_atomic_get(void *data, u64 *val)
519 {
520 	struct gpio_virtuser_line_data *ld = data;
521 	struct gpio_virtuser_irq_work_context ctx;
522 
523 	gpio_virtuser_init_irq_work_context(&ctx);
524 	ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_get_value_atomic);
525 	ctx.desc = ld->ad.desc;
526 
527 	gpio_virtuser_irq_work_queue_sync(&ctx);
528 
529 	if (ctx.val < 0)
530 		return ctx.val;
531 
532 	*val = ctx.val;
533 
534 	return 0;
535 }
536 
537 static void gpio_virtuser_set_value_atomic(struct irq_work *work)
538 {
539 	struct gpio_virtuser_irq_work_context *ctx =
540 			to_gpio_virtuser_irq_work_context(work);
541 
542 	gpiod_set_value(ctx->desc, ctx->val);
543 	complete(&ctx->work_completion);
544 }
545 
546 static int gpio_virtuser_value_atomic_set(void *data, u64 val)
547 {
548 	struct gpio_virtuser_line_data *ld = data;
549 	struct gpio_virtuser_irq_work_context ctx;
550 
551 	if (val > 1)
552 		return -EINVAL;
553 
554 	gpio_virtuser_init_irq_work_context(&ctx);
555 	ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_set_value_atomic);
556 	ctx.desc = ld->ad.desc;
557 	ctx.val = (int)val;
558 
559 	gpio_virtuser_irq_work_queue_sync(&ctx);
560 
561 	return 0;
562 }
563 
564 DEFINE_DEBUGFS_ATTRIBUTE(gpio_virtuser_value_atomic_fops,
565 			 gpio_virtuser_value_atomic_get,
566 			 gpio_virtuser_value_atomic_set,
567 			 "%llu\n");
568 
569 static int gpio_virtuser_debounce_get(void *data, u64 *val)
570 {
571 	struct gpio_virtuser_line_data *ld = data;
572 
573 	*val = READ_ONCE(ld->debounce);
574 
575 	return 0;
576 }
577 
578 static int gpio_virtuser_debounce_set(void *data, u64 val)
579 {
580 	struct gpio_virtuser_line_data *ld = data;
581 	int ret;
582 
583 	if (val > UINT_MAX)
584 		return -E2BIG;
585 
586 	ret = gpiod_set_debounce(ld->ad.desc, (unsigned int)val);
587 	if (ret)
588 		/* Don't propagate errno unknown to user-space. */
589 		return ret == -ENOTSUPP ? -EOPNOTSUPP : ret;
590 
591 	WRITE_ONCE(ld->debounce, (unsigned int)val);
592 
593 	return 0;
594 }
595 
596 DEFINE_DEBUGFS_ATTRIBUTE(gpio_virtuser_debounce_fops,
597 			 gpio_virtuser_debounce_get,
598 			 gpio_virtuser_debounce_set,
599 			 "%llu\n");
600 
601 static ssize_t gpio_virtuser_consumer_read(struct file *file,
602 					   char __user *user_buf,
603 					   size_t size, loff_t *ppos)
604 {
605 	struct gpio_virtuser_line_data *data = file->private_data;
606 	char buf[GPIO_VIRTUSER_NAME_BUF_LEN + 1];
607 	ssize_t ret;
608 
609 	memset(buf, 0x0, sizeof(buf));
610 
611 	scoped_guard(mutex, &data->consumer_lock)
612 		ret = snprintf(buf, sizeof(buf), "%s\n", data->consumer);
613 
614 	return simple_read_from_buffer(user_buf, size, ppos, buf, ret);
615 }
616 
617 static ssize_t gpio_virtuser_consumer_write(struct file *file,
618 					    const char __user *user_buf,
619 					    size_t count, loff_t *ppos)
620 {
621 	struct gpio_virtuser_line_data *data = file->private_data;
622 	char buf[GPIO_VIRTUSER_NAME_BUF_LEN + 2];
623 	int ret;
624 
625 	ret = simple_write_to_buffer(buf, GPIO_VIRTUSER_NAME_BUF_LEN, ppos,
626 				     user_buf, count);
627 	if (ret < 0)
628 		return ret;
629 
630 	buf[strlen(buf) - 1] = '\0';
631 
632 	ret = gpiod_set_consumer_name(data->ad.desc, buf);
633 	if (ret)
634 		return ret;
635 
636 	scoped_guard(mutex, &data->consumer_lock)
637 		strscpy(data->consumer, buf, sizeof(data->consumer));
638 
639 	return count;
640 }
641 
642 static const struct file_operations gpio_virtuser_consumer_fops = {
643 	.read = gpio_virtuser_consumer_read,
644 	.write = gpio_virtuser_consumer_write,
645 	.open = simple_open,
646 	.owner = THIS_MODULE,
647 	.llseek = default_llseek,
648 };
649 
650 static int gpio_virtuser_interrupts_get(void *data, u64 *val)
651 {
652 	struct gpio_virtuser_line_data *ld = data;
653 
654 	*val = atomic_read(&ld->irq_count);
655 
656 	return 0;
657 }
658 
659 static irqreturn_t gpio_virtuser_irq_handler(int irq, void *data)
660 {
661 	struct gpio_virtuser_line_data *ld = data;
662 
663 	atomic_inc(&ld->irq_count);
664 
665 	return IRQ_HANDLED;
666 }
667 
668 static int gpio_virtuser_interrupts_set(void *data, u64 val)
669 {
670 	struct gpio_virtuser_line_data *ld = data;
671 	int irq, ret;
672 
673 	if (val > 1)
674 		return -EINVAL;
675 
676 	if (val) {
677 		irq = gpiod_to_irq(ld->ad.desc);
678 		if (irq < 0)
679 			return irq;
680 
681 		ret = request_threaded_irq(irq, NULL,
682 					   gpio_virtuser_irq_handler,
683 					   IRQF_TRIGGER_RISING |
684 					   IRQF_TRIGGER_FALLING |
685 					   IRQF_ONESHOT,
686 					   ld->consumer, data);
687 		if (ret)
688 			return ret;
689 
690 		atomic_set(&ld->irq, irq);
691 	} else {
692 		irq = atomic_xchg(&ld->irq, 0);
693 		free_irq(irq, ld);
694 	}
695 
696 	return 0;
697 }
698 
699 DEFINE_DEBUGFS_ATTRIBUTE(gpio_virtuser_interrupts_fops,
700 			 gpio_virtuser_interrupts_get,
701 			 gpio_virtuser_interrupts_set,
702 			 "%llu\n");
703 
704 static const struct gpio_virtuser_dbgfs_attr_descr
705 gpio_virtuser_line_array_dbgfs_attrs[] = {
706 	{
707 		.name = "values",
708 		.fops = &gpio_virtuser_value_array_fops,
709 	},
710 	{
711 		.name = "values_atomic",
712 		.fops = &gpio_virtuser_value_array_atomic_fops,
713 	},
714 };
715 
716 static const struct gpio_virtuser_dbgfs_attr_descr
717 gpio_virtuser_line_dbgfs_attrs[] = {
718 	{
719 		.name = "direction",
720 		.fops = &gpio_virtuser_direction_fops,
721 	},
722 	{
723 		.name = "direction_atomic",
724 		.fops = &gpio_virtuser_direction_atomic_fops,
725 	},
726 	{
727 		.name = "value",
728 		.fops = &gpio_virtuser_value_fops,
729 	},
730 	{
731 		.name = "value_atomic",
732 		.fops = &gpio_virtuser_value_atomic_fops,
733 	},
734 	{
735 		.name = "debounce",
736 		.fops = &gpio_virtuser_debounce_fops,
737 	},
738 	{
739 		.name = "consumer",
740 		.fops = &gpio_virtuser_consumer_fops,
741 	},
742 	{
743 		.name = "interrupts",
744 		.fops = &gpio_virtuser_interrupts_fops,
745 	},
746 };
747 
748 static int gpio_virtuser_create_debugfs_attrs(
749 			const struct gpio_virtuser_dbgfs_attr_descr *attr,
750 			size_t num_attrs, struct dentry *parent, void *data)
751 {
752 	struct dentry *ret;
753 	size_t i;
754 
755 	for (i = 0; i < num_attrs; i++, attr++) {
756 		ret = debugfs_create_file(attr->name, 0644, parent, data,
757 					  attr->fops);
758 		if (IS_ERR(ret))
759 			return PTR_ERR(ret);
760 	}
761 
762 	return 0;
763 }
764 
765 static int gpio_virtuser_dbgfs_init_line_array_attrs(struct device *dev,
766 						     struct gpio_descs *descs,
767 						     const char *id,
768 						     struct dentry *dbgfs_entry)
769 {
770 	struct gpio_virtuser_line_array_data *data;
771 	char *name;
772 
773 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
774 	if (!data)
775 		return -ENOMEM;
776 
777 	data->ad.descs = descs;
778 
779 	name = devm_kasprintf(dev, GFP_KERNEL, "gpiod:%s", id);
780 	if (!name)
781 		return -ENOMEM;
782 
783 	data->ad.dbgfs_dir = debugfs_create_dir(name, dbgfs_entry);
784 	if (IS_ERR(data->ad.dbgfs_dir))
785 		return PTR_ERR(data->ad.dbgfs_dir);
786 
787 	return gpio_virtuser_create_debugfs_attrs(
788 			gpio_virtuser_line_array_dbgfs_attrs,
789 			ARRAY_SIZE(gpio_virtuser_line_array_dbgfs_attrs),
790 			data->ad.dbgfs_dir, data);
791 }
792 
793 static int gpio_virtuser_dbgfs_init_line_attrs(struct device *dev,
794 					       struct gpio_desc *desc,
795 					       const char *id,
796 					       unsigned int index,
797 					       struct dentry *dbgfs_entry)
798 {
799 	struct gpio_virtuser_line_data *data;
800 	char *name;
801 	int ret;
802 
803 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
804 	if (!data)
805 		return -ENOMEM;
806 
807 	data->ad.desc = desc;
808 	strscpy(data->consumer, id);
809 	atomic_set(&data->irq, 0);
810 	atomic_set(&data->irq_count, 0);
811 
812 	name = devm_kasprintf(dev, GFP_KERNEL, "gpiod:%s:%u", id, index);
813 	if (!name)
814 		return -ENOMEM;
815 
816 	ret = devm_mutex_init(dev, &data->consumer_lock);
817 	if (ret)
818 		return ret;
819 
820 	data->ad.dbgfs_dir = debugfs_create_dir(name, dbgfs_entry);
821 	if (IS_ERR(data->ad.dbgfs_dir))
822 		return PTR_ERR(data->ad.dbgfs_dir);
823 
824 	return gpio_virtuser_create_debugfs_attrs(
825 				gpio_virtuser_line_dbgfs_attrs,
826 				ARRAY_SIZE(gpio_virtuser_line_dbgfs_attrs),
827 				data->ad.dbgfs_dir, data);
828 }
829 
830 static void gpio_virtuser_debugfs_remove(void *data)
831 {
832 	struct dentry *dbgfs_entry = data;
833 
834 	debugfs_remove_recursive(dbgfs_entry);
835 }
836 
837 static int gpio_virtuser_prop_is_gpio(struct property *prop)
838 {
839 	char *dash = strrchr(prop->name, '-');
840 
841 	return dash && strcmp(dash, "-gpios") == 0;
842 }
843 
844 /*
845  * If this is an OF-based system, then we iterate over properties and consider
846  * all whose names end in "-gpios". For configfs we expect an additional string
847  * array property - "gpio-virtuser,ids" - containing the list of all GPIO IDs
848  * to request.
849  */
850 static int gpio_virtuser_count_ids(struct device *dev)
851 {
852 	struct device_node *of_node = dev_of_node(dev);
853 	struct property *prop;
854 	int ret = 0;
855 
856 	if (!of_node)
857 		return device_property_string_array_count(dev,
858 							  "gpio-virtuser,ids");
859 
860 	for_each_property_of_node(of_node, prop) {
861 		if (gpio_virtuser_prop_is_gpio(prop))
862 			++ret;
863 	}
864 
865 	return ret;
866 }
867 
868 static int gpio_virtuser_get_ids(struct device *dev, const char **ids,
869 				 int num_ids)
870 {
871 	struct device_node *of_node = dev_of_node(dev);
872 	struct property *prop;
873 	size_t pos = 0, diff;
874 	char *dash, *tmp;
875 
876 	if (!of_node)
877 		return device_property_read_string_array(dev,
878 							 "gpio-virtuser,ids",
879 							 ids, num_ids);
880 
881 	for_each_property_of_node(of_node, prop) {
882 		if (!gpio_virtuser_prop_is_gpio(prop))
883 			continue;
884 
885 		dash = strrchr(prop->name, '-');
886 		diff = dash - prop->name;
887 
888 		tmp = devm_kmemdup(dev, prop->name, diff + 1,
889 				   GFP_KERNEL);
890 		if (!tmp)
891 			return -ENOMEM;
892 
893 		tmp[diff] = '\0';
894 		ids[pos++] = tmp;
895 	}
896 
897 	return 0;
898 }
899 
900 static int gpio_virtuser_probe(struct platform_device *pdev)
901 {
902 	struct device *dev = &pdev->dev;
903 	struct dentry *dbgfs_entry;
904 	struct gpio_descs *descs;
905 	int ret, num_ids = 0, i;
906 	const char **ids;
907 	unsigned int j;
908 
909 	num_ids = gpio_virtuser_count_ids(dev);
910 	if (num_ids < 0)
911 		return dev_err_probe(dev, num_ids,
912 				     "Failed to get the number of GPIOs to request\n");
913 
914 	if (num_ids == 0)
915 		return dev_err_probe(dev, -EINVAL, "No GPIO IDs specified\n");
916 
917 	ids = devm_kcalloc(dev, num_ids, sizeof(*ids), GFP_KERNEL);
918 	if (!ids)
919 		return -ENOMEM;
920 
921 	ret = gpio_virtuser_get_ids(dev, ids, num_ids);
922 	if (ret < 0)
923 		return dev_err_probe(dev, ret,
924 				     "Failed to get the IDs of GPIOs to request\n");
925 
926 	dbgfs_entry = debugfs_create_dir(dev_name(dev), gpio_virtuser_dbg_root);
927 	ret = devm_add_action_or_reset(dev, gpio_virtuser_debugfs_remove,
928 				       dbgfs_entry);
929 	if (ret)
930 		return ret;
931 
932 	for (i = 0; i < num_ids; i++) {
933 		descs = devm_gpiod_get_array(dev, ids[i], GPIOD_ASIS);
934 		if (IS_ERR(descs))
935 			return dev_err_probe(dev, PTR_ERR(descs),
936 					     "Failed to request the '%s' GPIOs\n",
937 					     ids[i]);
938 
939 		ret = gpio_virtuser_dbgfs_init_line_array_attrs(dev, descs,
940 								ids[i],
941 								dbgfs_entry);
942 		if (ret)
943 			return dev_err_probe(dev, ret,
944 					     "Failed to setup the debugfs array interface for the '%s' GPIOs\n",
945 					     ids[i]);
946 
947 		for (j = 0; j < descs->ndescs; j++) {
948 			ret = gpio_virtuser_dbgfs_init_line_attrs(dev,
949 							descs->desc[j], ids[i],
950 							j, dbgfs_entry);
951 			if (ret)
952 				return dev_err_probe(dev, ret,
953 						     "Failed to setup the debugfs line interface for the '%s' GPIOs\n",
954 						     ids[i]);
955 		}
956 	}
957 
958 	return 0;
959 }
960 
961 static const struct of_device_id gpio_virtuser_of_match[] = {
962 	{ .compatible = "gpio-virtuser" },
963 	{ }
964 };
965 MODULE_DEVICE_TABLE(of, gpio_virtuser_of_match);
966 
967 static struct platform_driver gpio_virtuser_driver = {
968 	.driver = {
969 		.name = "gpio-virtuser",
970 		.of_match_table = gpio_virtuser_of_match,
971 	},
972 	.probe = gpio_virtuser_probe,
973 };
974 
975 struct gpio_virtuser_device {
976 	struct config_group group;
977 
978 	struct platform_device *pdev;
979 	int id;
980 	struct mutex lock;
981 
982 	struct notifier_block bus_notifier;
983 	struct completion probe_completion;
984 	bool driver_bound;
985 
986 	struct gpiod_lookup_table *lookup_table;
987 
988 	struct list_head lookup_list;
989 };
990 
991 static int gpio_virtuser_bus_notifier_call(struct notifier_block *nb,
992 					   unsigned long action, void *data)
993 {
994 	struct gpio_virtuser_device *vdev;
995 	struct device *dev = data;
996 	char devname[32];
997 
998 	vdev = container_of(nb, struct gpio_virtuser_device, bus_notifier);
999 	snprintf(devname, sizeof(devname), "gpio-virtuser.%d", vdev->id);
1000 
1001 	if (!device_match_name(dev, devname))
1002 		return NOTIFY_DONE;
1003 
1004 	switch (action) {
1005 	case BUS_NOTIFY_BOUND_DRIVER:
1006 		vdev->driver_bound = true;
1007 		break;
1008 	case BUS_NOTIFY_DRIVER_NOT_BOUND:
1009 		vdev->driver_bound = false;
1010 		break;
1011 	default:
1012 		return NOTIFY_DONE;
1013 	}
1014 
1015 	complete(&vdev->probe_completion);
1016 	return NOTIFY_OK;
1017 }
1018 
1019 static struct gpio_virtuser_device *
1020 to_gpio_virtuser_device(struct config_item *item)
1021 {
1022 	struct config_group *group = to_config_group(item);
1023 
1024 	return container_of(group, struct gpio_virtuser_device, group);
1025 }
1026 
1027 static bool
1028 gpio_virtuser_device_is_live(struct gpio_virtuser_device *dev)
1029 {
1030 	lockdep_assert_held(&dev->lock);
1031 
1032 	return !!dev->pdev;
1033 }
1034 
1035 struct gpio_virtuser_lookup {
1036 	struct config_group group;
1037 
1038 	struct gpio_virtuser_device *parent;
1039 	struct list_head siblings;
1040 
1041 	char *con_id;
1042 
1043 	struct list_head entry_list;
1044 };
1045 
1046 static struct gpio_virtuser_lookup *
1047 to_gpio_virtuser_lookup(struct config_item *item)
1048 {
1049 	struct config_group *group = to_config_group(item);
1050 
1051 	return container_of(group, struct gpio_virtuser_lookup, group);
1052 }
1053 
1054 struct gpio_virtuser_lookup_entry {
1055 	struct config_group group;
1056 
1057 	struct gpio_virtuser_lookup *parent;
1058 	struct list_head siblings;
1059 
1060 	char *key;
1061 	/* Can be negative to indicate lookup by name. */
1062 	int offset;
1063 	enum gpio_lookup_flags flags;
1064 };
1065 
1066 static struct gpio_virtuser_lookup_entry *
1067 to_gpio_virtuser_lookup_entry(struct config_item *item)
1068 {
1069 	struct config_group *group = to_config_group(item);
1070 
1071 	return container_of(group, struct gpio_virtuser_lookup_entry, group);
1072 }
1073 
1074 static ssize_t
1075 gpio_virtuser_lookup_entry_config_key_show(struct config_item *item, char *page)
1076 {
1077 	struct gpio_virtuser_lookup_entry *entry =
1078 					to_gpio_virtuser_lookup_entry(item);
1079 	struct gpio_virtuser_device *dev = entry->parent->parent;
1080 
1081 	guard(mutex)(&dev->lock);
1082 
1083 	return sprintf(page, "%s\n", entry->key ?: "");
1084 }
1085 
1086 static ssize_t
1087 gpio_virtuser_lookup_entry_config_key_store(struct config_item *item,
1088 					    const char *page, size_t count)
1089 {
1090 	struct gpio_virtuser_lookup_entry *entry =
1091 					to_gpio_virtuser_lookup_entry(item);
1092 	struct gpio_virtuser_device *dev = entry->parent->parent;
1093 
1094 	char *key __free(kfree) = kstrndup(skip_spaces(page), count,
1095 					   GFP_KERNEL);
1096 	if (!key)
1097 		return -ENOMEM;
1098 
1099 	strim(key);
1100 
1101 	guard(mutex)(&dev->lock);
1102 
1103 	if (gpio_virtuser_device_is_live(dev))
1104 		return -EBUSY;
1105 
1106 	kfree(entry->key);
1107 	entry->key = no_free_ptr(key);
1108 
1109 	return count;
1110 }
1111 
1112 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, key);
1113 
1114 static ssize_t
1115 gpio_virtuser_lookup_entry_config_offset_show(struct config_item *item,
1116 					      char *page)
1117 {
1118 	struct gpio_virtuser_lookup_entry *entry =
1119 					to_gpio_virtuser_lookup_entry(item);
1120 	struct gpio_virtuser_device *dev = entry->parent->parent;
1121 	unsigned int offset;
1122 
1123 	scoped_guard(mutex, &dev->lock)
1124 		offset = entry->offset;
1125 
1126 	return sprintf(page, "%d\n", offset);
1127 }
1128 
1129 static ssize_t
1130 gpio_virtuser_lookup_entry_config_offset_store(struct config_item *item,
1131 					       const char *page, size_t count)
1132 {
1133 	struct gpio_virtuser_lookup_entry *entry =
1134 					to_gpio_virtuser_lookup_entry(item);
1135 	struct gpio_virtuser_device *dev = entry->parent->parent;
1136 	int offset, ret;
1137 
1138 	ret = kstrtoint(page, 0, &offset);
1139 	if (ret)
1140 		return ret;
1141 
1142 	/*
1143 	 * Negative number here means: 'key' represents a line name to lookup.
1144 	 * Non-negative means: 'key' represents the label of the chip with
1145 	 * the 'offset' value representing the line within that chip.
1146 	 *
1147 	 * GPIOLIB uses the U16_MAX value to indicate lookup by line name so
1148 	 * the greatest offset we can accept is (U16_MAX - 1).
1149 	 */
1150 	if (offset > (U16_MAX - 1))
1151 		return -EINVAL;
1152 
1153 	guard(mutex)(&dev->lock);
1154 
1155 	if (gpio_virtuser_device_is_live(dev))
1156 		return -EBUSY;
1157 
1158 	entry->offset = offset;
1159 
1160 	return count;
1161 }
1162 
1163 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, offset);
1164 
1165 static enum gpio_lookup_flags
1166 gpio_virtuser_lookup_get_flags(struct config_item *item)
1167 {
1168 	struct gpio_virtuser_lookup_entry *entry =
1169 					to_gpio_virtuser_lookup_entry(item);
1170 	struct gpio_virtuser_device *dev = entry->parent->parent;
1171 
1172 	guard(mutex)(&dev->lock);
1173 
1174 	return entry->flags;
1175 }
1176 
1177 static ssize_t
1178 gpio_virtuser_lookup_entry_config_drive_show(struct config_item *item, char *page)
1179 {
1180 	enum gpio_lookup_flags flags = gpio_virtuser_lookup_get_flags(item);
1181 	const char *repr;
1182 
1183 	if (flags & GPIO_OPEN_DRAIN)
1184 		repr = "open-drain";
1185 	else if (flags & GPIO_OPEN_SOURCE)
1186 		repr = "open-source";
1187 	else
1188 		repr = "push-pull";
1189 
1190 	return sprintf(page, "%s\n", repr);
1191 }
1192 
1193 static ssize_t
1194 gpio_virtuser_lookup_entry_config_drive_store(struct config_item *item,
1195 					      const char *page, size_t count)
1196 {
1197 	struct gpio_virtuser_lookup_entry *entry =
1198 					to_gpio_virtuser_lookup_entry(item);
1199 	struct gpio_virtuser_device *dev = entry->parent->parent;
1200 
1201 	guard(mutex)(&dev->lock);
1202 
1203 	if (gpio_virtuser_device_is_live(dev))
1204 		return -EBUSY;
1205 
1206 	if (sysfs_streq(page, "push-pull")) {
1207 		entry->flags &= ~(GPIO_OPEN_DRAIN | GPIO_OPEN_SOURCE);
1208 	} else if (sysfs_streq(page, "open-drain")) {
1209 		entry->flags &= ~GPIO_OPEN_SOURCE;
1210 		entry->flags |= GPIO_OPEN_DRAIN;
1211 	} else if (sysfs_streq(page, "open-source")) {
1212 		entry->flags &= ~GPIO_OPEN_DRAIN;
1213 		entry->flags |= GPIO_OPEN_SOURCE;
1214 	} else {
1215 		count = -EINVAL;
1216 	}
1217 
1218 	return count;
1219 }
1220 
1221 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, drive);
1222 
1223 static ssize_t
1224 gpio_virtuser_lookup_entry_config_pull_show(struct config_item *item, char *page)
1225 {
1226 	enum gpio_lookup_flags flags = gpio_virtuser_lookup_get_flags(item);
1227 	const char *repr;
1228 
1229 	if (flags & GPIO_PULL_UP)
1230 		repr = "pull-up";
1231 	else if (flags & GPIO_PULL_DOWN)
1232 		repr = "pull-down";
1233 	else if (flags & GPIO_PULL_DISABLE)
1234 		repr = "pull-disabled";
1235 	else
1236 		repr = "as-is";
1237 
1238 	return sprintf(page, "%s\n", repr);
1239 }
1240 
1241 static ssize_t
1242 gpio_virtuser_lookup_entry_config_pull_store(struct config_item *item,
1243 					     const char *page, size_t count)
1244 {
1245 	struct gpio_virtuser_lookup_entry *entry =
1246 					to_gpio_virtuser_lookup_entry(item);
1247 	struct gpio_virtuser_device *dev = entry->parent->parent;
1248 
1249 	guard(mutex)(&dev->lock);
1250 
1251 	if (gpio_virtuser_device_is_live(dev))
1252 		return -EBUSY;
1253 
1254 	if (sysfs_streq(page, "pull-up")) {
1255 		entry->flags &= ~(GPIO_PULL_DOWN | GPIO_PULL_DISABLE);
1256 		entry->flags |= GPIO_PULL_UP;
1257 	} else if (sysfs_streq(page, "pull-down")) {
1258 		entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DISABLE);
1259 		entry->flags |= GPIO_PULL_DOWN;
1260 	} else if (sysfs_streq(page, "pull-disabled")) {
1261 		entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DOWN);
1262 		entry->flags |= GPIO_PULL_DISABLE;
1263 	} else if (sysfs_streq(page, "as-is")) {
1264 		entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DOWN |
1265 				  GPIO_PULL_DISABLE);
1266 	} else {
1267 		count = -EINVAL;
1268 	}
1269 
1270 	return count;
1271 }
1272 
1273 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, pull);
1274 
1275 static ssize_t
1276 gpio_virtuser_lookup_entry_config_active_low_show(struct config_item *item,
1277 						  char *page)
1278 {
1279 	enum gpio_lookup_flags flags = gpio_virtuser_lookup_get_flags(item);
1280 
1281 	return sprintf(page, "%c\n", flags & GPIO_ACTIVE_LOW ? '1' : '0');
1282 }
1283 
1284 static ssize_t
1285 gpio_virtuser_lookup_entry_config_active_low_store(struct config_item *item,
1286 						   const char *page,
1287 						   size_t count)
1288 {
1289 	struct gpio_virtuser_lookup_entry *entry =
1290 					to_gpio_virtuser_lookup_entry(item);
1291 	struct gpio_virtuser_device *dev = entry->parent->parent;
1292 	bool active_low;
1293 	int ret;
1294 
1295 	ret = kstrtobool(page, &active_low);
1296 	if (ret)
1297 		return ret;
1298 
1299 	guard(mutex)(&dev->lock);
1300 
1301 	if (gpio_virtuser_device_is_live(dev))
1302 		return -EBUSY;
1303 
1304 	if (active_low)
1305 		entry->flags |= GPIO_ACTIVE_LOW;
1306 	else
1307 		entry->flags &= ~GPIO_ACTIVE_LOW;
1308 
1309 	return count;
1310 }
1311 
1312 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, active_low);
1313 
1314 static ssize_t
1315 gpio_virtuser_lookup_entry_config_transitory_show(struct config_item *item,
1316 						  char *page)
1317 {
1318 	enum gpio_lookup_flags flags = gpio_virtuser_lookup_get_flags(item);
1319 
1320 	return sprintf(page, "%c\n", flags & GPIO_TRANSITORY ? '1' : '0');
1321 }
1322 
1323 static ssize_t
1324 gpio_virtuser_lookup_entry_config_transitory_store(struct config_item *item,
1325 						   const char *page,
1326 						   size_t count)
1327 {
1328 	struct gpio_virtuser_lookup_entry *entry =
1329 					to_gpio_virtuser_lookup_entry(item);
1330 	struct gpio_virtuser_device *dev = entry->parent->parent;
1331 	bool transitory;
1332 	int ret;
1333 
1334 	ret = kstrtobool(page, &transitory);
1335 	if (ret)
1336 		return ret;
1337 
1338 	guard(mutex)(&dev->lock);
1339 
1340 	if (gpio_virtuser_device_is_live(dev))
1341 		return -EBUSY;
1342 
1343 	if (transitory)
1344 		entry->flags |= GPIO_TRANSITORY;
1345 	else
1346 		entry->flags &= ~GPIO_TRANSITORY;
1347 
1348 	return count;
1349 }
1350 
1351 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, transitory);
1352 
1353 static struct configfs_attribute *gpio_virtuser_lookup_entry_config_attrs[] = {
1354 	&gpio_virtuser_lookup_entry_config_attr_key,
1355 	&gpio_virtuser_lookup_entry_config_attr_offset,
1356 	&gpio_virtuser_lookup_entry_config_attr_drive,
1357 	&gpio_virtuser_lookup_entry_config_attr_pull,
1358 	&gpio_virtuser_lookup_entry_config_attr_active_low,
1359 	&gpio_virtuser_lookup_entry_config_attr_transitory,
1360 	NULL
1361 };
1362 
1363 static ssize_t
1364 gpio_virtuser_device_config_dev_name_show(struct config_item *item,
1365 					  char *page)
1366 {
1367 	struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
1368 	struct platform_device *pdev;
1369 
1370 	guard(mutex)(&dev->lock);
1371 
1372 	pdev = dev->pdev;
1373 	if (pdev)
1374 		return sprintf(page, "%s\n", dev_name(&pdev->dev));
1375 
1376 	return sprintf(page, "gpio-sim.%d\n", dev->id);
1377 }
1378 
1379 CONFIGFS_ATTR_RO(gpio_virtuser_device_config_, dev_name);
1380 
1381 static ssize_t gpio_virtuser_device_config_live_show(struct config_item *item,
1382 						     char *page)
1383 {
1384 	struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
1385 	bool live;
1386 
1387 	scoped_guard(mutex, &dev->lock)
1388 		live = gpio_virtuser_device_is_live(dev);
1389 
1390 	return sprintf(page, "%c\n", live ? '1' : '0');
1391 }
1392 
1393 static size_t
1394 gpio_virtuser_get_lookup_count(struct gpio_virtuser_device *dev)
1395 {
1396 	struct gpio_virtuser_lookup *lookup;
1397 	size_t count = 0;
1398 
1399 	lockdep_assert_held(&dev->lock);
1400 
1401 	list_for_each_entry(lookup, &dev->lookup_list, siblings)
1402 		count += list_count_nodes(&lookup->entry_list);
1403 
1404 	return count;
1405 }
1406 
1407 static int
1408 gpio_virtuser_make_lookup_table(struct gpio_virtuser_device *dev)
1409 {
1410 	size_t num_entries = gpio_virtuser_get_lookup_count(dev);
1411 	struct gpio_virtuser_lookup_entry *entry;
1412 	struct gpio_virtuser_lookup *lookup;
1413 	struct gpiod_lookup *curr;
1414 	unsigned int i = 0;
1415 
1416 	lockdep_assert_held(&dev->lock);
1417 
1418 	struct gpiod_lookup_table *table __free(kfree) =
1419 		kzalloc(struct_size(table, table, num_entries + 1), GFP_KERNEL);
1420 	if (!table)
1421 		return -ENOMEM;
1422 
1423 	table->dev_id = kasprintf(GFP_KERNEL, "gpio-virtuser.%d", dev->id);
1424 	if (!table->dev_id)
1425 		return -ENOMEM;
1426 
1427 	list_for_each_entry(lookup, &dev->lookup_list, siblings) {
1428 		list_for_each_entry(entry, &lookup->entry_list, siblings) {
1429 			curr = &table->table[i];
1430 
1431 			curr->con_id = lookup->con_id;
1432 			curr->idx = i;
1433 			curr->key = entry->key;
1434 			curr->chip_hwnum = entry->offset < 0 ?
1435 						U16_MAX : entry->offset;
1436 			curr->flags = entry->flags;
1437 			i++;
1438 		}
1439 	}
1440 
1441 	gpiod_add_lookup_table(table);
1442 	dev->lookup_table = no_free_ptr(table);
1443 
1444 	return 0;
1445 }
1446 
1447 static struct fwnode_handle *
1448 gpio_virtuser_make_device_swnode(struct gpio_virtuser_device *dev)
1449 {
1450 	struct property_entry properties[2];
1451 	struct gpio_virtuser_lookup *lookup;
1452 	unsigned int i = 0;
1453 	size_t num_ids;
1454 
1455 	memset(properties, 0, sizeof(properties));
1456 
1457 	num_ids = list_count_nodes(&dev->lookup_list);
1458 	char **ids __free(kfree) = kcalloc(num_ids + 1, sizeof(*ids),
1459 					   GFP_KERNEL);
1460 	if (!ids)
1461 		return ERR_PTR(-ENOMEM);
1462 
1463 	list_for_each_entry(lookup, &dev->lookup_list, siblings)
1464 		ids[i++] = lookup->con_id;
1465 
1466 	properties[0] = PROPERTY_ENTRY_STRING_ARRAY_LEN("gpio-virtuser,ids",
1467 							ids, num_ids);
1468 
1469 	return fwnode_create_software_node(properties, NULL);
1470 }
1471 
1472 static int
1473 gpio_virtuser_device_activate(struct gpio_virtuser_device *dev)
1474 {
1475 	struct platform_device_info pdevinfo;
1476 	struct fwnode_handle *swnode;
1477 	struct platform_device *pdev;
1478 	int ret;
1479 
1480 	lockdep_assert_held(&dev->lock);
1481 
1482 	if (list_empty(&dev->lookup_list))
1483 		return -ENODATA;
1484 
1485 	swnode = gpio_virtuser_make_device_swnode(dev);
1486 	if (IS_ERR(swnode))
1487 		return PTR_ERR(swnode);
1488 
1489 	memset(&pdevinfo, 0, sizeof(pdevinfo));
1490 	pdevinfo.name = "gpio-virtuser";
1491 	pdevinfo.id = dev->id;
1492 	pdevinfo.fwnode = swnode;
1493 
1494 	ret = gpio_virtuser_make_lookup_table(dev);
1495 	if (ret) {
1496 		fwnode_remove_software_node(swnode);
1497 		return ret;
1498 	}
1499 
1500 	reinit_completion(&dev->probe_completion);
1501 	dev->driver_bound = false;
1502 	bus_register_notifier(&platform_bus_type, &dev->bus_notifier);
1503 
1504 	pdev = platform_device_register_full(&pdevinfo);
1505 	if (IS_ERR(pdev)) {
1506 		bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier);
1507 		fwnode_remove_software_node(swnode);
1508 		return PTR_ERR(pdev);
1509 	}
1510 
1511 	wait_for_completion(&dev->probe_completion);
1512 	bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier);
1513 
1514 	if (!dev->driver_bound) {
1515 		platform_device_unregister(pdev);
1516 		fwnode_remove_software_node(swnode);
1517 		return -ENXIO;
1518 	}
1519 
1520 	dev->pdev = pdev;
1521 
1522 	return 0;
1523 }
1524 
1525 static void
1526 gpio_virtuser_device_deactivate(struct gpio_virtuser_device *dev)
1527 {
1528 	struct fwnode_handle *swnode;
1529 
1530 	lockdep_assert_held(&dev->lock);
1531 
1532 	swnode = dev_fwnode(&dev->pdev->dev);
1533 	platform_device_unregister(dev->pdev);
1534 	fwnode_remove_software_node(swnode);
1535 	dev->pdev = NULL;
1536 	gpiod_remove_lookup_table(dev->lookup_table);
1537 	kfree(dev->lookup_table);
1538 }
1539 
1540 static ssize_t
1541 gpio_virtuser_device_config_live_store(struct config_item *item,
1542 				       const char *page, size_t count)
1543 {
1544 	struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
1545 	int ret = 0;
1546 	bool live;
1547 
1548 	ret = kstrtobool(page, &live);
1549 	if (ret)
1550 		return ret;
1551 
1552 	guard(mutex)(&dev->lock);
1553 
1554 	if (live == gpio_virtuser_device_is_live(dev))
1555 		return -EPERM;
1556 
1557 	if (live)
1558 		ret = gpio_virtuser_device_activate(dev);
1559 	else
1560 		gpio_virtuser_device_deactivate(dev);
1561 
1562 	return ret ?: count;
1563 }
1564 
1565 CONFIGFS_ATTR(gpio_virtuser_device_config_, live);
1566 
1567 static struct configfs_attribute *gpio_virtuser_device_config_attrs[] = {
1568 	&gpio_virtuser_device_config_attr_dev_name,
1569 	&gpio_virtuser_device_config_attr_live,
1570 	NULL
1571 };
1572 
1573 static void
1574 gpio_virtuser_lookup_entry_config_group_release(struct config_item *item)
1575 {
1576 	struct gpio_virtuser_lookup_entry *entry =
1577 					to_gpio_virtuser_lookup_entry(item);
1578 	struct gpio_virtuser_device *dev = entry->parent->parent;
1579 
1580 	guard(mutex)(&dev->lock);
1581 
1582 	list_del(&entry->siblings);
1583 
1584 	kfree(entry->key);
1585 	kfree(entry);
1586 }
1587 
1588 static struct
1589 configfs_item_operations gpio_virtuser_lookup_entry_config_item_ops = {
1590 	.release	= gpio_virtuser_lookup_entry_config_group_release,
1591 };
1592 
1593 static const struct
1594 config_item_type gpio_virtuser_lookup_entry_config_group_type = {
1595 	.ct_item_ops	= &gpio_virtuser_lookup_entry_config_item_ops,
1596 	.ct_attrs	= gpio_virtuser_lookup_entry_config_attrs,
1597 	.ct_owner	= THIS_MODULE,
1598 };
1599 
1600 static struct config_group *
1601 gpio_virtuser_make_lookup_entry_group(struct config_group *group,
1602 				      const char *name)
1603 {
1604 	struct gpio_virtuser_lookup *lookup =
1605 				to_gpio_virtuser_lookup(&group->cg_item);
1606 	struct gpio_virtuser_device *dev = lookup->parent;
1607 
1608 	guard(mutex)(&dev->lock);
1609 
1610 	if (gpio_virtuser_device_is_live(dev))
1611 		return ERR_PTR(-EBUSY);
1612 
1613 	struct gpio_virtuser_lookup_entry *entry __free(kfree) =
1614 				kzalloc(sizeof(*entry), GFP_KERNEL);
1615 	if (!entry)
1616 		return ERR_PTR(-ENOMEM);
1617 
1618 	config_group_init_type_name(&entry->group, name,
1619 			&gpio_virtuser_lookup_entry_config_group_type);
1620 	entry->flags = GPIO_LOOKUP_FLAGS_DEFAULT;
1621 	entry->parent = lookup;
1622 	list_add_tail(&entry->siblings, &lookup->entry_list);
1623 
1624 	return &no_free_ptr(entry)->group;
1625 }
1626 
1627 static void gpio_virtuser_lookup_config_group_release(struct config_item *item)
1628 {
1629 	struct gpio_virtuser_lookup *lookup = to_gpio_virtuser_lookup(item);
1630 	struct gpio_virtuser_device *dev = lookup->parent;
1631 
1632 	guard(mutex)(&dev->lock);
1633 
1634 	list_del(&lookup->siblings);
1635 
1636 	kfree(lookup->con_id);
1637 	kfree(lookup);
1638 }
1639 
1640 static struct configfs_item_operations gpio_virtuser_lookup_config_item_ops = {
1641 	.release	= gpio_virtuser_lookup_config_group_release,
1642 };
1643 
1644 static struct
1645 configfs_group_operations gpio_virtuser_lookup_config_group_ops = {
1646 	.make_group     = gpio_virtuser_make_lookup_entry_group,
1647 };
1648 
1649 static const struct config_item_type gpio_virtuser_lookup_config_group_type = {
1650 	.ct_group_ops	= &gpio_virtuser_lookup_config_group_ops,
1651 	.ct_item_ops	= &gpio_virtuser_lookup_config_item_ops,
1652 	.ct_owner	= THIS_MODULE,
1653 };
1654 
1655 static struct config_group *
1656 gpio_virtuser_make_lookup_group(struct config_group *group, const char *name)
1657 {
1658 	struct gpio_virtuser_device *dev =
1659 				to_gpio_virtuser_device(&group->cg_item);
1660 
1661 	if (strlen(name) > (GPIO_VIRTUSER_NAME_BUF_LEN - 1))
1662 		return ERR_PTR(-E2BIG);
1663 
1664 	guard(mutex)(&dev->lock);
1665 
1666 	if (gpio_virtuser_device_is_live(dev))
1667 		return ERR_PTR(-EBUSY);
1668 
1669 	struct gpio_virtuser_lookup *lookup __free(kfree) =
1670 				kzalloc(sizeof(*lookup), GFP_KERNEL);
1671 	if (!lookup)
1672 		return ERR_PTR(-ENOMEM);
1673 
1674 	lookup->con_id = kstrdup(name, GFP_KERNEL);
1675 	if (!lookup->con_id)
1676 		return ERR_PTR(-ENOMEM);
1677 
1678 	config_group_init_type_name(&lookup->group, name,
1679 				    &gpio_virtuser_lookup_config_group_type);
1680 	INIT_LIST_HEAD(&lookup->entry_list);
1681 	lookup->parent = dev;
1682 	list_add_tail(&lookup->siblings, &dev->lookup_list);
1683 
1684 	return &no_free_ptr(lookup)->group;
1685 }
1686 
1687 static void gpio_virtuser_device_config_group_release(struct config_item *item)
1688 {
1689 	struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
1690 
1691 	guard(mutex)(&dev->lock);
1692 
1693 	if (gpio_virtuser_device_is_live(dev))
1694 		gpio_virtuser_device_deactivate(dev);
1695 
1696 	mutex_destroy(&dev->lock);
1697 	ida_free(&gpio_virtuser_ida, dev->id);
1698 	kfree(dev);
1699 }
1700 
1701 static struct configfs_item_operations gpio_virtuser_device_config_item_ops = {
1702 	.release	= gpio_virtuser_device_config_group_release,
1703 };
1704 
1705 static struct configfs_group_operations gpio_virtuser_device_config_group_ops = {
1706 	.make_group	= gpio_virtuser_make_lookup_group,
1707 };
1708 
1709 static const struct config_item_type gpio_virtuser_device_config_group_type = {
1710 	.ct_group_ops	= &gpio_virtuser_device_config_group_ops,
1711 	.ct_item_ops	= &gpio_virtuser_device_config_item_ops,
1712 	.ct_attrs	= gpio_virtuser_device_config_attrs,
1713 	.ct_owner	= THIS_MODULE,
1714 };
1715 
1716 static struct config_group *
1717 gpio_virtuser_config_make_device_group(struct config_group *group,
1718 				       const char *name)
1719 {
1720 	struct gpio_virtuser_device *dev __free(kfree) = kzalloc(sizeof(*dev),
1721 								 GFP_KERNEL);
1722 	if (!dev)
1723 		return ERR_PTR(-ENOMEM);
1724 
1725 	dev->id = ida_alloc(&gpio_virtuser_ida, GFP_KERNEL);
1726 	if (dev->id < 0)
1727 		return ERR_PTR(dev->id);
1728 
1729 	config_group_init_type_name(&dev->group, name,
1730 				    &gpio_virtuser_device_config_group_type);
1731 	mutex_init(&dev->lock);
1732 	INIT_LIST_HEAD(&dev->lookup_list);
1733 	dev->bus_notifier.notifier_call = gpio_virtuser_bus_notifier_call;
1734 	init_completion(&dev->probe_completion);
1735 
1736 	return &no_free_ptr(dev)->group;
1737 }
1738 
1739 static struct configfs_group_operations gpio_virtuser_config_group_ops = {
1740 	.make_group	= gpio_virtuser_config_make_device_group,
1741 };
1742 
1743 static const struct config_item_type gpio_virtuser_config_type = {
1744 	.ct_group_ops	= &gpio_virtuser_config_group_ops,
1745 	.ct_owner	= THIS_MODULE,
1746 };
1747 
1748 static struct configfs_subsystem gpio_virtuser_config_subsys = {
1749 	.su_group = {
1750 		.cg_item = {
1751 			.ci_namebuf	= "gpio-virtuser",
1752 			.ci_type	= &gpio_virtuser_config_type,
1753 		},
1754 	},
1755 };
1756 
1757 static int __init gpio_virtuser_init(void)
1758 {
1759 	int ret;
1760 
1761 	ret = platform_driver_register(&gpio_virtuser_driver);
1762 	if (ret) {
1763 		pr_err("Failed to register the platform driver: %d\n", ret);
1764 		return ret;
1765 	}
1766 
1767 	config_group_init(&gpio_virtuser_config_subsys.su_group);
1768 	mutex_init(&gpio_virtuser_config_subsys.su_mutex);
1769 	ret = configfs_register_subsystem(&gpio_virtuser_config_subsys);
1770 	if (ret) {
1771 		pr_err("Failed to register the '%s' configfs subsystem: %d\n",
1772 		       gpio_virtuser_config_subsys.su_group.cg_item.ci_namebuf,
1773 		       ret);
1774 		goto err_plat_drv_unreg;
1775 	}
1776 
1777 	gpio_virtuser_dbg_root = debugfs_create_dir("gpio-virtuser", NULL);
1778 	if (IS_ERR(gpio_virtuser_dbg_root)) {
1779 		ret = PTR_ERR(gpio_virtuser_dbg_root);
1780 		pr_err("Failed to create the debugfs tree: %d\n", ret);
1781 		goto err_configfs_unreg;
1782 	}
1783 
1784 	return 0;
1785 
1786 err_configfs_unreg:
1787 	configfs_unregister_subsystem(&gpio_virtuser_config_subsys);
1788 err_plat_drv_unreg:
1789 	mutex_destroy(&gpio_virtuser_config_subsys.su_mutex);
1790 	platform_driver_unregister(&gpio_virtuser_driver);
1791 
1792 	return ret;
1793 }
1794 module_init(gpio_virtuser_init);
1795 
1796 static void __exit gpio_virtuser_exit(void)
1797 {
1798 	configfs_unregister_subsystem(&gpio_virtuser_config_subsys);
1799 	mutex_destroy(&gpio_virtuser_config_subsys.su_mutex);
1800 	platform_driver_unregister(&gpio_virtuser_driver);
1801 	debugfs_remove_recursive(gpio_virtuser_dbg_root);
1802 }
1803 module_exit(gpio_virtuser_exit);
1804 
1805 MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>");
1806 MODULE_DESCRIPTION("Virtual GPIO consumer module");
1807 MODULE_LICENSE("GPL");
1808