xref: /openbmc/linux/drivers/input/input-compat.h (revision 152194fe9c3f03232b9c0d0264793a7fa4af82f8)
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 {
21*152194feSDeepa Dinamani 	compat_ulong_t sec;
22*152194feSDeepa Dinamani 	compat_ulong_t usec;
232d56f3a3SPhilip Langdale 	__u16 type;
242d56f3a3SPhilip Langdale 	__u16 code;
252d56f3a3SPhilip Langdale 	__s32 value;
262d56f3a3SPhilip Langdale };
272d56f3a3SPhilip Langdale 
282d56f3a3SPhilip Langdale struct ff_periodic_effect_compat {
292d56f3a3SPhilip Langdale 	__u16 waveform;
302d56f3a3SPhilip Langdale 	__u16 period;
312d56f3a3SPhilip Langdale 	__s16 magnitude;
322d56f3a3SPhilip Langdale 	__s16 offset;
332d56f3a3SPhilip Langdale 	__u16 phase;
342d56f3a3SPhilip Langdale 
352d56f3a3SPhilip Langdale 	struct ff_envelope envelope;
362d56f3a3SPhilip Langdale 
372d56f3a3SPhilip Langdale 	__u32 custom_len;
382d56f3a3SPhilip Langdale 	compat_uptr_t custom_data;
392d56f3a3SPhilip Langdale };
402d56f3a3SPhilip Langdale 
412d56f3a3SPhilip Langdale struct ff_effect_compat {
422d56f3a3SPhilip Langdale 	__u16 type;
432d56f3a3SPhilip Langdale 	__s16 id;
442d56f3a3SPhilip Langdale 	__u16 direction;
452d56f3a3SPhilip Langdale 	struct ff_trigger trigger;
462d56f3a3SPhilip Langdale 	struct ff_replay replay;
472d56f3a3SPhilip Langdale 
482d56f3a3SPhilip Langdale 	union {
492d56f3a3SPhilip Langdale 		struct ff_constant_effect constant;
502d56f3a3SPhilip Langdale 		struct ff_ramp_effect ramp;
512d56f3a3SPhilip Langdale 		struct ff_periodic_effect_compat periodic;
522d56f3a3SPhilip Langdale 		struct ff_condition_effect condition[2]; /* One for each axis */
532d56f3a3SPhilip Langdale 		struct ff_rumble_effect rumble;
542d56f3a3SPhilip Langdale 	} u;
552d56f3a3SPhilip Langdale };
562d56f3a3SPhilip Langdale 
572d56f3a3SPhilip Langdale static inline size_t input_event_size(void)
582d56f3a3SPhilip Langdale {
59b8b4ead1SAndrew Morton 	return (in_compat_syscall() && !COMPAT_USE_64BIT_TIME) ?
602d56f3a3SPhilip Langdale 		sizeof(struct input_event_compat) : sizeof(struct input_event);
612d56f3a3SPhilip Langdale }
622d56f3a3SPhilip Langdale 
632d56f3a3SPhilip Langdale #else
642d56f3a3SPhilip Langdale 
652d56f3a3SPhilip Langdale static inline size_t input_event_size(void)
662d56f3a3SPhilip Langdale {
672d56f3a3SPhilip Langdale 	return sizeof(struct input_event);
682d56f3a3SPhilip Langdale }
692d56f3a3SPhilip Langdale 
702d56f3a3SPhilip Langdale #endif /* CONFIG_COMPAT */
712d56f3a3SPhilip Langdale 
722d56f3a3SPhilip Langdale int input_event_from_user(const char __user *buffer,
732d56f3a3SPhilip Langdale 			 struct input_event *event);
742d56f3a3SPhilip Langdale 
752d56f3a3SPhilip Langdale int input_event_to_user(char __user *buffer,
762d56f3a3SPhilip Langdale 			const struct input_event *event);
772d56f3a3SPhilip Langdale 
782d56f3a3SPhilip Langdale int input_ff_effect_from_user(const char __user *buffer, size_t size,
792d56f3a3SPhilip Langdale 			      struct ff_effect *effect);
802d56f3a3SPhilip Langdale 
812d56f3a3SPhilip Langdale #endif /* _INPUT_COMPAT_H */
82