mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 17:23:55 +08:00
Input: analog - always use ktime functions
m68k, mips, s390, and sparc allmodconfig images fail to build with the following error. drivers/input/joystick/analog.c:160:2: error: #warning Precise timer not defined for this architecture. Remove architecture specific time handling code and always use ktime functions to determine time deltas. Also remove the now useless use_ktime kernel parameter. Signed-off-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Acked-by: Randy Dunlap <rdunlap@infradead.org> # build-tested Link: https://lore.kernel.org/r/20210907123734.21520-1-linux@roeck-us.net Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
ab10867819
commit
0c5483a577
@ -28,10 +28,6 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static bool use_ktime = true;
|
||||
module_param(use_ktime, bool, 0400);
|
||||
MODULE_PARM_DESC(use_ktime, "Use ktime for measuring I/O speed");
|
||||
|
||||
/*
|
||||
* Option parsing.
|
||||
*/
|
||||
@ -110,7 +106,6 @@ struct analog_port {
|
||||
char cooked;
|
||||
int bads;
|
||||
int reads;
|
||||
int speed;
|
||||
int loop;
|
||||
int fuzz;
|
||||
int axes[4];
|
||||
@ -119,66 +114,6 @@ struct analog_port {
|
||||
int axtime;
|
||||
};
|
||||
|
||||
/*
|
||||
* Time macros.
|
||||
*/
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
#include <linux/i8253.h>
|
||||
|
||||
#define GET_TIME(x) do { if (boot_cpu_has(X86_FEATURE_TSC)) x = (unsigned int)rdtsc(); else x = get_time_pit(); } while (0)
|
||||
#define DELTA(x,y) (boot_cpu_has(X86_FEATURE_TSC) ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? PIT_TICK_RATE / HZ : 0)))
|
||||
#define TIME_NAME (boot_cpu_has(X86_FEATURE_TSC)?"TSC":"PIT")
|
||||
static unsigned int get_time_pit(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int count;
|
||||
|
||||
raw_spin_lock_irqsave(&i8253_lock, flags);
|
||||
outb_p(0x00, 0x43);
|
||||
count = inb_p(0x40);
|
||||
count |= inb_p(0x40) << 8;
|
||||
raw_spin_unlock_irqrestore(&i8253_lock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
#elif defined(__x86_64__)
|
||||
#define GET_TIME(x) do { x = (unsigned int)rdtsc(); } while (0)
|
||||
#define DELTA(x,y) ((y)-(x))
|
||||
#define TIME_NAME "TSC"
|
||||
#elif defined(__alpha__) || defined(CONFIG_ARM) || defined(CONFIG_ARM64) || defined(CONFIG_PPC) || defined(CONFIG_RISCV)
|
||||
#define GET_TIME(x) do { x = get_cycles(); } while (0)
|
||||
#define DELTA(x,y) ((y)-(x))
|
||||
#define TIME_NAME "get_cycles"
|
||||
#else
|
||||
#define FAKE_TIME
|
||||
static unsigned long analog_faketime = 0;
|
||||
#define GET_TIME(x) do { x = analog_faketime++; } while(0)
|
||||
#define DELTA(x,y) ((y)-(x))
|
||||
#define TIME_NAME "Unreliable"
|
||||
#warning Precise timer not defined for this architecture.
|
||||
#endif
|
||||
|
||||
static inline u64 get_time(void)
|
||||
{
|
||||
if (use_ktime) {
|
||||
return ktime_get_ns();
|
||||
} else {
|
||||
unsigned int x;
|
||||
GET_TIME(x);
|
||||
return x;
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned int delta(u64 x, u64 y)
|
||||
{
|
||||
if (use_ktime)
|
||||
return y - x;
|
||||
else
|
||||
return DELTA((unsigned int)x, (unsigned int)y);
|
||||
}
|
||||
|
||||
/*
|
||||
* analog_decode() decodes analog joystick data and reports input events.
|
||||
*/
|
||||
@ -234,18 +169,18 @@ static void analog_decode(struct analog *analog, int *axes, int *initial, int bu
|
||||
static int analog_cooked_read(struct analog_port *port)
|
||||
{
|
||||
struct gameport *gameport = port->gameport;
|
||||
u64 time[4], start, loop, now;
|
||||
ktime_t time[4], start, loop, now;
|
||||
unsigned int loopout, timeout;
|
||||
unsigned char data[4], this, last;
|
||||
unsigned long flags;
|
||||
int i, j;
|
||||
|
||||
loopout = (ANALOG_LOOP_TIME * port->loop) / 1000;
|
||||
timeout = ANALOG_MAX_TIME * port->speed;
|
||||
timeout = ANALOG_MAX_TIME * NSEC_PER_MSEC;
|
||||
|
||||
local_irq_save(flags);
|
||||
gameport_trigger(gameport);
|
||||
now = get_time();
|
||||
now = ktime_get();
|
||||
local_irq_restore(flags);
|
||||
|
||||
start = now;
|
||||
@ -258,16 +193,16 @@ static int analog_cooked_read(struct analog_port *port)
|
||||
|
||||
local_irq_disable();
|
||||
this = gameport_read(gameport) & port->mask;
|
||||
now = get_time();
|
||||
now = ktime_get();
|
||||
local_irq_restore(flags);
|
||||
|
||||
if ((last ^ this) && (delta(loop, now) < loopout)) {
|
||||
if ((last ^ this) && (ktime_sub(now, loop) < loopout)) {
|
||||
data[i] = last ^ this;
|
||||
time[i] = now;
|
||||
i++;
|
||||
}
|
||||
|
||||
} while (this && (i < 4) && (delta(start, now) < timeout));
|
||||
} while (this && (i < 4) && (ktime_sub(now, start) < timeout));
|
||||
|
||||
this <<= 4;
|
||||
|
||||
@ -275,7 +210,7 @@ static int analog_cooked_read(struct analog_port *port)
|
||||
this |= data[i];
|
||||
for (j = 0; j < 4; j++)
|
||||
if (data[i] & (1 << j))
|
||||
port->axes[j] = (delta(start, time[i]) << ANALOG_FUZZ_BITS) / port->loop;
|
||||
port->axes[j] = ((u32)ktime_sub(time[i], start) << ANALOG_FUZZ_BITS) / port->loop;
|
||||
}
|
||||
|
||||
return -(this != port->mask);
|
||||
@ -375,38 +310,22 @@ static void analog_calibrate_timer(struct analog_port *port)
|
||||
{
|
||||
struct gameport *gameport = port->gameport;
|
||||
unsigned int i, t, tx;
|
||||
u64 t1, t2, t3;
|
||||
ktime_t t1, t2, t3;
|
||||
unsigned long flags;
|
||||
|
||||
if (use_ktime) {
|
||||
port->speed = 1000000;
|
||||
} else {
|
||||
local_irq_save(flags);
|
||||
t1 = get_time();
|
||||
#ifdef FAKE_TIME
|
||||
analog_faketime += 830;
|
||||
#endif
|
||||
mdelay(1);
|
||||
t2 = get_time();
|
||||
t3 = get_time();
|
||||
local_irq_restore(flags);
|
||||
|
||||
port->speed = delta(t1, t2) - delta(t2, t3);
|
||||
}
|
||||
|
||||
tx = ~0;
|
||||
|
||||
for (i = 0; i < 50; i++) {
|
||||
local_irq_save(flags);
|
||||
t1 = get_time();
|
||||
t1 = ktime_get();
|
||||
for (t = 0; t < 50; t++) {
|
||||
gameport_read(gameport);
|
||||
t2 = get_time();
|
||||
t2 = ktime_get();
|
||||
}
|
||||
t3 = get_time();
|
||||
t3 = ktime_get();
|
||||
local_irq_restore(flags);
|
||||
udelay(i);
|
||||
t = delta(t1, t2) - delta(t2, t3);
|
||||
t = ktime_sub(t2, t1) - ktime_sub(t3, t2);
|
||||
if (t < tx) tx = t;
|
||||
}
|
||||
|
||||
@ -611,7 +530,7 @@ static int analog_init_port(struct gameport *gameport, struct gameport_driver *d
|
||||
t = gameport_read(gameport);
|
||||
msleep(ANALOG_MAX_TIME);
|
||||
port->mask = (gameport_read(gameport) ^ t) & t & 0xf;
|
||||
port->fuzz = (port->speed * ANALOG_FUZZ_MAGIC) / port->loop / 1000 + ANALOG_FUZZ_BITS;
|
||||
port->fuzz = (NSEC_PER_MSEC * ANALOG_FUZZ_MAGIC) / port->loop / 1000 + ANALOG_FUZZ_BITS;
|
||||
|
||||
for (i = 0; i < ANALOG_INIT_RETRIES; i++) {
|
||||
if (!analog_cooked_read(port))
|
||||
|
Loading…
Reference in New Issue
Block a user