mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-26 19:36:41 +00:00
USB: cp210x: fix CP2104 baudrate usage
This fix changes the way baudrates are set on the CP210x devices from Silicon Labs. The CP2101/2/3 will respond to both a GET/SET_BAUDDIV command, and GET/SET_BAUDRATE command, while CP2104 and higher devices only respond to GET/SET_BAUDRATE. The current cp210x.ko driver in kernel version 3.2.0 only implements the GET/SET_BAUDDIV command. This patch implements the two new codes for the GET/SET_BAUDRATE commands. Then there is a change in the way that the baudrate is assigned or retrieved. This is done according to the CP210x USB specification in AN571. This document can be found here: http://www.silabs.com/pages/DownloadDoc.aspx?FILEURL=Support%20Documents/TechnicalDocs/AN571.pdf&src=DocumentationWebPart Sections 5.3/5.4 describe the USB packets for the old baudrate method. Sections 5.5/5.6 describe the USB packets for the new method. This patch also implements the new request scheme, and eliminates the unnecessary baudrate calculations since it uses the "actual baudrate" method. This patch solves the problem reported for the CP2104 in bug 42586, and also keeps support for all other devices (CP2101/2/3). This patchfile is also attached to the bug report on bugzilla.kernel.org. This patch has been developed and test on the 3.2.0 mainline kernel version under Ubuntu 10.11. Signed-off-by: Preston Fick <preston.fick@silabs.com> [duplicate patch also sent by Johan - gregkh] Signed-off-by: Johan Hovold <jhovold@gmail.com> Cc: stable <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
55b2afbb92
commit
7f482fc88a
@ -202,6 +202,8 @@ static struct usb_serial_driver cp210x_device = {
|
||||
#define CP210X_EMBED_EVENTS 0x15
|
||||
#define CP210X_GET_EVENTSTATE 0x16
|
||||
#define CP210X_SET_CHARS 0x19
|
||||
#define CP210X_GET_BAUDRATE 0x1D
|
||||
#define CP210X_SET_BAUDRATE 0x1E
|
||||
|
||||
/* CP210X_IFC_ENABLE */
|
||||
#define UART_ENABLE 0x0001
|
||||
@ -465,10 +467,7 @@ static void cp210x_get_termios_port(struct usb_serial_port *port,
|
||||
|
||||
dbg("%s - port %d", __func__, port->number);
|
||||
|
||||
cp210x_get_config(port, CP210X_GET_BAUDDIV, &baud, 2);
|
||||
/* Convert to baudrate */
|
||||
if (baud)
|
||||
baud = cp210x_quantise_baudrate((BAUD_RATE_GEN_FREQ + baud/2)/ baud);
|
||||
cp210x_get_config(port, CP210X_GET_BAUDRATE, &baud, 4);
|
||||
|
||||
dbg("%s - baud rate = %d", __func__, baud);
|
||||
*baudp = baud;
|
||||
@ -597,8 +596,7 @@ static void cp210x_set_termios(struct tty_struct *tty,
|
||||
if (baud != tty_termios_baud_rate(old_termios) && baud != 0) {
|
||||
dbg("%s - Setting baud rate to %d baud", __func__,
|
||||
baud);
|
||||
if (cp210x_set_config_single(port, CP210X_SET_BAUDDIV,
|
||||
((BAUD_RATE_GEN_FREQ + baud/2) / baud))) {
|
||||
if (cp210x_set_config(port, CP210X_SET_BAUDRATE, &baud, 4)) {
|
||||
dbg("Baud rate requested not supported by device");
|
||||
baud = tty_termios_baud_rate(old_termios);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user