aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/apbuart.c
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2011-03-30 01:12:41 +0000
committerDavid S. Miller <davem@davemloft.net>2011-03-30 04:28:54 -0700
commitc897dcf6311ea9c8d24e96cc7f7fe9de58a0a6a2 (patch)
tree97775a7437b61aa344ed8652584e24c17a1c89b9 /drivers/tty/serial/apbuart.c
parentsparc32, leon: APBUART driver must use archdata to get IRQ number (diff)
downloadlinux-dev-c897dcf6311ea9c8d24e96cc7f7fe9de58a0a6a2.tar.xz
linux-dev-c897dcf6311ea9c8d24e96cc7f7fe9de58a0a6a2.zip
sparc32,leon: Fixed APBUART frequency detection
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>
Diffstat (limited to 'drivers/tty/serial/apbuart.c')
-rw-r--r--drivers/tty/serial/apbuart.c24
1 files changed, 7 insertions, 17 deletions
diff --git a/drivers/tty/serial/apbuart.c b/drivers/tty/serial/apbuart.c
index 12d4e7ca53ca..19a943693e4c 100644
--- a/drivers/tty/serial/apbuart.c
+++ b/drivers/tty/serial/apbuart.c
@@ -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;
@@ -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;
@@ -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++;