On Sunday 24 July 2022 14:41:19 Johan Hovold wrote: > On Tue, Jul 12, 2022 at 01:53:06PM +0200, Marek Behún wrote: > > From: Pali Rohár <pali@xxxxxxxxxx> > > > > Calculate baud rate value in c_*speed fields to the real values which were > > set on hardware. For this operation, add a new set of methods > > *_divisor_to_baud() for each chip and use them for calculating the real > > baud rate values. > > > > Each *_divisor_to_baud() method is constructed as an inverse function of > > its corresponding *_baud_to_divisor() method. > > > > Signed-off-by: Pali Rohár <pali@xxxxxxxxxx> > > Tested-by: Marek Behún <kabel@xxxxxxxxxx> > > Signed-off-by: Marek Behún <kabel@xxxxxxxxxx> > > --- > > drivers/usb/serial/ftdi_sio.c | 83 +++++++++++++++++++++++++++++++++++ > > 1 file changed, 83 insertions(+) > > > > diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c > > index 39e8c5d06157..838acce53e69 100644 > > --- a/drivers/usb/serial/ftdi_sio.c > > +++ b/drivers/usb/serial/ftdi_sio.c > > @@ -1167,6 +1167,23 @@ static int ftdi_sio_baud_to_divisor(int baud) > > } > > } > > > > +static int ftdi_sdio_divisor_to_baud(u32 divisor) > > +{ > > + switch (divisor) { > > + case ftdi_sio_b300: return 300; > > + case ftdi_sio_b600: return 600; > > + case ftdi_sio_b1200: return 1200; > > + case ftdi_sio_b2400: return 2400; > > + case ftdi_sio_b4800: return 4800; > > + case ftdi_sio_b9600: return 9600; > > + case ftdi_sio_b19200: return 19200; > > + case ftdi_sio_b38400: return 38400; > > + case ftdi_sio_b57600: return 57600; > > + case ftdi_sio_b115200: return 115200; > > + default: return 9600; > > + } > > +} > > This one should not be needed as sio only supports this discrete set of > values in the first place. > > > static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base) > > { > > unsigned short int divisor; > > @@ -1189,15 +1206,33 @@ static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base) > > return divisor; > > } > > > > +static int ftdi_232am_divisor_base_to_baud(unsigned short int divisor, int base) > > I believe "base" was used as a function name suffix in the inverse > function (due to the additional base argument). Yes, in the same way as it used in name of ftdi_232am_baud_base_to_divisor. > > +{ > > + static const unsigned char divfrac_inv[4] = { 0, 4, 2, 1 }; > > + unsigned int divisor3; > > + > > + if (divisor == 0) > > + divisor = 1; > > + divisor3 = (GENMASK(13, 0) & divisor) << 3; > > + divisor3 |= divfrac_inv[(divisor >> 14) & 0x3]; > > + return DIV_ROUND_CLOSEST(base, 2 * divisor3); > > +} > > I don't have the motivation to try to review these inverses right now. > > Let's get the rest of the series in order first. > > Johan