1 /*
2  *  Copyright(C) MontaVista Software Inc, 2006
3  *
4  *  Author: dmitry pervushin <dpervushin@ru.mvista.com>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 #include <linux/init.h>
21 #include <linux/kernel.h>
22 #include <linux/types.h>
23 #include <linux/ioport.h>
24 #include <linux/serial_8250.h>
25 #include <linux/mtd/physmap.h>
26 
27 #include <asm/cpu.h>
28 #include <asm/bootinfo.h>
29 #include <asm/addrspace.h>
30 #include <asm/time.h>
31 #include <asm/bcache.h>
32 #include <asm/irq.h>
33 #include <asm/reboot.h>
34 #include <asm/traps.h>
35 
36 #include <asm/emma/emma2rh.h>
37 
38 
39 #define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */
40 
41 static struct resource i2c_emma_resources_0[] = {
42 	{
43 		.name	= NULL,
44 		.start	= EMMA2RH_IRQ_PIIC0,
45 		.end	= EMMA2RH_IRQ_PIIC0,
46 		.flags	= IORESOURCE_IRQ
47 	}, {
48 		.name	= NULL,
49 		.start	= EMMA2RH_PIIC0_BASE,
50 		.end	= EMMA2RH_PIIC0_BASE + 0x1000,
51 		.flags	= 0
52 	},
53 };
54 
55 struct resource i2c_emma_resources_1[] = {
56 	{
57 		.name	= NULL,
58 		.start	= EMMA2RH_IRQ_PIIC1,
59 		.end	= EMMA2RH_IRQ_PIIC1,
60 		.flags	= IORESOURCE_IRQ
61 	}, {
62 		.name	= NULL,
63 		.start	= EMMA2RH_PIIC1_BASE,
64 		.end	= EMMA2RH_PIIC1_BASE + 0x1000,
65 		.flags	= 0
66 	},
67 };
68 
69 struct resource i2c_emma_resources_2[] = {
70 	{
71 		.name	= NULL,
72 		.start	= EMMA2RH_IRQ_PIIC2,
73 		.end	= EMMA2RH_IRQ_PIIC2,
74 		.flags	= IORESOURCE_IRQ
75 	}, {
76 		.name	= NULL,
77 		.start	= EMMA2RH_PIIC2_BASE,
78 		.end	= EMMA2RH_PIIC2_BASE + 0x1000,
79 		.flags	= 0
80 	},
81 };
82 
83 struct platform_device i2c_emma_devices[] = {
84 	[0] = {
85 		.name = I2C_EMMA2RH,
86 		.id = 0,
87 		.resource = i2c_emma_resources_0,
88 		.num_resources = ARRAY_SIZE(i2c_emma_resources_0),
89 	},
90 	[1] = {
91 		.name = I2C_EMMA2RH,
92 		.id = 1,
93 		.resource = i2c_emma_resources_1,
94 		.num_resources = ARRAY_SIZE(i2c_emma_resources_1),
95 	},
96 	[2] = {
97 		.name = I2C_EMMA2RH,
98 		.id = 2,
99 		.resource = i2c_emma_resources_2,
100 		.num_resources = ARRAY_SIZE(i2c_emma_resources_2),
101 	},
102 };
103 
104 #define EMMA2RH_SERIAL_CLOCK 18544000
105 #define EMMA2RH_SERIAL_FLAGS UPF_BOOT_AUTOCONF | UPF_SKIP_TEST
106 
107 static struct  plat_serial8250_port platform_serial_ports[] = {
108 	[0] = {
109 		.membase= (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR0_BASE + 3),
110 		.mapbase = EMMA2RH_PFUR0_BASE + 3,
111 		.irq = EMMA2RH_IRQ_PFUR0,
112 		.uartclk = EMMA2RH_SERIAL_CLOCK,
113 		.regshift = 4,
114 		.iotype = UPIO_MEM,
115 		.flags = EMMA2RH_SERIAL_FLAGS,
116        }, [1] = {
117 		.membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR1_BASE + 3),
118 		.mapbase = EMMA2RH_PFUR1_BASE + 3,
119 		.irq = EMMA2RH_IRQ_PFUR1,
120 		.uartclk = EMMA2RH_SERIAL_CLOCK,
121 		.regshift = 4,
122 		.iotype = UPIO_MEM,
123 		.flags = EMMA2RH_SERIAL_FLAGS,
124        }, [2] = {
125 		.membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR2_BASE + 3),
126 		.mapbase = EMMA2RH_PFUR2_BASE + 3,
127 		.irq = EMMA2RH_IRQ_PFUR2,
128 		.uartclk = EMMA2RH_SERIAL_CLOCK,
129 		.regshift = 4,
130 		.iotype = UPIO_MEM,
131 		.flags = EMMA2RH_SERIAL_FLAGS,
132        }, [3] = {
133 		.flags = 0,
134        },
135 };
136 
137 static struct  platform_device serial_emma = {
138 	.name = "serial8250",
139 	.dev = {
140 		.platform_data = &platform_serial_ports,
141 	},
142 };
143 
144 static struct mtd_partition markeins_parts[] = {
145 	[0] = {
146 		.name = "RootFS",
147 		.offset = 0x00000000,
148 		.size = 0x00c00000,
149 	},
150 	[1] = {
151 		.name = "boot code area",
152 		.offset = MTDPART_OFS_APPEND,
153 		.size = 0x00100000,
154 	},
155 	[2] = {
156 		.name = "kernel image",
157 		.offset = MTDPART_OFS_APPEND,
158 		.size = 0x00300000,
159 	},
160 	[3] = {
161 		.name = "RootFS2",
162 		.offset = MTDPART_OFS_APPEND,
163 		.size = 0x00c00000,
164 	},
165 	[4] = {
166 		.name = "boot code area2",
167 		.offset = MTDPART_OFS_APPEND,
168 		.size = 0x00100000,
169 	},
170 	[5] = {
171 		.name = "kernel image2",
172 		.offset = MTDPART_OFS_APPEND,
173 		.size = MTDPART_SIZ_FULL,
174 	},
175 };
176 
177 static struct physmap_flash_data markeins_flash_data = {
178 	.width		= 2,
179 	.nr_parts	= ARRAY_SIZE(markeins_parts),
180 	.parts		= markeins_parts
181 };
182 
183 static struct resource markeins_flash_resource = {
184 	.start		= 0x1e000000,
185 	.end		= 0x02000000,
186 	.flags		= IORESOURCE_MEM
187 };
188 
189 static struct platform_device markeins_flash_device = {
190 	.name		= "physmap-flash",
191 	.id		= 0,
192 	.dev		= {
193         	.platform_data  = &markeins_flash_data,
194 	},
195 	.num_resources	= 1,
196 	.resource	= &markeins_flash_resource,
197 };
198 
199 static struct platform_device *devices[] = {
200 	i2c_emma_devices,
201 	i2c_emma_devices + 1,
202 	i2c_emma_devices + 2,
203 	&serial_emma,
204 	&markeins_flash_device,
205 };
206 
platform_devices_setup(void)207 static int __init platform_devices_setup(void)
208 {
209 	return platform_add_devices(devices, ARRAY_SIZE(devices));
210 }
211 
212 arch_initcall(platform_devices_setup);
213