serial: stm32x7: simplify baud rate register calculation
Simplify baud rate register formula and use the oversampling uart feature. This code is aligned with what is implemented in kernel driver drivers/tty/serial/stm32-usart.c since kernel v4.9. Signed-off-by: Patrice Chotard <patrice.chotard@st.com> Reviewed-by: Christophe KERELLO <christophe.kerello@st.com> Reviewed-by: Patrick DELAUNAY <patrick.delaunay@st.com> Acked-by: Vikas MANOCHA <vikas.manocha@st.com>
This commit is contained in:
		
							parent
							
								
									1113ad49dc
								
							
						
					
					
						commit
						1afcf9cb25
					
				|  | @ -20,7 +20,7 @@ static int stm32_serial_setbrg(struct udevice *dev, int baudrate) | ||||||
| { | { | ||||||
| 	struct stm32x7_serial_platdata *plat = dev->platdata; | 	struct stm32x7_serial_platdata *plat = dev->platdata; | ||||||
| 	struct stm32_usart *const usart = plat->base; | 	struct stm32_usart *const usart = plat->base; | ||||||
| 	u32  clock, int_div, frac_div, tmp; | 	u32  clock, int_div, mantissa, fraction, oversampling; | ||||||
| 
 | 
 | ||||||
| 	if (((u32)usart & STM32_BUS_MASK) == APB1_PERIPH_BASE) | 	if (((u32)usart & STM32_BUS_MASK) == APB1_PERIPH_BASE) | ||||||
| 		clock = clock_get(CLOCK_APB1); | 		clock = clock_get(CLOCK_APB1); | ||||||
|  | @ -29,11 +29,20 @@ static int stm32_serial_setbrg(struct udevice *dev, int baudrate) | ||||||
| 	else | 	else | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	int_div = (25 * clock) / (4 * baudrate); | 	int_div = DIV_ROUND_CLOSEST(clock, baudrate); | ||||||
| 	tmp = ((int_div / 100) << USART_BRR_M_SHIFT) & USART_BRR_M_MASK; | 
 | ||||||
| 	frac_div = int_div - (100 * (tmp >> USART_BRR_M_SHIFT)); | 	if (int_div < 16) { | ||||||
| 	tmp |= (((frac_div * 16) + 50) / 100) & USART_BRR_F_MASK; | 		oversampling = 8; | ||||||
| 	writel(tmp, &usart->brr); | 		setbits_le32(&usart->cr1, USART_CR1_OVER8); | ||||||
|  | 	} else { | ||||||
|  | 		oversampling = 16; | ||||||
|  | 		clrbits_le32(&usart->cr1, USART_CR1_OVER8); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	mantissa = (int_div / oversampling) << USART_BRR_M_SHIFT; | ||||||
|  | 	fraction = int_div % oversampling; | ||||||
|  | 
 | ||||||
|  | 	writel(mantissa | fraction, &usart->brr); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -23,8 +23,9 @@ struct stm32_usart { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| #define USART_CR1_RE			(1 << 2) | #define USART_CR1_OVER8			(1 << 15) | ||||||
| #define USART_CR1_TE			(1 << 3) | #define USART_CR1_TE			(1 << 3) | ||||||
|  | #define USART_CR1_RE			(1 << 2) | ||||||
| #define USART_CR1_UE			(1 << 0) | #define USART_CR1_UE			(1 << 0) | ||||||
| 
 | 
 | ||||||
| #define USART_CR3_OVRDIS		(1 << 12) | #define USART_CR3_OVRDIS		(1 << 12) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue