Merge /spare/repo/linux-2.6/
[linux-2.6] / arch / arm / mach-ixp4xx / gtwx5715-setup.c
1 /*
2  * arch/arm/mach-ixp4xx/gtwx5715-setup.c
3  *
4  * Gemtek GTWX5715 (Linksys WRV54G) board settup
5  *
6  * Copyright (C) 2004 George T. Joseph
7  * Derived from Coyote
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  */
24
25 #include <linux/init.h>
26 #include <linux/device.h>
27 #include <linux/serial.h>
28 #include <linux/tty.h>
29 #include <linux/serial_8250.h>
30
31 #include <asm/types.h>
32 #include <asm/setup.h>
33 #include <asm/memory.h>
34 #include <asm/hardware.h>
35 #include <asm/irq.h>
36 #include <asm/mach-types.h>
37 #include <asm/mach/arch.h>
38 #include <asm/mach/flash.h>
39 #include <asm/arch/gtwx5715.h>
40
41 /*
42  * Xscale UART registers are 32 bits wide with only the least
43  * significant 8 bits having any meaning.  From a configuration
44  * perspective, this means 2 things...
45  *
46  *   Setting .regshift = 2 so that the standard 16550 registers
47  *   line up on every 4th byte.
48  *
49  *   Shifting the register start virtual address +3 bytes when
50  *   compiled big-endian.  Since register writes are done on a
51  *   single byte basis, if the shift isn't done the driver will
52  *   write the value into the most significant byte of the register,
53  *   which is ignored, instead of the least significant.
54  */
55
56 #ifdef  __ARMEB__
57 #define REG_OFFSET      3
58 #else
59 #define REG_OFFSET      0
60 #endif
61
62 /*
63  * Only the second or "console" uart is connected on the gtwx5715.
64  */
65
66 static struct resource gtwx5715_uart_resources[] = {
67         {
68                 .start  = IXP4XX_UART2_BASE_PHYS,
69                 .end    = IXP4XX_UART2_BASE_PHYS + 0x0fff,
70                 .flags  = IORESOURCE_MEM,
71         },
72         {
73                 .start  = IRQ_IXP4XX_UART2,
74                 .end    = IRQ_IXP4XX_UART2,
75                 .flags  = IORESOURCE_IRQ,
76         },
77         { },
78 };
79
80
81 static struct plat_serial8250_port gtwx5715_uart_platform_data[] = {
82         {
83         .mapbase        = IXP4XX_UART2_BASE_PHYS,
84         .membase        = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
85         .irq            = IRQ_IXP4XX_UART2,
86         .flags          = UPF_BOOT_AUTOCONF,
87         .iotype         = UPIO_MEM,
88         .regshift       = 2,
89         .uartclk        = IXP4XX_UART_XTAL,
90         },
91         { },
92 };
93
94 static struct platform_device gtwx5715_uart_device = {
95         .name           = "serial8250",
96         .id             = 0,
97         .dev                    = {
98                 .platform_data  = gtwx5715_uart_platform_data,
99         },
100         .num_resources  = 2,
101         .resource       = gtwx5715_uart_resources,
102 };
103
104
105 void __init gtwx5715_map_io(void)
106 {
107         ixp4xx_map_io();
108 }
109
110 static struct flash_platform_data gtwx5715_flash_data = {
111         .map_name       = "cfi_probe",
112         .width          = 2,
113 };
114
115 static struct resource gtwx5715_flash_resource = {
116         .start          = GTWX5715_FLASH_BASE,
117         .end            = GTWX5715_FLASH_BASE + GTWX5715_FLASH_SIZE,
118         .flags          = IORESOURCE_MEM,
119 };
120
121 static struct platform_device gtwx5715_flash = {
122         .name           = "IXP4XX-Flash",
123         .id             = 0,
124         .dev            = {
125                 .platform_data = &gtwx5715_flash_data,
126         },
127         .num_resources  = 1,
128         .resource       = &gtwx5715_flash_resource,
129 };
130
131 static struct platform_device *gtwx5715_devices[] __initdata = {
132         &gtwx5715_uart_device,
133         &gtwx5715_flash,
134 };
135
136 static void __init gtwx5715_init(void)
137 {
138         platform_add_devices(gtwx5715_devices, ARRAY_SIZE(gtwx5715_devices));
139 }
140
141
142 MACHINE_START(GTWX5715, "Gemtek GTWX5715 (Linksys WRV54G)")
143         MAINTAINER("George Joseph")
144         BOOT_MEM(PHYS_OFFSET, IXP4XX_UART2_BASE_PHYS,
145                 IXP4XX_UART2_BASE_VIRT)
146         MAPIO(gtwx5715_map_io)
147         INITIRQ(ixp4xx_init_irq)
148                   .timer                = &ixp4xx_timer,
149         BOOT_PARAMS(0x0100)
150         INIT_MACHINE(gtwx5715_init)
151 MACHINE_END
152
153