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 *
to_gpio_virtuser_irq_work_context(struct irq_work * work)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
gpio_virtuser_init_irq_work_context(struct gpio_virtuser_irq_work_context * ctx)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
gpio_virtuser_irq_work_queue_sync(struct gpio_virtuser_irq_work_context * ctx)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 
gpio_virtuser_dbgfs_emit_value_array(char * buf,unsigned long * values,size_t num_values)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 
gpio_virtuser_get_value_array_atomic(struct irq_work * work)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 
gpio_virtuser_get_array_value(struct gpio_descs * descs,unsigned long * values,bool atomic)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 
gpio_virtuser_value_array_do_read(struct file * file,char __user * user_buf,size_t size,loff_t * ppos,bool atomic)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 
gpio_virtuser_dbgfs_parse_value_array(const char * buf,size_t len,unsigned long * values)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 
gpio_virtuser_set_value_array_atomic(struct irq_work * work)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 
gpio_virtuser_set_array_value(struct gpio_descs * descs,unsigned long * values,bool atomic)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 
gpio_virtuser_value_array_do_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos,bool atomic)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 
gpio_virtuser_value_array_read(struct file * file,char __user * user_buf,size_t count,loff_t * ppos)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 
gpio_virtuser_value_array_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)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
gpio_virtuser_value_array_atomic_read(struct file * file,char __user * user_buf,size_t count,loff_t * ppos)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
gpio_virtuser_value_array_atomic_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)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 
gpio_virtuser_do_get_direction_atomic(struct irq_work * work)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 
gpio_virtuser_get_direction_atomic(struct gpio_desc * desc)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 
gpio_virtuser_direction_do_read(struct file * file,char __user * user_buf,size_t size,loff_t * ppos,bool atomic)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 
gpio_virtuser_set_direction(struct gpio_desc * desc,int dir,int val)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 
gpio_virtuser_do_set_direction_atomic(struct irq_work * work)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 
gpio_virtuser_set_direction_atomic(struct gpio_desc * desc,int dir,int val)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 
gpio_virtuser_direction_do_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos,bool atomic)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 	if (count >= sizeof(buf))
404 		return -EINVAL;
405 
406 	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
407 	if (ret < 0)
408 		return ret;
409 
410 	buf[ret] = '\0';
411 
412 	trimmed = strim(buf);
413 
414 	if (strcmp(trimmed, "input") == 0) {
415 		dir = 1;
416 	} else if (strcmp(trimmed, "output-high") == 0) {
417 		dir = 0;
418 		val = 1;
419 	} else if (strcmp(trimmed, "output-low") == 0) {
420 		dir = val = 0;
421 	} else {
422 		return -EINVAL;
423 	}
424 
425 	if (!atomic)
426 		ret = gpio_virtuser_set_direction(desc, dir, val);
427 	else
428 		ret = gpio_virtuser_set_direction_atomic(desc, dir, val);
429 	if (ret)
430 		return ret;
431 
432 	return count;
433 }
434 
gpio_virtuser_direction_read(struct file * file,char __user * user_buf,size_t size,loff_t * ppos)435 static ssize_t gpio_virtuser_direction_read(struct file *file,
436 					    char __user *user_buf,
437 					    size_t size, loff_t *ppos)
438 {
439 	return gpio_virtuser_direction_do_read(file, user_buf, size, ppos,
440 					       false);
441 }
442 
gpio_virtuser_direction_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)443 static ssize_t gpio_virtuser_direction_write(struct file *file,
444 					     const char __user *user_buf,
445 					     size_t count, loff_t *ppos)
446 {
447 	return gpio_virtuser_direction_do_write(file, user_buf, count, ppos,
448 						false);
449 }
450 
451 static const struct file_operations gpio_virtuser_direction_fops = {
452 	.read = gpio_virtuser_direction_read,
453 	.write = gpio_virtuser_direction_write,
454 	.open = simple_open,
455 	.owner = THIS_MODULE,
456 	.llseek = default_llseek,
457 };
458 
gpio_virtuser_direction_atomic_read(struct file * file,char __user * user_buf,size_t size,loff_t * ppos)459 static ssize_t gpio_virtuser_direction_atomic_read(struct file *file,
460 						   char __user *user_buf,
461 						   size_t size, loff_t *ppos)
462 {
463 	return gpio_virtuser_direction_do_read(file, user_buf, size, ppos,
464 					       true);
465 }
466 
gpio_virtuser_direction_atomic_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)467 static ssize_t gpio_virtuser_direction_atomic_write(struct file *file,
468 						    const char __user *user_buf,
469 						    size_t count, loff_t *ppos)
470 {
471 	return gpio_virtuser_direction_do_write(file, user_buf, count, ppos,
472 						true);
473 }
474 
475 static const struct file_operations gpio_virtuser_direction_atomic_fops = {
476 	.read = gpio_virtuser_direction_atomic_read,
477 	.write = gpio_virtuser_direction_atomic_write,
478 	.open = simple_open,
479 	.owner = THIS_MODULE,
480 	.llseek = default_llseek,
481 };
482 
gpio_virtuser_value_get(void * data,u64 * val)483 static int gpio_virtuser_value_get(void *data, u64 *val)
484 {
485 	struct gpio_virtuser_line_data *ld = data;
486 	int ret;
487 
488 	ret = gpiod_get_value_cansleep(ld->ad.desc);
489 	if (ret < 0)
490 		return ret;
491 
492 	*val = ret;
493 
494 	return 0;
495 }
496 
gpio_virtuser_value_set(void * data,u64 val)497 static int gpio_virtuser_value_set(void *data, u64 val)
498 {
499 	struct gpio_virtuser_line_data *ld = data;
500 
501 	if (val > 1)
502 		return -EINVAL;
503 
504 	gpiod_set_value_cansleep(ld->ad.desc, (int)val);
505 
506 	return 0;
507 }
508 
509 DEFINE_DEBUGFS_ATTRIBUTE(gpio_virtuser_value_fops,
510 			 gpio_virtuser_value_get,
511 			 gpio_virtuser_value_set,
512 			 "%llu\n");
513 
gpio_virtuser_get_value_atomic(struct irq_work * work)514 static void gpio_virtuser_get_value_atomic(struct irq_work *work)
515 {
516 	struct gpio_virtuser_irq_work_context *ctx =
517 				to_gpio_virtuser_irq_work_context(work);
518 
519 	ctx->val = gpiod_get_value(ctx->desc);
520 	complete(&ctx->work_completion);
521 }
522 
gpio_virtuser_value_atomic_get(void * data,u64 * val)523 static int gpio_virtuser_value_atomic_get(void *data, u64 *val)
524 {
525 	struct gpio_virtuser_line_data *ld = data;
526 	struct gpio_virtuser_irq_work_context ctx;
527 
528 	gpio_virtuser_init_irq_work_context(&ctx);
529 	ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_get_value_atomic);
530 	ctx.desc = ld->ad.desc;
531 
532 	gpio_virtuser_irq_work_queue_sync(&ctx);
533 
534 	if (ctx.val < 0)
535 		return ctx.val;
536 
537 	*val = ctx.val;
538 
539 	return 0;
540 }
541 
gpio_virtuser_set_value_atomic(struct irq_work * work)542 static void gpio_virtuser_set_value_atomic(struct irq_work *work)
543 {
544 	struct gpio_virtuser_irq_work_context *ctx =
545 			to_gpio_virtuser_irq_work_context(work);
546 
547 	gpiod_set_value(ctx->desc, ctx->val);
548 	complete(&ctx->work_completion);
549 }
550 
gpio_virtuser_value_atomic_set(void * data,u64 val)551 static int gpio_virtuser_value_atomic_set(void *data, u64 val)
552 {
553 	struct gpio_virtuser_line_data *ld = data;
554 	struct gpio_virtuser_irq_work_context ctx;
555 
556 	if (val > 1)
557 		return -EINVAL;
558 
559 	gpio_virtuser_init_irq_work_context(&ctx);
560 	ctx.work = IRQ_WORK_INIT_HARD(gpio_virtuser_set_value_atomic);
561 	ctx.desc = ld->ad.desc;
562 	ctx.val = (int)val;
563 
564 	gpio_virtuser_irq_work_queue_sync(&ctx);
565 
566 	return 0;
567 }
568 
569 DEFINE_DEBUGFS_ATTRIBUTE(gpio_virtuser_value_atomic_fops,
570 			 gpio_virtuser_value_atomic_get,
571 			 gpio_virtuser_value_atomic_set,
572 			 "%llu\n");
573 
gpio_virtuser_debounce_get(void * data,u64 * val)574 static int gpio_virtuser_debounce_get(void *data, u64 *val)
575 {
576 	struct gpio_virtuser_line_data *ld = data;
577 
578 	*val = READ_ONCE(ld->debounce);
579 
580 	return 0;
581 }
582 
gpio_virtuser_debounce_set(void * data,u64 val)583 static int gpio_virtuser_debounce_set(void *data, u64 val)
584 {
585 	struct gpio_virtuser_line_data *ld = data;
586 	int ret;
587 
588 	if (val > UINT_MAX)
589 		return -E2BIG;
590 
591 	ret = gpiod_set_debounce(ld->ad.desc, (unsigned int)val);
592 	if (ret)
593 		/* Don't propagate errno unknown to user-space. */
594 		return ret == -ENOTSUPP ? -EOPNOTSUPP : ret;
595 
596 	WRITE_ONCE(ld->debounce, (unsigned int)val);
597 
598 	return 0;
599 }
600 
601 DEFINE_DEBUGFS_ATTRIBUTE(gpio_virtuser_debounce_fops,
602 			 gpio_virtuser_debounce_get,
603 			 gpio_virtuser_debounce_set,
604 			 "%llu\n");
605 
gpio_virtuser_consumer_read(struct file * file,char __user * user_buf,size_t size,loff_t * ppos)606 static ssize_t gpio_virtuser_consumer_read(struct file *file,
607 					   char __user *user_buf,
608 					   size_t size, loff_t *ppos)
609 {
610 	struct gpio_virtuser_line_data *data = file->private_data;
611 	char buf[GPIO_VIRTUSER_NAME_BUF_LEN + 1];
612 	ssize_t ret;
613 
614 	memset(buf, 0x0, sizeof(buf));
615 
616 	scoped_guard(mutex, &data->consumer_lock)
617 		ret = snprintf(buf, sizeof(buf), "%s\n", data->consumer);
618 
619 	return simple_read_from_buffer(user_buf, size, ppos, buf, ret);
620 }
621 
gpio_virtuser_consumer_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)622 static ssize_t gpio_virtuser_consumer_write(struct file *file,
623 					    const char __user *user_buf,
624 					    size_t count, loff_t *ppos)
625 {
626 	struct gpio_virtuser_line_data *data = file->private_data;
627 	char buf[GPIO_VIRTUSER_NAME_BUF_LEN + 2];
628 	int ret;
629 
630 	if (count >= sizeof(buf))
631 		return -EINVAL;
632 
633 	ret = simple_write_to_buffer(buf, GPIO_VIRTUSER_NAME_BUF_LEN, ppos,
634 				     user_buf, count);
635 	if (ret < 0)
636 		return ret;
637 
638 	buf[ret] = '\0';
639 
640 	ret = gpiod_set_consumer_name(data->ad.desc, buf);
641 	if (ret)
642 		return ret;
643 
644 	scoped_guard(mutex, &data->consumer_lock)
645 		strscpy(data->consumer, buf, sizeof(data->consumer));
646 
647 	return count;
648 }
649 
650 static const struct file_operations gpio_virtuser_consumer_fops = {
651 	.read = gpio_virtuser_consumer_read,
652 	.write = gpio_virtuser_consumer_write,
653 	.open = simple_open,
654 	.owner = THIS_MODULE,
655 	.llseek = default_llseek,
656 };
657 
gpio_virtuser_interrupts_get(void * data,u64 * val)658 static int gpio_virtuser_interrupts_get(void *data, u64 *val)
659 {
660 	struct gpio_virtuser_line_data *ld = data;
661 
662 	*val = atomic_read(&ld->irq_count);
663 
664 	return 0;
665 }
666 
gpio_virtuser_irq_handler(int irq,void * data)667 static irqreturn_t gpio_virtuser_irq_handler(int irq, void *data)
668 {
669 	struct gpio_virtuser_line_data *ld = data;
670 
671 	atomic_inc(&ld->irq_count);
672 
673 	return IRQ_HANDLED;
674 }
675 
gpio_virtuser_interrupts_set(void * data,u64 val)676 static int gpio_virtuser_interrupts_set(void *data, u64 val)
677 {
678 	struct gpio_virtuser_line_data *ld = data;
679 	int irq, ret;
680 
681 	if (val > 1)
682 		return -EINVAL;
683 
684 	if (val) {
685 		irq = gpiod_to_irq(ld->ad.desc);
686 		if (irq < 0)
687 			return irq;
688 
689 		ret = request_threaded_irq(irq, NULL,
690 					   gpio_virtuser_irq_handler,
691 					   IRQF_TRIGGER_RISING |
692 					   IRQF_TRIGGER_FALLING |
693 					   IRQF_ONESHOT,
694 					   ld->consumer, data);
695 		if (ret)
696 			return ret;
697 
698 		atomic_set(&ld->irq, irq);
699 	} else {
700 		irq = atomic_xchg(&ld->irq, 0);
701 		free_irq(irq, ld);
702 	}
703 
704 	return 0;
705 }
706 
707 DEFINE_DEBUGFS_ATTRIBUTE(gpio_virtuser_interrupts_fops,
708 			 gpio_virtuser_interrupts_get,
709 			 gpio_virtuser_interrupts_set,
710 			 "%llu\n");
711 
712 static const struct gpio_virtuser_dbgfs_attr_descr
713 gpio_virtuser_line_array_dbgfs_attrs[] = {
714 	{
715 		.name = "values",
716 		.fops = &gpio_virtuser_value_array_fops,
717 	},
718 	{
719 		.name = "values_atomic",
720 		.fops = &gpio_virtuser_value_array_atomic_fops,
721 	},
722 };
723 
724 static const struct gpio_virtuser_dbgfs_attr_descr
725 gpio_virtuser_line_dbgfs_attrs[] = {
726 	{
727 		.name = "direction",
728 		.fops = &gpio_virtuser_direction_fops,
729 	},
730 	{
731 		.name = "direction_atomic",
732 		.fops = &gpio_virtuser_direction_atomic_fops,
733 	},
734 	{
735 		.name = "value",
736 		.fops = &gpio_virtuser_value_fops,
737 	},
738 	{
739 		.name = "value_atomic",
740 		.fops = &gpio_virtuser_value_atomic_fops,
741 	},
742 	{
743 		.name = "debounce",
744 		.fops = &gpio_virtuser_debounce_fops,
745 	},
746 	{
747 		.name = "consumer",
748 		.fops = &gpio_virtuser_consumer_fops,
749 	},
750 	{
751 		.name = "interrupts",
752 		.fops = &gpio_virtuser_interrupts_fops,
753 	},
754 };
755 
gpio_virtuser_create_debugfs_attrs(const struct gpio_virtuser_dbgfs_attr_descr * attr,size_t num_attrs,struct dentry * parent,void * data)756 static int gpio_virtuser_create_debugfs_attrs(
757 			const struct gpio_virtuser_dbgfs_attr_descr *attr,
758 			size_t num_attrs, struct dentry *parent, void *data)
759 {
760 	struct dentry *ret;
761 	size_t i;
762 
763 	for (i = 0; i < num_attrs; i++, attr++) {
764 		ret = debugfs_create_file(attr->name, 0644, parent, data,
765 					  attr->fops);
766 		if (IS_ERR(ret))
767 			return PTR_ERR(ret);
768 	}
769 
770 	return 0;
771 }
772 
gpio_virtuser_dbgfs_init_line_array_attrs(struct device * dev,struct gpio_descs * descs,const char * id,struct dentry * dbgfs_entry)773 static int gpio_virtuser_dbgfs_init_line_array_attrs(struct device *dev,
774 						     struct gpio_descs *descs,
775 						     const char *id,
776 						     struct dentry *dbgfs_entry)
777 {
778 	struct gpio_virtuser_line_array_data *data;
779 	char *name;
780 
781 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
782 	if (!data)
783 		return -ENOMEM;
784 
785 	data->ad.descs = descs;
786 
787 	name = devm_kasprintf(dev, GFP_KERNEL, "gpiod:%s", id);
788 	if (!name)
789 		return -ENOMEM;
790 
791 	data->ad.dbgfs_dir = debugfs_create_dir(name, dbgfs_entry);
792 	if (IS_ERR(data->ad.dbgfs_dir))
793 		return PTR_ERR(data->ad.dbgfs_dir);
794 
795 	return gpio_virtuser_create_debugfs_attrs(
796 			gpio_virtuser_line_array_dbgfs_attrs,
797 			ARRAY_SIZE(gpio_virtuser_line_array_dbgfs_attrs),
798 			data->ad.dbgfs_dir, data);
799 }
800 
gpio_virtuser_dbgfs_init_line_attrs(struct device * dev,struct gpio_desc * desc,const char * id,unsigned int index,struct dentry * dbgfs_entry)801 static int gpio_virtuser_dbgfs_init_line_attrs(struct device *dev,
802 					       struct gpio_desc *desc,
803 					       const char *id,
804 					       unsigned int index,
805 					       struct dentry *dbgfs_entry)
806 {
807 	struct gpio_virtuser_line_data *data;
808 	char *name;
809 	int ret;
810 
811 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
812 	if (!data)
813 		return -ENOMEM;
814 
815 	data->ad.desc = desc;
816 	strscpy(data->consumer, id);
817 	atomic_set(&data->irq, 0);
818 	atomic_set(&data->irq_count, 0);
819 
820 	name = devm_kasprintf(dev, GFP_KERNEL, "gpiod:%s:%u", id, index);
821 	if (!name)
822 		return -ENOMEM;
823 
824 	ret = devm_mutex_init(dev, &data->consumer_lock);
825 	if (ret)
826 		return ret;
827 
828 	data->ad.dbgfs_dir = debugfs_create_dir(name, dbgfs_entry);
829 	if (IS_ERR(data->ad.dbgfs_dir))
830 		return PTR_ERR(data->ad.dbgfs_dir);
831 
832 	return gpio_virtuser_create_debugfs_attrs(
833 				gpio_virtuser_line_dbgfs_attrs,
834 				ARRAY_SIZE(gpio_virtuser_line_dbgfs_attrs),
835 				data->ad.dbgfs_dir, data);
836 }
837 
gpio_virtuser_debugfs_remove(void * data)838 static void gpio_virtuser_debugfs_remove(void *data)
839 {
840 	struct dentry *dbgfs_entry = data;
841 
842 	debugfs_remove_recursive(dbgfs_entry);
843 }
844 
gpio_virtuser_prop_is_gpio(struct property * prop)845 static int gpio_virtuser_prop_is_gpio(struct property *prop)
846 {
847 	char *dash = strrchr(prop->name, '-');
848 
849 	return dash && strcmp(dash, "-gpios") == 0;
850 }
851 
852 /*
853  * If this is an OF-based system, then we iterate over properties and consider
854  * all whose names end in "-gpios". For configfs we expect an additional string
855  * array property - "gpio-virtuser,ids" - containing the list of all GPIO IDs
856  * to request.
857  */
gpio_virtuser_count_ids(struct device * dev)858 static int gpio_virtuser_count_ids(struct device *dev)
859 {
860 	struct device_node *of_node = dev_of_node(dev);
861 	struct property *prop;
862 	int ret = 0;
863 
864 	if (!of_node)
865 		return device_property_string_array_count(dev,
866 							  "gpio-virtuser,ids");
867 
868 	for_each_property_of_node(of_node, prop) {
869 		if (gpio_virtuser_prop_is_gpio(prop))
870 			++ret;
871 	}
872 
873 	return ret;
874 }
875 
gpio_virtuser_get_ids(struct device * dev,const char ** ids,int num_ids)876 static int gpio_virtuser_get_ids(struct device *dev, const char **ids,
877 				 int num_ids)
878 {
879 	struct device_node *of_node = dev_of_node(dev);
880 	struct property *prop;
881 	size_t pos = 0, diff;
882 	char *dash, *tmp;
883 
884 	if (!of_node)
885 		return device_property_read_string_array(dev,
886 							 "gpio-virtuser,ids",
887 							 ids, num_ids);
888 
889 	for_each_property_of_node(of_node, prop) {
890 		if (!gpio_virtuser_prop_is_gpio(prop))
891 			continue;
892 
893 		dash = strrchr(prop->name, '-');
894 		diff = dash - prop->name;
895 
896 		tmp = devm_kmemdup(dev, prop->name, diff + 1,
897 				   GFP_KERNEL);
898 		if (!tmp)
899 			return -ENOMEM;
900 
901 		tmp[diff] = '\0';
902 		ids[pos++] = tmp;
903 	}
904 
905 	return 0;
906 }
907 
gpio_virtuser_probe(struct platform_device * pdev)908 static int gpio_virtuser_probe(struct platform_device *pdev)
909 {
910 	struct device *dev = &pdev->dev;
911 	struct dentry *dbgfs_entry;
912 	struct gpio_descs *descs;
913 	int ret, num_ids = 0, i;
914 	const char **ids;
915 	unsigned int j;
916 
917 	num_ids = gpio_virtuser_count_ids(dev);
918 	if (num_ids < 0)
919 		return dev_err_probe(dev, num_ids,
920 				     "Failed to get the number of GPIOs to request\n");
921 
922 	if (num_ids == 0)
923 		return dev_err_probe(dev, -EINVAL, "No GPIO IDs specified\n");
924 
925 	ids = devm_kcalloc(dev, num_ids, sizeof(*ids), GFP_KERNEL);
926 	if (!ids)
927 		return -ENOMEM;
928 
929 	ret = gpio_virtuser_get_ids(dev, ids, num_ids);
930 	if (ret < 0)
931 		return dev_err_probe(dev, ret,
932 				     "Failed to get the IDs of GPIOs to request\n");
933 
934 	dbgfs_entry = debugfs_create_dir(dev_name(dev), gpio_virtuser_dbg_root);
935 	ret = devm_add_action_or_reset(dev, gpio_virtuser_debugfs_remove,
936 				       dbgfs_entry);
937 	if (ret)
938 		return ret;
939 
940 	for (i = 0; i < num_ids; i++) {
941 		descs = devm_gpiod_get_array(dev, ids[i], GPIOD_ASIS);
942 		if (IS_ERR(descs))
943 			return dev_err_probe(dev, PTR_ERR(descs),
944 					     "Failed to request the '%s' GPIOs\n",
945 					     ids[i]);
946 
947 		ret = gpio_virtuser_dbgfs_init_line_array_attrs(dev, descs,
948 								ids[i],
949 								dbgfs_entry);
950 		if (ret)
951 			return dev_err_probe(dev, ret,
952 					     "Failed to setup the debugfs array interface for the '%s' GPIOs\n",
953 					     ids[i]);
954 
955 		for (j = 0; j < descs->ndescs; j++) {
956 			ret = gpio_virtuser_dbgfs_init_line_attrs(dev,
957 							descs->desc[j], ids[i],
958 							j, dbgfs_entry);
959 			if (ret)
960 				return dev_err_probe(dev, ret,
961 						     "Failed to setup the debugfs line interface for the '%s' GPIOs\n",
962 						     ids[i]);
963 		}
964 	}
965 
966 	return 0;
967 }
968 
969 static const struct of_device_id gpio_virtuser_of_match[] = {
970 	{ .compatible = "gpio-virtuser" },
971 	{ }
972 };
973 MODULE_DEVICE_TABLE(of, gpio_virtuser_of_match);
974 
975 static struct platform_driver gpio_virtuser_driver = {
976 	.driver = {
977 		.name = "gpio-virtuser",
978 		.of_match_table = gpio_virtuser_of_match,
979 	},
980 	.probe = gpio_virtuser_probe,
981 };
982 
983 struct gpio_virtuser_device {
984 	struct config_group group;
985 
986 	struct platform_device *pdev;
987 	int id;
988 	struct mutex lock;
989 
990 	struct notifier_block bus_notifier;
991 	struct completion probe_completion;
992 	bool driver_bound;
993 
994 	struct gpiod_lookup_table *lookup_table;
995 
996 	struct list_head lookup_list;
997 };
998 
gpio_virtuser_bus_notifier_call(struct notifier_block * nb,unsigned long action,void * data)999 static int gpio_virtuser_bus_notifier_call(struct notifier_block *nb,
1000 					   unsigned long action, void *data)
1001 {
1002 	struct gpio_virtuser_device *vdev;
1003 	struct device *dev = data;
1004 	char devname[32];
1005 
1006 	vdev = container_of(nb, struct gpio_virtuser_device, bus_notifier);
1007 	snprintf(devname, sizeof(devname), "gpio-virtuser.%d", vdev->id);
1008 
1009 	if (!device_match_name(dev, devname))
1010 		return NOTIFY_DONE;
1011 
1012 	switch (action) {
1013 	case BUS_NOTIFY_BOUND_DRIVER:
1014 		vdev->driver_bound = true;
1015 		break;
1016 	case BUS_NOTIFY_DRIVER_NOT_BOUND:
1017 		vdev->driver_bound = false;
1018 		break;
1019 	default:
1020 		return NOTIFY_DONE;
1021 	}
1022 
1023 	complete(&vdev->probe_completion);
1024 	return NOTIFY_OK;
1025 }
1026 
1027 static struct gpio_virtuser_device *
to_gpio_virtuser_device(struct config_item * item)1028 to_gpio_virtuser_device(struct config_item *item)
1029 {
1030 	struct config_group *group = to_config_group(item);
1031 
1032 	return container_of(group, struct gpio_virtuser_device, group);
1033 }
1034 
1035 static bool
gpio_virtuser_device_is_live(struct gpio_virtuser_device * dev)1036 gpio_virtuser_device_is_live(struct gpio_virtuser_device *dev)
1037 {
1038 	lockdep_assert_held(&dev->lock);
1039 
1040 	return !!dev->pdev;
1041 }
1042 
1043 struct gpio_virtuser_lookup {
1044 	struct config_group group;
1045 
1046 	struct gpio_virtuser_device *parent;
1047 	struct list_head siblings;
1048 
1049 	char *con_id;
1050 
1051 	struct list_head entry_list;
1052 };
1053 
1054 static struct gpio_virtuser_lookup *
to_gpio_virtuser_lookup(struct config_item * item)1055 to_gpio_virtuser_lookup(struct config_item *item)
1056 {
1057 	struct config_group *group = to_config_group(item);
1058 
1059 	return container_of(group, struct gpio_virtuser_lookup, group);
1060 }
1061 
1062 struct gpio_virtuser_lookup_entry {
1063 	struct config_group group;
1064 
1065 	struct gpio_virtuser_lookup *parent;
1066 	struct list_head siblings;
1067 
1068 	char *key;
1069 	/* Can be negative to indicate lookup by name. */
1070 	int offset;
1071 	enum gpio_lookup_flags flags;
1072 };
1073 
1074 static struct gpio_virtuser_lookup_entry *
to_gpio_virtuser_lookup_entry(struct config_item * item)1075 to_gpio_virtuser_lookup_entry(struct config_item *item)
1076 {
1077 	struct config_group *group = to_config_group(item);
1078 
1079 	return container_of(group, struct gpio_virtuser_lookup_entry, group);
1080 }
1081 
1082 static ssize_t
gpio_virtuser_lookup_entry_config_key_show(struct config_item * item,char * page)1083 gpio_virtuser_lookup_entry_config_key_show(struct config_item *item, char *page)
1084 {
1085 	struct gpio_virtuser_lookup_entry *entry =
1086 					to_gpio_virtuser_lookup_entry(item);
1087 	struct gpio_virtuser_device *dev = entry->parent->parent;
1088 
1089 	guard(mutex)(&dev->lock);
1090 
1091 	return sprintf(page, "%s\n", entry->key ?: "");
1092 }
1093 
1094 static ssize_t
gpio_virtuser_lookup_entry_config_key_store(struct config_item * item,const char * page,size_t count)1095 gpio_virtuser_lookup_entry_config_key_store(struct config_item *item,
1096 					    const char *page, size_t count)
1097 {
1098 	struct gpio_virtuser_lookup_entry *entry =
1099 					to_gpio_virtuser_lookup_entry(item);
1100 	struct gpio_virtuser_device *dev = entry->parent->parent;
1101 
1102 	char *key __free(kfree) = kstrndup(skip_spaces(page), count,
1103 					   GFP_KERNEL);
1104 	if (!key)
1105 		return -ENOMEM;
1106 
1107 	strim(key);
1108 
1109 	guard(mutex)(&dev->lock);
1110 
1111 	if (gpio_virtuser_device_is_live(dev))
1112 		return -EBUSY;
1113 
1114 	kfree(entry->key);
1115 	entry->key = no_free_ptr(key);
1116 
1117 	return count;
1118 }
1119 
1120 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, key);
1121 
1122 static ssize_t
gpio_virtuser_lookup_entry_config_offset_show(struct config_item * item,char * page)1123 gpio_virtuser_lookup_entry_config_offset_show(struct config_item *item,
1124 					      char *page)
1125 {
1126 	struct gpio_virtuser_lookup_entry *entry =
1127 					to_gpio_virtuser_lookup_entry(item);
1128 	struct gpio_virtuser_device *dev = entry->parent->parent;
1129 	unsigned int offset;
1130 
1131 	scoped_guard(mutex, &dev->lock)
1132 		offset = entry->offset;
1133 
1134 	return sprintf(page, "%d\n", offset);
1135 }
1136 
1137 static ssize_t
gpio_virtuser_lookup_entry_config_offset_store(struct config_item * item,const char * page,size_t count)1138 gpio_virtuser_lookup_entry_config_offset_store(struct config_item *item,
1139 					       const char *page, size_t count)
1140 {
1141 	struct gpio_virtuser_lookup_entry *entry =
1142 					to_gpio_virtuser_lookup_entry(item);
1143 	struct gpio_virtuser_device *dev = entry->parent->parent;
1144 	int offset, ret;
1145 
1146 	ret = kstrtoint(page, 0, &offset);
1147 	if (ret)
1148 		return ret;
1149 
1150 	/*
1151 	 * Negative number here means: 'key' represents a line name to lookup.
1152 	 * Non-negative means: 'key' represents the label of the chip with
1153 	 * the 'offset' value representing the line within that chip.
1154 	 *
1155 	 * GPIOLIB uses the U16_MAX value to indicate lookup by line name so
1156 	 * the greatest offset we can accept is (U16_MAX - 1).
1157 	 */
1158 	if (offset > (U16_MAX - 1))
1159 		return -EINVAL;
1160 
1161 	guard(mutex)(&dev->lock);
1162 
1163 	if (gpio_virtuser_device_is_live(dev))
1164 		return -EBUSY;
1165 
1166 	entry->offset = offset;
1167 
1168 	return count;
1169 }
1170 
1171 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, offset);
1172 
1173 static enum gpio_lookup_flags
gpio_virtuser_lookup_get_flags(struct config_item * item)1174 gpio_virtuser_lookup_get_flags(struct config_item *item)
1175 {
1176 	struct gpio_virtuser_lookup_entry *entry =
1177 					to_gpio_virtuser_lookup_entry(item);
1178 	struct gpio_virtuser_device *dev = entry->parent->parent;
1179 
1180 	guard(mutex)(&dev->lock);
1181 
1182 	return entry->flags;
1183 }
1184 
1185 static ssize_t
gpio_virtuser_lookup_entry_config_drive_show(struct config_item * item,char * page)1186 gpio_virtuser_lookup_entry_config_drive_show(struct config_item *item, char *page)
1187 {
1188 	enum gpio_lookup_flags flags = gpio_virtuser_lookup_get_flags(item);
1189 	const char *repr;
1190 
1191 	if (flags & GPIO_OPEN_DRAIN)
1192 		repr = "open-drain";
1193 	else if (flags & GPIO_OPEN_SOURCE)
1194 		repr = "open-source";
1195 	else
1196 		repr = "push-pull";
1197 
1198 	return sprintf(page, "%s\n", repr);
1199 }
1200 
1201 static ssize_t
gpio_virtuser_lookup_entry_config_drive_store(struct config_item * item,const char * page,size_t count)1202 gpio_virtuser_lookup_entry_config_drive_store(struct config_item *item,
1203 					      const char *page, size_t count)
1204 {
1205 	struct gpio_virtuser_lookup_entry *entry =
1206 					to_gpio_virtuser_lookup_entry(item);
1207 	struct gpio_virtuser_device *dev = entry->parent->parent;
1208 
1209 	guard(mutex)(&dev->lock);
1210 
1211 	if (gpio_virtuser_device_is_live(dev))
1212 		return -EBUSY;
1213 
1214 	if (sysfs_streq(page, "push-pull")) {
1215 		entry->flags &= ~(GPIO_OPEN_DRAIN | GPIO_OPEN_SOURCE);
1216 	} else if (sysfs_streq(page, "open-drain")) {
1217 		entry->flags &= ~GPIO_OPEN_SOURCE;
1218 		entry->flags |= GPIO_OPEN_DRAIN;
1219 	} else if (sysfs_streq(page, "open-source")) {
1220 		entry->flags &= ~GPIO_OPEN_DRAIN;
1221 		entry->flags |= GPIO_OPEN_SOURCE;
1222 	} else {
1223 		count = -EINVAL;
1224 	}
1225 
1226 	return count;
1227 }
1228 
1229 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, drive);
1230 
1231 static ssize_t
gpio_virtuser_lookup_entry_config_pull_show(struct config_item * item,char * page)1232 gpio_virtuser_lookup_entry_config_pull_show(struct config_item *item, char *page)
1233 {
1234 	enum gpio_lookup_flags flags = gpio_virtuser_lookup_get_flags(item);
1235 	const char *repr;
1236 
1237 	if (flags & GPIO_PULL_UP)
1238 		repr = "pull-up";
1239 	else if (flags & GPIO_PULL_DOWN)
1240 		repr = "pull-down";
1241 	else if (flags & GPIO_PULL_DISABLE)
1242 		repr = "pull-disabled";
1243 	else
1244 		repr = "as-is";
1245 
1246 	return sprintf(page, "%s\n", repr);
1247 }
1248 
1249 static ssize_t
gpio_virtuser_lookup_entry_config_pull_store(struct config_item * item,const char * page,size_t count)1250 gpio_virtuser_lookup_entry_config_pull_store(struct config_item *item,
1251 					     const char *page, size_t count)
1252 {
1253 	struct gpio_virtuser_lookup_entry *entry =
1254 					to_gpio_virtuser_lookup_entry(item);
1255 	struct gpio_virtuser_device *dev = entry->parent->parent;
1256 
1257 	guard(mutex)(&dev->lock);
1258 
1259 	if (gpio_virtuser_device_is_live(dev))
1260 		return -EBUSY;
1261 
1262 	if (sysfs_streq(page, "pull-up")) {
1263 		entry->flags &= ~(GPIO_PULL_DOWN | GPIO_PULL_DISABLE);
1264 		entry->flags |= GPIO_PULL_UP;
1265 	} else if (sysfs_streq(page, "pull-down")) {
1266 		entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DISABLE);
1267 		entry->flags |= GPIO_PULL_DOWN;
1268 	} else if (sysfs_streq(page, "pull-disabled")) {
1269 		entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DOWN);
1270 		entry->flags |= GPIO_PULL_DISABLE;
1271 	} else if (sysfs_streq(page, "as-is")) {
1272 		entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DOWN |
1273 				  GPIO_PULL_DISABLE);
1274 	} else {
1275 		count = -EINVAL;
1276 	}
1277 
1278 	return count;
1279 }
1280 
1281 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, pull);
1282 
1283 static ssize_t
gpio_virtuser_lookup_entry_config_active_low_show(struct config_item * item,char * page)1284 gpio_virtuser_lookup_entry_config_active_low_show(struct config_item *item,
1285 						  char *page)
1286 {
1287 	enum gpio_lookup_flags flags = gpio_virtuser_lookup_get_flags(item);
1288 
1289 	return sprintf(page, "%c\n", flags & GPIO_ACTIVE_LOW ? '1' : '0');
1290 }
1291 
1292 static ssize_t
gpio_virtuser_lookup_entry_config_active_low_store(struct config_item * item,const char * page,size_t count)1293 gpio_virtuser_lookup_entry_config_active_low_store(struct config_item *item,
1294 						   const char *page,
1295 						   size_t count)
1296 {
1297 	struct gpio_virtuser_lookup_entry *entry =
1298 					to_gpio_virtuser_lookup_entry(item);
1299 	struct gpio_virtuser_device *dev = entry->parent->parent;
1300 	bool active_low;
1301 	int ret;
1302 
1303 	ret = kstrtobool(page, &active_low);
1304 	if (ret)
1305 		return ret;
1306 
1307 	guard(mutex)(&dev->lock);
1308 
1309 	if (gpio_virtuser_device_is_live(dev))
1310 		return -EBUSY;
1311 
1312 	if (active_low)
1313 		entry->flags |= GPIO_ACTIVE_LOW;
1314 	else
1315 		entry->flags &= ~GPIO_ACTIVE_LOW;
1316 
1317 	return count;
1318 }
1319 
1320 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, active_low);
1321 
1322 static ssize_t
gpio_virtuser_lookup_entry_config_transitory_show(struct config_item * item,char * page)1323 gpio_virtuser_lookup_entry_config_transitory_show(struct config_item *item,
1324 						  char *page)
1325 {
1326 	enum gpio_lookup_flags flags = gpio_virtuser_lookup_get_flags(item);
1327 
1328 	return sprintf(page, "%c\n", flags & GPIO_TRANSITORY ? '1' : '0');
1329 }
1330 
1331 static ssize_t
gpio_virtuser_lookup_entry_config_transitory_store(struct config_item * item,const char * page,size_t count)1332 gpio_virtuser_lookup_entry_config_transitory_store(struct config_item *item,
1333 						   const char *page,
1334 						   size_t count)
1335 {
1336 	struct gpio_virtuser_lookup_entry *entry =
1337 					to_gpio_virtuser_lookup_entry(item);
1338 	struct gpio_virtuser_device *dev = entry->parent->parent;
1339 	bool transitory;
1340 	int ret;
1341 
1342 	ret = kstrtobool(page, &transitory);
1343 	if (ret)
1344 		return ret;
1345 
1346 	guard(mutex)(&dev->lock);
1347 
1348 	if (gpio_virtuser_device_is_live(dev))
1349 		return -EBUSY;
1350 
1351 	if (transitory)
1352 		entry->flags |= GPIO_TRANSITORY;
1353 	else
1354 		entry->flags &= ~GPIO_TRANSITORY;
1355 
1356 	return count;
1357 }
1358 
1359 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, transitory);
1360 
1361 static struct configfs_attribute *gpio_virtuser_lookup_entry_config_attrs[] = {
1362 	&gpio_virtuser_lookup_entry_config_attr_key,
1363 	&gpio_virtuser_lookup_entry_config_attr_offset,
1364 	&gpio_virtuser_lookup_entry_config_attr_drive,
1365 	&gpio_virtuser_lookup_entry_config_attr_pull,
1366 	&gpio_virtuser_lookup_entry_config_attr_active_low,
1367 	&gpio_virtuser_lookup_entry_config_attr_transitory,
1368 	NULL
1369 };
1370 
1371 static ssize_t
gpio_virtuser_device_config_dev_name_show(struct config_item * item,char * page)1372 gpio_virtuser_device_config_dev_name_show(struct config_item *item,
1373 					  char *page)
1374 {
1375 	struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
1376 	struct platform_device *pdev;
1377 
1378 	guard(mutex)(&dev->lock);
1379 
1380 	pdev = dev->pdev;
1381 	if (pdev)
1382 		return sprintf(page, "%s\n", dev_name(&pdev->dev));
1383 
1384 	return sprintf(page, "gpio-sim.%d\n", dev->id);
1385 }
1386 
1387 CONFIGFS_ATTR_RO(gpio_virtuser_device_config_, dev_name);
1388 
gpio_virtuser_device_config_live_show(struct config_item * item,char * page)1389 static ssize_t gpio_virtuser_device_config_live_show(struct config_item *item,
1390 						     char *page)
1391 {
1392 	struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
1393 	bool live;
1394 
1395 	scoped_guard(mutex, &dev->lock)
1396 		live = gpio_virtuser_device_is_live(dev);
1397 
1398 	return sprintf(page, "%c\n", live ? '1' : '0');
1399 }
1400 
1401 static size_t
gpio_virtuser_get_lookup_count(struct gpio_virtuser_device * dev)1402 gpio_virtuser_get_lookup_count(struct gpio_virtuser_device *dev)
1403 {
1404 	struct gpio_virtuser_lookup *lookup;
1405 	size_t count = 0;
1406 
1407 	lockdep_assert_held(&dev->lock);
1408 
1409 	list_for_each_entry(lookup, &dev->lookup_list, siblings)
1410 		count += list_count_nodes(&lookup->entry_list);
1411 
1412 	return count;
1413 }
1414 
1415 static int
gpio_virtuser_make_lookup_table(struct gpio_virtuser_device * dev)1416 gpio_virtuser_make_lookup_table(struct gpio_virtuser_device *dev)
1417 {
1418 	size_t num_entries = gpio_virtuser_get_lookup_count(dev);
1419 	struct gpio_virtuser_lookup_entry *entry;
1420 	struct gpio_virtuser_lookup *lookup;
1421 	unsigned int i = 0, idx;
1422 
1423 	lockdep_assert_held(&dev->lock);
1424 
1425 	struct gpiod_lookup_table *table __free(kfree) =
1426 		kzalloc(struct_size(table, table, num_entries + 1), GFP_KERNEL);
1427 	if (!table)
1428 		return -ENOMEM;
1429 
1430 	table->dev_id = kasprintf(GFP_KERNEL, "gpio-virtuser.%d", dev->id);
1431 	if (!table->dev_id)
1432 		return -ENOMEM;
1433 
1434 	list_for_each_entry(lookup, &dev->lookup_list, siblings) {
1435 		idx = 0;
1436 		list_for_each_entry(entry, &lookup->entry_list, siblings) {
1437 			table->table[i++] =
1438 				GPIO_LOOKUP_IDX(entry->key,
1439 						entry->offset < 0 ? U16_MAX : entry->offset,
1440 						lookup->con_id, idx++, entry->flags);
1441 		}
1442 	}
1443 
1444 	gpiod_add_lookup_table(table);
1445 	dev->lookup_table = no_free_ptr(table);
1446 
1447 	return 0;
1448 }
1449 
1450 static void
gpio_virtuser_remove_lookup_table(struct gpio_virtuser_device * dev)1451 gpio_virtuser_remove_lookup_table(struct gpio_virtuser_device *dev)
1452 {
1453 	gpiod_remove_lookup_table(dev->lookup_table);
1454 	kfree(dev->lookup_table->dev_id);
1455 	kfree(dev->lookup_table);
1456 	dev->lookup_table = NULL;
1457 }
1458 
1459 static struct fwnode_handle *
gpio_virtuser_make_device_swnode(struct gpio_virtuser_device * dev)1460 gpio_virtuser_make_device_swnode(struct gpio_virtuser_device *dev)
1461 {
1462 	struct property_entry properties[2];
1463 	struct gpio_virtuser_lookup *lookup;
1464 	unsigned int i = 0;
1465 	size_t num_ids;
1466 
1467 	memset(properties, 0, sizeof(properties));
1468 
1469 	num_ids = list_count_nodes(&dev->lookup_list);
1470 	char **ids __free(kfree) = kcalloc(num_ids + 1, sizeof(*ids),
1471 					   GFP_KERNEL);
1472 	if (!ids)
1473 		return ERR_PTR(-ENOMEM);
1474 
1475 	list_for_each_entry(lookup, &dev->lookup_list, siblings)
1476 		ids[i++] = lookup->con_id;
1477 
1478 	properties[0] = PROPERTY_ENTRY_STRING_ARRAY_LEN("gpio-virtuser,ids",
1479 							ids, num_ids);
1480 
1481 	return fwnode_create_software_node(properties, NULL);
1482 }
1483 
1484 static int
gpio_virtuser_device_activate(struct gpio_virtuser_device * dev)1485 gpio_virtuser_device_activate(struct gpio_virtuser_device *dev)
1486 {
1487 	struct platform_device_info pdevinfo;
1488 	struct fwnode_handle *swnode;
1489 	struct platform_device *pdev;
1490 	int ret;
1491 
1492 	lockdep_assert_held(&dev->lock);
1493 
1494 	if (list_empty(&dev->lookup_list))
1495 		return -ENODATA;
1496 
1497 	swnode = gpio_virtuser_make_device_swnode(dev);
1498 	if (IS_ERR(swnode))
1499 		return PTR_ERR(swnode);
1500 
1501 	memset(&pdevinfo, 0, sizeof(pdevinfo));
1502 	pdevinfo.name = "gpio-virtuser";
1503 	pdevinfo.id = dev->id;
1504 	pdevinfo.fwnode = swnode;
1505 
1506 	ret = gpio_virtuser_make_lookup_table(dev);
1507 	if (ret)
1508 		goto err_remove_swnode;
1509 
1510 	reinit_completion(&dev->probe_completion);
1511 	dev->driver_bound = false;
1512 	bus_register_notifier(&platform_bus_type, &dev->bus_notifier);
1513 
1514 	pdev = platform_device_register_full(&pdevinfo);
1515 	if (IS_ERR(pdev)) {
1516 		ret = PTR_ERR(pdev);
1517 		bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier);
1518 		goto err_remove_lookup_table;
1519 	}
1520 
1521 	wait_for_completion(&dev->probe_completion);
1522 	bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier);
1523 
1524 	if (!dev->driver_bound) {
1525 		ret = -ENXIO;
1526 		goto err_unregister_pdev;
1527 	}
1528 
1529 	dev->pdev = pdev;
1530 
1531 	return 0;
1532 
1533 err_unregister_pdev:
1534 	platform_device_unregister(pdev);
1535 err_remove_lookup_table:
1536 	gpio_virtuser_remove_lookup_table(dev);
1537 err_remove_swnode:
1538 	fwnode_remove_software_node(swnode);
1539 
1540 	return ret;
1541 }
1542 
1543 static void
gpio_virtuser_device_deactivate(struct gpio_virtuser_device * dev)1544 gpio_virtuser_device_deactivate(struct gpio_virtuser_device *dev)
1545 {
1546 	struct fwnode_handle *swnode;
1547 
1548 	lockdep_assert_held(&dev->lock);
1549 
1550 	swnode = dev_fwnode(&dev->pdev->dev);
1551 	platform_device_unregister(dev->pdev);
1552 	gpio_virtuser_remove_lookup_table(dev);
1553 	fwnode_remove_software_node(swnode);
1554 	dev->pdev = NULL;
1555 }
1556 
1557 static void
gpio_virtuser_device_lockup_configfs(struct gpio_virtuser_device * dev,bool lock)1558 gpio_virtuser_device_lockup_configfs(struct gpio_virtuser_device *dev, bool lock)
1559 {
1560 	struct configfs_subsystem *subsys = dev->group.cg_subsys;
1561 	struct gpio_virtuser_lookup_entry *entry;
1562 	struct gpio_virtuser_lookup *lookup;
1563 
1564 	/*
1565 	 * The device only needs to depend on leaf lookup entries. This is
1566 	 * sufficient to lock up all the configfs entries that the
1567 	 * instantiated, alive device depends on.
1568 	 */
1569 	list_for_each_entry(lookup, &dev->lookup_list, siblings) {
1570 		list_for_each_entry(entry, &lookup->entry_list, siblings) {
1571 			if (lock)
1572 				WARN_ON(configfs_depend_item_unlocked(
1573 						subsys, &entry->group.cg_item));
1574 			else
1575 				configfs_undepend_item_unlocked(
1576 						&entry->group.cg_item);
1577 		}
1578 	}
1579 }
1580 
1581 static ssize_t
gpio_virtuser_device_config_live_store(struct config_item * item,const char * page,size_t count)1582 gpio_virtuser_device_config_live_store(struct config_item *item,
1583 				       const char *page, size_t count)
1584 {
1585 	struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
1586 	int ret = 0;
1587 	bool live;
1588 
1589 	ret = kstrtobool(page, &live);
1590 	if (ret)
1591 		return ret;
1592 
1593 	if (live)
1594 		gpio_virtuser_device_lockup_configfs(dev, true);
1595 
1596 	scoped_guard(mutex, &dev->lock) {
1597 		if (live == gpio_virtuser_device_is_live(dev))
1598 			ret = -EPERM;
1599 		else if (live)
1600 			ret = gpio_virtuser_device_activate(dev);
1601 		else
1602 			gpio_virtuser_device_deactivate(dev);
1603 	}
1604 
1605 	/*
1606 	 * Undepend is required only if device disablement (live == 0)
1607 	 * succeeds or if device enablement (live == 1) fails.
1608 	 */
1609 	if (live == !!ret)
1610 		gpio_virtuser_device_lockup_configfs(dev, false);
1611 
1612 	return ret ?: count;
1613 }
1614 
1615 CONFIGFS_ATTR(gpio_virtuser_device_config_, live);
1616 
1617 static struct configfs_attribute *gpio_virtuser_device_config_attrs[] = {
1618 	&gpio_virtuser_device_config_attr_dev_name,
1619 	&gpio_virtuser_device_config_attr_live,
1620 	NULL
1621 };
1622 
1623 static void
gpio_virtuser_lookup_entry_config_group_release(struct config_item * item)1624 gpio_virtuser_lookup_entry_config_group_release(struct config_item *item)
1625 {
1626 	struct gpio_virtuser_lookup_entry *entry =
1627 					to_gpio_virtuser_lookup_entry(item);
1628 	struct gpio_virtuser_device *dev = entry->parent->parent;
1629 
1630 	guard(mutex)(&dev->lock);
1631 
1632 	list_del(&entry->siblings);
1633 
1634 	kfree(entry->key);
1635 	kfree(entry);
1636 }
1637 
1638 static struct
1639 configfs_item_operations gpio_virtuser_lookup_entry_config_item_ops = {
1640 	.release	= gpio_virtuser_lookup_entry_config_group_release,
1641 };
1642 
1643 static const struct
1644 config_item_type gpio_virtuser_lookup_entry_config_group_type = {
1645 	.ct_item_ops	= &gpio_virtuser_lookup_entry_config_item_ops,
1646 	.ct_attrs	= gpio_virtuser_lookup_entry_config_attrs,
1647 	.ct_owner	= THIS_MODULE,
1648 };
1649 
1650 static struct config_group *
gpio_virtuser_make_lookup_entry_group(struct config_group * group,const char * name)1651 gpio_virtuser_make_lookup_entry_group(struct config_group *group,
1652 				      const char *name)
1653 {
1654 	struct gpio_virtuser_lookup *lookup =
1655 				to_gpio_virtuser_lookup(&group->cg_item);
1656 	struct gpio_virtuser_device *dev = lookup->parent;
1657 
1658 	guard(mutex)(&dev->lock);
1659 
1660 	if (gpio_virtuser_device_is_live(dev))
1661 		return ERR_PTR(-EBUSY);
1662 
1663 	struct gpio_virtuser_lookup_entry *entry __free(kfree) =
1664 				kzalloc(sizeof(*entry), GFP_KERNEL);
1665 	if (!entry)
1666 		return ERR_PTR(-ENOMEM);
1667 
1668 	config_group_init_type_name(&entry->group, name,
1669 			&gpio_virtuser_lookup_entry_config_group_type);
1670 	entry->flags = GPIO_LOOKUP_FLAGS_DEFAULT;
1671 	entry->parent = lookup;
1672 	list_add_tail(&entry->siblings, &lookup->entry_list);
1673 
1674 	return &no_free_ptr(entry)->group;
1675 }
1676 
gpio_virtuser_lookup_config_group_release(struct config_item * item)1677 static void gpio_virtuser_lookup_config_group_release(struct config_item *item)
1678 {
1679 	struct gpio_virtuser_lookup *lookup = to_gpio_virtuser_lookup(item);
1680 	struct gpio_virtuser_device *dev = lookup->parent;
1681 
1682 	guard(mutex)(&dev->lock);
1683 
1684 	list_del(&lookup->siblings);
1685 
1686 	kfree(lookup->con_id);
1687 	kfree(lookup);
1688 }
1689 
1690 static struct configfs_item_operations gpio_virtuser_lookup_config_item_ops = {
1691 	.release	= gpio_virtuser_lookup_config_group_release,
1692 };
1693 
1694 static struct
1695 configfs_group_operations gpio_virtuser_lookup_config_group_ops = {
1696 	.make_group     = gpio_virtuser_make_lookup_entry_group,
1697 };
1698 
1699 static const struct config_item_type gpio_virtuser_lookup_config_group_type = {
1700 	.ct_group_ops	= &gpio_virtuser_lookup_config_group_ops,
1701 	.ct_item_ops	= &gpio_virtuser_lookup_config_item_ops,
1702 	.ct_owner	= THIS_MODULE,
1703 };
1704 
1705 static struct config_group *
gpio_virtuser_make_lookup_group(struct config_group * group,const char * name)1706 gpio_virtuser_make_lookup_group(struct config_group *group, const char *name)
1707 {
1708 	struct gpio_virtuser_device *dev =
1709 				to_gpio_virtuser_device(&group->cg_item);
1710 
1711 	if (strlen(name) > (GPIO_VIRTUSER_NAME_BUF_LEN - 1))
1712 		return ERR_PTR(-E2BIG);
1713 
1714 	guard(mutex)(&dev->lock);
1715 
1716 	if (gpio_virtuser_device_is_live(dev))
1717 		return ERR_PTR(-EBUSY);
1718 
1719 	struct gpio_virtuser_lookup *lookup __free(kfree) =
1720 				kzalloc(sizeof(*lookup), GFP_KERNEL);
1721 	if (!lookup)
1722 		return ERR_PTR(-ENOMEM);
1723 
1724 	lookup->con_id = kstrdup(name, GFP_KERNEL);
1725 	if (!lookup->con_id)
1726 		return ERR_PTR(-ENOMEM);
1727 
1728 	config_group_init_type_name(&lookup->group, name,
1729 				    &gpio_virtuser_lookup_config_group_type);
1730 	INIT_LIST_HEAD(&lookup->entry_list);
1731 	lookup->parent = dev;
1732 	list_add_tail(&lookup->siblings, &dev->lookup_list);
1733 
1734 	return &no_free_ptr(lookup)->group;
1735 }
1736 
gpio_virtuser_device_config_group_release(struct config_item * item)1737 static void gpio_virtuser_device_config_group_release(struct config_item *item)
1738 {
1739 	struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
1740 
1741 	guard(mutex)(&dev->lock);
1742 
1743 	if (gpio_virtuser_device_is_live(dev))
1744 		gpio_virtuser_device_deactivate(dev);
1745 
1746 	mutex_destroy(&dev->lock);
1747 	ida_free(&gpio_virtuser_ida, dev->id);
1748 	kfree(dev);
1749 }
1750 
1751 static struct configfs_item_operations gpio_virtuser_device_config_item_ops = {
1752 	.release	= gpio_virtuser_device_config_group_release,
1753 };
1754 
1755 static struct configfs_group_operations gpio_virtuser_device_config_group_ops = {
1756 	.make_group	= gpio_virtuser_make_lookup_group,
1757 };
1758 
1759 static const struct config_item_type gpio_virtuser_device_config_group_type = {
1760 	.ct_group_ops	= &gpio_virtuser_device_config_group_ops,
1761 	.ct_item_ops	= &gpio_virtuser_device_config_item_ops,
1762 	.ct_attrs	= gpio_virtuser_device_config_attrs,
1763 	.ct_owner	= THIS_MODULE,
1764 };
1765 
1766 static struct config_group *
gpio_virtuser_config_make_device_group(struct config_group * group,const char * name)1767 gpio_virtuser_config_make_device_group(struct config_group *group,
1768 				       const char *name)
1769 {
1770 	struct gpio_virtuser_device *dev __free(kfree) = kzalloc(sizeof(*dev),
1771 								 GFP_KERNEL);
1772 	if (!dev)
1773 		return ERR_PTR(-ENOMEM);
1774 
1775 	dev->id = ida_alloc(&gpio_virtuser_ida, GFP_KERNEL);
1776 	if (dev->id < 0)
1777 		return ERR_PTR(dev->id);
1778 
1779 	config_group_init_type_name(&dev->group, name,
1780 				    &gpio_virtuser_device_config_group_type);
1781 	mutex_init(&dev->lock);
1782 	INIT_LIST_HEAD(&dev->lookup_list);
1783 	dev->bus_notifier.notifier_call = gpio_virtuser_bus_notifier_call;
1784 	init_completion(&dev->probe_completion);
1785 
1786 	return &no_free_ptr(dev)->group;
1787 }
1788 
1789 static struct configfs_group_operations gpio_virtuser_config_group_ops = {
1790 	.make_group	= gpio_virtuser_config_make_device_group,
1791 };
1792 
1793 static const struct config_item_type gpio_virtuser_config_type = {
1794 	.ct_group_ops	= &gpio_virtuser_config_group_ops,
1795 	.ct_owner	= THIS_MODULE,
1796 };
1797 
1798 static struct configfs_subsystem gpio_virtuser_config_subsys = {
1799 	.su_group = {
1800 		.cg_item = {
1801 			.ci_namebuf	= "gpio-virtuser",
1802 			.ci_type	= &gpio_virtuser_config_type,
1803 		},
1804 	},
1805 };
1806 
gpio_virtuser_init(void)1807 static int __init gpio_virtuser_init(void)
1808 {
1809 	int ret;
1810 
1811 	ret = platform_driver_register(&gpio_virtuser_driver);
1812 	if (ret) {
1813 		pr_err("Failed to register the platform driver: %d\n", ret);
1814 		return ret;
1815 	}
1816 
1817 	config_group_init(&gpio_virtuser_config_subsys.su_group);
1818 	mutex_init(&gpio_virtuser_config_subsys.su_mutex);
1819 	ret = configfs_register_subsystem(&gpio_virtuser_config_subsys);
1820 	if (ret) {
1821 		pr_err("Failed to register the '%s' configfs subsystem: %d\n",
1822 		       gpio_virtuser_config_subsys.su_group.cg_item.ci_namebuf,
1823 		       ret);
1824 		goto err_plat_drv_unreg;
1825 	}
1826 
1827 	gpio_virtuser_dbg_root = debugfs_create_dir("gpio-virtuser", NULL);
1828 	if (IS_ERR(gpio_virtuser_dbg_root)) {
1829 		ret = PTR_ERR(gpio_virtuser_dbg_root);
1830 		pr_err("Failed to create the debugfs tree: %d\n", ret);
1831 		goto err_configfs_unreg;
1832 	}
1833 
1834 	return 0;
1835 
1836 err_configfs_unreg:
1837 	configfs_unregister_subsystem(&gpio_virtuser_config_subsys);
1838 err_plat_drv_unreg:
1839 	mutex_destroy(&gpio_virtuser_config_subsys.su_mutex);
1840 	platform_driver_unregister(&gpio_virtuser_driver);
1841 
1842 	return ret;
1843 }
1844 module_init(gpio_virtuser_init);
1845 
gpio_virtuser_exit(void)1846 static void __exit gpio_virtuser_exit(void)
1847 {
1848 	configfs_unregister_subsystem(&gpio_virtuser_config_subsys);
1849 	mutex_destroy(&gpio_virtuser_config_subsys.su_mutex);
1850 	platform_driver_unregister(&gpio_virtuser_driver);
1851 	debugfs_remove_recursive(gpio_virtuser_dbg_root);
1852 }
1853 module_exit(gpio_virtuser_exit);
1854 
1855 MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>");
1856 MODULE_DESCRIPTION("Virtual GPIO consumer module");
1857 MODULE_LICENSE("GPL");
1858