USB: pl2303: use divisors for unsupported baud rates

Use direct method for supported baud rates, otherwise use divisors.
Limit baud rate to 12 Mbaud with HX type.

This change has been tested to work with PL-2303HX at 115200, 500000,
1000000, 2000000, 2500000, 3000000 and 4000000 baud rates.

Signed-off-by: Lauri Hintsala <lauri.hintsala@bluegiga.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
Lauri Hintsala 2014-08-13 15:02:53 +03:00 коммит произвёл Johan Hovold
Родитель 69e273c0b0
Коммит 399aa9a75a
1 изменённых файлов: 7 добавлений и 6 удалений

Просмотреть файл

@ -162,6 +162,9 @@ static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = {
.max_baud_rate = 1228800, .max_baud_rate = 1228800,
.quirks = PL2303_QUIRK_LEGACY, .quirks = PL2303_QUIRK_LEGACY,
}, },
[TYPE_HX] = {
.max_baud_rate = 12000000,
},
}; };
static int pl2303_vendor_read(struct usb_serial *serial, u16 value, static int pl2303_vendor_read(struct usb_serial *serial, u16 value,
@ -395,16 +398,14 @@ static void pl2303_encode_baud_rate(struct tty_struct *tty,
if (spriv->type->max_baud_rate) if (spriv->type->max_baud_rate)
baud = min_t(speed_t, baud, spriv->type->max_baud_rate); baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
/* /*
* Set baud rate to nearest supported value. * Use direct method for supported baud rates, otherwise use divisors.
*
* NOTE: Baud rate 500k can only be set using divisors.
*/ */
baud_sup = pl2303_get_supported_baud_rate(baud); baud_sup = pl2303_get_supported_baud_rate(baud);
if (baud == 500000) if (baud == baud_sup)
baud = pl2303_encode_baud_rate_divisor(buf, baud); baud = pl2303_encode_baud_rate_direct(buf, baud);
else else
baud = pl2303_encode_baud_rate_direct(buf, baud_sup); baud = pl2303_encode_baud_rate_divisor(buf, baud);
/* Save resulting baud rate */ /* Save resulting baud rate */
tty_encode_baud_rate(tty, baud, baud); tty_encode_baud_rate(tty, baud, baud);