xref: /openbmc/linux/drivers/input/input-compat.h (revision b8b4ead11e9d258ccc9a8aea28cc0ac747b044ef)
12d56f3a3SPhilip Langdale #ifndef _INPUT_COMPAT_H
22d56f3a3SPhilip Langdale #define _INPUT_COMPAT_H
32d56f3a3SPhilip Langdale 
42d56f3a3SPhilip Langdale /*
52d56f3a3SPhilip Langdale  * 32bit compatibility wrappers for the input subsystem.
62d56f3a3SPhilip Langdale  *
72d56f3a3SPhilip Langdale  * Very heavily based on evdev.c - Copyright (c) 1999-2002 Vojtech Pavlik
82d56f3a3SPhilip Langdale  *
92d56f3a3SPhilip Langdale  * This program is free software; you can redistribute it and/or modify it
102d56f3a3SPhilip Langdale  * under the terms of the GNU General Public License version 2 as published by
112d56f3a3SPhilip Langdale  * the Free Software Foundation.
122d56f3a3SPhilip Langdale  */
132d56f3a3SPhilip Langdale 
142d56f3a3SPhilip Langdale #include <linux/compiler.h>
152d56f3a3SPhilip Langdale #include <linux/compat.h>
162d56f3a3SPhilip Langdale #include <linux/input.h>
172d56f3a3SPhilip Langdale 
182d56f3a3SPhilip Langdale #ifdef CONFIG_COMPAT
192d56f3a3SPhilip Langdale 
202d56f3a3SPhilip Langdale struct input_event_compat {
212d56f3a3SPhilip Langdale 	struct compat_timeval time;
222d56f3a3SPhilip Langdale 	__u16 type;
232d56f3a3SPhilip Langdale 	__u16 code;
242d56f3a3SPhilip Langdale 	__s32 value;
252d56f3a3SPhilip Langdale };
262d56f3a3SPhilip Langdale 
272d56f3a3SPhilip Langdale struct ff_periodic_effect_compat {
282d56f3a3SPhilip Langdale 	__u16 waveform;
292d56f3a3SPhilip Langdale 	__u16 period;
302d56f3a3SPhilip Langdale 	__s16 magnitude;
312d56f3a3SPhilip Langdale 	__s16 offset;
322d56f3a3SPhilip Langdale 	__u16 phase;
332d56f3a3SPhilip Langdale 
342d56f3a3SPhilip Langdale 	struct ff_envelope envelope;
352d56f3a3SPhilip Langdale 
362d56f3a3SPhilip Langdale 	__u32 custom_len;
372d56f3a3SPhilip Langdale 	compat_uptr_t custom_data;
382d56f3a3SPhilip Langdale };
392d56f3a3SPhilip Langdale 
402d56f3a3SPhilip Langdale struct ff_effect_compat {
412d56f3a3SPhilip Langdale 	__u16 type;
422d56f3a3SPhilip Langdale 	__s16 id;
432d56f3a3SPhilip Langdale 	__u16 direction;
442d56f3a3SPhilip Langdale 	struct ff_trigger trigger;
452d56f3a3SPhilip Langdale 	struct ff_replay replay;
462d56f3a3SPhilip Langdale 
472d56f3a3SPhilip Langdale 	union {
482d56f3a3SPhilip Langdale 		struct ff_constant_effect constant;
492d56f3a3SPhilip Langdale 		struct ff_ramp_effect ramp;
502d56f3a3SPhilip Langdale 		struct ff_periodic_effect_compat periodic;
512d56f3a3SPhilip Langdale 		struct ff_condition_effect condition[2]; /* One for each axis */
522d56f3a3SPhilip Langdale 		struct ff_rumble_effect rumble;
532d56f3a3SPhilip Langdale 	} u;
542d56f3a3SPhilip Langdale };
552d56f3a3SPhilip Langdale 
562d56f3a3SPhilip Langdale static inline size_t input_event_size(void)
572d56f3a3SPhilip Langdale {
58*b8b4ead1SAndrew Morton 	return (in_compat_syscall() && !COMPAT_USE_64BIT_TIME) ?
592d56f3a3SPhilip Langdale 		sizeof(struct input_event_compat) : sizeof(struct input_event);
602d56f3a3SPhilip Langdale }
612d56f3a3SPhilip Langdale 
622d56f3a3SPhilip Langdale #else
632d56f3a3SPhilip Langdale 
642d56f3a3SPhilip Langdale static inline size_t input_event_size(void)
652d56f3a3SPhilip Langdale {
662d56f3a3SPhilip Langdale 	return sizeof(struct input_event);
672d56f3a3SPhilip Langdale }
682d56f3a3SPhilip Langdale 
692d56f3a3SPhilip Langdale #endif /* CONFIG_COMPAT */
702d56f3a3SPhilip Langdale 
712d56f3a3SPhilip Langdale int input_event_from_user(const char __user *buffer,
722d56f3a3SPhilip Langdale 			 struct input_event *event);
732d56f3a3SPhilip Langdale 
742d56f3a3SPhilip Langdale int input_event_to_user(char __user *buffer,
752d56f3a3SPhilip Langdale 			const struct input_event *event);
762d56f3a3SPhilip Langdale 
772d56f3a3SPhilip Langdale int input_ff_effect_from_user(const char __user *buffer, size_t size,
782d56f3a3SPhilip Langdale 			      struct ff_effect *effect);
792d56f3a3SPhilip Langdale 
802d56f3a3SPhilip Langdale #endif /* _INPUT_COMPAT_H */
81