[PATCH 78/97] USB: CP2101 Support AN205 baud rates

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <linux-usb@...>
Cc: Craig Shelley <craig@...>, Greg Kroah-Hartman <gregkh@...>
Date: Tuesday, March 24, 2009 - 8:23 pm

From: Craig Shelley <craig@microtron.org.uk>

This patch adds support for the extended range of baud rates supported
by CP2102 and CP2103 devices described in SiLabs AN205.  An additional
function cp2101_quantise_baudrate rounds the baud rate as per AN205
Table 1.  A modification to the baud rate calculation removes a rounding
error, allowing the full range of baud rates to be used.

Signed-off-by: Craig Shelley <craig@microtron.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 drivers/usb/serial/cp2101.c |   92 ++++++++++++++++++++++++-------------------
 1 files changed, 52 insertions(+), 40 deletions(-)

diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c
index 9b4082b..9b56e35 100644
--- a/drivers/usb/serial/cp2101.c
+++ b/drivers/usb/serial/cp2101.c
@@ -31,7 +31,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v0.07"
+#define DRIVER_VERSION "v0.08"
 #define DRIVER_DESC "Silicon Labs CP2101/CP2102 RS232 serial adaptor driver"
 
 /*
@@ -301,6 +301,47 @@ static inline int cp2101_set_config_single(struct usb_serial_port *port,
 	return cp2101_set_config(port, request, &data, 2);
 }
 
+/*
+ * cp2101_quantise_baudrate
+ * Quantises the baud rate as per AN205 Table 1
+ */
+static unsigned int cp2101_quantise_baudrate(unsigned int baud) {
+	if      (baud <= 56)       baud = 0;
+	else if (baud <= 300)      baud = 300;
+	else if (baud <= 600)      baud = 600;
+	else if (baud <= 1200)     baud = 1200;
+	else if (baud <= 1800)     baud = 1800;
+	else if (baud <= 2400)     baud = 2400;
+	else if (baud <= 4000)     baud = 4000;
+	else if (baud <= 4803)     baud = 4800;
+	else if (baud <= 7207)     baud = 7200;
+	else if (baud <= 9612)     baud = 9600;
+	else if (baud <= 14428)    baud = 14400;
+	else if (baud <= 16062)    baud = 16000;
+	else if (baud <= 19250)    baud = 19200;
+	else if (baud <= 28912)    baud = 28800;
+	else if (baud <= 38601)    baud = 38400;
+	else if (baud <= 51558)    baud = 51200;
+	else if (baud <= 56280)    baud = 56000;
+	else if (baud <= 58053)    baud = 57600;
+	else if (baud <= 64111)    baud = 64000;
+	else if (baud <= 77608)    baud = 76800;
+	else if (baud <= 117028)   baud = 115200;
+	else if (baud <= 129347)   baud = 128000;
+	else if (baud <= 156868)   baud = 153600;
+	else if (baud <= 237832)   baud = 230400;
+	else if (baud <= 254234)   baud = 250000;
+	else if (baud <= 273066)   baud = 256000;
+	else if (baud <= 491520)   baud = 460800;
+	else if (baud <= 567138)   baud = 500000;
+	else if (baud <= 670254)   baud = 576000;
+	else if (baud <= 1053257)  baud = 921600;
+	else if (baud <= 1474560)  baud = 1228800;
+	else if (baud <= 2457600)  baud = 1843200;
+	else                       baud = 3686400;
+	return baud;
+}
+
 static int cp2101_open(struct tty_struct *tty, struct usb_serial_port *port,
 				struct file *filp)
 {
@@ -388,7 +429,7 @@ static void cp2101_get_termios (struct tty_struct *tty)
 	cp2101_get_config(port, CP2101_BAUDRATE, &baud, 2);
 	/* Convert to baudrate */
 	if (baud)
-		baud = BAUD_RATE_GEN_FREQ / baud;
+		baud = cp2101_quantise_baudrate((BAUD_RATE_GEN_FREQ + baud/2)/ baud);
 
 	dbg("%s - baud rate = %d", __func__, baud);
 
@@ -517,46 +558,17 @@ static void cp2101_set_termios(struct tty_struct *tty,
 	tty->termios->c_cflag &= ~CMSPAR;
 	cflag = tty->termios->c_cflag;
 	old_cflag = old_termios->c_cflag;
-	baud = tty_get_baud_rate(tty);
+	baud = cp2101_quantise_baudrate(tty_get_baud_rate(tty));
 
 	/* If the baud rate is to be updated*/
-	if (baud != tty_termios_baud_rate(old_termios)) {
-		switch (baud) {
-		case 0:
-		case 600:
-		case 1200:
-		case 1800:
-		case 2400:
-		case 4800:
-		case 7200:
-		case 9600:
-		case 14400:
-		case 19200:
-		case 28800:
-		case 38400:
-		case 55854:
-		case 57600:
-		case 115200:
-		case 127117:
-		case 230400:
-		case 460800:
-		case 921600:
-		case 3686400:
-			break;
-		default:
-			baud = 9600;
-			break;
-		}
-
-		if (baud) {
-			dbg("%s - Setting baud rate to %d baud", __func__,
-					baud);
-			if (cp2101_set_config_single(port, CP2101_BAUDRATE,
-						(BAUD_RATE_GEN_FREQ / baud))) {
-				dev_err(&port->dev, "Baud rate requested not "
-						"supported by device\n");
-				baud = tty_termios_baud_rate(old_termios);
-			}
+	if (baud != tty_termios_baud_rate(old_termios) && baud != 0) {
+		dbg("%s - Setting baud rate to %d baud", __func__,
+				baud);
+		if (cp2101_set_config_single(port, CP2101_BAUDRATE,
+					((BAUD_RATE_GEN_FREQ + baud/2) / baud))) {
+			dev_err(&port->dev, "Baud rate requested not "
+					"supported by device\n");
+			baud = tty_termios_baud_rate(old_termios);
 		}
 	}
 	/* Report back the resulting baud rate */
-- 
1.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[GIT PATCH] USB patches for 2.6.30 merge window, Greg KH, (Tue Mar 24, 8:17 pm)
[PATCH 71/97] USB: uhci: don't use pseudo negative values, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 69/97] USB: usbmon: Add binary API v1, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 70/97] USB: TWL: disable VUSB regulators when cable u..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 60/97] USB: usb-storage: added missing MODULE_LICENSE..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 11/97] USB: ub: use USB API functions rather than con..., Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 45/97] USB: replace uses of __constant_{endian}, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 74/97] USB: remove phidget drivers from kernel tree., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 17/97] USB: imx_udc: Fix IMX UDC gadget code style, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 15/97] USB: usb-serial ch341: support for DTR/RTS/CTS, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 88/97] USB: CP2101 New Device ID, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 93/97] USB: gadget: gadget zero uses new suspend/resu..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 97/97] USB: qcserial: add device id for HP devices, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 48/97] usb-storage: prepare for subdriver separation, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 27/97] USB: add missing KERN_* constants to printks, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 57/97] usb-storage: make alauda a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 16/97] USB: imx_udc: Fix IMX UDC gadget bugs, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 96/97] USB: isp1760: Add a delay before reading the S..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 20/97] USB: suspend/resume support for option driver, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 90/97] USB: more u32 conversion after transfer_buffer..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 23/97] USB: serial: introduce a flag into the usb ser..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 94/97] USB: pxa27x_udc: typo fixes and code cleanups, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 18/97] USB: imx_udc: Fix IMX UDC gadget ep0 irq handl..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 95/97] USB: allow malformed LANGID descriptors, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 42/97] USB: serial: add symbol serial driver, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 22/97] USB: count reaches -1, tested 0, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 91/97] USB: r8a66597-hcd: suspend/resume support, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 92/97] USB: gadget: composite device-level suspend/re..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 86/97] USB: S3C: Move usb-control.h to platform include, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 24/97] USB: serial generic resume function fix, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 87/97] USB: ipaq: handle 4 endpoint devices, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 84/97] USB: pedantic: spelling correction in comment ..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 89/97] USB: Fix cp2101 USB serial device driver termi..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 67/97] USB: musb: partial DaVinci dm355 support, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 85/97] USB: ohci-hcd: Add ARCH_S3C24XX to the ohci-s3..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 83/97] USB: host: fix sparse warning: Using plain int..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 40/97] USB: Make the isp1760_register function protot..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 39/97] USB: EHCI: add software retry for transaction ..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 59/97] usb-storage: make onetouch a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 80/97] USB: serial: rename cp2101 driver to cp210x, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 82/97] USB: ohci-s3c2410: fix name of bus clock, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 43/97] USB: symbolserial: log the ioctl commands, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 81/97] USB: ohci-s3c2410: remove &lt;mach/hardware.h&..., Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 68/97] USB: ch341 serial: fix port number changed aft..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 78/97] USB: CP2101 Support AN205 baud rates, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 64/97] USB: musb: NAK timeout scheme on bulk RX endpo..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 72/97] USB: make transfer_buffer_lengths in struct ur..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 77/97] USB: use kzfree(), Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 66/97] USB: musb: only turn off vbus in OTG hosts, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 75/97] USB: don't send Set-Interface after reset, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 79/97] USB: CP2101 Reduce Error Logging, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 29/97] USB: otg: adding nop usb transceiver, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 50/97] usb-storage: make isd200 a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 53/97] usb-storage: make shuttle_usbat a separate mod..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 73/97] USB: make actual_length in struct urb field u32, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 61/97] USB: allow libusb to talk to unauthenticated W..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 62/97] USB: composite: avoid inconsistent lock state, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 76/97] USB: usbfs: remove unneeded "inline" annotations, Greg Kroah-Hartman, (Tue Mar 24, 8:23 pm)
[PATCH 55/97] usb-storage: make datafab a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 25/97] USB: serial: export symbol of usb_serial_gener..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 63/97] USB: musb: rewrite host periodic endpoint allo..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 06/97] USB: pxa27x_udc: factor pullup code to prepare..., Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 49/97] usb-storage: make sddr09 a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 65/97] USB: musb: fix init oops crash with static FIF..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 58/97] usb-storage: make karma a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 56/97] usb-storage: make jumpshot a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 51/97] usb-storage: make sddr55 a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 46/97] USB: fix ehci printk formats, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 52/97] usb-storage: make cypress_atacb a separate mod..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 10/97] USB: Move definitions from usb.h to usb/ch9.h, Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 54/97] usb-storage: make freecom a separate module, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 47/97] usb-serial: fix usb_serial_register bug when b..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 36/97] usb: kill prehistorical comments about USB_EHC..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 30/97] USB: serial: opticon: add write support, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 05/97] USB: gpio_vbus: add delayed vbus_session calls, Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 41/97] USB: Add platform device support for the ISP17..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 44/97] USB: serial: add qualcomm wireless modem driver, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 37/97] USB: EHCI: Make timer_action out-of-line, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 38/97] USB: fix USB_STORAGE_CYPRESS_ATACB, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 13/97] USB: drivers: use USB API functions rather tha..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 34/97] USB: serial: remove recourse to generic method, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 28/97] USB: ftdi_sio: remove pointless syslog spew, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 19/97] USB: imx_udc: Fix IMX UDC gadget general irq h..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 31/97] USB: serial: opticon: add serial line ioctls, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 33/97] USB: skeleton: Use dev_info instead of info, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 35/97] USB: serial: refuse to open recently removed U..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 32/97] usb_storage: make Kconfig note visible in the ..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 08/97] USB: pxa27x_udc: add otg transceiver support, Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 26/97] USB: serial: use generic method if no alternat..., Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 21/97] USB: suspend/resume for opticon driver, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 14/97] USB: gadget: remove duplicated #include, Greg Kroah-Hartman, (Tue Mar 24, 8:22 pm)
[PATCH 12/97] USB: Remove redundant test in pxa27x_udc and f..., Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 07/97] USB: pxa27x_udc: add vbus session handling, Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 09/97] USB: pxa27x_udc: add vbus_draw callback, Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 04/97] usblp: continuously poll for status, Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 03/97] USB: usb-storage: increase max_sectors for tap..., Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 02/97] USB: gadget: fix rndis regression, Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)
[PATCH 01/97] USB: add quirk to avoid config and interface s..., Greg Kroah-Hartman, (Tue Mar 24, 8:21 pm)