summaryrefslogtreecommitdiff
path: root/drivers/usb/serial/pl2303.c
diff options
context:
space:
mode:
authorJohan Hovold <jhovold@gmail.com>2013-12-29 19:23:11 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-01-03 12:31:48 -0800
commit59afe10e8dd33d26f8c2ae7572f9023044e71bab (patch)
tree524cc74abb81ffd5788470b2c875fba5fba29fcd /drivers/usb/serial/pl2303.c
parent79816824c1ae73542d9523283ce353142b67563e (diff)
USB: pl2303: refactor baud-rate table lookup
Refactor supported baud-rate table lookup. Signed-off-by: Johan Hovold <jhovold@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/serial/pl2303.c')
-rw-r--r--drivers/usb/serial/pl2303.c55
1 files changed, 33 insertions, 22 deletions
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 8d792afbe27f..9a95b92310f2 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -311,31 +311,19 @@ static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
return retval;
}
-static void pl2303_encode_baud_rate(struct tty_struct *tty,
- struct usb_serial_port *port,
- u8 buf[4])
+/*
+ * Returns the nearest supported baud rate.
+ */
+static speed_t pl2303_get_supported_baud_rate(speed_t baud)
{
- const speed_t baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
- 4800, 7200, 9600, 14400, 19200, 28800, 38400,
- 57600, 115200, 230400, 460800, 500000, 614400,
- 921600, 1228800, 2457600, 3000000, 6000000 };
+ static const speed_t baud_sup[] = {
+ 75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600,
+ 14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800,
+ 500000, 614400, 921600, 1228800, 2457600, 3000000, 6000000
+ };
- struct usb_serial *serial = port->serial;
- struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
- speed_t baud;
- int i;
+ unsigned i;
- /*
- * NOTE: Only the values defined in baud_sup are supported!
- * => if unsupported values are set, the PL2303 seems to use
- * 9600 baud (at least my PL2303X always does)
- */
- baud = tty_get_baud_rate(tty);
- dev_dbg(&port->dev, "baud requested = %u\n", baud);
- if (!baud)
- return;
-
- /* Set baud rate to nearest supported value */
for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
if (baud_sup[i] > baud)
break;
@@ -348,6 +336,29 @@ static void pl2303_encode_baud_rate(struct tty_struct *tty,
else
baud = baud_sup[i];
+ return baud;
+}
+
+static void pl2303_encode_baud_rate(struct tty_struct *tty,
+ struct usb_serial_port *port,
+ u8 buf[4])
+{
+ struct usb_serial *serial = port->serial;
+ struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
+ speed_t baud;
+
+ baud = tty_get_baud_rate(tty);
+ dev_dbg(&port->dev, "baud requested = %u\n", baud);
+ if (!baud)
+ return;
+ /*
+ * Set baud rate to nearest supported value.
+ *
+ * NOTE: If unsupported values are set directly, the PL2303 seems to
+ * use 9600 baud.
+ */
+ baud = pl2303_get_supported_baud_rate(baud);
+
if (spriv->type->max_baud_rate)
baud = min_t(speed_t, baud, spriv->type->max_baud_rate);