aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-11-01 09:19:34 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-11-01 09:19:34 -0700
commit7e12a6fcbf266eb0d5b19761f91b2964ad18e371 (patch)
tree24738755893344e35f089e4cef3bd56598a36929
parent336b9daf90d2a1575088ab93d7bfe82dcd10dd8d (diff)
Revert "usb: pl2303: do not round to the next nearest standard baud rate for the divisor based baud rate encoding method"
This reverts commit 75417d9f99f89ab241de69d7db15af5842b488c4. Revert all of the pl2303 changes that went into 3.12-rc1 and -rc2 as they cause regressions on some versions of the chip. This will all be revisited for later kernel versions when we can figure out how to handle this in a way that does not break working devices. Reported-by: Mika Westerberg <mika.westerberg@linux.intel.com> Cc: Frank Schäfer <fschaefer.oss@googlemail.com> Acked-by: Johan Hovold <jhovold@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/serial/pl2303.c65
1 files changed, 28 insertions, 37 deletions
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 04390dff926..b93b3b30dec 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -273,46 +273,44 @@ static void pl2303_encode_baudrate(struct tty_struct *tty,
struct usb_serial_port *port,
u8 buf[4])
{
+ const int 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);
int baud;
+ int 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 = %d\n", baud);
if (!baud)
return;
- if (spriv->type != HX || baud <= 115200) {
- /*
- * 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)
- */
- const int 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 };
- int i;
-
- /* Set baudrate to nearest supported value */
- for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
- if (baud_sup[i] > baud)
- break;
- }
+ /* Set baudrate to nearest supported value */
+ for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
+ if (baud_sup[i] > baud)
+ break;
+ }
- if (i == ARRAY_SIZE(baud_sup))
- baud = baud_sup[i - 1];
- else if (i > 0
- && (baud_sup[i] - baud) > (baud - baud_sup[i - 1]))
- baud = baud_sup[i - 1];
- else
- baud = baud_sup[i];
+ if (i == ARRAY_SIZE(baud_sup))
+ baud = baud_sup[i - 1];
+ else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1]))
+ baud = baud_sup[i - 1];
+ else
+ baud = baud_sup[i];
- /* type_0, type_1 only support up to 1228800 baud */
- if (spriv->type != HX)
- baud = min_t(int, baud, 1228800);
+ /* type_0, type_1 only support up to 1228800 baud */
+ if (spriv->type != HX)
+ baud = min_t(int, baud, 1228800);
+ if (spriv->type != HX || baud <= 115200) {
/* Direct (standard) baud rate encoding method */
put_unaligned_le32(baud, buf);
} else {
@@ -333,17 +331,10 @@ static void pl2303_encode_baudrate(struct tty_struct *tty,
* => 8 < B < 16: device seems to work not properly
* => B <= 8: device uses the max. value B = 512 instead
*/
- unsigned int A, B;
- /* Respect the specified baud rate limits */
- baud = max_t(int, baud, 75);
- if (spriv->type == HX)
- baud = min_t(int, baud, 6000000);
- else
- baud = min_t(int, baud, 1228800);
/* Determine factors A and B */
- A = 0;
- B = 12000000 * 32 / baud; /* 12MHz */
+ unsigned int A = 0;
+ unsigned int B = 12000000 * 32 / baud; /* 12MHz */
B <<= 1; /* Add one bit for rounding */
while (B > (512 << 1) && A <= 14) {
A += 2;