Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
platform.c
Go to the documentation of this file.
1 /*
2  * Copyright(C) MontaVista Software Inc, 2006
3  *
4  * Author: dmitry pervushin <[email protected]>
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 
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 
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 
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[] = {
201  i2c_emma_devices + 1,
202  i2c_emma_devices + 2,
203  &serial_emma,
204  &markeins_flash_device,
205 };
206 
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);