summaryrefslogtreecommitdiffstats
path: root/drivers/char/specialix.c
diff options
context:
space:
mode:
authorAlan Cox <alan@redhat.com>2008-07-22 11:19:05 +0100
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-22 13:03:28 -0700
commitfaa7612c09ae4519ad4659c8417aaaba81183833 (patch)
tree132db1199de3e7102557349f9855acc165d20902 /drivers/char/specialix.c
parent4a56122297ac7a4a3bf09fb66c0a365a13abe707 (diff)
specialix: restore driver using new break functionality
Use the hardware break support on the specialix driver Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/specialix.c')
-rw-r--r--drivers/char/specialix.c38
1 files changed, 11 insertions, 27 deletions
diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c
index f3184a8a75d..242fd46fda2 100644
--- a/drivers/char/specialix.c
+++ b/drivers/char/specialix.c
@@ -1818,13 +1818,15 @@ static int sx_tiocmset(struct tty_struct *tty, struct file *file,
}
-static void sx_send_break(struct specialix_port *port,
- unsigned long length)
+static int sx_send_break(struct tty_struct *tty, int length)
{
+ struct specialix_port *port = (struct specialix_port *)tty->driver_data;
struct specialix_board *bp = port_Board(port);
unsigned long flags;
func_enter();
+ if (length == 0 || length == -1)
+ return -EOPNOTSUPP;
spin_lock_irqsave(&port->lock, flags);
port->break_length = SPECIALIX_TPS / HZ * length;
@@ -1843,6 +1845,7 @@ static void sx_send_break(struct specialix_port *port,
sx_wait_CCR(bp);
func_exit();
+ return 0;
}
@@ -1929,7 +1932,6 @@ static int sx_ioctl(struct tty_struct *tty, struct file *filp,
unsigned int cmd, unsigned long arg)
{
struct specialix_port *port = (struct specialix_port *)tty->driver_data;
- int retval;
void __user *argp = (void __user *)arg;
func_enter();
@@ -1940,34 +1942,14 @@ static int sx_ioctl(struct tty_struct *tty, struct file *filp,
}
switch (cmd) {
- case TCSBRK: /* SVID version: non-zero arg --> no break */
- retval = tty_check_change(tty);
- if (retval) {
- func_exit();
- return retval;
- }
- tty_wait_until_sent(tty, 0);
- if (!arg)
- sx_send_break(port, HZ/4); /* 1/4 second */
- return 0;
- case TCSBRKP: /* support for POSIX tcsendbreak() */
- retval = tty_check_change(tty);
- if (retval) {
- func_exit();
- return retval;
- }
- tty_wait_until_sent(tty, 0);
- sx_send_break(port, arg ? arg*(HZ/10) : HZ/4);
- func_exit();
- return 0;
case TIOCGSERIAL:
- func_exit();
+ func_exit();
return sx_get_serial_info(port, argp);
case TIOCSSERIAL:
- func_exit();
+ func_exit();
return sx_set_serial_info(port, argp);
default:
- func_exit();
+ func_exit();
return -ENOIOCTLCMD;
}
func_exit();
@@ -2190,6 +2172,7 @@ static const struct tty_operations sx_ops = {
.hangup = sx_hangup,
.tiocmget = sx_tiocmget,
.tiocmset = sx_tiocmset,
+ .break_ctl = sx_send_break,
};
static int sx_init_drivers(void)
@@ -2216,7 +2199,8 @@ static int sx_init_drivers(void)
B9600 | CS8 | CREAD | HUPCL | CLOCAL;
specialix_driver->init_termios.c_ispeed = 9600;
specialix_driver->init_termios.c_ospeed = 9600;
- specialix_driver->flags = TTY_DRIVER_REAL_RAW;
+ specialix_driver->flags = TTY_DRIVER_REAL_RAW |
+ TTY_DRIVER_HARDWARE_BREAK;
tty_set_operations(specialix_driver, &sx_ops);
error = tty_register_driver(specialix_driver);