Commit 02dc2723 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'usb-serial-4.3-rc1' of...

Merge tag 'usb-serial-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial into usb-next

Johan writes:

USB-serial updates for v4.3-rc1

Here's a fix for a long-standing issue with the pl2303 divisor
calculations that affects some non-standard baudrates that were enabled
in v3.18.

Adding support for newer Edgeport devices and firmware required changes
to the io_ti driver and also exposed some issues with the driver's
current firmware handling.

Included is also a URL comment-typo fix.
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parents 17248569 26c78daa
...@@ -1365,7 +1365,7 @@ ...@@ -1365,7 +1365,7 @@
#define FTDI_CTI_NANO_PID 0xF60B #define FTDI_CTI_NANO_PID 0xF60B
/* /*
* ZeitControl cardsystems GmbH rfid-readers http://zeitconrol.de * ZeitControl cardsystems GmbH rfid-readers http://zeitcontrol.de
*/ */
/* TagTracer MIFARE*/ /* TagTracer MIFARE*/
#define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0 #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0
......
This diff is collapsed.
...@@ -362,21 +362,38 @@ static speed_t pl2303_encode_baud_rate_direct(unsigned char buf[4], ...@@ -362,21 +362,38 @@ static speed_t pl2303_encode_baud_rate_direct(unsigned char buf[4],
static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4], static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4],
speed_t baud) speed_t baud)
{ {
unsigned int tmp; unsigned int baseline, mantissa, exponent;
/* /*
* Apparently the formula is: * Apparently the formula is:
* baudrate = 12M * 32 / (2^buf[1]) / buf[0] * baudrate = 12M * 32 / (mantissa * 4^exponent)
* where
* mantissa = buf[8:0]
* exponent = buf[11:9]
*/ */
tmp = 12000000 * 32 / baud; baseline = 12000000 * 32;
mantissa = baseline / baud;
if (mantissa == 0)
mantissa = 1; /* Avoid dividing by zero if baud > 32*12M. */
exponent = 0;
while (mantissa >= 512) {
if (exponent < 7) {
mantissa >>= 2; /* divide by 4 */
exponent++;
} else {
/* Exponent is maxed. Trim mantissa and leave. */
mantissa = 511;
break;
}
}
buf[3] = 0x80; buf[3] = 0x80;
buf[2] = 0; buf[2] = 0;
buf[1] = (tmp >= 256); buf[1] = exponent << 1 | mantissa >> 8;
while (tmp >= 256) { buf[0] = mantissa & 0xff;
tmp >>= 2;
buf[1] <<= 1; /* Calculate and return the exact baud rate. */
} baud = (baseline / mantissa) >> (exponent << 1);
buf[0] = tmp;
return baud; return baud;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment