Commit d5fc42a8 authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by David S. Miller

[IRDA]: Migrate TIOCMGET and TIOCMSET ioctls in IrCOMM to the new TTY API.

Patch from Russell King.
parent f1980d3a
...@@ -122,6 +122,9 @@ void ircomm_tty_stop(struct tty_struct *tty); ...@@ -122,6 +122,9 @@ void ircomm_tty_stop(struct tty_struct *tty);
void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self); void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self);
extern void ircomm_tty_change_speed(struct ircomm_tty_cb *self); extern void ircomm_tty_change_speed(struct ircomm_tty_cb *self);
extern int ircomm_tty_tiocmget(struct tty_struct *tty, struct file *file);
extern int ircomm_tty_tiocmset(struct tty_struct *tty, struct file *file,
unsigned int set, unsigned int clear);
extern int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file, extern int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
extern void ircomm_tty_set_termios(struct tty_struct *tty, extern void ircomm_tty_set_termios(struct tty_struct *tty,
......
...@@ -86,7 +86,9 @@ static struct tty_operations ops = { ...@@ -86,7 +86,9 @@ static struct tty_operations ops = {
.write_room = ircomm_tty_write_room, .write_room = ircomm_tty_write_room,
.chars_in_buffer = ircomm_tty_chars_in_buffer, .chars_in_buffer = ircomm_tty_chars_in_buffer,
.flush_buffer = ircomm_tty_flush_buffer, .flush_buffer = ircomm_tty_flush_buffer,
.ioctl = ircomm_tty_ioctl, .ioctl = ircomm_tty_ioctl, /* ircomm_tty_ioctl.c */
.tiocmget = ircomm_tty_tiocmget, /* ircomm_tty_ioctl.c */
.tiocmset = ircomm_tty_tiocmset, /* ircomm_tty_ioctl.c */
.throttle = ircomm_tty_throttle, .throttle = ircomm_tty_throttle,
.unthrottle = ircomm_tty_unthrottle, .unthrottle = ircomm_tty_unthrottle,
.send_xchar = ircomm_tty_send_xchar, .send_xchar = ircomm_tty_send_xchar,
......
...@@ -190,81 +190,62 @@ void ircomm_tty_set_termios(struct tty_struct *tty, ...@@ -190,81 +190,62 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
} }
/* /*
* Function ircomm_tty_get_modem_info (self, value) * Function ircomm_tty_tiocmget (tty, file)
* *
* *
* *
*/ */
static int ircomm_tty_get_modem_info(struct ircomm_tty_cb *self, int ircomm_tty_tiocmget(struct tty_struct *tty, struct file *file)
unsigned int *value)
{ {
struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
unsigned int result; unsigned int result;
IRDA_DEBUG(2, "%s()\n", __FUNCTION__ ); IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
if (tty->flags & (1 << TTY_IO_ERROR))
return -EIO;
result = ((self->settings.dte & IRCOMM_RTS) ? TIOCM_RTS : 0) result = ((self->settings.dte & IRCOMM_RTS) ? TIOCM_RTS : 0)
| ((self->settings.dte & IRCOMM_DTR) ? TIOCM_DTR : 0) | ((self->settings.dte & IRCOMM_DTR) ? TIOCM_DTR : 0)
| ((self->settings.dce & IRCOMM_CD) ? TIOCM_CAR : 0) | ((self->settings.dce & IRCOMM_CD) ? TIOCM_CAR : 0)
| ((self->settings.dce & IRCOMM_RI) ? TIOCM_RNG : 0) | ((self->settings.dce & IRCOMM_RI) ? TIOCM_RNG : 0)
| ((self->settings.dce & IRCOMM_DSR) ? TIOCM_DSR : 0) | ((self->settings.dce & IRCOMM_DSR) ? TIOCM_DSR : 0)
| ((self->settings.dce & IRCOMM_CTS) ? TIOCM_CTS : 0); | ((self->settings.dce & IRCOMM_CTS) ? TIOCM_CTS : 0);
return result;
return put_user(result, value);
} }
/* /*
* Function set_modem_info (driver, cmd, value) * Function ircomm_tty_tiocmset (tty, file, set, clear)
* *
* *
* *
*/ */
static int ircomm_tty_set_modem_info(struct ircomm_tty_cb *self, int ircomm_tty_tiocmset(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned int *value) unsigned int set, unsigned int clear)
{ {
unsigned int arg; struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
__u8 old_rts, old_dtr;
IRDA_DEBUG(2, "%s()\n", __FUNCTION__ ); IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
if (tty->flags & (1 << TTY_IO_ERROR))
return -EIO;
ASSERT(self != NULL, return -1;); ASSERT(self != NULL, return -1;);
ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
if (get_user(arg, value)) if (set & TIOCM_RTS)
return -EFAULT;
old_rts = self->settings.dte & IRCOMM_RTS;
old_dtr = self->settings.dte & IRCOMM_DTR;
switch (cmd) {
case TIOCMBIS:
if (arg & TIOCM_RTS)
self->settings.dte |= IRCOMM_RTS; self->settings.dte |= IRCOMM_RTS;
if (arg & TIOCM_DTR) if (set & TIOCM_DTR)
self->settings.dte |= IRCOMM_DTR; self->settings.dte |= IRCOMM_DTR;
break;
case TIOCMBIC: if (clear & TIOCM_RTS)
if (arg & TIOCM_RTS)
self->settings.dte &= ~IRCOMM_RTS; self->settings.dte &= ~IRCOMM_RTS;
if (arg & TIOCM_DTR) if (clear & TIOCM_DTR)
self->settings.dte &= ~IRCOMM_DTR; self->settings.dte &= ~IRCOMM_DTR;
break;
case TIOCMSET: if ((set|clear) & TIOCM_RTS)
self->settings.dte =
((self->settings.dte & ~(IRCOMM_RTS | IRCOMM_DTR))
| ((arg & TIOCM_RTS) ? IRCOMM_RTS : 0)
| ((arg & TIOCM_DTR) ? IRCOMM_DTR : 0));
break;
default:
return -EINVAL;
}
if ((self->settings.dte & IRCOMM_RTS) != old_rts)
self->settings.dte |= IRCOMM_DELTA_RTS; self->settings.dte |= IRCOMM_DELTA_RTS;
if ((set|clear) & TIOCM_DTR)
if ((self->settings.dte & IRCOMM_DTR) != old_dtr)
self->settings.dte |= IRCOMM_DELTA_DTR; self->settings.dte |= IRCOMM_DELTA_DTR;
ircomm_param_request(self, IRCOMM_DTE, TRUE); ircomm_param_request(self, IRCOMM_DTE, TRUE);
...@@ -406,14 +387,6 @@ int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file, ...@@ -406,14 +387,6 @@ int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file,
} }
switch (cmd) { switch (cmd) {
case TIOCMGET:
ret = ircomm_tty_get_modem_info(self, (unsigned int *) arg);
break;
case TIOCMBIS:
case TIOCMBIC:
case TIOCMSET:
ret = ircomm_tty_set_modem_info(self, cmd, (unsigned int *) arg);
break;
case TIOCGSERIAL: case TIOCGSERIAL:
ret = ircomm_tty_get_serial_info(self, (struct serial_struct *) arg); ret = ircomm_tty_get_serial_info(self, (struct serial_struct *) arg);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment