diff options
Diffstat (limited to 'arch/arm/mach-integrator/core.c')
-rw-r--r-- | arch/arm/mach-integrator/core.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index 20071a2767cc..576a5e979c00 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c | |||
@@ -15,7 +15,9 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
17 | #include <linux/smp.h> | 17 | #include <linux/smp.h> |
18 | #include <linux/termios.h> | ||
18 | #include <linux/amba/bus.h> | 19 | #include <linux/amba/bus.h> |
20 | #include <linux/amba/serial.h> | ||
19 | 21 | ||
20 | #include <asm/hardware.h> | 22 | #include <asm/hardware.h> |
21 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
@@ -28,6 +30,8 @@ | |||
28 | 30 | ||
29 | #include "common.h" | 31 | #include "common.h" |
30 | 32 | ||
33 | static struct amba_pl010_data integrator_uart_data; | ||
34 | |||
31 | static struct amba_device rtc_device = { | 35 | static struct amba_device rtc_device = { |
32 | .dev = { | 36 | .dev = { |
33 | .bus_id = "mb:15", | 37 | .bus_id = "mb:15", |
@@ -44,6 +48,7 @@ static struct amba_device rtc_device = { | |||
44 | static struct amba_device uart0_device = { | 48 | static struct amba_device uart0_device = { |
45 | .dev = { | 49 | .dev = { |
46 | .bus_id = "mb:16", | 50 | .bus_id = "mb:16", |
51 | .platform_data = &integrator_uart_data, | ||
47 | }, | 52 | }, |
48 | .res = { | 53 | .res = { |
49 | .start = INTEGRATOR_UART0_BASE, | 54 | .start = INTEGRATOR_UART0_BASE, |
@@ -57,6 +62,7 @@ static struct amba_device uart0_device = { | |||
57 | static struct amba_device uart1_device = { | 62 | static struct amba_device uart1_device = { |
58 | .dev = { | 63 | .dev = { |
59 | .bus_id = "mb:17", | 64 | .bus_id = "mb:17", |
65 | .platform_data = &integrator_uart_data, | ||
60 | }, | 66 | }, |
61 | .res = { | 67 | .res = { |
62 | .start = INTEGRATOR_UART1_BASE, | 68 | .start = INTEGRATOR_UART1_BASE, |
@@ -115,6 +121,46 @@ static int __init integrator_init(void) | |||
115 | 121 | ||
116 | arch_initcall(integrator_init); | 122 | arch_initcall(integrator_init); |
117 | 123 | ||
124 | /* | ||
125 | * On the Integrator platform, the port RTS and DTR are provided by | ||
126 | * bits in the following SC_CTRLS register bits: | ||
127 | * RTS DTR | ||
128 | * UART0 7 6 | ||
129 | * UART1 5 4 | ||
130 | */ | ||
131 | #define SC_CTRLC (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET) | ||
132 | #define SC_CTRLS (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET) | ||
133 | |||
134 | static void integrator_uart_set_mctrl(struct amba_device *dev, void __iomem *base, unsigned int mctrl) | ||
135 | { | ||
136 | unsigned int ctrls = 0, ctrlc = 0, rts_mask, dtr_mask; | ||
137 | |||
138 | if (dev == &uart0_device) { | ||
139 | rts_mask = 1 << 4; | ||
140 | dtr_mask = 1 << 5; | ||
141 | } else { | ||
142 | rts_mask = 1 << 6; | ||
143 | dtr_mask = 1 << 7; | ||
144 | } | ||
145 | |||
146 | if (mctrl & TIOCM_RTS) | ||
147 | ctrlc |= rts_mask; | ||
148 | else | ||
149 | ctrls |= rts_mask; | ||
150 | |||
151 | if (mctrl & TIOCM_DTR) | ||
152 | ctrlc |= dtr_mask; | ||
153 | else | ||
154 | ctrls |= dtr_mask; | ||
155 | |||
156 | __raw_writel(ctrls, SC_CTRLS); | ||
157 | __raw_writel(ctrlc, SC_CTRLC); | ||
158 | } | ||
159 | |||
160 | static struct amba_pl010_data integrator_uart_data = { | ||
161 | .set_mctrl = integrator_uart_set_mctrl, | ||
162 | }; | ||
163 | |||
118 | #define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_CTRL_OFFSET | 164 | #define CM_CTRL IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_CTRL_OFFSET |
119 | 165 | ||
120 | static DEFINE_SPINLOCK(cm_lock); | 166 | static DEFINE_SPINLOCK(cm_lock); |