The minimum baud rate was hardcoded, not computed from first principles. The break condition simulation added in a later patch will also need to make use of the minimum baud rate. The (1 + ((x - 1) / y)) pattern is to force rounding up (mathematically the minimum rate is about 45.78bps). Signed-off-by: Michael Hanselmann <public@xxxxxxxxx> --- Rebase on top of usb-next and wording change in commit message. drivers/usb/serial/ch341.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c index 97214e1ec5d2..202cfa4ef6c7 100644 --- a/drivers/usb/serial/ch341.c +++ b/drivers/usb/serial/ch341.c @@ -147,6 +147,8 @@ static int ch341_control_in(struct usb_device *dev, #define CH341_CLKRATE 48000000 #define CH341_CLK_DIV(ps, fact) (1 << (12 - 3 * (ps) - (fact))) +#define CH341_MIN_BPS \ + (unsigned int)(1 + (((CH341_CLKRATE) - 1) / (CH341_CLK_DIV(0, 0) * 256))) #define CH341_MIN_RATE(ps) (CH341_CLKRATE / (CH341_CLK_DIV((ps), 1) * 512)) static const speed_t ch341_min_rates[] = { @@ -174,10 +176,10 @@ static int ch341_get_divisor(struct ch341_private *priv) int ps; /* - * Clamp to supported range, this makes the (ps < 0) and (div < 2) - * sanity checks below redundant. + * Clamp to supported range, making the later range sanity checks + * redundant. */ - speed = clamp(speed, 46U, 3000000U); + speed = clamp(speed, CH341_MIN_BPS, 3000000U); /* * Start with highest possible base clock (fact = 1) that will give a -- 2.20.1