162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci#ifndef _INPUT_COMPAT_H
362306a36Sopenharmony_ci#define _INPUT_COMPAT_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci * 32bit compatibility wrappers for the input subsystem.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Very heavily based on evdev.c - Copyright (c) 1999-2002 Vojtech Pavlik
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/compiler.h>
1262306a36Sopenharmony_ci#include <linux/compat.h>
1362306a36Sopenharmony_ci#include <linux/input.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifdef CONFIG_COMPAT
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct input_event_compat {
1862306a36Sopenharmony_ci	compat_ulong_t sec;
1962306a36Sopenharmony_ci	compat_ulong_t usec;
2062306a36Sopenharmony_ci	__u16 type;
2162306a36Sopenharmony_ci	__u16 code;
2262306a36Sopenharmony_ci	__s32 value;
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct ff_periodic_effect_compat {
2662306a36Sopenharmony_ci	__u16 waveform;
2762306a36Sopenharmony_ci	__u16 period;
2862306a36Sopenharmony_ci	__s16 magnitude;
2962306a36Sopenharmony_ci	__s16 offset;
3062306a36Sopenharmony_ci	__u16 phase;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	struct ff_envelope envelope;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	__u32 custom_len;
3562306a36Sopenharmony_ci	compat_uptr_t custom_data;
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct ff_effect_compat {
3962306a36Sopenharmony_ci	__u16 type;
4062306a36Sopenharmony_ci	__s16 id;
4162306a36Sopenharmony_ci	__u16 direction;
4262306a36Sopenharmony_ci	struct ff_trigger trigger;
4362306a36Sopenharmony_ci	struct ff_replay replay;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	union {
4662306a36Sopenharmony_ci		struct ff_constant_effect constant;
4762306a36Sopenharmony_ci		struct ff_ramp_effect ramp;
4862306a36Sopenharmony_ci		struct ff_periodic_effect_compat periodic;
4962306a36Sopenharmony_ci		struct ff_condition_effect condition[2]; /* One for each axis */
5062306a36Sopenharmony_ci		struct ff_rumble_effect rumble;
5162306a36Sopenharmony_ci	} u;
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline size_t input_event_size(void)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	return (in_compat_syscall() && !COMPAT_USE_64BIT_TIME) ?
5762306a36Sopenharmony_ci		sizeof(struct input_event_compat) : sizeof(struct input_event);
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#else
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline size_t input_event_size(void)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	return sizeof(struct input_event);
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#endif /* CONFIG_COMPAT */
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciint input_event_from_user(const char __user *buffer,
7062306a36Sopenharmony_ci			 struct input_event *event);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciint input_event_to_user(char __user *buffer,
7362306a36Sopenharmony_ci			const struct input_event *event);
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciint input_ff_effect_from_user(const char __user *buffer, size_t size,
7662306a36Sopenharmony_ci			      struct ff_effect *effect);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci#endif /* _INPUT_COMPAT_H */
79