USB: serial: ch341: add register and USB request definitions
[pandora-kernel.git] / drivers / usb / serial / ch341.c
index fef839b..2d9d337 100644 (file)
  * the Net/FreeBSD uchcom.c driver by Takanori Watanabe.  Domo arigato.
  */
 
+#define CH341_REQ_READ_VERSION 0x5F
 #define CH341_REQ_WRITE_REG    0x9A
 #define CH341_REQ_READ_REG     0x95
-#define CH341_REG_BREAK1       0x05
-#define CH341_REG_BREAK2       0x18
-#define CH341_NBREAK_BITS_REG1 0x01
-#define CH341_NBREAK_BITS_REG2 0x40
-
+#define CH341_REQ_SERIAL_INIT  0xA1
+#define CH341_REQ_MODEM_CTRL   0xA4
+
+#define CH341_REG_BREAK        0x05
+#define CH341_REG_LCR          0x18
+#define CH341_NBREAK_BITS      0x01
+
+#define CH341_LCR_ENABLE_RX    0x80
+#define CH341_LCR_ENABLE_TX    0x40
+#define CH341_LCR_MARK_SPACE   0x20
+#define CH341_LCR_PAR_EVEN     0x10
+#define CH341_LCR_ENABLE_PAR   0x08
+#define CH341_LCR_STOP_BITS_2  0x04
+#define CH341_LCR_CS8          0x03
+#define CH341_LCR_CS7          0x02
+#define CH341_LCR_CS6          0x01
+#define CH341_LCR_CS5          0x00
 
 static int debug;
 
@@ -147,9 +160,9 @@ static int ch341_set_baudrate(struct usb_device *dev,
        a = (factor & 0xff00) | divisor;
        b = factor & 0xff;
 
-       r = ch341_control_out(dev, 0x9a, 0x1312, a);
+       r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x1312, a);
        if (!r)
-               r = ch341_control_out(dev, 0x9a, 0x0f2c, b);
+               r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x0f2c, b);
 
        return r;
 }
@@ -157,7 +170,7 @@ static int ch341_set_baudrate(struct usb_device *dev,
 static int ch341_set_handshake(struct usb_device *dev, u8 control)
 {
        dbg("ch341_set_handshake(0x%02x)", control);
-       return ch341_control_out(dev, 0xa4, ~control, 0);
+       return ch341_control_out(dev, CH341_REQ_MODEM_CTRL, ~control, 0);
 }
 
 static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv)
@@ -173,7 +186,7 @@ static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv)
        if (!buffer)
                return -ENOMEM;
 
-       r = ch341_control_in(dev, 0x95, 0x0706, 0, buffer, size);
+       r = ch341_control_in(dev, CH341_REQ_READ_REG, 0x0706, 0, buffer, size);
        if (r < 0)
                goto out;
 
@@ -206,11 +219,11 @@ static int ch341_configure(struct usb_device *dev, struct ch341_private *priv)
                return -ENOMEM;
 
        /* expect two bytes 0x27 0x00 */
-       r = ch341_control_in(dev, 0x5f, 0, 0, buffer, size);
+       r = ch341_control_in(dev, CH341_REQ_READ_VERSION, 0, 0, buffer, size);
        if (r < 0)
                goto out;
 
-       r = ch341_control_out(dev, 0xa1, 0, 0);
+       r = ch341_control_out(dev, CH341_REQ_SERIAL_INIT, 0, 0);
        if (r < 0)
                goto out;
 
@@ -219,11 +232,11 @@ static int ch341_configure(struct usb_device *dev, struct ch341_private *priv)
                goto out;
 
        /* expect two bytes 0x56 0x00 */
-       r = ch341_control_in(dev, 0x95, 0x2518, 0, buffer, size);
+       r = ch341_control_in(dev, CH341_REQ_READ_REG, 0x2518, 0, buffer, size);
        if (r < 0)
                goto out;
 
-       r = ch341_control_out(dev, 0x9a, 0x2518, 0x0050);
+       r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x2518, 0x0050);
        if (r < 0)
                goto out;
 
@@ -232,7 +245,7 @@ static int ch341_configure(struct usb_device *dev, struct ch341_private *priv)
        if (r < 0)
                goto out;
 
-       r = ch341_control_out(dev, 0xa1, 0x501f, 0xd90a);
+       r = ch341_control_out(dev, CH341_REQ_SERIAL_INIT, 0x501f, 0xd90a);
        if (r < 0)
                goto out;
 
@@ -382,7 +395,7 @@ static void ch341_set_termios(struct tty_struct *tty,
 static void ch341_break_ctl(struct tty_struct *tty, int break_state)
 {
        const uint16_t ch341_break_reg =
-               CH341_REG_BREAK1 | ((uint16_t) CH341_REG_BREAK2 << 8);
+                       ((uint16_t) CH341_REG_LCR << 8) | CH341_REG_BREAK;
        struct usb_serial_port *port = tty->driver_data;
        int r;
        uint16_t reg_contents;
@@ -407,12 +420,12 @@ static void ch341_break_ctl(struct tty_struct *tty, int break_state)
                        __func__, break_reg[0], break_reg[1]);
        if (break_state != 0) {
                dbg("%s - Enter break state requested", __func__);
-               break_reg[0] &= ~CH341_NBREAK_BITS_REG1;
-               break_reg[1] &= ~CH341_NBREAK_BITS_REG2;
+               break_reg[0] &= ~CH341_NBREAK_BITS;
+               break_reg[1] &= ~CH341_LCR_ENABLE_TX;
        } else {
                dbg("%s - Leave break state requested", __func__);
-               break_reg[0] |= CH341_NBREAK_BITS_REG1;
-               break_reg[1] |= CH341_NBREAK_BITS_REG2;
+               break_reg[0] |= CH341_NBREAK_BITS;
+               break_reg[1] |= CH341_LCR_ENABLE_TX;
        }
        dbg("%s - New ch341 break register contents - reg1: %x, reg2: %x",
                        __func__, break_reg[0], break_reg[1]);