Commit a4da16d3 authored by Eric Piel's avatar Eric Piel Committed by Dmitry Torokhov

Input: wriston - reduce polling frequency

Reduces the polling frequency from 10 Hz to 2 Hz, which should be less a burden
for laptops wrt energy saving. As it is multimedia keys, 500ms (maximum) of
latency should be still fine for the user. In order to keep fluent the feeling
when the user is pressing several keys in a raw (such as changing the volume),
the frequency is increased for a short duration after a key is pressed.
Signed-off-by: default avatarEric Piel <eric.piel@tremplin-utc.net>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 5035522d
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/jiffies.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mc146818rtc.h> #include <linux/mc146818rtc.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -37,9 +38,10 @@ ...@@ -37,9 +38,10 @@
*/ */
#define MAX_POLL_ITERATIONS 64 #define MAX_POLL_ITERATIONS 64
#define POLL_FREQUENCY 10 /* Number of polls per second */ #define POLL_FREQUENCY 2 /* Number of polls per second when idle */
#define POLL_FREQUENCY_BURST 10 /* Polls per second when a key was recently pressed */
#if POLL_FREQUENCY > HZ #if POLL_FREQUENCY_BURST > HZ
#error "POLL_FREQUENCY too high" #error "POLL_FREQUENCY too high"
#endif #endif
...@@ -1079,6 +1081,8 @@ static void handle_key(u8 code) ...@@ -1079,6 +1081,8 @@ static void handle_key(u8 code)
static void poll_bios(unsigned long discard) static void poll_bios(unsigned long discard)
{ {
static unsigned long jiffies_last_press;
unsigned long jiffies_now = jiffies;
u8 qlen; u8 qlen;
u16 val; u16 val;
...@@ -1087,11 +1091,17 @@ static void poll_bios(unsigned long discard) ...@@ -1087,11 +1091,17 @@ static void poll_bios(unsigned long discard)
if (qlen == 0) if (qlen == 0)
break; break;
val = bios_pop_queue(); val = bios_pop_queue();
if (val != 0 && !discard) if (val != 0 && !discard) {
handle_key((u8)val); handle_key((u8)val);
jiffies_last_press = jiffies_now;
}
} }
mod_timer(&poll_timer, jiffies + HZ / POLL_FREQUENCY); /* Increase precision if user is currently pressing keys (< 2s ago) */
if (time_after(jiffies_last_press, jiffies_now - (HZ * 2)))
mod_timer(&poll_timer, jiffies_now + HZ / POLL_FREQUENCY_BURST);
else
mod_timer(&poll_timer, jiffies_now + HZ / POLL_FREQUENCY);
} }
static int __devinit wistron_probe(struct platform_device *dev) static int __devinit wistron_probe(struct platform_device *dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment