xref: /OK3568_Linux_fs/kernel/drivers/input/input-polldev.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Generic implementation of a polled input device
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun  * Copyright (c) 2007 Dmitry Torokhov
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/jiffies.h>
11*4882a593Smuzhiyun #include <linux/slab.h>
12*4882a593Smuzhiyun #include <linux/mutex.h>
13*4882a593Smuzhiyun #include <linux/workqueue.h>
14*4882a593Smuzhiyun #include <linux/module.h>
15*4882a593Smuzhiyun #include <linux/input-polldev.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>");
18*4882a593Smuzhiyun MODULE_DESCRIPTION("Generic implementation of a polled input device");
19*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
20*4882a593Smuzhiyun 
input_polldev_queue_work(struct input_polled_dev * dev)21*4882a593Smuzhiyun static void input_polldev_queue_work(struct input_polled_dev *dev)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun 	unsigned long delay;
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 	delay = msecs_to_jiffies(dev->poll_interval);
26*4882a593Smuzhiyun 	if (delay >= HZ)
27*4882a593Smuzhiyun 		delay = round_jiffies_relative(delay);
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	queue_delayed_work(system_freezable_wq, &dev->work, delay);
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun 
input_polled_device_work(struct work_struct * work)32*4882a593Smuzhiyun static void input_polled_device_work(struct work_struct *work)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	struct input_polled_dev *dev =
35*4882a593Smuzhiyun 		container_of(work, struct input_polled_dev, work.work);
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	dev->poll(dev);
38*4882a593Smuzhiyun 	input_polldev_queue_work(dev);
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun 
input_open_polled_device(struct input_dev * input)41*4882a593Smuzhiyun static int input_open_polled_device(struct input_dev *input)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	struct input_polled_dev *dev = input_get_drvdata(input);
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	if (dev->open)
46*4882a593Smuzhiyun 		dev->open(dev);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	/* Only start polling if polling is enabled */
49*4882a593Smuzhiyun 	if (dev->poll_interval > 0) {
50*4882a593Smuzhiyun 		dev->poll(dev);
51*4882a593Smuzhiyun 		input_polldev_queue_work(dev);
52*4882a593Smuzhiyun 	}
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	return 0;
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun 
input_close_polled_device(struct input_dev * input)57*4882a593Smuzhiyun static void input_close_polled_device(struct input_dev *input)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	struct input_polled_dev *dev = input_get_drvdata(input);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	cancel_delayed_work_sync(&dev->work);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	if (dev->close)
64*4882a593Smuzhiyun 		dev->close(dev);
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun /* SYSFS interface */
68*4882a593Smuzhiyun 
input_polldev_get_poll(struct device * dev,struct device_attribute * attr,char * buf)69*4882a593Smuzhiyun static ssize_t input_polldev_get_poll(struct device *dev,
70*4882a593Smuzhiyun 				      struct device_attribute *attr, char *buf)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	struct input_polled_dev *polldev = dev_get_drvdata(dev);
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	return sprintf(buf, "%d\n", polldev->poll_interval);
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
input_polldev_set_poll(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)77*4882a593Smuzhiyun static ssize_t input_polldev_set_poll(struct device *dev,
78*4882a593Smuzhiyun 				struct device_attribute *attr, const char *buf,
79*4882a593Smuzhiyun 				size_t count)
80*4882a593Smuzhiyun {
81*4882a593Smuzhiyun 	struct input_polled_dev *polldev = dev_get_drvdata(dev);
82*4882a593Smuzhiyun 	struct input_dev *input = polldev->input;
83*4882a593Smuzhiyun 	unsigned int interval;
84*4882a593Smuzhiyun 	int err;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	err = kstrtouint(buf, 0, &interval);
87*4882a593Smuzhiyun 	if (err)
88*4882a593Smuzhiyun 		return err;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	if (interval < polldev->poll_interval_min)
91*4882a593Smuzhiyun 		return -EINVAL;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	if (interval > polldev->poll_interval_max)
94*4882a593Smuzhiyun 		return -EINVAL;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	mutex_lock(&input->mutex);
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	polldev->poll_interval = interval;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	if (input->users) {
101*4882a593Smuzhiyun 		cancel_delayed_work_sync(&polldev->work);
102*4882a593Smuzhiyun 		if (polldev->poll_interval > 0)
103*4882a593Smuzhiyun 			input_polldev_queue_work(polldev);
104*4882a593Smuzhiyun 	}
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	mutex_unlock(&input->mutex);
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	return count;
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun static DEVICE_ATTR(poll, S_IRUGO | S_IWUSR, input_polldev_get_poll,
112*4882a593Smuzhiyun 					    input_polldev_set_poll);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 
input_polldev_get_max(struct device * dev,struct device_attribute * attr,char * buf)115*4882a593Smuzhiyun static ssize_t input_polldev_get_max(struct device *dev,
116*4882a593Smuzhiyun 				     struct device_attribute *attr, char *buf)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun 	struct input_polled_dev *polldev = dev_get_drvdata(dev);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	return sprintf(buf, "%d\n", polldev->poll_interval_max);
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun static DEVICE_ATTR(max, S_IRUGO, input_polldev_get_max, NULL);
124*4882a593Smuzhiyun 
input_polldev_get_min(struct device * dev,struct device_attribute * attr,char * buf)125*4882a593Smuzhiyun static ssize_t input_polldev_get_min(struct device *dev,
126*4882a593Smuzhiyun 				     struct device_attribute *attr, char *buf)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	struct input_polled_dev *polldev = dev_get_drvdata(dev);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	return sprintf(buf, "%d\n", polldev->poll_interval_min);
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun static DEVICE_ATTR(min, S_IRUGO, input_polldev_get_min, NULL);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun static struct attribute *sysfs_attrs[] = {
136*4882a593Smuzhiyun 	&dev_attr_poll.attr,
137*4882a593Smuzhiyun 	&dev_attr_max.attr,
138*4882a593Smuzhiyun 	&dev_attr_min.attr,
139*4882a593Smuzhiyun 	NULL
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun static struct attribute_group input_polldev_attribute_group = {
143*4882a593Smuzhiyun 	.attrs = sysfs_attrs
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun static const struct attribute_group *input_polldev_attribute_groups[] = {
147*4882a593Smuzhiyun 	&input_polldev_attribute_group,
148*4882a593Smuzhiyun 	NULL
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun /**
152*4882a593Smuzhiyun  * input_allocate_polled_device - allocate memory for polled device
153*4882a593Smuzhiyun  *
154*4882a593Smuzhiyun  * The function allocates memory for a polled device and also
155*4882a593Smuzhiyun  * for an input device associated with this polled device.
156*4882a593Smuzhiyun  */
input_allocate_polled_device(void)157*4882a593Smuzhiyun struct input_polled_dev *input_allocate_polled_device(void)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	struct input_polled_dev *dev;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	dev = kzalloc(sizeof(struct input_polled_dev), GFP_KERNEL);
162*4882a593Smuzhiyun 	if (!dev)
163*4882a593Smuzhiyun 		return NULL;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	dev->input = input_allocate_device();
166*4882a593Smuzhiyun 	if (!dev->input) {
167*4882a593Smuzhiyun 		kfree(dev);
168*4882a593Smuzhiyun 		return NULL;
169*4882a593Smuzhiyun 	}
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	return dev;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun EXPORT_SYMBOL(input_allocate_polled_device);
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun struct input_polled_devres {
176*4882a593Smuzhiyun 	struct input_polled_dev *polldev;
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun 
devm_input_polldev_match(struct device * dev,void * res,void * data)179*4882a593Smuzhiyun static int devm_input_polldev_match(struct device *dev, void *res, void *data)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun 	struct input_polled_devres *devres = res;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	return devres->polldev == data;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun 
devm_input_polldev_release(struct device * dev,void * res)186*4882a593Smuzhiyun static void devm_input_polldev_release(struct device *dev, void *res)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun 	struct input_polled_devres *devres = res;
189*4882a593Smuzhiyun 	struct input_polled_dev *polldev = devres->polldev;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	dev_dbg(dev, "%s: dropping reference/freeing %s\n",
192*4882a593Smuzhiyun 		__func__, dev_name(&polldev->input->dev));
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	input_put_device(polldev->input);
195*4882a593Smuzhiyun 	kfree(polldev);
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
devm_input_polldev_unregister(struct device * dev,void * res)198*4882a593Smuzhiyun static void devm_input_polldev_unregister(struct device *dev, void *res)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	struct input_polled_devres *devres = res;
201*4882a593Smuzhiyun 	struct input_polled_dev *polldev = devres->polldev;
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	dev_dbg(dev, "%s: unregistering device %s\n",
204*4882a593Smuzhiyun 		__func__, dev_name(&polldev->input->dev));
205*4882a593Smuzhiyun 	input_unregister_device(polldev->input);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	/*
208*4882a593Smuzhiyun 	 * Note that we are still holding extra reference to the input
209*4882a593Smuzhiyun 	 * device so it will stick around until devm_input_polldev_release()
210*4882a593Smuzhiyun 	 * is called.
211*4882a593Smuzhiyun 	 */
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /**
215*4882a593Smuzhiyun  * devm_input_allocate_polled_device - allocate managed polled device
216*4882a593Smuzhiyun  * @dev: device owning the polled device being created
217*4882a593Smuzhiyun  *
218*4882a593Smuzhiyun  * Returns prepared &struct input_polled_dev or %NULL.
219*4882a593Smuzhiyun  *
220*4882a593Smuzhiyun  * Managed polled input devices do not need to be explicitly unregistered
221*4882a593Smuzhiyun  * or freed as it will be done automatically when owner device unbinds
222*4882a593Smuzhiyun  * from * its driver (or binding fails). Once such managed polled device
223*4882a593Smuzhiyun  * is allocated, it is ready to be set up and registered in the same
224*4882a593Smuzhiyun  * fashion as regular polled input devices (using
225*4882a593Smuzhiyun  * input_register_polled_device() function).
226*4882a593Smuzhiyun  *
227*4882a593Smuzhiyun  * If you want to manually unregister and free such managed polled devices,
228*4882a593Smuzhiyun  * it can be still done by calling input_unregister_polled_device() and
229*4882a593Smuzhiyun  * input_free_polled_device(), although it is rarely needed.
230*4882a593Smuzhiyun  *
231*4882a593Smuzhiyun  * NOTE: the owner device is set up as parent of input device and users
232*4882a593Smuzhiyun  * should not override it.
233*4882a593Smuzhiyun  */
devm_input_allocate_polled_device(struct device * dev)234*4882a593Smuzhiyun struct input_polled_dev *devm_input_allocate_polled_device(struct device *dev)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun 	struct input_polled_dev *polldev;
237*4882a593Smuzhiyun 	struct input_polled_devres *devres;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	devres = devres_alloc(devm_input_polldev_release, sizeof(*devres),
240*4882a593Smuzhiyun 			      GFP_KERNEL);
241*4882a593Smuzhiyun 	if (!devres)
242*4882a593Smuzhiyun 		return NULL;
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	polldev = input_allocate_polled_device();
245*4882a593Smuzhiyun 	if (!polldev) {
246*4882a593Smuzhiyun 		devres_free(devres);
247*4882a593Smuzhiyun 		return NULL;
248*4882a593Smuzhiyun 	}
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	polldev->input->dev.parent = dev;
251*4882a593Smuzhiyun 	polldev->devres_managed = true;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	devres->polldev = polldev;
254*4882a593Smuzhiyun 	devres_add(dev, devres);
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	return polldev;
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun EXPORT_SYMBOL(devm_input_allocate_polled_device);
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun /**
261*4882a593Smuzhiyun  * input_free_polled_device - free memory allocated for polled device
262*4882a593Smuzhiyun  * @dev: device to free
263*4882a593Smuzhiyun  *
264*4882a593Smuzhiyun  * The function frees memory allocated for polling device and drops
265*4882a593Smuzhiyun  * reference to the associated input device.
266*4882a593Smuzhiyun  */
input_free_polled_device(struct input_polled_dev * dev)267*4882a593Smuzhiyun void input_free_polled_device(struct input_polled_dev *dev)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun 	if (dev) {
270*4882a593Smuzhiyun 		if (dev->devres_managed)
271*4882a593Smuzhiyun 			WARN_ON(devres_destroy(dev->input->dev.parent,
272*4882a593Smuzhiyun 						devm_input_polldev_release,
273*4882a593Smuzhiyun 						devm_input_polldev_match,
274*4882a593Smuzhiyun 						dev));
275*4882a593Smuzhiyun 		input_put_device(dev->input);
276*4882a593Smuzhiyun 		kfree(dev);
277*4882a593Smuzhiyun 	}
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun EXPORT_SYMBOL(input_free_polled_device);
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /**
282*4882a593Smuzhiyun  * input_register_polled_device - register polled device
283*4882a593Smuzhiyun  * @dev: device to register
284*4882a593Smuzhiyun  *
285*4882a593Smuzhiyun  * The function registers previously initialized polled input device
286*4882a593Smuzhiyun  * with input layer. The device should be allocated with call to
287*4882a593Smuzhiyun  * input_allocate_polled_device(). Callers should also set up poll()
288*4882a593Smuzhiyun  * method and set up capabilities (id, name, phys, bits) of the
289*4882a593Smuzhiyun  * corresponding input_dev structure.
290*4882a593Smuzhiyun  */
input_register_polled_device(struct input_polled_dev * dev)291*4882a593Smuzhiyun int input_register_polled_device(struct input_polled_dev *dev)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun 	struct input_polled_devres *devres = NULL;
294*4882a593Smuzhiyun 	struct input_dev *input = dev->input;
295*4882a593Smuzhiyun 	int error;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	if (dev->devres_managed) {
298*4882a593Smuzhiyun 		devres = devres_alloc(devm_input_polldev_unregister,
299*4882a593Smuzhiyun 				      sizeof(*devres), GFP_KERNEL);
300*4882a593Smuzhiyun 		if (!devres)
301*4882a593Smuzhiyun 			return -ENOMEM;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 		devres->polldev = dev;
304*4882a593Smuzhiyun 	}
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	input_set_drvdata(input, dev);
307*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&dev->work, input_polled_device_work);
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 	if (!dev->poll_interval)
310*4882a593Smuzhiyun 		dev->poll_interval = 500;
311*4882a593Smuzhiyun 	if (!dev->poll_interval_max)
312*4882a593Smuzhiyun 		dev->poll_interval_max = dev->poll_interval;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	input->open = input_open_polled_device;
315*4882a593Smuzhiyun 	input->close = input_close_polled_device;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	input->dev.groups = input_polldev_attribute_groups;
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	error = input_register_device(input);
320*4882a593Smuzhiyun 	if (error) {
321*4882a593Smuzhiyun 		devres_free(devres);
322*4882a593Smuzhiyun 		return error;
323*4882a593Smuzhiyun 	}
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 	/*
326*4882a593Smuzhiyun 	 * Take extra reference to the underlying input device so
327*4882a593Smuzhiyun 	 * that it survives call to input_unregister_polled_device()
328*4882a593Smuzhiyun 	 * and is deleted only after input_free_polled_device()
329*4882a593Smuzhiyun 	 * has been invoked. This is needed to ease task of freeing
330*4882a593Smuzhiyun 	 * sparse keymaps.
331*4882a593Smuzhiyun 	 */
332*4882a593Smuzhiyun 	input_get_device(input);
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	if (dev->devres_managed) {
335*4882a593Smuzhiyun 		dev_dbg(input->dev.parent, "%s: registering %s with devres.\n",
336*4882a593Smuzhiyun 			__func__, dev_name(&input->dev));
337*4882a593Smuzhiyun 		devres_add(input->dev.parent, devres);
338*4882a593Smuzhiyun 	}
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	return 0;
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun EXPORT_SYMBOL(input_register_polled_device);
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun /**
345*4882a593Smuzhiyun  * input_unregister_polled_device - unregister polled device
346*4882a593Smuzhiyun  * @dev: device to unregister
347*4882a593Smuzhiyun  *
348*4882a593Smuzhiyun  * The function unregisters previously registered polled input
349*4882a593Smuzhiyun  * device from input layer. Polling is stopped and device is
350*4882a593Smuzhiyun  * ready to be freed with call to input_free_polled_device().
351*4882a593Smuzhiyun  */
input_unregister_polled_device(struct input_polled_dev * dev)352*4882a593Smuzhiyun void input_unregister_polled_device(struct input_polled_dev *dev)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun 	if (dev->devres_managed)
355*4882a593Smuzhiyun 		WARN_ON(devres_destroy(dev->input->dev.parent,
356*4882a593Smuzhiyun 					devm_input_polldev_unregister,
357*4882a593Smuzhiyun 					devm_input_polldev_match,
358*4882a593Smuzhiyun 					dev));
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	input_unregister_device(dev->input);
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun EXPORT_SYMBOL(input_unregister_polled_device);
363