]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/usb/serial/kl5kusb105.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[karo-tx-linux.git] / drivers / usb / serial / kl5kusb105.c
index 160e19263e2581c75336b9ff34bfeb2d88adbb0b..f328948d74e3dfc9cf21439333ef48140eff1af9 100644 (file)
@@ -54,6 +54,7 @@
 #include <linux/tty_flip.h>
 #include <linux/module.h>
 #include <asm/uaccess.h>
+#include <asm/unaligned.h>
 #include <linux/usb.h>
 #include <linux/usb/serial.h>
 #include "kl5kusb105.h"
@@ -235,7 +236,7 @@ static int klsi_105_get_line_state(struct usb_serial_port *port,
        if (rc < 0)
                err("Reading line status failed (error = %d)", rc);
        else {
-               status = le16_to_cpu(*(u16 *)status_buf);
+               status = le16_to_cpu(get_unaligned((__le16 *)status_buf));
 
                info("%s - read status %x %x", __func__,
                     status_buf[0], status_buf[1]);
@@ -567,7 +568,7 @@ exit:
 
 static void klsi_105_write_bulk_callback ( struct urb *urb)
 {
-       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *port = urb->context;
        int status = urb->status;
 
        dbg("%s - port %d", __func__, port->number);
@@ -628,7 +629,7 @@ static int klsi_105_write_room (struct usb_serial_port *port)
 
 static void klsi_105_read_bulk_callback (struct urb *urb)
 {
-       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
+       struct usb_serial_port *port = urb->context;
        struct klsi_105_private *priv = usb_get_serial_port_data(port);
        struct tty_struct *tty;
        unsigned char *data = urb->transfer_buffer;
@@ -702,12 +703,14 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
                                  struct ktermios *old_termios)
 {
        struct klsi_105_private *priv = usb_get_serial_port_data(port);
-       unsigned int iflag = port->tty->termios->c_iflag;
+       struct tty_struct *tty = port->tty;
+       unsigned int iflag = tty->termios->c_iflag;
        unsigned int old_iflag = old_termios->c_iflag;
-       unsigned int cflag = port->tty->termios->c_cflag;
+       unsigned int cflag = tty->termios->c_cflag;
        unsigned int old_cflag = old_termios->c_cflag;
        struct klsi_105_port_settings cfg;
        unsigned long flags;
+       speed_t baud;
        
        /* lock while we are modifying the settings */
        spin_lock_irqsave (&priv->lock, flags);
@@ -715,6 +718,8 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
        /*
         * Update baud rate
         */
+       baud = tty_get_baud_rate(tty);
+
        if( (cflag & CBAUD) != (old_cflag & CBAUD) ) {
                /* reassert DTR and (maybe) RTS on transition from B0 */
                if( (old_cflag & CBAUD) == B0 ) {
@@ -728,8 +733,8 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
                        mct_u232_set_modem_ctrl(serial, priv->control_state);
 #endif
                }
-               
-               switch(tty_get_baud_rate(port->tty)) {
+       }
+       switch(baud) {
                case 0: /* handled below */
                        break;
                case 1200:
@@ -757,25 +762,26 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
                        priv->cfg.baudrate = kl5kusb105a_sio_b115200;
                        break;
                default:
-                       err("KLSI USB->Serial converter:"
+                       dbg("KLSI USB->Serial converter:"
                            " unsupported baudrate request, using default"
                            " of 9600");
                        priv->cfg.baudrate = kl5kusb105a_sio_b9600;
+                       baud = 9600;
                        break;
-               }
-               if ((cflag & CBAUD) == B0 ) {
-                       dbg("%s: baud is B0", __func__);
-                       /* Drop RTS and DTR */
-                       /* maybe this should be simulated by sending read
-                        * disable and read enable messages?
-                        */
-                       ;
+       }
+       if ((cflag & CBAUD) == B0 ) {
+               dbg("%s: baud is B0", __func__);
+               /* Drop RTS and DTR */
+               /* maybe this should be simulated by sending read
+                * disable and read enable messages?
+                */
+               ;
 #if 0
-                       priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
-                       mct_u232_set_modem_ctrl(serial, priv->control_state);
+               priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
+                       mct_u232_set_modem_ctrl(serial, priv->control_state);
 #endif
-               }
        }
+       tty_encode_baud_rate(tty, baud, baud);
 
        if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
                /* set the number of data bits */
@@ -807,6 +813,8 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
        if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))
            || (cflag & CSTOPB) != (old_cflag & CSTOPB) ) {
                
+               /* Not currently supported */
+               tty->termios->c_cflag &= ~(PARENB|PARODD|CSTOPB);
 #if 0
                priv->last_lcr = 0;
 
@@ -834,6 +842,8 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
            || (iflag & IXON) != (old_iflag & IXON)
            ||  (cflag & CRTSCTS) != (old_cflag & CRTSCTS) ) {
                
+               /* Not currently supported */
+               tty->termios->c_cflag &= ~CRTSCTS;
                /* Drop DTR/RTS if no flow control otherwise assert */
 #if 0
                if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS) )