xref: /openbmc/linux/include/linux/tty_flip.h (revision b49a0ff7)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _LINUX_TTY_FLIP_H
31da177e4SLinus Torvalds #define _LINUX_TTY_FLIP_H
41da177e4SLinus Torvalds 
552c27f13SJiri Slaby #include <linux/tty_buffer.h>
652c27f13SJiri Slaby #include <linux/tty_port.h>
748344460SJiri Slaby 
856eef46aSJiri Slaby struct tty_ldisc;
956eef46aSJiri Slaby 
1078941934SJiri Slaby int tty_buffer_set_limit(struct tty_port *port, int limit);
1178941934SJiri Slaby unsigned int tty_buffer_space_avail(struct tty_port *port);
1278941934SJiri Slaby int tty_buffer_request_room(struct tty_port *port, size_t size);
136144922eSJiri Slaby (SUSE) size_t __tty_insert_flip_string_flags(struct tty_port *port, const u8 *chars,
14c26405fdSJiri Slaby (SUSE) 				      const u8 *flags, bool mutable_flags,
15c26405fdSJiri Slaby (SUSE) 				      size_t size);
162ce2983cSJiri Slaby (SUSE) size_t tty_prepare_flip_string(struct tty_port *port, u8 **chars, size_t size);
1778941934SJiri Slaby void tty_flip_buffer_push(struct tty_port *port);
1833f0f88fSAlan Cox 
19c26405fdSJiri Slaby (SUSE) /**
20c26405fdSJiri Slaby (SUSE)  * tty_insert_flip_string_fixed_flag - add characters to the tty buffer
21c26405fdSJiri Slaby (SUSE)  * @port: tty port
22c26405fdSJiri Slaby (SUSE)  * @chars: characters
23c26405fdSJiri Slaby (SUSE)  * @flag: flag value for each character
24c26405fdSJiri Slaby (SUSE)  * @size: size
25c26405fdSJiri Slaby (SUSE)  *
26c26405fdSJiri Slaby (SUSE)  * Queue a series of bytes to the tty buffering. All the characters passed are
27c26405fdSJiri Slaby (SUSE)  * marked with the supplied flag.
28c26405fdSJiri Slaby (SUSE)  *
29c26405fdSJiri Slaby (SUSE)  * Returns: the number added.
30c26405fdSJiri Slaby (SUSE)  */
tty_insert_flip_string_fixed_flag(struct tty_port * port,const u8 * chars,u8 flag,size_t size)316144922eSJiri Slaby (SUSE) static inline size_t tty_insert_flip_string_fixed_flag(struct tty_port *port,
32c26405fdSJiri Slaby (SUSE) 						       const u8 *chars, u8 flag,
33c26405fdSJiri Slaby (SUSE) 						       size_t size)
34c26405fdSJiri Slaby (SUSE) {
35c26405fdSJiri Slaby (SUSE) 	return __tty_insert_flip_string_flags(port, chars, &flag, false, size);
36c26405fdSJiri Slaby (SUSE) }
37c26405fdSJiri Slaby (SUSE) 
38c26405fdSJiri Slaby (SUSE) /**
39c26405fdSJiri Slaby (SUSE)  * tty_insert_flip_string_flags - add characters to the tty buffer
40c26405fdSJiri Slaby (SUSE)  * @port: tty port
41c26405fdSJiri Slaby (SUSE)  * @chars: characters
42c26405fdSJiri Slaby (SUSE)  * @flags: flag bytes
43c26405fdSJiri Slaby (SUSE)  * @size: size
44c26405fdSJiri Slaby (SUSE)  *
45c26405fdSJiri Slaby (SUSE)  * Queue a series of bytes to the tty buffering. For each character the flags
46c26405fdSJiri Slaby (SUSE)  * array indicates the status of the character.
47c26405fdSJiri Slaby (SUSE)  *
48c26405fdSJiri Slaby (SUSE)  * Returns: the number added.
49c26405fdSJiri Slaby (SUSE)  */
tty_insert_flip_string_flags(struct tty_port * port,const u8 * chars,const u8 * flags,size_t size)506144922eSJiri Slaby (SUSE) static inline size_t tty_insert_flip_string_flags(struct tty_port *port,
516144922eSJiri Slaby (SUSE) 						  const u8 *chars,
526144922eSJiri Slaby (SUSE) 						  const u8 *flags, size_t size)
53c26405fdSJiri Slaby (SUSE) {
54c26405fdSJiri Slaby (SUSE) 	return __tty_insert_flip_string_flags(port, chars, flags, true, size);
55c26405fdSJiri Slaby (SUSE) }
56c26405fdSJiri Slaby (SUSE) 
57*b49a0ff7SJiri Slaby (SUSE) /**
58*b49a0ff7SJiri Slaby (SUSE)  * tty_insert_flip_char - add one character to the tty buffer
59*b49a0ff7SJiri Slaby (SUSE)  * @port: tty port
60*b49a0ff7SJiri Slaby (SUSE)  * @ch: character
61*b49a0ff7SJiri Slaby (SUSE)  * @flag: flag byte
62*b49a0ff7SJiri Slaby (SUSE)  *
63*b49a0ff7SJiri Slaby (SUSE)  * Queue a single byte @ch to the tty buffering, with an optional flag.
64*b49a0ff7SJiri Slaby (SUSE)  */
tty_insert_flip_char(struct tty_port * port,u8 ch,u8 flag)656144922eSJiri Slaby (SUSE) static inline size_t tty_insert_flip_char(struct tty_port *port, u8 ch, u8 flag)
661da177e4SLinus Torvalds {
6792a19f9cSJiri Slaby 	struct tty_buffer *tb = port->buf.tail;
68acc0f67fSPeter Hurley 	int change;
69acc0f67fSPeter Hurley 
702e2b4b89SIlpo Järvinen 	change = !tb->flags && (flag != TTY_NORMAL);
71acc0f67fSPeter Hurley 	if (!change && tb->used < tb->size) {
722e2b4b89SIlpo Järvinen 		if (tb->flags)
731fc359fcSPeter Hurley 			*flag_buf_ptr(tb, tb->used) = flag;
741fc359fcSPeter Hurley 		*char_buf_ptr(tb, tb->used++) = ch;
7533f0f88fSAlan Cox 		return 1;
761da177e4SLinus Torvalds 	}
77*b49a0ff7SJiri Slaby (SUSE) 	return __tty_insert_flip_string_flags(port, &ch, &flag, false, 1);
781da177e4SLinus Torvalds }
791da177e4SLinus Torvalds 
tty_insert_flip_string(struct tty_port * port,const u8 * chars,size_t size)806144922eSJiri Slaby (SUSE) static inline size_t tty_insert_flip_string(struct tty_port *port,
81a8d9cd23SJiri Slaby (SUSE) 					    const u8 *chars, size_t size)
822832fc11SAlan Cox {
8305c7cd39SJiri Slaby 	return tty_insert_flip_string_fixed_flag(port, chars, TTY_NORMAL, size);
842832fc11SAlan Cox }
852832fc11SAlan Cox 
86892bc209SJiri Slaby (SUSE) size_t tty_ldisc_receive_buf(struct tty_ldisc *ld, const u8 *p, const u8 *f,
87a8d9cd23SJiri Slaby (SUSE) 			     size_t count);
8856eef46aSJiri Slaby 
8978941934SJiri Slaby void tty_buffer_lock_exclusive(struct tty_port *port);
9078941934SJiri Slaby void tty_buffer_unlock_exclusive(struct tty_port *port);
91a7c8d58cSPeter Hurley 
921da177e4SLinus Torvalds #endif /* _LINUX_TTY_FLIP_H */
93