]> git.hungrycats.org Git - linux/commitdiff
[PATCH] USB: digi_acceleport: add support for new tty tiocmget and tiocmset functions.
authorGreg Kroah-Hartman <greg@kroah.com>
Wed, 23 Apr 2003 10:37:29 +0000 (03:37 -0700)
committerGreg Kroah-Hartman <greg@kroah.com>
Wed, 23 Apr 2003 10:37:29 +0000 (03:37 -0700)
drivers/usb/serial/digi_acceleport.c

index 8d5db2732654da1bcc3306b8ee9d3c885f0fe223..48feb4898cf3f46f6255ea1b7f77522d128bc142 100644 (file)
@@ -460,6 +460,9 @@ static void digi_set_termios( struct usb_serial_port *port,
 static void digi_break_ctl( struct usb_serial_port *port, int break_state );
 static int digi_ioctl( struct usb_serial_port *port, struct file *file,
        unsigned int cmd, unsigned long arg );
+static int digi_tiocmget( struct usb_serial_port *port, struct file *file );
+static int digi_tiocmset( struct usb_serial_port *port, struct file *file,
+       unsigned int set, unsigned int clear );
 static int digi_write( struct usb_serial_port *port, int from_user,
        const unsigned char *buf, int count );
 static void digi_write_bulk_callback( struct urb *urb, struct pt_regs *regs );
@@ -526,6 +529,8 @@ static struct usb_serial_device_type digi_acceleport_2_device = {
        .ioctl =                        digi_ioctl,
        .set_termios =                  digi_set_termios,
        .break_ctl =                    digi_break_ctl,
+       .tiocmget =                     digi_tiocmget,
+       .tiocmset =                     digi_tiocmset,
        .attach =                       digi_startup,
        .shutdown =                     digi_shutdown,
 };
@@ -551,6 +556,8 @@ static struct usb_serial_device_type digi_acceleport_4_device = {
        .ioctl =                        digi_ioctl,
        .set_termios =                  digi_set_termios,
        .break_ctl =                    digi_break_ctl,
+       .tiocmget =                     digi_tiocmget,
+       .tiocmset =                     digi_tiocmset,
        .attach =                       digi_startup,
        .shutdown =                     digi_shutdown,
 };
@@ -1211,39 +1218,46 @@ static void digi_break_ctl( struct usb_serial_port *port, int break_state )
 }
 
 
-static int digi_ioctl( struct usb_serial_port *port, struct file *file,
-       unsigned int cmd, unsigned long arg )
+static int digi_tiocmget( struct usb_serial_port *port, struct file *file )
 {
+       struct digi_port *priv = usb_get_serial_port_data(port);
+       unsigned int val;
+       unsigned long flags;
+
+       dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num);
+
+       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       val = priv->dp_modem_signals;
+       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
+       return val;
+}
 
+
+static int digi_tiocmset( struct usb_serial_port *port, struct file *file,
+       unsigned int set, unsigned int clear )
+{
        struct digi_port *priv = usb_get_serial_port_data(port);
        unsigned int val;
-       unsigned long flags = 0;
+       unsigned long flags;
 
+       dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num);
 
-dbg( "digi_ioctl: TOP: port=%d, cmd=0x%x", priv->dp_port_num, cmd );
+       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       val = (priv->dp_modem_signals & ~clear) | set;
+       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
+       return digi_set_modem_signals( port, val, 1 );
+}
 
-       switch (cmd) {
 
-       case TIOCMGET:
-               spin_lock_irqsave( &priv->dp_port_lock, flags );
-               val = priv->dp_modem_signals;
-               spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-               if( copy_to_user((unsigned int *)arg, &val, sizeof(int)) )
-                       return( -EFAULT );
-               return( 0 );
+static int digi_ioctl( struct usb_serial_port *port, struct file *file,
+       unsigned int cmd, unsigned long arg )
+{
 
-       case TIOCMSET:
-       case TIOCMBIS:
-       case TIOCMBIC:
-               if( copy_from_user(&val, (unsigned int *)arg, sizeof(int)) )
-                       return( -EFAULT );
-               spin_lock_irqsave( &priv->dp_port_lock, flags );
-               if( cmd == TIOCMBIS )
-                       val = priv->dp_modem_signals | val;
-               else if( cmd == TIOCMBIC )
-                       val = priv->dp_modem_signals & ~val;
-               spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-               return( digi_set_modem_signals( port, val, 1 ) );
+       struct digi_port *priv = usb_get_serial_port_data(port);
+
+dbg( "digi_ioctl: TOP: port=%d, cmd=0x%x", priv->dp_port_num, cmd );
+
+       switch (cmd) {
 
        case TIOCMIWAIT:
                /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/