소스 검색

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>
Daniel Hellstrom 14 년 전
부모
커밋
c897dcf631
1개의 변경된 파일7개의 추가작업 그리고 17개의 파일을 삭제
  1. 7 17
      drivers/tty/serial/apbuart.c

+ 7 - 17
drivers/tty/serial/apbuart.c

@@ -598,24 +598,12 @@ static struct platform_driver grlib_apbuart_of_driver = {
 
 
 static int grlib_apbuart_configure(void)
 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) {
 	for_each_matching_node(np, apbuart_match) {
 		const int *ampopts;
 		const int *ampopts;
+		const u32 *freq_hz;
 		const struct amba_prom_registers *regs;
 		const struct amba_prom_registers *regs;
 		struct uart_port *port;
 		struct uart_port *port;
 		unsigned long addr;
 		unsigned long addr;
@@ -624,8 +612,10 @@ static int grlib_apbuart_configure(void)
 		if (ampopts && (*ampopts == 0))
 		if (ampopts && (*ampopts == 0))
 			continue; /* Ignore if used by another OS instance */
 			continue; /* Ignore if used by another OS instance */
 		regs = of_get_property(np, "reg", NULL);
 		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;
 			continue;
 
 
 		grlib_apbuart_nodes[line] = np;
 		grlib_apbuart_nodes[line] = np;
@@ -641,7 +631,7 @@ static int grlib_apbuart_configure(void)
 		port->ops = &grlib_apbuart_ops;
 		port->ops = &grlib_apbuart_ops;
 		port->flags = UPF_BOOT_AUTOCONF;
 		port->flags = UPF_BOOT_AUTOCONF;
 		port->line = line;
 		port->line = line;
-		port->uartclk = freq_khz * 1000;
+		port->uartclk = *freq_hz;
 		port->fifosize = apbuart_scan_fifo_size((struct uart_port *) port, line);
 		port->fifosize = apbuart_scan_fifo_size((struct uart_port *) port, line);
 		line++;
 		line++;