USB: serial: cp210x: make line-speed quantisation data driven
Subsystems (2)
Johan Hovold
maintainerPATCH 1/2 USB: serial: cp210x: make line-speed quantisation data driven
Older cp210x devices only support a fixed set of line speeds to which a requested speed is mapped. Reimplement this mapping using a table instead of a long if-else construct.
Signed-off-by Johan Hovold <[email protected]>
--- drivers/usb/serial/cp210x.c | 99 +++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 43 deletions(-)
drivers/usb/serial/cp210x.c +56 -43
@@ -767,48 +767,6 @@ static int cp210x_get_line_ctl(struct usb_serial_port *port, u16 *ctl)return 0 ; } -/* -* cp210x_quantise_baudrate -* Quantises the baud rate as per AN205 Table 1 -*/ -static unsigned int cp210x_quantise_baudrate (unsigned int baud) -{ -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 <1000000 ) - baud =921600 ; -else if (baud >2000000 ) - baud =2000000 ; -return baud; -} -static int cp210x_open (struct tty_struct *tty,struct usb_serial_port *port) {int result;
@@ -1028,6 +986,58 @@ static void cp210x_get_termios_port(struct usb_serial_port *port, *cflagp = cflag; } +struct cp210x_rate { +speed_t rate; +speed_t high; +}; + +static const struct cp210x_rate cp210x_an205_table1[] = { + {300 ,300 }, + {600 ,600 }, + {1200 ,1200 }, + {1800 ,1800 }, + {2400 ,2400 }, + {4000 ,4000 }, + {4800 ,4803 }, + {7200 ,7207 }, + {9600 ,9612 }, + {14400 ,14428 }, + {16000 ,16062 }, + {19200 ,19250 }, + {28800 ,28912 }, + {38400 ,38601 }, + {51200 ,51558 }, + {56000 ,56280 }, + {57600 ,58053 }, + {64000 ,64111 }, + {76800 ,77608 }, + {115200 ,117028 }, + {128000 ,129347 }, + {153600 ,156868 }, + {230400 ,237832 }, + {250000 ,254234 }, + {256000 ,273066 }, + {460800 ,491520 }, + {500000 ,567138 }, + {576000 ,670254 }, + {921600 ,UINT_MAX } +}; + +/* +* Quantises the baud rate as per AN205 Table 1 +*/ +static speed_t cp210x_get_an205_rate (speed_t baud) +{ +int i; + +for (i =0 ; i <ARRAY_SIZE (cp210x_an205_table1); ++i) { +if (baud <= cp210x_an205_table1[i].high) +break ; + } + +return cp210x_an205_table1[i].rate; +} +/* * CP2101 supports the following baud rates: *
@@ -1066,7 +1076,10 @@ static void cp210x_change_speed(struct tty_struct *tty,* * NOTE: B0 is not implemented. */ - baud =cp210x_quantise_baudrate (baud); +if (baud <1000000 ) + baud =cp210x_get_an205_rate (baud); +else if (baud >2000000 ) + baud =2000000 ;dev_dbg (&port->dev,"%s - setting baud rate to %u\n" , __func__, baud);if (cp210x_write_u32_reg (port,CP210X_SET_BAUDRATE , baud)) {