xref: /openbmc/linux/drivers/gpio/gpiolib-cdev.c (revision 925ca36913fc7dfee9d0bb7f36d81dd108a7b80f)
1*925ca369SKent Gibson // SPDX-License-Identifier: GPL-2.0
2*925ca369SKent Gibson 
3*925ca369SKent Gibson #include <linux/bitmap.h>
4*925ca369SKent Gibson #include <linux/kernel.h>
5*925ca369SKent Gibson #include <linux/module.h>
6*925ca369SKent Gibson #include <linux/interrupt.h>
7*925ca369SKent Gibson #include <linux/irqreturn.h>
8*925ca369SKent Gibson #include <linux/spinlock.h>
9*925ca369SKent Gibson #include <linux/device.h>
10*925ca369SKent Gibson #include <linux/err.h>
11*925ca369SKent Gibson #include <linux/gpio.h>
12*925ca369SKent Gibson #include <linux/gpio/driver.h>
13*925ca369SKent Gibson #include <linux/pinctrl/consumer.h>
14*925ca369SKent Gibson #include <linux/cdev.h>
15*925ca369SKent Gibson #include <linux/uaccess.h>
16*925ca369SKent Gibson #include <linux/compat.h>
17*925ca369SKent Gibson #include <linux/anon_inodes.h>
18*925ca369SKent Gibson #include <linux/file.h>
19*925ca369SKent Gibson #include <linux/kfifo.h>
20*925ca369SKent Gibson #include <linux/poll.h>
21*925ca369SKent Gibson #include <linux/timekeeping.h>
22*925ca369SKent Gibson #include <uapi/linux/gpio.h>
23*925ca369SKent Gibson 
24*925ca369SKent Gibson #include "gpiolib.h"
25*925ca369SKent Gibson #include "gpiolib-cdev.h"
26*925ca369SKent Gibson 
27*925ca369SKent Gibson /* Character device interface to GPIO.
28*925ca369SKent Gibson  *
29*925ca369SKent Gibson  * The GPIO character device, /dev/gpiochipN, provides userspace an
30*925ca369SKent Gibson  * interface to gpiolib GPIOs via ioctl()s.
31*925ca369SKent Gibson  */
32*925ca369SKent Gibson 
33*925ca369SKent Gibson /*
34*925ca369SKent Gibson  * GPIO line handle management
35*925ca369SKent Gibson  */
36*925ca369SKent Gibson 
37*925ca369SKent Gibson /**
38*925ca369SKent Gibson  * struct linehandle_state - contains the state of a userspace handle
39*925ca369SKent Gibson  * @gdev: the GPIO device the handle pertains to
40*925ca369SKent Gibson  * @label: consumer label used to tag descriptors
41*925ca369SKent Gibson  * @descs: the GPIO descriptors held by this handle
42*925ca369SKent Gibson  * @numdescs: the number of descriptors held in the descs array
43*925ca369SKent Gibson  */
44*925ca369SKent Gibson struct linehandle_state {
45*925ca369SKent Gibson 	struct gpio_device *gdev;
46*925ca369SKent Gibson 	const char *label;
47*925ca369SKent Gibson 	struct gpio_desc *descs[GPIOHANDLES_MAX];
48*925ca369SKent Gibson 	u32 numdescs;
49*925ca369SKent Gibson };
50*925ca369SKent Gibson 
51*925ca369SKent Gibson #define GPIOHANDLE_REQUEST_VALID_FLAGS \
52*925ca369SKent Gibson 	(GPIOHANDLE_REQUEST_INPUT | \
53*925ca369SKent Gibson 	GPIOHANDLE_REQUEST_OUTPUT | \
54*925ca369SKent Gibson 	GPIOHANDLE_REQUEST_ACTIVE_LOW | \
55*925ca369SKent Gibson 	GPIOHANDLE_REQUEST_BIAS_PULL_UP | \
56*925ca369SKent Gibson 	GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | \
57*925ca369SKent Gibson 	GPIOHANDLE_REQUEST_BIAS_DISABLE | \
58*925ca369SKent Gibson 	GPIOHANDLE_REQUEST_OPEN_DRAIN | \
59*925ca369SKent Gibson 	GPIOHANDLE_REQUEST_OPEN_SOURCE)
60*925ca369SKent Gibson 
61*925ca369SKent Gibson static int linehandle_validate_flags(u32 flags)
62*925ca369SKent Gibson {
63*925ca369SKent Gibson 	/* Return an error if an unknown flag is set */
64*925ca369SKent Gibson 	if (flags & ~GPIOHANDLE_REQUEST_VALID_FLAGS)
65*925ca369SKent Gibson 		return -EINVAL;
66*925ca369SKent Gibson 
67*925ca369SKent Gibson 	/*
68*925ca369SKent Gibson 	 * Do not allow both INPUT & OUTPUT flags to be set as they are
69*925ca369SKent Gibson 	 * contradictory.
70*925ca369SKent Gibson 	 */
71*925ca369SKent Gibson 	if ((flags & GPIOHANDLE_REQUEST_INPUT) &&
72*925ca369SKent Gibson 	    (flags & GPIOHANDLE_REQUEST_OUTPUT))
73*925ca369SKent Gibson 		return -EINVAL;
74*925ca369SKent Gibson 
75*925ca369SKent Gibson 	/*
76*925ca369SKent Gibson 	 * Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If
77*925ca369SKent Gibson 	 * the hardware actually supports enabling both at the same time the
78*925ca369SKent Gibson 	 * electrical result would be disastrous.
79*925ca369SKent Gibson 	 */
80*925ca369SKent Gibson 	if ((flags & GPIOHANDLE_REQUEST_OPEN_DRAIN) &&
81*925ca369SKent Gibson 	    (flags & GPIOHANDLE_REQUEST_OPEN_SOURCE))
82*925ca369SKent Gibson 		return -EINVAL;
83*925ca369SKent Gibson 
84*925ca369SKent Gibson 	/* OPEN_DRAIN and OPEN_SOURCE flags only make sense for output mode. */
85*925ca369SKent Gibson 	if (!(flags & GPIOHANDLE_REQUEST_OUTPUT) &&
86*925ca369SKent Gibson 	    ((flags & GPIOHANDLE_REQUEST_OPEN_DRAIN) ||
87*925ca369SKent Gibson 	     (flags & GPIOHANDLE_REQUEST_OPEN_SOURCE)))
88*925ca369SKent Gibson 		return -EINVAL;
89*925ca369SKent Gibson 
90*925ca369SKent Gibson 	/* Bias flags only allowed for input or output mode. */
91*925ca369SKent Gibson 	if (!((flags & GPIOHANDLE_REQUEST_INPUT) ||
92*925ca369SKent Gibson 	      (flags & GPIOHANDLE_REQUEST_OUTPUT)) &&
93*925ca369SKent Gibson 	    ((flags & GPIOHANDLE_REQUEST_BIAS_DISABLE) ||
94*925ca369SKent Gibson 	     (flags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) ||
95*925ca369SKent Gibson 	     (flags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN)))
96*925ca369SKent Gibson 		return -EINVAL;
97*925ca369SKent Gibson 
98*925ca369SKent Gibson 	/* Only one bias flag can be set. */
99*925ca369SKent Gibson 	if (((flags & GPIOHANDLE_REQUEST_BIAS_DISABLE) &&
100*925ca369SKent Gibson 	     (flags & (GPIOHANDLE_REQUEST_BIAS_PULL_DOWN |
101*925ca369SKent Gibson 			GPIOHANDLE_REQUEST_BIAS_PULL_UP))) ||
102*925ca369SKent Gibson 	    ((flags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) &&
103*925ca369SKent Gibson 	     (flags & GPIOHANDLE_REQUEST_BIAS_PULL_UP)))
104*925ca369SKent Gibson 		return -EINVAL;
105*925ca369SKent Gibson 
106*925ca369SKent Gibson 	return 0;
107*925ca369SKent Gibson }
108*925ca369SKent Gibson 
109*925ca369SKent Gibson static long linehandle_set_config(struct linehandle_state *lh,
110*925ca369SKent Gibson 				  void __user *ip)
111*925ca369SKent Gibson {
112*925ca369SKent Gibson 	struct gpiohandle_config gcnf;
113*925ca369SKent Gibson 	struct gpio_desc *desc;
114*925ca369SKent Gibson 	int i, ret;
115*925ca369SKent Gibson 	u32 lflags;
116*925ca369SKent Gibson 	unsigned long *flagsp;
117*925ca369SKent Gibson 
118*925ca369SKent Gibson 	if (copy_from_user(&gcnf, ip, sizeof(gcnf)))
119*925ca369SKent Gibson 		return -EFAULT;
120*925ca369SKent Gibson 
121*925ca369SKent Gibson 	lflags = gcnf.flags;
122*925ca369SKent Gibson 	ret = linehandle_validate_flags(lflags);
123*925ca369SKent Gibson 	if (ret)
124*925ca369SKent Gibson 		return ret;
125*925ca369SKent Gibson 
126*925ca369SKent Gibson 	for (i = 0; i < lh->numdescs; i++) {
127*925ca369SKent Gibson 		desc = lh->descs[i];
128*925ca369SKent Gibson 		flagsp = &desc->flags;
129*925ca369SKent Gibson 
130*925ca369SKent Gibson 		assign_bit(FLAG_ACTIVE_LOW, flagsp,
131*925ca369SKent Gibson 			lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW);
132*925ca369SKent Gibson 
133*925ca369SKent Gibson 		assign_bit(FLAG_OPEN_DRAIN, flagsp,
134*925ca369SKent Gibson 			lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN);
135*925ca369SKent Gibson 
136*925ca369SKent Gibson 		assign_bit(FLAG_OPEN_SOURCE, flagsp,
137*925ca369SKent Gibson 			lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE);
138*925ca369SKent Gibson 
139*925ca369SKent Gibson 		assign_bit(FLAG_PULL_UP, flagsp,
140*925ca369SKent Gibson 			lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP);
141*925ca369SKent Gibson 
142*925ca369SKent Gibson 		assign_bit(FLAG_PULL_DOWN, flagsp,
143*925ca369SKent Gibson 			lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN);
144*925ca369SKent Gibson 
145*925ca369SKent Gibson 		assign_bit(FLAG_BIAS_DISABLE, flagsp,
146*925ca369SKent Gibson 			lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE);
147*925ca369SKent Gibson 
148*925ca369SKent Gibson 		/*
149*925ca369SKent Gibson 		 * Lines have to be requested explicitly for input
150*925ca369SKent Gibson 		 * or output, else the line will be treated "as is".
151*925ca369SKent Gibson 		 */
152*925ca369SKent Gibson 		if (lflags & GPIOHANDLE_REQUEST_OUTPUT) {
153*925ca369SKent Gibson 			int val = !!gcnf.default_values[i];
154*925ca369SKent Gibson 
155*925ca369SKent Gibson 			ret = gpiod_direction_output(desc, val);
156*925ca369SKent Gibson 			if (ret)
157*925ca369SKent Gibson 				return ret;
158*925ca369SKent Gibson 		} else if (lflags & GPIOHANDLE_REQUEST_INPUT) {
159*925ca369SKent Gibson 			ret = gpiod_direction_input(desc);
160*925ca369SKent Gibson 			if (ret)
161*925ca369SKent Gibson 				return ret;
162*925ca369SKent Gibson 		}
163*925ca369SKent Gibson 
164*925ca369SKent Gibson 		atomic_notifier_call_chain(&desc->gdev->notifier,
165*925ca369SKent Gibson 					   GPIOLINE_CHANGED_CONFIG, desc);
166*925ca369SKent Gibson 	}
167*925ca369SKent Gibson 	return 0;
168*925ca369SKent Gibson }
169*925ca369SKent Gibson 
170*925ca369SKent Gibson static long linehandle_ioctl(struct file *filep, unsigned int cmd,
171*925ca369SKent Gibson 			     unsigned long arg)
172*925ca369SKent Gibson {
173*925ca369SKent Gibson 	struct linehandle_state *lh = filep->private_data;
174*925ca369SKent Gibson 	void __user *ip = (void __user *)arg;
175*925ca369SKent Gibson 	struct gpiohandle_data ghd;
176*925ca369SKent Gibson 	DECLARE_BITMAP(vals, GPIOHANDLES_MAX);
177*925ca369SKent Gibson 	int i;
178*925ca369SKent Gibson 
179*925ca369SKent Gibson 	if (cmd == GPIOHANDLE_GET_LINE_VALUES_IOCTL) {
180*925ca369SKent Gibson 		/* NOTE: It's ok to read values of output lines. */
181*925ca369SKent Gibson 		int ret = gpiod_get_array_value_complex(false,
182*925ca369SKent Gibson 							true,
183*925ca369SKent Gibson 							lh->numdescs,
184*925ca369SKent Gibson 							lh->descs,
185*925ca369SKent Gibson 							NULL,
186*925ca369SKent Gibson 							vals);
187*925ca369SKent Gibson 		if (ret)
188*925ca369SKent Gibson 			return ret;
189*925ca369SKent Gibson 
190*925ca369SKent Gibson 		memset(&ghd, 0, sizeof(ghd));
191*925ca369SKent Gibson 		for (i = 0; i < lh->numdescs; i++)
192*925ca369SKent Gibson 			ghd.values[i] = test_bit(i, vals);
193*925ca369SKent Gibson 
194*925ca369SKent Gibson 		if (copy_to_user(ip, &ghd, sizeof(ghd)))
195*925ca369SKent Gibson 			return -EFAULT;
196*925ca369SKent Gibson 
197*925ca369SKent Gibson 		return 0;
198*925ca369SKent Gibson 	} else if (cmd == GPIOHANDLE_SET_LINE_VALUES_IOCTL) {
199*925ca369SKent Gibson 		/*
200*925ca369SKent Gibson 		 * All line descriptors were created at once with the same
201*925ca369SKent Gibson 		 * flags so just check if the first one is really output.
202*925ca369SKent Gibson 		 */
203*925ca369SKent Gibson 		if (!test_bit(FLAG_IS_OUT, &lh->descs[0]->flags))
204*925ca369SKent Gibson 			return -EPERM;
205*925ca369SKent Gibson 
206*925ca369SKent Gibson 		if (copy_from_user(&ghd, ip, sizeof(ghd)))
207*925ca369SKent Gibson 			return -EFAULT;
208*925ca369SKent Gibson 
209*925ca369SKent Gibson 		/* Clamp all values to [0,1] */
210*925ca369SKent Gibson 		for (i = 0; i < lh->numdescs; i++)
211*925ca369SKent Gibson 			__assign_bit(i, vals, ghd.values[i]);
212*925ca369SKent Gibson 
213*925ca369SKent Gibson 		/* Reuse the array setting function */
214*925ca369SKent Gibson 		return gpiod_set_array_value_complex(false,
215*925ca369SKent Gibson 					      true,
216*925ca369SKent Gibson 					      lh->numdescs,
217*925ca369SKent Gibson 					      lh->descs,
218*925ca369SKent Gibson 					      NULL,
219*925ca369SKent Gibson 					      vals);
220*925ca369SKent Gibson 	} else if (cmd == GPIOHANDLE_SET_CONFIG_IOCTL) {
221*925ca369SKent Gibson 		return linehandle_set_config(lh, ip);
222*925ca369SKent Gibson 	}
223*925ca369SKent Gibson 	return -EINVAL;
224*925ca369SKent Gibson }
225*925ca369SKent Gibson 
226*925ca369SKent Gibson #ifdef CONFIG_COMPAT
227*925ca369SKent Gibson static long linehandle_ioctl_compat(struct file *filep, unsigned int cmd,
228*925ca369SKent Gibson 			     unsigned long arg)
229*925ca369SKent Gibson {
230*925ca369SKent Gibson 	return linehandle_ioctl(filep, cmd, (unsigned long)compat_ptr(arg));
231*925ca369SKent Gibson }
232*925ca369SKent Gibson #endif
233*925ca369SKent Gibson 
234*925ca369SKent Gibson static int linehandle_release(struct inode *inode, struct file *filep)
235*925ca369SKent Gibson {
236*925ca369SKent Gibson 	struct linehandle_state *lh = filep->private_data;
237*925ca369SKent Gibson 	struct gpio_device *gdev = lh->gdev;
238*925ca369SKent Gibson 	int i;
239*925ca369SKent Gibson 
240*925ca369SKent Gibson 	for (i = 0; i < lh->numdescs; i++)
241*925ca369SKent Gibson 		gpiod_free(lh->descs[i]);
242*925ca369SKent Gibson 	kfree(lh->label);
243*925ca369SKent Gibson 	kfree(lh);
244*925ca369SKent Gibson 	put_device(&gdev->dev);
245*925ca369SKent Gibson 	return 0;
246*925ca369SKent Gibson }
247*925ca369SKent Gibson 
248*925ca369SKent Gibson static const struct file_operations linehandle_fileops = {
249*925ca369SKent Gibson 	.release = linehandle_release,
250*925ca369SKent Gibson 	.owner = THIS_MODULE,
251*925ca369SKent Gibson 	.llseek = noop_llseek,
252*925ca369SKent Gibson 	.unlocked_ioctl = linehandle_ioctl,
253*925ca369SKent Gibson #ifdef CONFIG_COMPAT
254*925ca369SKent Gibson 	.compat_ioctl = linehandle_ioctl_compat,
255*925ca369SKent Gibson #endif
256*925ca369SKent Gibson };
257*925ca369SKent Gibson 
258*925ca369SKent Gibson static int linehandle_create(struct gpio_device *gdev, void __user *ip)
259*925ca369SKent Gibson {
260*925ca369SKent Gibson 	struct gpiohandle_request handlereq;
261*925ca369SKent Gibson 	struct linehandle_state *lh;
262*925ca369SKent Gibson 	struct file *file;
263*925ca369SKent Gibson 	int fd, i, count = 0, ret;
264*925ca369SKent Gibson 	u32 lflags;
265*925ca369SKent Gibson 
266*925ca369SKent Gibson 	if (copy_from_user(&handlereq, ip, sizeof(handlereq)))
267*925ca369SKent Gibson 		return -EFAULT;
268*925ca369SKent Gibson 	if ((handlereq.lines == 0) || (handlereq.lines > GPIOHANDLES_MAX))
269*925ca369SKent Gibson 		return -EINVAL;
270*925ca369SKent Gibson 
271*925ca369SKent Gibson 	lflags = handlereq.flags;
272*925ca369SKent Gibson 
273*925ca369SKent Gibson 	ret = linehandle_validate_flags(lflags);
274*925ca369SKent Gibson 	if (ret)
275*925ca369SKent Gibson 		return ret;
276*925ca369SKent Gibson 
277*925ca369SKent Gibson 	lh = kzalloc(sizeof(*lh), GFP_KERNEL);
278*925ca369SKent Gibson 	if (!lh)
279*925ca369SKent Gibson 		return -ENOMEM;
280*925ca369SKent Gibson 	lh->gdev = gdev;
281*925ca369SKent Gibson 	get_device(&gdev->dev);
282*925ca369SKent Gibson 
283*925ca369SKent Gibson 	/* Make sure this is terminated */
284*925ca369SKent Gibson 	handlereq.consumer_label[sizeof(handlereq.consumer_label)-1] = '\0';
285*925ca369SKent Gibson 	if (strlen(handlereq.consumer_label)) {
286*925ca369SKent Gibson 		lh->label = kstrdup(handlereq.consumer_label,
287*925ca369SKent Gibson 				    GFP_KERNEL);
288*925ca369SKent Gibson 		if (!lh->label) {
289*925ca369SKent Gibson 			ret = -ENOMEM;
290*925ca369SKent Gibson 			goto out_free_lh;
291*925ca369SKent Gibson 		}
292*925ca369SKent Gibson 	}
293*925ca369SKent Gibson 
294*925ca369SKent Gibson 	/* Request each GPIO */
295*925ca369SKent Gibson 	for (i = 0; i < handlereq.lines; i++) {
296*925ca369SKent Gibson 		u32 offset = handlereq.lineoffsets[i];
297*925ca369SKent Gibson 		struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset);
298*925ca369SKent Gibson 
299*925ca369SKent Gibson 		if (IS_ERR(desc)) {
300*925ca369SKent Gibson 			ret = PTR_ERR(desc);
301*925ca369SKent Gibson 			goto out_free_descs;
302*925ca369SKent Gibson 		}
303*925ca369SKent Gibson 
304*925ca369SKent Gibson 		ret = gpiod_request(desc, lh->label);
305*925ca369SKent Gibson 		if (ret)
306*925ca369SKent Gibson 			goto out_free_descs;
307*925ca369SKent Gibson 		lh->descs[i] = desc;
308*925ca369SKent Gibson 		count = i + 1;
309*925ca369SKent Gibson 
310*925ca369SKent Gibson 		if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW)
311*925ca369SKent Gibson 			set_bit(FLAG_ACTIVE_LOW, &desc->flags);
312*925ca369SKent Gibson 		if (lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN)
313*925ca369SKent Gibson 			set_bit(FLAG_OPEN_DRAIN, &desc->flags);
314*925ca369SKent Gibson 		if (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)
315*925ca369SKent Gibson 			set_bit(FLAG_OPEN_SOURCE, &desc->flags);
316*925ca369SKent Gibson 		if (lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE)
317*925ca369SKent Gibson 			set_bit(FLAG_BIAS_DISABLE, &desc->flags);
318*925ca369SKent Gibson 		if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN)
319*925ca369SKent Gibson 			set_bit(FLAG_PULL_DOWN, &desc->flags);
320*925ca369SKent Gibson 		if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP)
321*925ca369SKent Gibson 			set_bit(FLAG_PULL_UP, &desc->flags);
322*925ca369SKent Gibson 
323*925ca369SKent Gibson 		ret = gpiod_set_transitory(desc, false);
324*925ca369SKent Gibson 		if (ret < 0)
325*925ca369SKent Gibson 			goto out_free_descs;
326*925ca369SKent Gibson 
327*925ca369SKent Gibson 		/*
328*925ca369SKent Gibson 		 * Lines have to be requested explicitly for input
329*925ca369SKent Gibson 		 * or output, else the line will be treated "as is".
330*925ca369SKent Gibson 		 */
331*925ca369SKent Gibson 		if (lflags & GPIOHANDLE_REQUEST_OUTPUT) {
332*925ca369SKent Gibson 			int val = !!handlereq.default_values[i];
333*925ca369SKent Gibson 
334*925ca369SKent Gibson 			ret = gpiod_direction_output(desc, val);
335*925ca369SKent Gibson 			if (ret)
336*925ca369SKent Gibson 				goto out_free_descs;
337*925ca369SKent Gibson 		} else if (lflags & GPIOHANDLE_REQUEST_INPUT) {
338*925ca369SKent Gibson 			ret = gpiod_direction_input(desc);
339*925ca369SKent Gibson 			if (ret)
340*925ca369SKent Gibson 				goto out_free_descs;
341*925ca369SKent Gibson 		}
342*925ca369SKent Gibson 
343*925ca369SKent Gibson 		atomic_notifier_call_chain(&desc->gdev->notifier,
344*925ca369SKent Gibson 					   GPIOLINE_CHANGED_REQUESTED, desc);
345*925ca369SKent Gibson 
346*925ca369SKent Gibson 		dev_dbg(&gdev->dev, "registered chardev handle for line %d\n",
347*925ca369SKent Gibson 			offset);
348*925ca369SKent Gibson 	}
349*925ca369SKent Gibson 	/* Let i point at the last handle */
350*925ca369SKent Gibson 	i--;
351*925ca369SKent Gibson 	lh->numdescs = handlereq.lines;
352*925ca369SKent Gibson 
353*925ca369SKent Gibson 	fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC);
354*925ca369SKent Gibson 	if (fd < 0) {
355*925ca369SKent Gibson 		ret = fd;
356*925ca369SKent Gibson 		goto out_free_descs;
357*925ca369SKent Gibson 	}
358*925ca369SKent Gibson 
359*925ca369SKent Gibson 	file = anon_inode_getfile("gpio-linehandle",
360*925ca369SKent Gibson 				  &linehandle_fileops,
361*925ca369SKent Gibson 				  lh,
362*925ca369SKent Gibson 				  O_RDONLY | O_CLOEXEC);
363*925ca369SKent Gibson 	if (IS_ERR(file)) {
364*925ca369SKent Gibson 		ret = PTR_ERR(file);
365*925ca369SKent Gibson 		goto out_put_unused_fd;
366*925ca369SKent Gibson 	}
367*925ca369SKent Gibson 
368*925ca369SKent Gibson 	handlereq.fd = fd;
369*925ca369SKent Gibson 	if (copy_to_user(ip, &handlereq, sizeof(handlereq))) {
370*925ca369SKent Gibson 		/*
371*925ca369SKent Gibson 		 * fput() will trigger the release() callback, so do not go onto
372*925ca369SKent Gibson 		 * the regular error cleanup path here.
373*925ca369SKent Gibson 		 */
374*925ca369SKent Gibson 		fput(file);
375*925ca369SKent Gibson 		put_unused_fd(fd);
376*925ca369SKent Gibson 		return -EFAULT;
377*925ca369SKent Gibson 	}
378*925ca369SKent Gibson 
379*925ca369SKent Gibson 	fd_install(fd, file);
380*925ca369SKent Gibson 
381*925ca369SKent Gibson 	dev_dbg(&gdev->dev, "registered chardev handle for %d lines\n",
382*925ca369SKent Gibson 		lh->numdescs);
383*925ca369SKent Gibson 
384*925ca369SKent Gibson 	return 0;
385*925ca369SKent Gibson 
386*925ca369SKent Gibson out_put_unused_fd:
387*925ca369SKent Gibson 	put_unused_fd(fd);
388*925ca369SKent Gibson out_free_descs:
389*925ca369SKent Gibson 	for (i = 0; i < count; i++)
390*925ca369SKent Gibson 		gpiod_free(lh->descs[i]);
391*925ca369SKent Gibson 	kfree(lh->label);
392*925ca369SKent Gibson out_free_lh:
393*925ca369SKent Gibson 	kfree(lh);
394*925ca369SKent Gibson 	put_device(&gdev->dev);
395*925ca369SKent Gibson 	return ret;
396*925ca369SKent Gibson }
397*925ca369SKent Gibson 
398*925ca369SKent Gibson /*
399*925ca369SKent Gibson  * GPIO line event management
400*925ca369SKent Gibson  */
401*925ca369SKent Gibson 
402*925ca369SKent Gibson /**
403*925ca369SKent Gibson  * struct lineevent_state - contains the state of a userspace event
404*925ca369SKent Gibson  * @gdev: the GPIO device the event pertains to
405*925ca369SKent Gibson  * @label: consumer label used to tag descriptors
406*925ca369SKent Gibson  * @desc: the GPIO descriptor held by this event
407*925ca369SKent Gibson  * @eflags: the event flags this line was requested with
408*925ca369SKent Gibson  * @irq: the interrupt that trigger in response to events on this GPIO
409*925ca369SKent Gibson  * @wait: wait queue that handles blocking reads of events
410*925ca369SKent Gibson  * @events: KFIFO for the GPIO events
411*925ca369SKent Gibson  * @timestamp: cache for the timestamp storing it between hardirq
412*925ca369SKent Gibson  * and IRQ thread, used to bring the timestamp close to the actual
413*925ca369SKent Gibson  * event
414*925ca369SKent Gibson  */
415*925ca369SKent Gibson struct lineevent_state {
416*925ca369SKent Gibson 	struct gpio_device *gdev;
417*925ca369SKent Gibson 	const char *label;
418*925ca369SKent Gibson 	struct gpio_desc *desc;
419*925ca369SKent Gibson 	u32 eflags;
420*925ca369SKent Gibson 	int irq;
421*925ca369SKent Gibson 	wait_queue_head_t wait;
422*925ca369SKent Gibson 	DECLARE_KFIFO(events, struct gpioevent_data, 16);
423*925ca369SKent Gibson 	u64 timestamp;
424*925ca369SKent Gibson };
425*925ca369SKent Gibson 
426*925ca369SKent Gibson #define GPIOEVENT_REQUEST_VALID_FLAGS \
427*925ca369SKent Gibson 	(GPIOEVENT_REQUEST_RISING_EDGE | \
428*925ca369SKent Gibson 	GPIOEVENT_REQUEST_FALLING_EDGE)
429*925ca369SKent Gibson 
430*925ca369SKent Gibson static __poll_t lineevent_poll(struct file *filep,
431*925ca369SKent Gibson 				   struct poll_table_struct *wait)
432*925ca369SKent Gibson {
433*925ca369SKent Gibson 	struct lineevent_state *le = filep->private_data;
434*925ca369SKent Gibson 	__poll_t events = 0;
435*925ca369SKent Gibson 
436*925ca369SKent Gibson 	poll_wait(filep, &le->wait, wait);
437*925ca369SKent Gibson 
438*925ca369SKent Gibson 	if (!kfifo_is_empty_spinlocked_noirqsave(&le->events, &le->wait.lock))
439*925ca369SKent Gibson 		events = EPOLLIN | EPOLLRDNORM;
440*925ca369SKent Gibson 
441*925ca369SKent Gibson 	return events;
442*925ca369SKent Gibson }
443*925ca369SKent Gibson 
444*925ca369SKent Gibson 
445*925ca369SKent Gibson static ssize_t lineevent_read(struct file *filep,
446*925ca369SKent Gibson 			      char __user *buf,
447*925ca369SKent Gibson 			      size_t count,
448*925ca369SKent Gibson 			      loff_t *f_ps)
449*925ca369SKent Gibson {
450*925ca369SKent Gibson 	struct lineevent_state *le = filep->private_data;
451*925ca369SKent Gibson 	struct gpioevent_data ge;
452*925ca369SKent Gibson 	ssize_t bytes_read = 0;
453*925ca369SKent Gibson 	int ret;
454*925ca369SKent Gibson 
455*925ca369SKent Gibson 	if (count < sizeof(ge))
456*925ca369SKent Gibson 		return -EINVAL;
457*925ca369SKent Gibson 
458*925ca369SKent Gibson 	do {
459*925ca369SKent Gibson 		spin_lock(&le->wait.lock);
460*925ca369SKent Gibson 		if (kfifo_is_empty(&le->events)) {
461*925ca369SKent Gibson 			if (bytes_read) {
462*925ca369SKent Gibson 				spin_unlock(&le->wait.lock);
463*925ca369SKent Gibson 				return bytes_read;
464*925ca369SKent Gibson 			}
465*925ca369SKent Gibson 
466*925ca369SKent Gibson 			if (filep->f_flags & O_NONBLOCK) {
467*925ca369SKent Gibson 				spin_unlock(&le->wait.lock);
468*925ca369SKent Gibson 				return -EAGAIN;
469*925ca369SKent Gibson 			}
470*925ca369SKent Gibson 
471*925ca369SKent Gibson 			ret = wait_event_interruptible_locked(le->wait,
472*925ca369SKent Gibson 					!kfifo_is_empty(&le->events));
473*925ca369SKent Gibson 			if (ret) {
474*925ca369SKent Gibson 				spin_unlock(&le->wait.lock);
475*925ca369SKent Gibson 				return ret;
476*925ca369SKent Gibson 			}
477*925ca369SKent Gibson 		}
478*925ca369SKent Gibson 
479*925ca369SKent Gibson 		ret = kfifo_out(&le->events, &ge, 1);
480*925ca369SKent Gibson 		spin_unlock(&le->wait.lock);
481*925ca369SKent Gibson 		if (ret != 1) {
482*925ca369SKent Gibson 			/*
483*925ca369SKent Gibson 			 * This should never happen - we were holding the lock
484*925ca369SKent Gibson 			 * from the moment we learned the fifo is no longer
485*925ca369SKent Gibson 			 * empty until now.
486*925ca369SKent Gibson 			 */
487*925ca369SKent Gibson 			ret = -EIO;
488*925ca369SKent Gibson 			break;
489*925ca369SKent Gibson 		}
490*925ca369SKent Gibson 
491*925ca369SKent Gibson 		if (copy_to_user(buf + bytes_read, &ge, sizeof(ge)))
492*925ca369SKent Gibson 			return -EFAULT;
493*925ca369SKent Gibson 		bytes_read += sizeof(ge);
494*925ca369SKent Gibson 	} while (count >= bytes_read + sizeof(ge));
495*925ca369SKent Gibson 
496*925ca369SKent Gibson 	return bytes_read;
497*925ca369SKent Gibson }
498*925ca369SKent Gibson 
499*925ca369SKent Gibson static int lineevent_release(struct inode *inode, struct file *filep)
500*925ca369SKent Gibson {
501*925ca369SKent Gibson 	struct lineevent_state *le = filep->private_data;
502*925ca369SKent Gibson 	struct gpio_device *gdev = le->gdev;
503*925ca369SKent Gibson 
504*925ca369SKent Gibson 	free_irq(le->irq, le);
505*925ca369SKent Gibson 	gpiod_free(le->desc);
506*925ca369SKent Gibson 	kfree(le->label);
507*925ca369SKent Gibson 	kfree(le);
508*925ca369SKent Gibson 	put_device(&gdev->dev);
509*925ca369SKent Gibson 	return 0;
510*925ca369SKent Gibson }
511*925ca369SKent Gibson 
512*925ca369SKent Gibson static long lineevent_ioctl(struct file *filep, unsigned int cmd,
513*925ca369SKent Gibson 			    unsigned long arg)
514*925ca369SKent Gibson {
515*925ca369SKent Gibson 	struct lineevent_state *le = filep->private_data;
516*925ca369SKent Gibson 	void __user *ip = (void __user *)arg;
517*925ca369SKent Gibson 	struct gpiohandle_data ghd;
518*925ca369SKent Gibson 
519*925ca369SKent Gibson 	/*
520*925ca369SKent Gibson 	 * We can get the value for an event line but not set it,
521*925ca369SKent Gibson 	 * because it is input by definition.
522*925ca369SKent Gibson 	 */
523*925ca369SKent Gibson 	if (cmd == GPIOHANDLE_GET_LINE_VALUES_IOCTL) {
524*925ca369SKent Gibson 		int val;
525*925ca369SKent Gibson 
526*925ca369SKent Gibson 		memset(&ghd, 0, sizeof(ghd));
527*925ca369SKent Gibson 
528*925ca369SKent Gibson 		val = gpiod_get_value_cansleep(le->desc);
529*925ca369SKent Gibson 		if (val < 0)
530*925ca369SKent Gibson 			return val;
531*925ca369SKent Gibson 		ghd.values[0] = val;
532*925ca369SKent Gibson 
533*925ca369SKent Gibson 		if (copy_to_user(ip, &ghd, sizeof(ghd)))
534*925ca369SKent Gibson 			return -EFAULT;
535*925ca369SKent Gibson 
536*925ca369SKent Gibson 		return 0;
537*925ca369SKent Gibson 	}
538*925ca369SKent Gibson 	return -EINVAL;
539*925ca369SKent Gibson }
540*925ca369SKent Gibson 
541*925ca369SKent Gibson #ifdef CONFIG_COMPAT
542*925ca369SKent Gibson static long lineevent_ioctl_compat(struct file *filep, unsigned int cmd,
543*925ca369SKent Gibson 				   unsigned long arg)
544*925ca369SKent Gibson {
545*925ca369SKent Gibson 	return lineevent_ioctl(filep, cmd, (unsigned long)compat_ptr(arg));
546*925ca369SKent Gibson }
547*925ca369SKent Gibson #endif
548*925ca369SKent Gibson 
549*925ca369SKent Gibson static const struct file_operations lineevent_fileops = {
550*925ca369SKent Gibson 	.release = lineevent_release,
551*925ca369SKent Gibson 	.read = lineevent_read,
552*925ca369SKent Gibson 	.poll = lineevent_poll,
553*925ca369SKent Gibson 	.owner = THIS_MODULE,
554*925ca369SKent Gibson 	.llseek = noop_llseek,
555*925ca369SKent Gibson 	.unlocked_ioctl = lineevent_ioctl,
556*925ca369SKent Gibson #ifdef CONFIG_COMPAT
557*925ca369SKent Gibson 	.compat_ioctl = lineevent_ioctl_compat,
558*925ca369SKent Gibson #endif
559*925ca369SKent Gibson };
560*925ca369SKent Gibson 
561*925ca369SKent Gibson static irqreturn_t lineevent_irq_thread(int irq, void *p)
562*925ca369SKent Gibson {
563*925ca369SKent Gibson 	struct lineevent_state *le = p;
564*925ca369SKent Gibson 	struct gpioevent_data ge;
565*925ca369SKent Gibson 	int ret;
566*925ca369SKent Gibson 
567*925ca369SKent Gibson 	/* Do not leak kernel stack to userspace */
568*925ca369SKent Gibson 	memset(&ge, 0, sizeof(ge));
569*925ca369SKent Gibson 
570*925ca369SKent Gibson 	/*
571*925ca369SKent Gibson 	 * We may be running from a nested threaded interrupt in which case
572*925ca369SKent Gibson 	 * we didn't get the timestamp from lineevent_irq_handler().
573*925ca369SKent Gibson 	 */
574*925ca369SKent Gibson 	if (!le->timestamp)
575*925ca369SKent Gibson 		ge.timestamp = ktime_get_ns();
576*925ca369SKent Gibson 	else
577*925ca369SKent Gibson 		ge.timestamp = le->timestamp;
578*925ca369SKent Gibson 
579*925ca369SKent Gibson 	if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE
580*925ca369SKent Gibson 	    && le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) {
581*925ca369SKent Gibson 		int level = gpiod_get_value_cansleep(le->desc);
582*925ca369SKent Gibson 
583*925ca369SKent Gibson 		if (level)
584*925ca369SKent Gibson 			/* Emit low-to-high event */
585*925ca369SKent Gibson 			ge.id = GPIOEVENT_EVENT_RISING_EDGE;
586*925ca369SKent Gibson 		else
587*925ca369SKent Gibson 			/* Emit high-to-low event */
588*925ca369SKent Gibson 			ge.id = GPIOEVENT_EVENT_FALLING_EDGE;
589*925ca369SKent Gibson 	} else if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE) {
590*925ca369SKent Gibson 		/* Emit low-to-high event */
591*925ca369SKent Gibson 		ge.id = GPIOEVENT_EVENT_RISING_EDGE;
592*925ca369SKent Gibson 	} else if (le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) {
593*925ca369SKent Gibson 		/* Emit high-to-low event */
594*925ca369SKent Gibson 		ge.id = GPIOEVENT_EVENT_FALLING_EDGE;
595*925ca369SKent Gibson 	} else {
596*925ca369SKent Gibson 		return IRQ_NONE;
597*925ca369SKent Gibson 	}
598*925ca369SKent Gibson 
599*925ca369SKent Gibson 	ret = kfifo_in_spinlocked_noirqsave(&le->events, &ge,
600*925ca369SKent Gibson 					    1, &le->wait.lock);
601*925ca369SKent Gibson 	if (ret)
602*925ca369SKent Gibson 		wake_up_poll(&le->wait, EPOLLIN);
603*925ca369SKent Gibson 	else
604*925ca369SKent Gibson 		pr_debug_ratelimited("event FIFO is full - event dropped\n");
605*925ca369SKent Gibson 
606*925ca369SKent Gibson 	return IRQ_HANDLED;
607*925ca369SKent Gibson }
608*925ca369SKent Gibson 
609*925ca369SKent Gibson static irqreturn_t lineevent_irq_handler(int irq, void *p)
610*925ca369SKent Gibson {
611*925ca369SKent Gibson 	struct lineevent_state *le = p;
612*925ca369SKent Gibson 
613*925ca369SKent Gibson 	/*
614*925ca369SKent Gibson 	 * Just store the timestamp in hardirq context so we get it as
615*925ca369SKent Gibson 	 * close in time as possible to the actual event.
616*925ca369SKent Gibson 	 */
617*925ca369SKent Gibson 	le->timestamp = ktime_get_ns();
618*925ca369SKent Gibson 
619*925ca369SKent Gibson 	return IRQ_WAKE_THREAD;
620*925ca369SKent Gibson }
621*925ca369SKent Gibson 
622*925ca369SKent Gibson static int lineevent_create(struct gpio_device *gdev, void __user *ip)
623*925ca369SKent Gibson {
624*925ca369SKent Gibson 	struct gpioevent_request eventreq;
625*925ca369SKent Gibson 	struct lineevent_state *le;
626*925ca369SKent Gibson 	struct gpio_desc *desc;
627*925ca369SKent Gibson 	struct file *file;
628*925ca369SKent Gibson 	u32 offset;
629*925ca369SKent Gibson 	u32 lflags;
630*925ca369SKent Gibson 	u32 eflags;
631*925ca369SKent Gibson 	int fd;
632*925ca369SKent Gibson 	int ret;
633*925ca369SKent Gibson 	int irqflags = 0;
634*925ca369SKent Gibson 
635*925ca369SKent Gibson 	if (copy_from_user(&eventreq, ip, sizeof(eventreq)))
636*925ca369SKent Gibson 		return -EFAULT;
637*925ca369SKent Gibson 
638*925ca369SKent Gibson 	offset = eventreq.lineoffset;
639*925ca369SKent Gibson 	lflags = eventreq.handleflags;
640*925ca369SKent Gibson 	eflags = eventreq.eventflags;
641*925ca369SKent Gibson 
642*925ca369SKent Gibson 	desc = gpiochip_get_desc(gdev->chip, offset);
643*925ca369SKent Gibson 	if (IS_ERR(desc))
644*925ca369SKent Gibson 		return PTR_ERR(desc);
645*925ca369SKent Gibson 
646*925ca369SKent Gibson 	/* Return an error if a unknown flag is set */
647*925ca369SKent Gibson 	if ((lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) ||
648*925ca369SKent Gibson 	    (eflags & ~GPIOEVENT_REQUEST_VALID_FLAGS))
649*925ca369SKent Gibson 		return -EINVAL;
650*925ca369SKent Gibson 
651*925ca369SKent Gibson 	/* This is just wrong: we don't look for events on output lines */
652*925ca369SKent Gibson 	if ((lflags & GPIOHANDLE_REQUEST_OUTPUT) ||
653*925ca369SKent Gibson 	    (lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN) ||
654*925ca369SKent Gibson 	    (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE))
655*925ca369SKent Gibson 		return -EINVAL;
656*925ca369SKent Gibson 
657*925ca369SKent Gibson 	/* Only one bias flag can be set. */
658*925ca369SKent Gibson 	if (((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) &&
659*925ca369SKent Gibson 	     (lflags & (GPIOHANDLE_REQUEST_BIAS_PULL_DOWN |
660*925ca369SKent Gibson 			GPIOHANDLE_REQUEST_BIAS_PULL_UP))) ||
661*925ca369SKent Gibson 	    ((lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) &&
662*925ca369SKent Gibson 	     (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP)))
663*925ca369SKent Gibson 		return -EINVAL;
664*925ca369SKent Gibson 
665*925ca369SKent Gibson 	le = kzalloc(sizeof(*le), GFP_KERNEL);
666*925ca369SKent Gibson 	if (!le)
667*925ca369SKent Gibson 		return -ENOMEM;
668*925ca369SKent Gibson 	le->gdev = gdev;
669*925ca369SKent Gibson 	get_device(&gdev->dev);
670*925ca369SKent Gibson 
671*925ca369SKent Gibson 	/* Make sure this is terminated */
672*925ca369SKent Gibson 	eventreq.consumer_label[sizeof(eventreq.consumer_label)-1] = '\0';
673*925ca369SKent Gibson 	if (strlen(eventreq.consumer_label)) {
674*925ca369SKent Gibson 		le->label = kstrdup(eventreq.consumer_label,
675*925ca369SKent Gibson 				    GFP_KERNEL);
676*925ca369SKent Gibson 		if (!le->label) {
677*925ca369SKent Gibson 			ret = -ENOMEM;
678*925ca369SKent Gibson 			goto out_free_le;
679*925ca369SKent Gibson 		}
680*925ca369SKent Gibson 	}
681*925ca369SKent Gibson 
682*925ca369SKent Gibson 	ret = gpiod_request(desc, le->label);
683*925ca369SKent Gibson 	if (ret)
684*925ca369SKent Gibson 		goto out_free_label;
685*925ca369SKent Gibson 	le->desc = desc;
686*925ca369SKent Gibson 	le->eflags = eflags;
687*925ca369SKent Gibson 
688*925ca369SKent Gibson 	if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW)
689*925ca369SKent Gibson 		set_bit(FLAG_ACTIVE_LOW, &desc->flags);
690*925ca369SKent Gibson 	if (lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE)
691*925ca369SKent Gibson 		set_bit(FLAG_BIAS_DISABLE, &desc->flags);
692*925ca369SKent Gibson 	if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN)
693*925ca369SKent Gibson 		set_bit(FLAG_PULL_DOWN, &desc->flags);
694*925ca369SKent Gibson 	if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP)
695*925ca369SKent Gibson 		set_bit(FLAG_PULL_UP, &desc->flags);
696*925ca369SKent Gibson 
697*925ca369SKent Gibson 	ret = gpiod_direction_input(desc);
698*925ca369SKent Gibson 	if (ret)
699*925ca369SKent Gibson 		goto out_free_desc;
700*925ca369SKent Gibson 
701*925ca369SKent Gibson 	atomic_notifier_call_chain(&desc->gdev->notifier,
702*925ca369SKent Gibson 				   GPIOLINE_CHANGED_REQUESTED, desc);
703*925ca369SKent Gibson 
704*925ca369SKent Gibson 	le->irq = gpiod_to_irq(desc);
705*925ca369SKent Gibson 	if (le->irq <= 0) {
706*925ca369SKent Gibson 		ret = -ENODEV;
707*925ca369SKent Gibson 		goto out_free_desc;
708*925ca369SKent Gibson 	}
709*925ca369SKent Gibson 
710*925ca369SKent Gibson 	if (eflags & GPIOEVENT_REQUEST_RISING_EDGE)
711*925ca369SKent Gibson 		irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
712*925ca369SKent Gibson 			IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
713*925ca369SKent Gibson 	if (eflags & GPIOEVENT_REQUEST_FALLING_EDGE)
714*925ca369SKent Gibson 		irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
715*925ca369SKent Gibson 			IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING;
716*925ca369SKent Gibson 	irqflags |= IRQF_ONESHOT;
717*925ca369SKent Gibson 
718*925ca369SKent Gibson 	INIT_KFIFO(le->events);
719*925ca369SKent Gibson 	init_waitqueue_head(&le->wait);
720*925ca369SKent Gibson 
721*925ca369SKent Gibson 	/* Request a thread to read the events */
722*925ca369SKent Gibson 	ret = request_threaded_irq(le->irq,
723*925ca369SKent Gibson 			lineevent_irq_handler,
724*925ca369SKent Gibson 			lineevent_irq_thread,
725*925ca369SKent Gibson 			irqflags,
726*925ca369SKent Gibson 			le->label,
727*925ca369SKent Gibson 			le);
728*925ca369SKent Gibson 	if (ret)
729*925ca369SKent Gibson 		goto out_free_desc;
730*925ca369SKent Gibson 
731*925ca369SKent Gibson 	fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC);
732*925ca369SKent Gibson 	if (fd < 0) {
733*925ca369SKent Gibson 		ret = fd;
734*925ca369SKent Gibson 		goto out_free_irq;
735*925ca369SKent Gibson 	}
736*925ca369SKent Gibson 
737*925ca369SKent Gibson 	file = anon_inode_getfile("gpio-event",
738*925ca369SKent Gibson 				  &lineevent_fileops,
739*925ca369SKent Gibson 				  le,
740*925ca369SKent Gibson 				  O_RDONLY | O_CLOEXEC);
741*925ca369SKent Gibson 	if (IS_ERR(file)) {
742*925ca369SKent Gibson 		ret = PTR_ERR(file);
743*925ca369SKent Gibson 		goto out_put_unused_fd;
744*925ca369SKent Gibson 	}
745*925ca369SKent Gibson 
746*925ca369SKent Gibson 	eventreq.fd = fd;
747*925ca369SKent Gibson 	if (copy_to_user(ip, &eventreq, sizeof(eventreq))) {
748*925ca369SKent Gibson 		/*
749*925ca369SKent Gibson 		 * fput() will trigger the release() callback, so do not go onto
750*925ca369SKent Gibson 		 * the regular error cleanup path here.
751*925ca369SKent Gibson 		 */
752*925ca369SKent Gibson 		fput(file);
753*925ca369SKent Gibson 		put_unused_fd(fd);
754*925ca369SKent Gibson 		return -EFAULT;
755*925ca369SKent Gibson 	}
756*925ca369SKent Gibson 
757*925ca369SKent Gibson 	fd_install(fd, file);
758*925ca369SKent Gibson 
759*925ca369SKent Gibson 	return 0;
760*925ca369SKent Gibson 
761*925ca369SKent Gibson out_put_unused_fd:
762*925ca369SKent Gibson 	put_unused_fd(fd);
763*925ca369SKent Gibson out_free_irq:
764*925ca369SKent Gibson 	free_irq(le->irq, le);
765*925ca369SKent Gibson out_free_desc:
766*925ca369SKent Gibson 	gpiod_free(le->desc);
767*925ca369SKent Gibson out_free_label:
768*925ca369SKent Gibson 	kfree(le->label);
769*925ca369SKent Gibson out_free_le:
770*925ca369SKent Gibson 	kfree(le);
771*925ca369SKent Gibson 	put_device(&gdev->dev);
772*925ca369SKent Gibson 	return ret;
773*925ca369SKent Gibson }
774*925ca369SKent Gibson 
775*925ca369SKent Gibson static void gpio_desc_to_lineinfo(struct gpio_desc *desc,
776*925ca369SKent Gibson 				  struct gpioline_info *info)
777*925ca369SKent Gibson {
778*925ca369SKent Gibson 	struct gpio_chip *gc = desc->gdev->chip;
779*925ca369SKent Gibson 	bool ok_for_pinctrl;
780*925ca369SKent Gibson 	unsigned long flags;
781*925ca369SKent Gibson 
782*925ca369SKent Gibson 	/*
783*925ca369SKent Gibson 	 * This function takes a mutex so we must check this before taking
784*925ca369SKent Gibson 	 * the spinlock.
785*925ca369SKent Gibson 	 *
786*925ca369SKent Gibson 	 * FIXME: find a non-racy way to retrieve this information. Maybe a
787*925ca369SKent Gibson 	 * lock common to both frameworks?
788*925ca369SKent Gibson 	 */
789*925ca369SKent Gibson 	ok_for_pinctrl =
790*925ca369SKent Gibson 		pinctrl_gpio_can_use_line(gc->base + info->line_offset);
791*925ca369SKent Gibson 
792*925ca369SKent Gibson 	spin_lock_irqsave(&gpio_lock, flags);
793*925ca369SKent Gibson 
794*925ca369SKent Gibson 	if (desc->name) {
795*925ca369SKent Gibson 		strncpy(info->name, desc->name, sizeof(info->name));
796*925ca369SKent Gibson 		info->name[sizeof(info->name) - 1] = '\0';
797*925ca369SKent Gibson 	} else {
798*925ca369SKent Gibson 		info->name[0] = '\0';
799*925ca369SKent Gibson 	}
800*925ca369SKent Gibson 
801*925ca369SKent Gibson 	if (desc->label) {
802*925ca369SKent Gibson 		strncpy(info->consumer, desc->label, sizeof(info->consumer));
803*925ca369SKent Gibson 		info->consumer[sizeof(info->consumer) - 1] = '\0';
804*925ca369SKent Gibson 	} else {
805*925ca369SKent Gibson 		info->consumer[0] = '\0';
806*925ca369SKent Gibson 	}
807*925ca369SKent Gibson 
808*925ca369SKent Gibson 	/*
809*925ca369SKent Gibson 	 * Userspace only need to know that the kernel is using this GPIO so
810*925ca369SKent Gibson 	 * it can't use it.
811*925ca369SKent Gibson 	 */
812*925ca369SKent Gibson 	info->flags = 0;
813*925ca369SKent Gibson 	if (test_bit(FLAG_REQUESTED, &desc->flags) ||
814*925ca369SKent Gibson 	    test_bit(FLAG_IS_HOGGED, &desc->flags) ||
815*925ca369SKent Gibson 	    test_bit(FLAG_USED_AS_IRQ, &desc->flags) ||
816*925ca369SKent Gibson 	    test_bit(FLAG_EXPORT, &desc->flags) ||
817*925ca369SKent Gibson 	    test_bit(FLAG_SYSFS, &desc->flags) ||
818*925ca369SKent Gibson 	    !ok_for_pinctrl)
819*925ca369SKent Gibson 		info->flags |= GPIOLINE_FLAG_KERNEL;
820*925ca369SKent Gibson 	if (test_bit(FLAG_IS_OUT, &desc->flags))
821*925ca369SKent Gibson 		info->flags |= GPIOLINE_FLAG_IS_OUT;
822*925ca369SKent Gibson 	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
823*925ca369SKent Gibson 		info->flags |= GPIOLINE_FLAG_ACTIVE_LOW;
824*925ca369SKent Gibson 	if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
825*925ca369SKent Gibson 		info->flags |= (GPIOLINE_FLAG_OPEN_DRAIN |
826*925ca369SKent Gibson 				GPIOLINE_FLAG_IS_OUT);
827*925ca369SKent Gibson 	if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
828*925ca369SKent Gibson 		info->flags |= (GPIOLINE_FLAG_OPEN_SOURCE |
829*925ca369SKent Gibson 				GPIOLINE_FLAG_IS_OUT);
830*925ca369SKent Gibson 	if (test_bit(FLAG_BIAS_DISABLE, &desc->flags))
831*925ca369SKent Gibson 		info->flags |= GPIOLINE_FLAG_BIAS_DISABLE;
832*925ca369SKent Gibson 	if (test_bit(FLAG_PULL_DOWN, &desc->flags))
833*925ca369SKent Gibson 		info->flags |= GPIOLINE_FLAG_BIAS_PULL_DOWN;
834*925ca369SKent Gibson 	if (test_bit(FLAG_PULL_UP, &desc->flags))
835*925ca369SKent Gibson 		info->flags |= GPIOLINE_FLAG_BIAS_PULL_UP;
836*925ca369SKent Gibson 
837*925ca369SKent Gibson 	spin_unlock_irqrestore(&gpio_lock, flags);
838*925ca369SKent Gibson }
839*925ca369SKent Gibson 
840*925ca369SKent Gibson struct gpio_chardev_data {
841*925ca369SKent Gibson 	struct gpio_device *gdev;
842*925ca369SKent Gibson 	wait_queue_head_t wait;
843*925ca369SKent Gibson 	DECLARE_KFIFO(events, struct gpioline_info_changed, 32);
844*925ca369SKent Gibson 	struct notifier_block lineinfo_changed_nb;
845*925ca369SKent Gibson 	unsigned long *watched_lines;
846*925ca369SKent Gibson };
847*925ca369SKent Gibson 
848*925ca369SKent Gibson /*
849*925ca369SKent Gibson  * gpio_ioctl() - ioctl handler for the GPIO chardev
850*925ca369SKent Gibson  */
851*925ca369SKent Gibson static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
852*925ca369SKent Gibson {
853*925ca369SKent Gibson 	struct gpio_chardev_data *priv = filp->private_data;
854*925ca369SKent Gibson 	struct gpio_device *gdev = priv->gdev;
855*925ca369SKent Gibson 	struct gpio_chip *gc = gdev->chip;
856*925ca369SKent Gibson 	void __user *ip = (void __user *)arg;
857*925ca369SKent Gibson 	struct gpio_desc *desc;
858*925ca369SKent Gibson 	__u32 offset;
859*925ca369SKent Gibson 	int hwgpio;
860*925ca369SKent Gibson 
861*925ca369SKent Gibson 	/* We fail any subsequent ioctl():s when the chip is gone */
862*925ca369SKent Gibson 	if (!gc)
863*925ca369SKent Gibson 		return -ENODEV;
864*925ca369SKent Gibson 
865*925ca369SKent Gibson 	/* Fill in the struct and pass to userspace */
866*925ca369SKent Gibson 	if (cmd == GPIO_GET_CHIPINFO_IOCTL) {
867*925ca369SKent Gibson 		struct gpiochip_info chipinfo;
868*925ca369SKent Gibson 
869*925ca369SKent Gibson 		memset(&chipinfo, 0, sizeof(chipinfo));
870*925ca369SKent Gibson 
871*925ca369SKent Gibson 		strncpy(chipinfo.name, dev_name(&gdev->dev),
872*925ca369SKent Gibson 			sizeof(chipinfo.name));
873*925ca369SKent Gibson 		chipinfo.name[sizeof(chipinfo.name)-1] = '\0';
874*925ca369SKent Gibson 		strncpy(chipinfo.label, gdev->label,
875*925ca369SKent Gibson 			sizeof(chipinfo.label));
876*925ca369SKent Gibson 		chipinfo.label[sizeof(chipinfo.label)-1] = '\0';
877*925ca369SKent Gibson 		chipinfo.lines = gdev->ngpio;
878*925ca369SKent Gibson 		if (copy_to_user(ip, &chipinfo, sizeof(chipinfo)))
879*925ca369SKent Gibson 			return -EFAULT;
880*925ca369SKent Gibson 		return 0;
881*925ca369SKent Gibson 	} else if (cmd == GPIO_GET_LINEINFO_IOCTL) {
882*925ca369SKent Gibson 		struct gpioline_info lineinfo;
883*925ca369SKent Gibson 
884*925ca369SKent Gibson 		if (copy_from_user(&lineinfo, ip, sizeof(lineinfo)))
885*925ca369SKent Gibson 			return -EFAULT;
886*925ca369SKent Gibson 
887*925ca369SKent Gibson 		desc = gpiochip_get_desc(gc, lineinfo.line_offset);
888*925ca369SKent Gibson 		if (IS_ERR(desc))
889*925ca369SKent Gibson 			return PTR_ERR(desc);
890*925ca369SKent Gibson 
891*925ca369SKent Gibson 		hwgpio = gpio_chip_hwgpio(desc);
892*925ca369SKent Gibson 
893*925ca369SKent Gibson 		gpio_desc_to_lineinfo(desc, &lineinfo);
894*925ca369SKent Gibson 
895*925ca369SKent Gibson 		if (copy_to_user(ip, &lineinfo, sizeof(lineinfo)))
896*925ca369SKent Gibson 			return -EFAULT;
897*925ca369SKent Gibson 		return 0;
898*925ca369SKent Gibson 	} else if (cmd == GPIO_GET_LINEHANDLE_IOCTL) {
899*925ca369SKent Gibson 		return linehandle_create(gdev, ip);
900*925ca369SKent Gibson 	} else if (cmd == GPIO_GET_LINEEVENT_IOCTL) {
901*925ca369SKent Gibson 		return lineevent_create(gdev, ip);
902*925ca369SKent Gibson 	} else if (cmd == GPIO_GET_LINEINFO_WATCH_IOCTL) {
903*925ca369SKent Gibson 		struct gpioline_info lineinfo;
904*925ca369SKent Gibson 
905*925ca369SKent Gibson 		if (copy_from_user(&lineinfo, ip, sizeof(lineinfo)))
906*925ca369SKent Gibson 			return -EFAULT;
907*925ca369SKent Gibson 
908*925ca369SKent Gibson 		desc = gpiochip_get_desc(gc, lineinfo.line_offset);
909*925ca369SKent Gibson 		if (IS_ERR(desc))
910*925ca369SKent Gibson 			return PTR_ERR(desc);
911*925ca369SKent Gibson 
912*925ca369SKent Gibson 		hwgpio = gpio_chip_hwgpio(desc);
913*925ca369SKent Gibson 
914*925ca369SKent Gibson 		if (test_bit(hwgpio, priv->watched_lines))
915*925ca369SKent Gibson 			return -EBUSY;
916*925ca369SKent Gibson 
917*925ca369SKent Gibson 		gpio_desc_to_lineinfo(desc, &lineinfo);
918*925ca369SKent Gibson 
919*925ca369SKent Gibson 		if (copy_to_user(ip, &lineinfo, sizeof(lineinfo)))
920*925ca369SKent Gibson 			return -EFAULT;
921*925ca369SKent Gibson 
922*925ca369SKent Gibson 		set_bit(hwgpio, priv->watched_lines);
923*925ca369SKent Gibson 		return 0;
924*925ca369SKent Gibson 	} else if (cmd == GPIO_GET_LINEINFO_UNWATCH_IOCTL) {
925*925ca369SKent Gibson 		if (copy_from_user(&offset, ip, sizeof(offset)))
926*925ca369SKent Gibson 			return -EFAULT;
927*925ca369SKent Gibson 
928*925ca369SKent Gibson 		desc = gpiochip_get_desc(gc, offset);
929*925ca369SKent Gibson 		if (IS_ERR(desc))
930*925ca369SKent Gibson 			return PTR_ERR(desc);
931*925ca369SKent Gibson 
932*925ca369SKent Gibson 		hwgpio = gpio_chip_hwgpio(desc);
933*925ca369SKent Gibson 
934*925ca369SKent Gibson 		if (!test_bit(hwgpio, priv->watched_lines))
935*925ca369SKent Gibson 			return -EBUSY;
936*925ca369SKent Gibson 
937*925ca369SKent Gibson 		clear_bit(hwgpio, priv->watched_lines);
938*925ca369SKent Gibson 		return 0;
939*925ca369SKent Gibson 	}
940*925ca369SKent Gibson 	return -EINVAL;
941*925ca369SKent Gibson }
942*925ca369SKent Gibson 
943*925ca369SKent Gibson #ifdef CONFIG_COMPAT
944*925ca369SKent Gibson static long gpio_ioctl_compat(struct file *filp, unsigned int cmd,
945*925ca369SKent Gibson 			      unsigned long arg)
946*925ca369SKent Gibson {
947*925ca369SKent Gibson 	return gpio_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
948*925ca369SKent Gibson }
949*925ca369SKent Gibson #endif
950*925ca369SKent Gibson 
951*925ca369SKent Gibson static struct gpio_chardev_data *
952*925ca369SKent Gibson to_gpio_chardev_data(struct notifier_block *nb)
953*925ca369SKent Gibson {
954*925ca369SKent Gibson 	return container_of(nb, struct gpio_chardev_data, lineinfo_changed_nb);
955*925ca369SKent Gibson }
956*925ca369SKent Gibson 
957*925ca369SKent Gibson static int lineinfo_changed_notify(struct notifier_block *nb,
958*925ca369SKent Gibson 				   unsigned long action, void *data)
959*925ca369SKent Gibson {
960*925ca369SKent Gibson 	struct gpio_chardev_data *priv = to_gpio_chardev_data(nb);
961*925ca369SKent Gibson 	struct gpioline_info_changed chg;
962*925ca369SKent Gibson 	struct gpio_desc *desc = data;
963*925ca369SKent Gibson 	int ret;
964*925ca369SKent Gibson 
965*925ca369SKent Gibson 	if (!test_bit(gpio_chip_hwgpio(desc), priv->watched_lines))
966*925ca369SKent Gibson 		return NOTIFY_DONE;
967*925ca369SKent Gibson 
968*925ca369SKent Gibson 	memset(&chg, 0, sizeof(chg));
969*925ca369SKent Gibson 	chg.info.line_offset = gpio_chip_hwgpio(desc);
970*925ca369SKent Gibson 	chg.event_type = action;
971*925ca369SKent Gibson 	chg.timestamp = ktime_get_ns();
972*925ca369SKent Gibson 	gpio_desc_to_lineinfo(desc, &chg.info);
973*925ca369SKent Gibson 
974*925ca369SKent Gibson 	ret = kfifo_in_spinlocked(&priv->events, &chg, 1, &priv->wait.lock);
975*925ca369SKent Gibson 	if (ret)
976*925ca369SKent Gibson 		wake_up_poll(&priv->wait, EPOLLIN);
977*925ca369SKent Gibson 	else
978*925ca369SKent Gibson 		pr_debug_ratelimited("lineinfo event FIFO is full - event dropped\n");
979*925ca369SKent Gibson 
980*925ca369SKent Gibson 	return NOTIFY_OK;
981*925ca369SKent Gibson }
982*925ca369SKent Gibson 
983*925ca369SKent Gibson static __poll_t lineinfo_watch_poll(struct file *filep,
984*925ca369SKent Gibson 				    struct poll_table_struct *pollt)
985*925ca369SKent Gibson {
986*925ca369SKent Gibson 	struct gpio_chardev_data *priv = filep->private_data;
987*925ca369SKent Gibson 	__poll_t events = 0;
988*925ca369SKent Gibson 
989*925ca369SKent Gibson 	poll_wait(filep, &priv->wait, pollt);
990*925ca369SKent Gibson 
991*925ca369SKent Gibson 	if (!kfifo_is_empty_spinlocked_noirqsave(&priv->events,
992*925ca369SKent Gibson 						 &priv->wait.lock))
993*925ca369SKent Gibson 		events = EPOLLIN | EPOLLRDNORM;
994*925ca369SKent Gibson 
995*925ca369SKent Gibson 	return events;
996*925ca369SKent Gibson }
997*925ca369SKent Gibson 
998*925ca369SKent Gibson static ssize_t lineinfo_watch_read(struct file *filep, char __user *buf,
999*925ca369SKent Gibson 				   size_t count, loff_t *off)
1000*925ca369SKent Gibson {
1001*925ca369SKent Gibson 	struct gpio_chardev_data *priv = filep->private_data;
1002*925ca369SKent Gibson 	struct gpioline_info_changed event;
1003*925ca369SKent Gibson 	ssize_t bytes_read = 0;
1004*925ca369SKent Gibson 	int ret;
1005*925ca369SKent Gibson 
1006*925ca369SKent Gibson 	if (count < sizeof(event))
1007*925ca369SKent Gibson 		return -EINVAL;
1008*925ca369SKent Gibson 
1009*925ca369SKent Gibson 	do {
1010*925ca369SKent Gibson 		spin_lock(&priv->wait.lock);
1011*925ca369SKent Gibson 		if (kfifo_is_empty(&priv->events)) {
1012*925ca369SKent Gibson 			if (bytes_read) {
1013*925ca369SKent Gibson 				spin_unlock(&priv->wait.lock);
1014*925ca369SKent Gibson 				return bytes_read;
1015*925ca369SKent Gibson 			}
1016*925ca369SKent Gibson 
1017*925ca369SKent Gibson 			if (filep->f_flags & O_NONBLOCK) {
1018*925ca369SKent Gibson 				spin_unlock(&priv->wait.lock);
1019*925ca369SKent Gibson 				return -EAGAIN;
1020*925ca369SKent Gibson 			}
1021*925ca369SKent Gibson 
1022*925ca369SKent Gibson 			ret = wait_event_interruptible_locked(priv->wait,
1023*925ca369SKent Gibson 					!kfifo_is_empty(&priv->events));
1024*925ca369SKent Gibson 			if (ret) {
1025*925ca369SKent Gibson 				spin_unlock(&priv->wait.lock);
1026*925ca369SKent Gibson 				return ret;
1027*925ca369SKent Gibson 			}
1028*925ca369SKent Gibson 		}
1029*925ca369SKent Gibson 
1030*925ca369SKent Gibson 		ret = kfifo_out(&priv->events, &event, 1);
1031*925ca369SKent Gibson 		spin_unlock(&priv->wait.lock);
1032*925ca369SKent Gibson 		if (ret != 1) {
1033*925ca369SKent Gibson 			ret = -EIO;
1034*925ca369SKent Gibson 			break;
1035*925ca369SKent Gibson 			/* We should never get here. See lineevent_read(). */
1036*925ca369SKent Gibson 		}
1037*925ca369SKent Gibson 
1038*925ca369SKent Gibson 		if (copy_to_user(buf + bytes_read, &event, sizeof(event)))
1039*925ca369SKent Gibson 			return -EFAULT;
1040*925ca369SKent Gibson 		bytes_read += sizeof(event);
1041*925ca369SKent Gibson 	} while (count >= bytes_read + sizeof(event));
1042*925ca369SKent Gibson 
1043*925ca369SKent Gibson 	return bytes_read;
1044*925ca369SKent Gibson }
1045*925ca369SKent Gibson 
1046*925ca369SKent Gibson /**
1047*925ca369SKent Gibson  * gpio_chrdev_open() - open the chardev for ioctl operations
1048*925ca369SKent Gibson  * @inode: inode for this chardev
1049*925ca369SKent Gibson  * @filp: file struct for storing private data
1050*925ca369SKent Gibson  * Returns 0 on success
1051*925ca369SKent Gibson  */
1052*925ca369SKent Gibson static int gpio_chrdev_open(struct inode *inode, struct file *filp)
1053*925ca369SKent Gibson {
1054*925ca369SKent Gibson 	struct gpio_device *gdev = container_of(inode->i_cdev,
1055*925ca369SKent Gibson 					      struct gpio_device, chrdev);
1056*925ca369SKent Gibson 	struct gpio_chardev_data *priv;
1057*925ca369SKent Gibson 	int ret = -ENOMEM;
1058*925ca369SKent Gibson 
1059*925ca369SKent Gibson 	/* Fail on open if the backing gpiochip is gone */
1060*925ca369SKent Gibson 	if (!gdev->chip)
1061*925ca369SKent Gibson 		return -ENODEV;
1062*925ca369SKent Gibson 
1063*925ca369SKent Gibson 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1064*925ca369SKent Gibson 	if (!priv)
1065*925ca369SKent Gibson 		return -ENOMEM;
1066*925ca369SKent Gibson 
1067*925ca369SKent Gibson 	priv->watched_lines = bitmap_zalloc(gdev->chip->ngpio, GFP_KERNEL);
1068*925ca369SKent Gibson 	if (!priv->watched_lines)
1069*925ca369SKent Gibson 		goto out_free_priv;
1070*925ca369SKent Gibson 
1071*925ca369SKent Gibson 	init_waitqueue_head(&priv->wait);
1072*925ca369SKent Gibson 	INIT_KFIFO(priv->events);
1073*925ca369SKent Gibson 	priv->gdev = gdev;
1074*925ca369SKent Gibson 
1075*925ca369SKent Gibson 	priv->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify;
1076*925ca369SKent Gibson 	ret = atomic_notifier_chain_register(&gdev->notifier,
1077*925ca369SKent Gibson 					     &priv->lineinfo_changed_nb);
1078*925ca369SKent Gibson 	if (ret)
1079*925ca369SKent Gibson 		goto out_free_bitmap;
1080*925ca369SKent Gibson 
1081*925ca369SKent Gibson 	get_device(&gdev->dev);
1082*925ca369SKent Gibson 	filp->private_data = priv;
1083*925ca369SKent Gibson 
1084*925ca369SKent Gibson 	ret = nonseekable_open(inode, filp);
1085*925ca369SKent Gibson 	if (ret)
1086*925ca369SKent Gibson 		goto out_unregister_notifier;
1087*925ca369SKent Gibson 
1088*925ca369SKent Gibson 	return ret;
1089*925ca369SKent Gibson 
1090*925ca369SKent Gibson out_unregister_notifier:
1091*925ca369SKent Gibson 	atomic_notifier_chain_unregister(&gdev->notifier,
1092*925ca369SKent Gibson 					 &priv->lineinfo_changed_nb);
1093*925ca369SKent Gibson out_free_bitmap:
1094*925ca369SKent Gibson 	bitmap_free(priv->watched_lines);
1095*925ca369SKent Gibson out_free_priv:
1096*925ca369SKent Gibson 	kfree(priv);
1097*925ca369SKent Gibson 	return ret;
1098*925ca369SKent Gibson }
1099*925ca369SKent Gibson 
1100*925ca369SKent Gibson /**
1101*925ca369SKent Gibson  * gpio_chrdev_release() - close chardev after ioctl operations
1102*925ca369SKent Gibson  * @inode: inode for this chardev
1103*925ca369SKent Gibson  * @filp: file struct for storing private data
1104*925ca369SKent Gibson  * Returns 0 on success
1105*925ca369SKent Gibson  */
1106*925ca369SKent Gibson static int gpio_chrdev_release(struct inode *inode, struct file *filp)
1107*925ca369SKent Gibson {
1108*925ca369SKent Gibson 	struct gpio_chardev_data *priv = filp->private_data;
1109*925ca369SKent Gibson 	struct gpio_device *gdev = priv->gdev;
1110*925ca369SKent Gibson 
1111*925ca369SKent Gibson 	bitmap_free(priv->watched_lines);
1112*925ca369SKent Gibson 	atomic_notifier_chain_unregister(&gdev->notifier,
1113*925ca369SKent Gibson 					 &priv->lineinfo_changed_nb);
1114*925ca369SKent Gibson 	put_device(&gdev->dev);
1115*925ca369SKent Gibson 	kfree(priv);
1116*925ca369SKent Gibson 
1117*925ca369SKent Gibson 	return 0;
1118*925ca369SKent Gibson }
1119*925ca369SKent Gibson 
1120*925ca369SKent Gibson static const struct file_operations gpio_fileops = {
1121*925ca369SKent Gibson 	.release = gpio_chrdev_release,
1122*925ca369SKent Gibson 	.open = gpio_chrdev_open,
1123*925ca369SKent Gibson 	.poll = lineinfo_watch_poll,
1124*925ca369SKent Gibson 	.read = lineinfo_watch_read,
1125*925ca369SKent Gibson 	.owner = THIS_MODULE,
1126*925ca369SKent Gibson 	.llseek = no_llseek,
1127*925ca369SKent Gibson 	.unlocked_ioctl = gpio_ioctl,
1128*925ca369SKent Gibson #ifdef CONFIG_COMPAT
1129*925ca369SKent Gibson 	.compat_ioctl = gpio_ioctl_compat,
1130*925ca369SKent Gibson #endif
1131*925ca369SKent Gibson };
1132*925ca369SKent Gibson 
1133*925ca369SKent Gibson int gpiolib_cdev_register(struct gpio_device *gdev, dev_t devt)
1134*925ca369SKent Gibson {
1135*925ca369SKent Gibson 	int ret;
1136*925ca369SKent Gibson 
1137*925ca369SKent Gibson 	cdev_init(&gdev->chrdev, &gpio_fileops);
1138*925ca369SKent Gibson 	gdev->chrdev.owner = THIS_MODULE;
1139*925ca369SKent Gibson 	gdev->dev.devt = MKDEV(MAJOR(devt), gdev->id);
1140*925ca369SKent Gibson 
1141*925ca369SKent Gibson 	ret = cdev_device_add(&gdev->chrdev, &gdev->dev);
1142*925ca369SKent Gibson 	if (ret)
1143*925ca369SKent Gibson 		return ret;
1144*925ca369SKent Gibson 
1145*925ca369SKent Gibson 	chip_dbg(gdev->chip, "added GPIO chardev (%d:%d)\n",
1146*925ca369SKent Gibson 		 MAJOR(devt), gdev->id);
1147*925ca369SKent Gibson 
1148*925ca369SKent Gibson 	return 0;
1149*925ca369SKent Gibson }
1150*925ca369SKent Gibson 
1151*925ca369SKent Gibson void gpiolib_cdev_unregister(struct gpio_device *gdev)
1152*925ca369SKent Gibson {
1153*925ca369SKent Gibson 	cdev_device_del(&gdev->chrdev, &gdev->dev);
1154*925ca369SKent Gibson }
1155