xref: /OK3568_Linux_fs/kernel/drivers/input/input-poller.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Support for polling mode for input devices.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/device.h>
7*4882a593Smuzhiyun #include <linux/input.h>
8*4882a593Smuzhiyun #include <linux/jiffies.h>
9*4882a593Smuzhiyun #include <linux/mutex.h>
10*4882a593Smuzhiyun #include <linux/slab.h>
11*4882a593Smuzhiyun #include <linux/types.h>
12*4882a593Smuzhiyun #include <linux/workqueue.h>
13*4882a593Smuzhiyun #include "input-poller.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct input_dev_poller {
16*4882a593Smuzhiyun 	void (*poll)(struct input_dev *dev);
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 	unsigned int poll_interval; /* msec */
19*4882a593Smuzhiyun 	unsigned int poll_interval_max; /* msec */
20*4882a593Smuzhiyun 	unsigned int poll_interval_min; /* msec */
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	struct input_dev *input;
23*4882a593Smuzhiyun 	struct delayed_work work;
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
input_dev_poller_queue_work(struct input_dev_poller * poller)26*4882a593Smuzhiyun static void input_dev_poller_queue_work(struct input_dev_poller *poller)
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun 	unsigned long delay;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	delay = msecs_to_jiffies(poller->poll_interval);
31*4882a593Smuzhiyun 	if (delay >= HZ)
32*4882a593Smuzhiyun 		delay = round_jiffies_relative(delay);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	queue_delayed_work(system_freezable_wq, &poller->work, delay);
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
input_dev_poller_work(struct work_struct * work)37*4882a593Smuzhiyun static void input_dev_poller_work(struct work_struct *work)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	struct input_dev_poller *poller =
40*4882a593Smuzhiyun 		container_of(work, struct input_dev_poller, work.work);
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	poller->poll(poller->input);
43*4882a593Smuzhiyun 	input_dev_poller_queue_work(poller);
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
input_dev_poller_finalize(struct input_dev_poller * poller)46*4882a593Smuzhiyun void input_dev_poller_finalize(struct input_dev_poller *poller)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	if (!poller->poll_interval)
49*4882a593Smuzhiyun 		poller->poll_interval = 500;
50*4882a593Smuzhiyun 	if (!poller->poll_interval_max)
51*4882a593Smuzhiyun 		poller->poll_interval_max = poller->poll_interval;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun 
input_dev_poller_start(struct input_dev_poller * poller)54*4882a593Smuzhiyun void input_dev_poller_start(struct input_dev_poller *poller)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun 	/* Only start polling if polling is enabled */
57*4882a593Smuzhiyun 	if (poller->poll_interval > 0) {
58*4882a593Smuzhiyun 		poller->poll(poller->input);
59*4882a593Smuzhiyun 		input_dev_poller_queue_work(poller);
60*4882a593Smuzhiyun 	}
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
input_dev_poller_stop(struct input_dev_poller * poller)63*4882a593Smuzhiyun void input_dev_poller_stop(struct input_dev_poller *poller)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun 	cancel_delayed_work_sync(&poller->work);
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
input_setup_polling(struct input_dev * dev,void (* poll_fn)(struct input_dev * dev))68*4882a593Smuzhiyun int input_setup_polling(struct input_dev *dev,
69*4882a593Smuzhiyun 			void (*poll_fn)(struct input_dev *dev))
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun 	struct input_dev_poller *poller;
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	poller = kzalloc(sizeof(*poller), GFP_KERNEL);
74*4882a593Smuzhiyun 	if (!poller) {
75*4882a593Smuzhiyun 		/*
76*4882a593Smuzhiyun 		 * We want to show message even though kzalloc() may have
77*4882a593Smuzhiyun 		 * printed backtrace as knowing what instance of input
78*4882a593Smuzhiyun 		 * device we were dealing with is helpful.
79*4882a593Smuzhiyun 		 */
80*4882a593Smuzhiyun 		dev_err(dev->dev.parent ?: &dev->dev,
81*4882a593Smuzhiyun 			"%s: unable to allocate poller structure\n", __func__);
82*4882a593Smuzhiyun 		return -ENOMEM;
83*4882a593Smuzhiyun 	}
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&poller->work, input_dev_poller_work);
86*4882a593Smuzhiyun 	poller->input = dev;
87*4882a593Smuzhiyun 	poller->poll = poll_fn;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	dev->poller = poller;
90*4882a593Smuzhiyun 	return 0;
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun EXPORT_SYMBOL(input_setup_polling);
93*4882a593Smuzhiyun 
input_dev_ensure_poller(struct input_dev * dev)94*4882a593Smuzhiyun static bool input_dev_ensure_poller(struct input_dev *dev)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	if (!dev->poller) {
97*4882a593Smuzhiyun 		dev_err(dev->dev.parent ?: &dev->dev,
98*4882a593Smuzhiyun 			"poller structure has not been set up\n");
99*4882a593Smuzhiyun 		return false;
100*4882a593Smuzhiyun 	}
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	return true;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
input_set_poll_interval(struct input_dev * dev,unsigned int interval)105*4882a593Smuzhiyun void input_set_poll_interval(struct input_dev *dev, unsigned int interval)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	if (input_dev_ensure_poller(dev))
108*4882a593Smuzhiyun 		dev->poller->poll_interval = interval;
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun EXPORT_SYMBOL(input_set_poll_interval);
111*4882a593Smuzhiyun 
input_set_min_poll_interval(struct input_dev * dev,unsigned int interval)112*4882a593Smuzhiyun void input_set_min_poll_interval(struct input_dev *dev, unsigned int interval)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun 	if (input_dev_ensure_poller(dev))
115*4882a593Smuzhiyun 		dev->poller->poll_interval_min = interval;
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun EXPORT_SYMBOL(input_set_min_poll_interval);
118*4882a593Smuzhiyun 
input_set_max_poll_interval(struct input_dev * dev,unsigned int interval)119*4882a593Smuzhiyun void input_set_max_poll_interval(struct input_dev *dev, unsigned int interval)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun 	if (input_dev_ensure_poller(dev))
122*4882a593Smuzhiyun 		dev->poller->poll_interval_max = interval;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun EXPORT_SYMBOL(input_set_max_poll_interval);
125*4882a593Smuzhiyun 
input_get_poll_interval(struct input_dev * dev)126*4882a593Smuzhiyun int input_get_poll_interval(struct input_dev *dev)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	if (!dev->poller)
129*4882a593Smuzhiyun 		return -EINVAL;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	return dev->poller->poll_interval;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun EXPORT_SYMBOL(input_get_poll_interval);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun /* SYSFS interface */
136*4882a593Smuzhiyun 
input_dev_get_poll_interval(struct device * dev,struct device_attribute * attr,char * buf)137*4882a593Smuzhiyun static ssize_t input_dev_get_poll_interval(struct device *dev,
138*4882a593Smuzhiyun 					   struct device_attribute *attr,
139*4882a593Smuzhiyun 					   char *buf)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	struct input_dev *input = to_input_dev(dev);
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	return sprintf(buf, "%d\n", input->poller->poll_interval);
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun 
input_dev_set_poll_interval(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)146*4882a593Smuzhiyun static ssize_t input_dev_set_poll_interval(struct device *dev,
147*4882a593Smuzhiyun 					   struct device_attribute *attr,
148*4882a593Smuzhiyun 					   const char *buf, size_t count)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun 	struct input_dev *input = to_input_dev(dev);
151*4882a593Smuzhiyun 	struct input_dev_poller *poller = input->poller;
152*4882a593Smuzhiyun 	unsigned int interval;
153*4882a593Smuzhiyun 	int err;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	err = kstrtouint(buf, 0, &interval);
156*4882a593Smuzhiyun 	if (err)
157*4882a593Smuzhiyun 		return err;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	if (interval < poller->poll_interval_min)
160*4882a593Smuzhiyun 		return -EINVAL;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	if (interval > poller->poll_interval_max)
163*4882a593Smuzhiyun 		return -EINVAL;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	mutex_lock(&input->mutex);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	poller->poll_interval = interval;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	if (input->users) {
170*4882a593Smuzhiyun 		cancel_delayed_work_sync(&poller->work);
171*4882a593Smuzhiyun 		if (poller->poll_interval > 0)
172*4882a593Smuzhiyun 			input_dev_poller_queue_work(poller);
173*4882a593Smuzhiyun 	}
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	mutex_unlock(&input->mutex);
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	return count;
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun static DEVICE_ATTR(poll, 0644,
181*4882a593Smuzhiyun 		   input_dev_get_poll_interval, input_dev_set_poll_interval);
182*4882a593Smuzhiyun 
input_dev_get_poll_max(struct device * dev,struct device_attribute * attr,char * buf)183*4882a593Smuzhiyun static ssize_t input_dev_get_poll_max(struct device *dev,
184*4882a593Smuzhiyun 				      struct device_attribute *attr, char *buf)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun 	struct input_dev *input = to_input_dev(dev);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	return sprintf(buf, "%d\n", input->poller->poll_interval_max);
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun static DEVICE_ATTR(max, 0444, input_dev_get_poll_max, NULL);
192*4882a593Smuzhiyun 
input_dev_get_poll_min(struct device * dev,struct device_attribute * attr,char * buf)193*4882a593Smuzhiyun static ssize_t input_dev_get_poll_min(struct device *dev,
194*4882a593Smuzhiyun 				     struct device_attribute *attr, char *buf)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun 	struct input_dev *input = to_input_dev(dev);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 	return sprintf(buf, "%d\n", input->poller->poll_interval_min);
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun static DEVICE_ATTR(min, 0444, input_dev_get_poll_min, NULL);
202*4882a593Smuzhiyun 
input_poller_attrs_visible(struct kobject * kobj,struct attribute * attr,int n)203*4882a593Smuzhiyun static umode_t input_poller_attrs_visible(struct kobject *kobj,
204*4882a593Smuzhiyun 					  struct attribute *attr, int n)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun 	struct device *dev = kobj_to_dev(kobj);
207*4882a593Smuzhiyun 	struct input_dev *input = to_input_dev(dev);
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	return input->poller ? attr->mode : 0;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun static struct attribute *input_poller_attrs[] = {
213*4882a593Smuzhiyun 	&dev_attr_poll.attr,
214*4882a593Smuzhiyun 	&dev_attr_max.attr,
215*4882a593Smuzhiyun 	&dev_attr_min.attr,
216*4882a593Smuzhiyun 	NULL
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun struct attribute_group input_poller_attribute_group = {
220*4882a593Smuzhiyun 	.is_visible	= input_poller_attrs_visible,
221*4882a593Smuzhiyun 	.attrs		= input_poller_attrs,
222*4882a593Smuzhiyun };
223