diff options
Diffstat (limited to 'drivers/tty/serial/sc16is7xx.c')
-rw-r--r-- | drivers/tty/serial/sc16is7xx.c | 23 |
1 files changed, 5 insertions, 18 deletions
diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c index 12915fffac..929206a9a6 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c @@ -554,28 +554,16 @@ static bool sc16is7xx_regmap_noinc(struct device *dev, unsigned int reg) return reg == SC16IS7XX_RHR_REG; } -/* - * Configure programmable baud rate generator (divisor) according to the - * desired baud rate. - * - * From the datasheet, the divisor is computed according to: - * - * XTAL1 input frequency - * ----------------------- - * prescaler - * divisor = --------------------------- - * baud-rate x sampling-rate - */ static int sc16is7xx_set_baud(struct uart_port *port, int baud) { struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); u8 lcr; - unsigned int prescaler = 1; + u8 prescaler = 0; unsigned long clk = port->uartclk, div = clk / 16 / baud; if (div >= BIT(16)) { - prescaler = 4; - div /= prescaler; + prescaler = SC16IS7XX_MCR_CLKSEL_BIT; + div /= 4; } /* Enable enhanced features */ @@ -585,10 +573,9 @@ static int sc16is7xx_set_baud(struct uart_port *port, int baud) SC16IS7XX_EFR_ENABLE_BIT); sc16is7xx_efr_unlock(port); - /* If bit MCR_CLKSEL is set, the divide by 4 prescaler is activated. */ sc16is7xx_port_update(port, SC16IS7XX_MCR_REG, SC16IS7XX_MCR_CLKSEL_BIT, - prescaler == 1 ? 0 : SC16IS7XX_MCR_CLKSEL_BIT); + prescaler); /* Backup LCR and access special register set (DLL/DLH) */ lcr = sc16is7xx_port_read(port, SC16IS7XX_LCR_REG); @@ -604,7 +591,7 @@ static int sc16is7xx_set_baud(struct uart_port *port, int baud) /* Restore LCR and access to general register set */ sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); - return DIV_ROUND_CLOSEST((clk / prescaler) / 16, div); + return DIV_ROUND_CLOSEST(clk / 16, div); } static void sc16is7xx_handle_rx(struct uart_port *port, unsigned int rxlen, |