static int ar933x_param(struct uart_bas *bas, int baudrate, int databits, int stopbits, int parity) { /* UART always 8 bits */ /* UART always 1 stop bit */ /* UART parity is controllable by bits 0:1, ignore for now */ /* Set baudrate if required. */ if (baudrate > 0) { uint32_t clock_scale, clock_step; /* Find the best fit for the given baud rate */ ar933x_uart_get_scale_step(bas, baudrate, &clock_scale, &clock_step); /* * Program the clock register in its entirety - no need * for Read-Modify-Write. */ ar933x_setreg(bas, AR933X_UART_CLOCK_REG, ((clock_scale & AR933X_UART_CLOCK_SCALE_M) << AR933X_UART_CLOCK_SCALE_S) | (clock_step & AR933X_UART_CLOCK_STEP_M)); } uart_barrier(bas); return (0); }
static int ar933x_serial_setbaudrate(struct console_device *cdev, int baudrate) { struct ar933x_uart_priv *priv = cdev->dev->priv; unsigned int scale, step; ar933x_uart_get_scale_step(clk_get_rate(priv->clk), baudrate, &scale, &step); ar933x_serial_writel(cdev, (scale << AR933X_UART_CLOCK_SCALE_S) | step, AR933X_UART_CLOCK_REG); return 0; }