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