1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun #ifndef _INPUT_COMPAT_H 3*4882a593Smuzhiyun #define _INPUT_COMPAT_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * 32bit compatibility wrappers for the input subsystem. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Very heavily based on evdev.c - Copyright (c) 1999-2002 Vojtech Pavlik 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/compiler.h> 12*4882a593Smuzhiyun #include <linux/compat.h> 13*4882a593Smuzhiyun #include <linux/input.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifdef CONFIG_COMPAT 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct input_event_compat { 18*4882a593Smuzhiyun compat_ulong_t sec; 19*4882a593Smuzhiyun compat_ulong_t usec; 20*4882a593Smuzhiyun __u16 type; 21*4882a593Smuzhiyun __u16 code; 22*4882a593Smuzhiyun __s32 value; 23*4882a593Smuzhiyun }; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct ff_periodic_effect_compat { 26*4882a593Smuzhiyun __u16 waveform; 27*4882a593Smuzhiyun __u16 period; 28*4882a593Smuzhiyun __s16 magnitude; 29*4882a593Smuzhiyun __s16 offset; 30*4882a593Smuzhiyun __u16 phase; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct ff_envelope envelope; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun __u32 custom_len; 35*4882a593Smuzhiyun compat_uptr_t custom_data; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct ff_effect_compat { 39*4882a593Smuzhiyun __u16 type; 40*4882a593Smuzhiyun __s16 id; 41*4882a593Smuzhiyun __u16 direction; 42*4882a593Smuzhiyun struct ff_trigger trigger; 43*4882a593Smuzhiyun struct ff_replay replay; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun union { 46*4882a593Smuzhiyun struct ff_constant_effect constant; 47*4882a593Smuzhiyun struct ff_ramp_effect ramp; 48*4882a593Smuzhiyun struct ff_periodic_effect_compat periodic; 49*4882a593Smuzhiyun struct ff_condition_effect condition[2]; /* One for each axis */ 50*4882a593Smuzhiyun struct ff_rumble_effect rumble; 51*4882a593Smuzhiyun } u; 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun input_event_size(void)54*4882a593Smuzhiyunstatic inline size_t input_event_size(void) 55*4882a593Smuzhiyun { 56*4882a593Smuzhiyun return (in_compat_syscall() && !COMPAT_USE_64BIT_TIME) ? 57*4882a593Smuzhiyun sizeof(struct input_event_compat) : sizeof(struct input_event); 58*4882a593Smuzhiyun } 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #else 61*4882a593Smuzhiyun input_event_size(void)62*4882a593Smuzhiyunstatic inline size_t input_event_size(void) 63*4882a593Smuzhiyun { 64*4882a593Smuzhiyun return sizeof(struct input_event); 65*4882a593Smuzhiyun } 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #endif /* CONFIG_COMPAT */ 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun int input_event_from_user(const char __user *buffer, 70*4882a593Smuzhiyun struct input_event *event); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun int input_event_to_user(char __user *buffer, 73*4882a593Smuzhiyun const struct input_event *event); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun int input_ff_effect_from_user(const char __user *buffer, size_t size, 76*4882a593Smuzhiyun struct ff_effect *effect); 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #endif /* _INPUT_COMPAT_H */ 79