18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _PARISC_TERMIOS_H
38c2ecf20Sopenharmony_ci#define _PARISC_TERMIOS_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <uapi/asm/termios.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci/*	intr=^C		quit=^\		erase=del	kill=^U
98c2ecf20Sopenharmony_ci	eof=^D		vtime=\0	vmin=\1		sxtc=\0
108c2ecf20Sopenharmony_ci	start=^Q	stop=^S		susp=^Z		eol=\0
118c2ecf20Sopenharmony_ci	reprint=^R	discard=^U	werase=^W	lnext=^V
128c2ecf20Sopenharmony_ci	eol2=\0
138c2ecf20Sopenharmony_ci*/
148c2ecf20Sopenharmony_ci#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci/*
178c2ecf20Sopenharmony_ci * Translate a "termio" structure into a "termios". Ugh.
188c2ecf20Sopenharmony_ci */
198c2ecf20Sopenharmony_ci#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \
208c2ecf20Sopenharmony_ci	unsigned short __tmp; \
218c2ecf20Sopenharmony_ci	get_user(__tmp,&(termio)->x); \
228c2ecf20Sopenharmony_ci	*(unsigned short *) &(termios)->x = __tmp; \
238c2ecf20Sopenharmony_ci}
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#define user_termio_to_kernel_termios(termios, termio) \
268c2ecf20Sopenharmony_ci({ \
278c2ecf20Sopenharmony_ci	SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \
288c2ecf20Sopenharmony_ci	SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \
298c2ecf20Sopenharmony_ci	SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \
308c2ecf20Sopenharmony_ci	SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \
318c2ecf20Sopenharmony_ci	copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
328c2ecf20Sopenharmony_ci})
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci/*
358c2ecf20Sopenharmony_ci * Translate a "termios" structure into a "termio". Ugh.
368c2ecf20Sopenharmony_ci */
378c2ecf20Sopenharmony_ci#define kernel_termios_to_user_termio(termio, termios) \
388c2ecf20Sopenharmony_ci({ \
398c2ecf20Sopenharmony_ci	put_user((termios)->c_iflag, &(termio)->c_iflag); \
408c2ecf20Sopenharmony_ci	put_user((termios)->c_oflag, &(termio)->c_oflag); \
418c2ecf20Sopenharmony_ci	put_user((termios)->c_cflag, &(termio)->c_cflag); \
428c2ecf20Sopenharmony_ci	put_user((termios)->c_lflag, &(termio)->c_lflag); \
438c2ecf20Sopenharmony_ci	put_user((termios)->c_line,  &(termio)->c_line); \
448c2ecf20Sopenharmony_ci	copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
458c2ecf20Sopenharmony_ci})
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
488c2ecf20Sopenharmony_ci#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
498c2ecf20Sopenharmony_ci#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
508c2ecf20Sopenharmony_ci#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci#endif	/* _PARISC_TERMIOS_H */
53