Skip to content
Snippets Groups Projects
Commit 764e7417 authored by Stefan Roese's avatar Stefan Roese
Browse files

ppc4xx: Correct UART input clock calculation and passing to fdt


Signed-off-by: default avatarStefan Roese <sr@denx.de>
parent 211ea91a
No related branches found
No related tags found
No related merge requests found
......@@ -85,11 +85,7 @@ static void do_fixup_uart(void *fdt, int offset, int i, bd_t *bd)
debug("Updating node UART%d\n", i);
#if defined(CFG_EXT_SERIAL_CLOCK)
val = cpu_to_fdt32(CFG_EXT_SERIAL_CLOCK);
#else
val = cpu_to_fdt32(sys_info.freqUART);
#endif
rc = fdt_setprop(fdt, offset, "clock-frequency", &val, 4);
if (rc)
printf("Unable to update node UART, err=%s\n", fdt_strerror(rc));
......
......@@ -528,12 +528,18 @@ int serial_init(void)
udiv = 1;
tmp = gd->baudrate * 16;
bdiv = (CFG_EXT_SERIAL_CLOCK + tmp / 2) / tmp;
gd->freqUART = CFG_EXT_SERIAL_CLOCK;
#else
/* For 440, the cpu clock is on divider chain A, UART on divider
* chain B ... so cpu clock is irrelevant. Get the "optimized"
* values that are subject to the 1/2 opb clock constraint
*/
serial_divs (gd->baudrate, &udiv, &bdiv);
/* Correct UART frequency in bd-info struct now that
* the UART divisor is available
*/
gd->freqUART = gd->freqUART / udiv;
#endif
reg |= (udiv - UDIV_SUBTRACT) << CR0_UDIV_POS; /* set the UART divisor */
......@@ -644,6 +650,15 @@ int serial_init (void)
bdiv = (clk + tmp / 2) / tmp;
#endif /* CONFIG_405EX */
/* Correct UART frequency in bd-info struct now that
* the UART divisor is available
*/
#ifdef CFG_EXT_SERIAL_CLOCK
gd->freqUART = CFG_EXT_SERIAL_CLOCK;
#else
gd->freqUART = gd->freqUART / udiv;
#endif
out8(UART_BASE + UART_LCR, 0x80); /* set DLAB bit */
out8(UART_BASE + UART_DLL, bdiv); /* set baudrate divisor */
out8(UART_BASE + UART_DLM, bdiv >> 8); /* set baudrate divisor */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment