diff options
Diffstat (limited to 'arch/arm/mach-sa1100/collie.c')
-rw-r--r-- | arch/arm/mach-sa1100/collie.c | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index 102454082474..676b5c5b75bb 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c | |||
@@ -11,7 +11,8 @@ | |||
11 | * published by the Free Software Foundation. | 11 | * published by the Free Software Foundation. |
12 | * | 12 | * |
13 | * ChangeLog: | 13 | * ChangeLog: |
14 | * 03-06-2004 John Lenz <jelenz@wisc.edu> | 14 | * 2006 Pavel Machek <pavel@suse.cz> |
15 | * 03-06-2004 John Lenz <lenz@cs.wisc.edu> | ||
15 | * 06-04-2002 Chris Larson <kergoth@digitalnemesis.net> | 16 | * 06-04-2002 Chris Larson <kergoth@digitalnemesis.net> |
16 | * 04-16-2001 Lineo Japan,Inc. ... | 17 | * 04-16-2001 Lineo Japan,Inc. ... |
17 | */ | 18 | */ |
@@ -87,12 +88,75 @@ static struct mcp_plat_data collie_mcp_data = { | |||
87 | .sclk_rate = 11981000, | 88 | .sclk_rate = 11981000, |
88 | }; | 89 | }; |
89 | 90 | ||
91 | #ifdef CONFIG_SHARP_LOCOMO | ||
92 | /* | ||
93 | * low-level UART features. | ||
94 | */ | ||
95 | static struct locomo_dev *uart_dev = NULL; | ||
96 | |||
97 | static void collie_uart_set_mctrl(struct uart_port *port, u_int mctrl) | ||
98 | { | ||
99 | if (!uart_dev) return; | ||
100 | |||
101 | if (mctrl & TIOCM_RTS) | ||
102 | locomo_gpio_write(uart_dev, LOCOMO_GPIO_RTS, 0); | ||
103 | else | ||
104 | locomo_gpio_write(uart_dev, LOCOMO_GPIO_RTS, 1); | ||
105 | |||
106 | if (mctrl & TIOCM_DTR) | ||
107 | locomo_gpio_write(uart_dev, LOCOMO_GPIO_DTR, 0); | ||
108 | else | ||
109 | locomo_gpio_write(uart_dev, LOCOMO_GPIO_DTR, 1); | ||
110 | } | ||
111 | |||
112 | static u_int collie_uart_get_mctrl(struct uart_port *port) | ||
113 | { | ||
114 | int ret = TIOCM_CD; | ||
115 | unsigned int r; | ||
116 | if (!uart_dev) return ret; | ||
117 | |||
118 | r = locomo_gpio_read_output(uart_dev, LOCOMO_GPIO_CTS & LOCOMO_GPIO_DSR); | ||
119 | if (r & LOCOMO_GPIO_CTS) | ||
120 | ret |= TIOCM_CTS; | ||
121 | if (r & LOCOMO_GPIO_DSR) | ||
122 | ret |= TIOCM_DSR; | ||
123 | |||
124 | return ret; | ||
125 | } | ||
90 | 126 | ||
91 | static struct sa1100_port_fns collie_port_fns __initdata = { | 127 | static struct sa1100_port_fns collie_port_fns __initdata = { |
92 | .set_mctrl = collie_uart_set_mctrl, | 128 | .set_mctrl = collie_uart_set_mctrl, |
93 | .get_mctrl = collie_uart_get_mctrl, | 129 | .get_mctrl = collie_uart_get_mctrl, |
94 | }; | 130 | }; |
95 | 131 | ||
132 | static int collie_uart_probe(struct locomo_dev *dev) | ||
133 | { | ||
134 | uart_dev = dev; | ||
135 | return 0; | ||
136 | } | ||
137 | |||
138 | static int collie_uart_remove(struct locomo_dev *dev) | ||
139 | { | ||
140 | uart_dev = NULL; | ||
141 | return 0; | ||
142 | } | ||
143 | |||
144 | static struct locomo_driver collie_uart_driver = { | ||
145 | .drv = { | ||
146 | .name = "collie_uart", | ||
147 | }, | ||
148 | .devid = LOCOMO_DEVID_UART, | ||
149 | .probe = collie_uart_probe, | ||
150 | .remove = collie_uart_remove, | ||
151 | }; | ||
152 | |||
153 | static int __init collie_uart_init(void) { | ||
154 | return locomo_driver_register(&collie_uart_driver); | ||
155 | } | ||
156 | device_initcall(collie_uart_init); | ||
157 | |||
158 | #endif | ||
159 | |||
96 | 160 | ||
97 | static struct resource locomo_resources[] = { | 161 | static struct resource locomo_resources[] = { |
98 | [0] = { | 162 | [0] = { |
@@ -218,6 +282,12 @@ static void __init collie_map_io(void) | |||
218 | { | 282 | { |
219 | sa1100_map_io(); | 283 | sa1100_map_io(); |
220 | iotable_init(collie_io_desc, ARRAY_SIZE(collie_io_desc)); | 284 | iotable_init(collie_io_desc, ARRAY_SIZE(collie_io_desc)); |
285 | |||
286 | #ifdef CONFIG_SHARP_LOCOMO | ||
287 | sa1100_register_uart_fns(&collie_port_fns); | ||
288 | #endif | ||
289 | sa1100_register_uart(0, 3); | ||
290 | sa1100_register_uart(1, 1); | ||
221 | } | 291 | } |
222 | 292 | ||
223 | MACHINE_START(COLLIE, "Sharp-Collie") | 293 | MACHINE_START(COLLIE, "Sharp-Collie") |