hdaps - switch to using input-polldev
PATCH 1/1 hdaps - switch to using input-polldev
Not tested - no hardware...
Signature · 161 lines
Dmitry HWMON: hdaps - convert to use input-polldev. Switch to using input-polldev skeleton instead of implementing polling loop by itself. This also fixes problem with trylock on a mutex in atomic context. Signed-off-by: Dmitry Torokhov <[email protected]> --- drivers/hwmon/Kconfig | 1 drivers/hwmon/hdaps.c | 55 +++++++++++++++++++++----------------------------- 2 files changed, 25 insertions(+), 31 deletions(-) Index: work/drivers/hwmon/Kconfig =================================--- work.orig/drivers/hwmon/Kconfig +++ work/drivers/hwmon/Kconfig @@ -602,6 +602,7 @@ config SENSORS_W83627EHF config SENSORS_HDAPS tristate "IBM Hard Drive Active Protection System (hdaps)" depends on INPUT && X86 + select INPUT_POLLDEV default n help This driver provides support for the IBM Hard Drive Active Protection Index: work/drivers/hwmon/hdaps.c =================================--- work.orig/drivers/hwmon/hdaps.c +++ work/drivers/hwmon/hdaps.c @@ -28,7 +28,7 @@ #include <linux/delay.h> #include <linux/platform_device.h> -#include <linux/input.h> +#include <linux/input-polldev.h> #include <linux/kernel.h> #include <linux/mutex.h> #include <linux/module.h> @@ -61,13 +61,12 @@ #define INIT_TIMEOUT_MSECS 4000 /* wait up to 4s for device init ... */ #define INIT_WAIT_MSECS 200 /* ... in 200ms increments */ -#define HDAPS_POLL_PERIOD (HZ/20) /* poll for input every 1/20s */ +#define HDAPS_POLL_INTERVAL 50 /* poll for input every 1/20s (50 ms)*/ #define HDAPS_INPUT_FUZZ 4 /* input event threshold */ #define HDAPS_INPUT_FLAT 4 -static struct timer_list hdaps_timer; static struct platform_device *pdev; -static struct input_dev *hdaps_idev; +static struct input_polled_dev *hdaps_idev; static unsigned int hdaps_invert; static u8 km_activity; static int rest_x; @@ -323,24 +322,19 @@ static void hdaps_calibrate(void) __hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &rest_x, &rest_y); } -static void hdaps_mousedev_poll(unsigned long unused) +static void hdaps_mousedev_poll(struct input_polled_dev *dev) { + struct input_dev *input_dev = dev->input; int x, y; - /* Cannot sleep. Try nonblockingly. If we fail, try again later. */ - if (mutex_trylock(&hdaps_mtx)) { - mod_timer(&hdaps_timer,jiffies + HDAPS_POLL_PERIOD); - return; - } + mutex_lock(&hdaps_mtx); if (__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y)) goto out; - input_report_abs(hdaps_idev, ABS_X, x - rest_x); - input_report_abs(hdaps_idev, ABS_Y, y - rest_y); - input_sync(hdaps_idev); - - mod_timer(&hdaps_timer, jiffies + HDAPS_POLL_PERIOD); + input_report_abs(input_dev, ABS_X, x - rest_x); + input_report_abs(input_dev, ABS_Y, y - rest_y); + input_sync(input_dev); out: mutex_unlock(&hdaps_mtx); @@ -536,6 +530,7 @@ static struct dmi_system_id __initdata h static int __init hdaps_init(void) { + struct input_dev *idev; int ret; if (!dmi_check_system(hdaps_whitelist)) { @@ -563,39 +558,37 @@ static int __init hdaps_init(void) if (ret) goto out_device; - hdaps_idev = input_allocate_device(); + hdaps_idev = input_allocate_polled_device(); if (!hdaps_idev) { ret = -ENOMEM; goto out_group; } + hdaps_idev->poll = hdaps_mousedev_poll; + hdaps_idev->poll_interval = HDAPS_POLL_INTERVAL; + /* initial calibrate for the input device */ hdaps_calibrate(); /* initialize the input class */ - hdaps_idev->name = "hdaps"; - hdaps_idev->dev.parent = &pdev->dev; - hdaps_idev->evbit[0] = BIT(EV_ABS); - input_set_abs_params(hdaps_idev, ABS_X, + idev = hdaps_idev->input; + idev->name = "hdaps"; + idev->dev.parent = &pdev->dev; + idev->evbit[0] = BIT(EV_ABS); + input_set_abs_params(idev, ABS_X, -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT); - input_set_abs_params(hdaps_idev, ABS_Y, + input_set_abs_params(idev, ABS_Y, -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT); - ret = input_register_device(hdaps_idev); + ret = input_register_polled_device(hdaps_idev); if (ret) goto out_idev; - /* start up our timer for the input device */ - init_timer(&hdaps_timer); - hdaps_timer.function = hdaps_mousedev_poll; - hdaps_timer.expires = jiffies + HDAPS_POLL_PERIOD; - add_timer(&hdaps_timer); - printk(KERN_INFO "hdaps: driver successfully loaded.\n"); return 0; out_idev: - input_free_device(hdaps_idev); + input_free_polled_device(hdaps_idev); out_group: sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group); out_device: @@ -611,8 +604,8 @@ out: static void __exit hdaps_exit(void) { - del_timer_sync(&hdaps_timer); - input_unregister_device(hdaps_idev); + input_unregister_polled_device(hdaps_idev); + input_free_polled_device(hdaps_idev); sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group); platform_device_unregister(pdev); platform_driver_unregister(&hdaps_driver); _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Hi Dmitry,
Quoted 1 line · Dmitry Torokhov
Not tested - no hardware...
Neither do I. Please send these patches to the maintainers of the affected drivers, I don't think they are reading the lm-sensors list (which wasn't the best list for these patches anyway, as they affect the input functions, not the hardware monitoring functions):
hdaps -> Robert Love
ams -> Stelian Pop
applesmc -> Nicolas Boichat
Signature · 6 lines
Jean Delvare _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Hi Jean,
Quoted 9 lines · Jean Delvare
Hi Dmitry,
Quoted 1 line · Dmitry Torokhov
Not tested - no hardware...
Neither do I. Please send these patches to the maintainers of the affected drivers, I don't think they are reading the lm-sensors list (which wasn't the best list for these patches anyway, as they affect the input functions, not the hardware monitoring functions):
What list do you think would suit better? LKML? I doubt they read linux-input either...
Quoted 1 line
hdaps -> Robert Love
Will do.
Quoted 1 line
ams -> Stelian Pop
Check.
Quoted 1 line
applesmc -> Nicolas Boichat
Check. But for some reason Nicolas always bounces by email. ;(
Signature · 6 lines
Dmitry _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Quoted 8 lines · Dmitry Torokhov
Hi Jean,
Quoted 5 lines · Jean Delvare
Hi Dmitry,
Quoted 1 line · Dmitry Torokhov
Not tested - no hardware...
Quoted 7 lines
Quoted 4 lines
Neither do I. Please send these patches to the maintainers of the affected drivers, I don't think they are reading the lm-sensors list (which wasn't the best list for these patches anyway, as they affect the input functions, not the hardware monitoring functions):
What list do you think would suit better? LKML? I doubt they read linux-input either...
I'd say linux-input + Cc to the driver maintainer.
Quoted 7 lines
Quoted 1 line
hdaps -> Robert Love
Will do.
Quoted 1 line
ams -> Stelian Pop
Check.
Sorry, I missed that. I stupidly assumed that the other patches were looking the same as the first one.
Quoted 3 lines
Quoted 1 line
applesmc -> Nicolas Boichat
Check. But for some reason Nicolas always bounces by email. ;(
Strange, it works for me. I'll forward your post to him to make sure.
Signature · 6 lines
Jean Delvare _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Quoted 6 lines · Dmitry Torokhov
What list do you think would suit better? LKML? I doubt they read linux-input either...
Quoted 1 line
hdaps -> Robert Love
Will do.
Also, please send it to [email protected].
Signature · 9 lines
"One disk to rule them all, One disk to find them. One disk to bring them all and in the darkness grind them. In the Land of Redmond where the shadows lie." -- The Silicon Valley Tarot Henrique Holschuh _______________________________________________ lm-sensors mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/lm-sensors