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