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