606d099cdd
This is the grungy swap all the occurrences in the right places patch that goes with the updates. At this point we have the same functionality as before (except that sgttyb() returns speeds not zero) and are ready to begin turning new stuff on providing nobody reports lots of bugs If you are a tty driver author converting an out of tree driver the only impact should be termios->ktermios name changes for the speed/property setting functions from your upper layers. If you are implementing your own TCGETS function before then your driver was broken already and its about to get a whole lot more painful for you so please fix it 8) Also fill in c_ispeed/ospeed on init for most devices, although the current code will do this for you anyway but I'd like eventually to lose that extra paranoia [akpm@osdl.org: bluetooth fix] [mp3@de.ibm.com: sclp fix] [mp3@de.ibm.com: warning fix for tty3270] [hugh@veritas.com: fix tty_ioctl powerpc build] [jdike@addtoit.com: uml: fix ->set_termios declaration] Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Martin Peschke <mp3@de.ibm.com> Acked-by: Peter Oberparleiter <oberpar@de.ibm.com> Cc: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Jeff Dike <jdike@addtoit.com> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
109 lines
3.1 KiB
C
109 lines
3.1 KiB
C
/*
|
|
* Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
|
|
* Licensed under the GPL
|
|
*/
|
|
|
|
#ifndef __LINE_H__
|
|
#define __LINE_H__
|
|
|
|
#include "linux/list.h"
|
|
#include "linux/workqueue.h"
|
|
#include "linux/tty.h"
|
|
#include "linux/interrupt.h"
|
|
#include "linux/spinlock.h"
|
|
#include "chan_user.h"
|
|
#include "mconsole_kern.h"
|
|
|
|
struct line_driver {
|
|
char *name;
|
|
char *device_name;
|
|
short major;
|
|
short minor_start;
|
|
short type;
|
|
short subtype;
|
|
int read_irq;
|
|
char *read_irq_name;
|
|
int write_irq;
|
|
char *write_irq_name;
|
|
char *symlink_from;
|
|
char *symlink_to;
|
|
struct mc_device mc;
|
|
};
|
|
|
|
struct line {
|
|
struct tty_struct *tty;
|
|
char *init_str;
|
|
int init_pri;
|
|
struct list_head chan_list;
|
|
int valid;
|
|
int count;
|
|
int throttled;
|
|
/*This lock is actually, mostly, local to*/
|
|
spinlock_t lock;
|
|
|
|
/* Yes, this is a real circular buffer.
|
|
* XXX: And this should become a struct kfifo!
|
|
*
|
|
* buffer points to a buffer allocated on demand, of length
|
|
* LINE_BUFSIZE, head to the start of the ring, tail to the end.*/
|
|
char *buffer;
|
|
char *head;
|
|
char *tail;
|
|
|
|
int sigio;
|
|
struct delayed_work task;
|
|
const struct line_driver *driver;
|
|
int have_irq;
|
|
};
|
|
|
|
#define LINE_INIT(str, d) \
|
|
{ .init_str = str, \
|
|
.init_pri = INIT_STATIC, \
|
|
.valid = 1, \
|
|
.lock = SPIN_LOCK_UNLOCKED, \
|
|
.driver = d }
|
|
|
|
struct lines {
|
|
int num;
|
|
};
|
|
|
|
#define LINES_INIT(n) { .num = n }
|
|
|
|
extern void line_close(struct tty_struct *tty, struct file * filp);
|
|
extern int line_open(struct line *lines, struct tty_struct *tty);
|
|
extern int line_setup(struct line *lines, unsigned int sizeof_lines,
|
|
char *init);
|
|
extern int line_write(struct tty_struct *tty, const unsigned char *buf,
|
|
int len);
|
|
extern void line_put_char(struct tty_struct *tty, unsigned char ch);
|
|
extern void line_set_termios(struct tty_struct *tty, struct ktermios * old);
|
|
extern int line_chars_in_buffer(struct tty_struct *tty);
|
|
extern void line_flush_buffer(struct tty_struct *tty);
|
|
extern void line_flush_chars(struct tty_struct *tty);
|
|
extern int line_write_room(struct tty_struct *tty);
|
|
extern int line_ioctl(struct tty_struct *tty, struct file * file,
|
|
unsigned int cmd, unsigned long arg);
|
|
extern void line_throttle(struct tty_struct *tty);
|
|
extern void line_unthrottle(struct tty_struct *tty);
|
|
|
|
extern char *add_xterm_umid(char *base);
|
|
extern int line_setup_irq(int fd, int input, int output, struct line *line,
|
|
void *data);
|
|
extern void line_close_chan(struct line *line);
|
|
extern struct tty_driver * line_register_devfs(struct lines *set,
|
|
struct line_driver *line_driver,
|
|
const struct tty_operations *driver,
|
|
struct line *lines, int nlines);
|
|
extern void lines_init(struct line *lines, int nlines, struct chan_opts *opts);
|
|
extern void close_lines(struct line *lines, int nlines);
|
|
|
|
extern int line_config(struct line *lines, unsigned int sizeof_lines,
|
|
char *str, const struct chan_opts *opts);
|
|
extern int line_id(char **str, int *start_out, int *end_out);
|
|
extern int line_remove(struct line *lines, unsigned int sizeof_lines, int n);
|
|
extern int line_get_config(char *dev, struct line *lines,
|
|
unsigned int sizeof_lines, char *str,
|
|
int size, char **error_out);
|
|
|
|
#endif
|