xref: /openbmc/linux/drivers/input/input-compat.h (revision 2d56f3a32c0e62f99c043d2579840f9731fe5855)
1*2d56f3a3SPhilip Langdale #ifndef _INPUT_COMPAT_H
2*2d56f3a3SPhilip Langdale #define _INPUT_COMPAT_H
3*2d56f3a3SPhilip Langdale 
4*2d56f3a3SPhilip Langdale /*
5*2d56f3a3SPhilip Langdale  * 32bit compatibility wrappers for the input subsystem.
6*2d56f3a3SPhilip Langdale  *
7*2d56f3a3SPhilip Langdale  * Very heavily based on evdev.c - Copyright (c) 1999-2002 Vojtech Pavlik
8*2d56f3a3SPhilip Langdale  *
9*2d56f3a3SPhilip Langdale  * This program is free software; you can redistribute it and/or modify it
10*2d56f3a3SPhilip Langdale  * under the terms of the GNU General Public License version 2 as published by
11*2d56f3a3SPhilip Langdale  * the Free Software Foundation.
12*2d56f3a3SPhilip Langdale  */
13*2d56f3a3SPhilip Langdale 
14*2d56f3a3SPhilip Langdale #include <linux/compiler.h>
15*2d56f3a3SPhilip Langdale #include <linux/compat.h>
16*2d56f3a3SPhilip Langdale #include <linux/input.h>
17*2d56f3a3SPhilip Langdale 
18*2d56f3a3SPhilip Langdale #ifdef CONFIG_COMPAT
19*2d56f3a3SPhilip Langdale 
20*2d56f3a3SPhilip Langdale /* Note to the author of this code: did it ever occur to
21*2d56f3a3SPhilip Langdale    you why the ifdefs are needed? Think about it again. -AK */
22*2d56f3a3SPhilip Langdale #ifdef CONFIG_X86_64
23*2d56f3a3SPhilip Langdale #  define INPUT_COMPAT_TEST is_compat_task()
24*2d56f3a3SPhilip Langdale #elif defined(CONFIG_IA64)
25*2d56f3a3SPhilip Langdale #  define INPUT_COMPAT_TEST IS_IA32_PROCESS(task_pt_regs(current))
26*2d56f3a3SPhilip Langdale #elif defined(CONFIG_S390)
27*2d56f3a3SPhilip Langdale #  define INPUT_COMPAT_TEST test_thread_flag(TIF_31BIT)
28*2d56f3a3SPhilip Langdale #elif defined(CONFIG_MIPS)
29*2d56f3a3SPhilip Langdale #  define INPUT_COMPAT_TEST test_thread_flag(TIF_32BIT_ADDR)
30*2d56f3a3SPhilip Langdale #else
31*2d56f3a3SPhilip Langdale #  define INPUT_COMPAT_TEST test_thread_flag(TIF_32BIT)
32*2d56f3a3SPhilip Langdale #endif
33*2d56f3a3SPhilip Langdale 
34*2d56f3a3SPhilip Langdale struct input_event_compat {
35*2d56f3a3SPhilip Langdale 	struct compat_timeval time;
36*2d56f3a3SPhilip Langdale 	__u16 type;
37*2d56f3a3SPhilip Langdale 	__u16 code;
38*2d56f3a3SPhilip Langdale 	__s32 value;
39*2d56f3a3SPhilip Langdale };
40*2d56f3a3SPhilip Langdale 
41*2d56f3a3SPhilip Langdale struct ff_periodic_effect_compat {
42*2d56f3a3SPhilip Langdale 	__u16 waveform;
43*2d56f3a3SPhilip Langdale 	__u16 period;
44*2d56f3a3SPhilip Langdale 	__s16 magnitude;
45*2d56f3a3SPhilip Langdale 	__s16 offset;
46*2d56f3a3SPhilip Langdale 	__u16 phase;
47*2d56f3a3SPhilip Langdale 
48*2d56f3a3SPhilip Langdale 	struct ff_envelope envelope;
49*2d56f3a3SPhilip Langdale 
50*2d56f3a3SPhilip Langdale 	__u32 custom_len;
51*2d56f3a3SPhilip Langdale 	compat_uptr_t custom_data;
52*2d56f3a3SPhilip Langdale };
53*2d56f3a3SPhilip Langdale 
54*2d56f3a3SPhilip Langdale struct ff_effect_compat {
55*2d56f3a3SPhilip Langdale 	__u16 type;
56*2d56f3a3SPhilip Langdale 	__s16 id;
57*2d56f3a3SPhilip Langdale 	__u16 direction;
58*2d56f3a3SPhilip Langdale 	struct ff_trigger trigger;
59*2d56f3a3SPhilip Langdale 	struct ff_replay replay;
60*2d56f3a3SPhilip Langdale 
61*2d56f3a3SPhilip Langdale 	union {
62*2d56f3a3SPhilip Langdale 		struct ff_constant_effect constant;
63*2d56f3a3SPhilip Langdale 		struct ff_ramp_effect ramp;
64*2d56f3a3SPhilip Langdale 		struct ff_periodic_effect_compat periodic;
65*2d56f3a3SPhilip Langdale 		struct ff_condition_effect condition[2]; /* One for each axis */
66*2d56f3a3SPhilip Langdale 		struct ff_rumble_effect rumble;
67*2d56f3a3SPhilip Langdale 	} u;
68*2d56f3a3SPhilip Langdale };
69*2d56f3a3SPhilip Langdale 
70*2d56f3a3SPhilip Langdale static inline size_t input_event_size(void)
71*2d56f3a3SPhilip Langdale {
72*2d56f3a3SPhilip Langdale 	return INPUT_COMPAT_TEST ?
73*2d56f3a3SPhilip Langdale 		sizeof(struct input_event_compat) : sizeof(struct input_event);
74*2d56f3a3SPhilip Langdale }
75*2d56f3a3SPhilip Langdale 
76*2d56f3a3SPhilip Langdale #else
77*2d56f3a3SPhilip Langdale 
78*2d56f3a3SPhilip Langdale static inline size_t input_event_size(void)
79*2d56f3a3SPhilip Langdale {
80*2d56f3a3SPhilip Langdale 	return sizeof(struct input_event);
81*2d56f3a3SPhilip Langdale }
82*2d56f3a3SPhilip Langdale 
83*2d56f3a3SPhilip Langdale #endif /* CONFIG_COMPAT */
84*2d56f3a3SPhilip Langdale 
85*2d56f3a3SPhilip Langdale int input_event_from_user(const char __user *buffer,
86*2d56f3a3SPhilip Langdale 			 struct input_event *event);
87*2d56f3a3SPhilip Langdale 
88*2d56f3a3SPhilip Langdale int input_event_to_user(char __user *buffer,
89*2d56f3a3SPhilip Langdale 			const struct input_event *event);
90*2d56f3a3SPhilip Langdale 
91*2d56f3a3SPhilip Langdale int input_ff_effect_from_user(const char __user *buffer, size_t size,
92*2d56f3a3SPhilip Langdale 			      struct ff_effect *effect);
93*2d56f3a3SPhilip Langdale 
94*2d56f3a3SPhilip Langdale #endif /* _INPUT_COMPAT_H */
95