Skip to content

Commit

Permalink
sparc32,leon: Fixed APBUART frequency detection
Browse files Browse the repository at this point in the history
The UARTs may be located on different APB buses, thus have

different UART clock frequency. The system frequency is not
the same (but often) as the UART frequency, rather the APB bus
frequency that the APBUART is located at has the same
frequency, so this looks at the "freq" property instead.

Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Daniel Hellstrom authored and David S. Miller committed Mar 30, 2011
1 parent 10544f1 commit c897dcf
Showing 1 changed file with 7 additions and 17 deletions.
24 changes: 7 additions & 17 deletions drivers/tty/serial/apbuart.c
Original file line number Diff line number Diff line change
Expand Up @@ -598,24 +598,12 @@ static struct platform_driver grlib_apbuart_of_driver = {

static int grlib_apbuart_configure(void)
{
struct device_node *np, *rp;
const u32 *prop;
int freq_khz, line = 0;

/* Get bus frequency */
rp = of_find_node_by_path("/");
if (!rp)
return -ENODEV;
rp = of_get_next_child(rp, NULL);
if (!rp)
return -ENODEV;
prop = of_get_property(rp, "clock-frequency", NULL);
if (!prop)
return -ENODEV;
freq_khz = *prop;
struct device_node *np;
int line = 0;

for_each_matching_node(np, apbuart_match) {
const int *ampopts;
const u32 *freq_hz;
const struct amba_prom_registers *regs;
struct uart_port *port;
unsigned long addr;
Expand All @@ -624,8 +612,10 @@ static int grlib_apbuart_configure(void)
if (ampopts && (*ampopts == 0))
continue; /* Ignore if used by another OS instance */
regs = of_get_property(np, "reg", NULL);
/* Frequency of APB Bus is frequency of UART */
freq_hz = of_get_property(np, "freq", NULL);

if (!regs)
if (!regs || !freq_hz || (*freq_hz == 0))
continue;

grlib_apbuart_nodes[line] = np;
Expand All @@ -641,7 +631,7 @@ static int grlib_apbuart_configure(void)
port->ops = &grlib_apbuart_ops;
port->flags = UPF_BOOT_AUTOCONF;
port->line = line;
port->uartclk = freq_khz * 1000;
port->uartclk = *freq_hz;
port->fifosize = apbuart_scan_fifo_size((struct uart_port *) port, line);
line++;

Expand Down

0 comments on commit c897dcf

Please sign in to comment.