diff options
author | Johan Hovold <jhovold@gmail.com> | 2013-12-29 19:23:11 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-03 12:31:48 -0800 |
commit | 59afe10e8dd33d26f8c2ae7572f9023044e71bab (patch) | |
tree | 524cc74abb81ffd5788470b2c875fba5fba29fcd /drivers/usb/serial/pl2303.c | |
parent | 79816824c1ae73542d9523283ce353142b67563e (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.c | 55 |
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); |