Skip to contentSkip to conversation

USB: serial: cp210x: add minimun baud rate for CP2105 SCI

DISCUSSION Johan Hovold 1 participant 1 message Feb 4, 2019 USB

lore
Share & tools
lore
#0 lore raw
Quoted 8 lines · Johanna Abrahamsson

From: Johanna Abrahamsson <[email protected]>

This patch adds a minimum baud rate of 2400 for CP2105 SCI

According to the datasheet for CP2105, the SCI supports 2400 as the lowest baud rate. As this is not heeded in the current code, an error message 'failed set req 0x1e size 4 status: -32' when trying to set a lower baud rate such as 300.

Good to hear to you found the root cause of that failed baudrate request.

Quoted 4 lines

Since this is, as far as I can tell, the only cp210x chip with a minimum baud rate higher than 300, I've added a special case to cp210x_change_speed rather than adding a min_speed field in cp210x_serial_private.

But please do add a min_speed field instead of special casing which tends to make the code harder to read.

Quoted 10 lines
---
 drivers/usb/serial/cp210x.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/usb/serial/cp210x.c +0 -0
index 336a3c0f9f2c..181abf7bb8c0 100644

drivers/usb/serial/cp210x.c static void cp210x_change_speed(struct tty_struct *tty, · line 1118

Quoted 9 lines
drivers/usb/serial/cp210x.c +4 -1
@@ -1111,9 +1111,12 @@ static void cp210x_change_speed(struct tty_struct *tty,
 	 */
 	if (priv->use_actual_rate)
 		baud = cp210x_get_actual_rate(serial, baud);
-	else if (baud < 1000000)
+	else if (baud < 1000000) {
+		if (priv->partnum == CP210X_PARTNUM_CP2105 &&
+		    cp210x_interface_num(serial) == 1)
+			baud = clamp(baud, 2400u, priv->max_speed);
 		baud = cp210x_get_an205_rate(baud);

We already have a clamp in place in cp210x_get_actual_rate() so just add a similar construct to cp210x_get_actual_rate() and amend cp210x_init_max_speed() as needed.

drivers/usb/serial/cp210x.c static void cp210x_change_speed(struct tty_struct *tty, · line 1122

Quoted 5 lines
drivers/usb/serial/cp210x.c +1 -1
-	else if (baud > priv->max_speed)
+	} else if (baud > priv->max_speed)
 		baud = priv->max_speed;
 
 	dev_dbg(&port->dev, "%s - setting baud rate to %u\n", __func__, baud);

Johan