This patch updates serial.c with DM355 support.
Signed-off-by: Hui Geng <[EMAIL PROTECTED]>
---
arch/arm/mach-davinci/serial.c | 75 +++++++++++++++++----------------------
1 files changed, 33 insertions(+), 42 deletions(-)
diff --git a/arch/arm/mach-davinci/serial.c b/arch/arm/mach-davinci/serial.c
index e6ae903..fec6ac7 100644
--- a/arch/arm/mach-davinci/serial.c
+++ b/arch/arm/mach-davinci/serial.c
@@ -31,8 +31,8 @@
#include <asm/irq.h>
#include <asm/hardware.h>
#include <asm/arch/serial.h>
-#include <asm/arch/board.h>
#include <asm/arch/irqs.h>
+#include <asm/arch/cpu.h>
#define UART_DAVINCI_PWREMU 0x0c
@@ -43,36 +43,29 @@ static inline unsigned int davinci_serial_in(struct plat_serial8250_port *up,
return (unsigned int)__raw_readb(up->membase + offset);
}
-static inline void davinci_serial_outb(struct plat_serial8250_port *p,
+static inline void davinci_serial_outp(struct plat_serial8250_port *p,
int offset, int value)
{
offset <<= p->regshift;
__raw_writeb(value, p->membase + offset);
}
-static inline void davinci_serial_outs(struct plat_serial8250_port *p,
- int offset, int value)
-{
- offset <<= p->regshift;
- __raw_writew(value, p->membase + offset);
-}
-
static void __init davinci_serial_reset(struct plat_serial8250_port *p)
{
/* reset both transmitter and receiver: bits 14,13 = UTRST, URRST */
unsigned int pwremu = 0;
- davinci_serial_outb(p, UART_IER, 0); /* disable all interrupts */
+ davinci_serial_outp(p, UART_IER, 0); /* disable all interrupts */
- davinci_serial_outs(p, UART_DAVINCI_PWREMU, pwremu);
+ davinci_serial_outp(p, UART_DAVINCI_PWREMU, pwremu);
mdelay(10);
pwremu |= (0x3 << 13);
pwremu |= 0x1;
- davinci_serial_outs(p, UART_DAVINCI_PWREMU, pwremu);
+ davinci_serial_outp(p, UART_DAVINCI_PWREMU, pwremu);
}
-#define UART_DM6467_SCR __REG(DAVINCI_UART0_BASE + 0x40)
+#define UART_DM6467_SCR __REG(DAVINCI_UART0_BASE + 0x40)
/*
* Internal UARTs need to be initialized for the 8250 autoconfig to work
* properly. Note that the TX watermark initialization may not be needed
@@ -86,42 +79,40 @@ static int __init dm646x_serial_reset(void)
void __init davinci_serial_init(struct platform_device *pdev)
{
- int i;
- const struct davinci_uart_config *info;
- char name[16];
struct clk *uart_clk;
struct device *dev = &pdev->dev;
-
- /*
- * Make sure the serial ports are muxed on at this point.
- * You have to mux them off in device drivers later on
- * if not needed.
- */
-
- info = davinci_get_config(DAVINCI_TAG_UART, struct davinci_uart_config);
-
- if (info == NULL)
- return;
-
- for (i = 0; i < DAVINCI_MAX_NR_UARTS; i++) {
- struct plat_serial8250_port *p = dev->platform_data + i;
-
- if (!(info->enabled_uarts & (1 << i))) {
- p->membase = 0;
- p->mapbase = 0;
+ struct plat_serial8250_port *p;
+ int uart;
+ char uart_name[6];
+
+ memset(uart_name, 0, sizeof(uart_name));
+ for (p = dev->platform_data; p && p->flags; p++) {
+ switch (p->mapbase) {
+ case DAVINCI_UART0_BASE:
+ uart = 0;
+ break;
+ case DAVINCI_UART1_BASE:
+ uart = 1;
+ break;
+ case DAVINCI_UART2_BASE:
+ case DM355_UART2_BASE:
+ uart = 2;
+ break;
+ default:
+ dev_err(dev,
+ "Unknown UART base address 0x%08lx\n",
+ p->mapbase);
continue;
}
-
- sprintf(name, "UART%d", i);
- uart_clk = clk_get(dev, name);
+ sprintf(uart_name, "UART%i", uart);
+ uart_clk = clk_get(dev, uart_name);
if (IS_ERR(uart_clk))
- printk(KERN_ERR "%s:%d: failed to get UART%d clock\n",
- __func__, __LINE__, i);
- else {
+ dev_err(dev, "failed to get %s clock\n", uart_name);
+ else
clk_enable(uart_clk);
+
+ if (cpu_is_davinci_dm355())
davinci_serial_reset(p);
- }
}
}
-
late_initcall(dm646x_serial_reset);