diff options
author | Syed Mohammed, Khasim <khasim@ti.com> | 2008-10-09 10:51:42 -0400 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2008-10-09 10:51:42 -0400 |
commit | 2885f00049f80287b14192145699774fa55c14f7 (patch) | |
tree | be5eb9664479e80828c1b4b8fc40e382ea668ef4 /arch/arm/mach-omap2/board-omap3beagle.c | |
parent | cc26b3b01bc96a8b8c36671b0dc4898b2a152ea8 (diff) |
ARM: OMAP3: Add minimal Beagle board support
Add minimal Beagle board support. Based on earlier patches
by Syed Mohammed Khasim with some fixes from linux-omap tree.
Signed-off-by: Syed Mohammed Khasim <khasim@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2/board-omap3beagle.c')
-rw-r--r-- | arch/arm/mach-omap2/board-omap3beagle.c | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c new file mode 100644 index 000000000000..baa79674e9d5 --- /dev/null +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -0,0 +1,244 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-omap2/board-omap3beagle.c | ||
3 | * | ||
4 | * Copyright (C) 2008 Texas Instruments | ||
5 | * | ||
6 | * Modified from mach-omap2/board-3430sdp.c | ||
7 | * | ||
8 | * Initial code: Syed Mohammed Khasim | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/err.h> | ||
20 | #include <linux/clk.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/leds.h> | ||
23 | #include <linux/gpio.h> | ||
24 | #include <linux/input.h> | ||
25 | #include <linux/gpio_keys.h> | ||
26 | |||
27 | #include <linux/mtd/mtd.h> | ||
28 | #include <linux/mtd/partitions.h> | ||
29 | #include <linux/mtd/nand.h> | ||
30 | |||
31 | #include <mach/hardware.h> | ||
32 | #include <asm/mach-types.h> | ||
33 | #include <asm/mach/arch.h> | ||
34 | #include <asm/mach/map.h> | ||
35 | #include <asm/mach/flash.h> | ||
36 | |||
37 | #include <mach/board.h> | ||
38 | #include <mach/common.h> | ||
39 | #include <mach/gpmc.h> | ||
40 | #include <mach/nand.h> | ||
41 | |||
42 | |||
43 | #define GPMC_CS0_BASE 0x60 | ||
44 | #define GPMC_CS_SIZE 0x30 | ||
45 | |||
46 | #define NAND_BLOCK_SIZE SZ_128K | ||
47 | |||
48 | static struct mtd_partition omap3beagle_nand_partitions[] = { | ||
49 | /* All the partition sizes are listed in terms of NAND block size */ | ||
50 | { | ||
51 | .name = "X-Loader", | ||
52 | .offset = 0, | ||
53 | .size = 4 * NAND_BLOCK_SIZE, | ||
54 | .mask_flags = MTD_WRITEABLE, /* force read-only */ | ||
55 | }, | ||
56 | { | ||
57 | .name = "U-Boot", | ||
58 | .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */ | ||
59 | .size = 15 * NAND_BLOCK_SIZE, | ||
60 | .mask_flags = MTD_WRITEABLE, /* force read-only */ | ||
61 | }, | ||
62 | { | ||
63 | .name = "U-Boot Env", | ||
64 | .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */ | ||
65 | .size = 1 * NAND_BLOCK_SIZE, | ||
66 | }, | ||
67 | { | ||
68 | .name = "Kernel", | ||
69 | .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */ | ||
70 | .size = 32 * NAND_BLOCK_SIZE, | ||
71 | }, | ||
72 | { | ||
73 | .name = "File System", | ||
74 | .offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */ | ||
75 | .size = MTDPART_SIZ_FULL, | ||
76 | }, | ||
77 | }; | ||
78 | |||
79 | static struct omap_nand_platform_data omap3beagle_nand_data = { | ||
80 | .options = NAND_BUSWIDTH_16, | ||
81 | .parts = omap3beagle_nand_partitions, | ||
82 | .nr_parts = ARRAY_SIZE(omap3beagle_nand_partitions), | ||
83 | .dma_channel = -1, /* disable DMA in OMAP NAND driver */ | ||
84 | .nand_setup = NULL, | ||
85 | .dev_ready = NULL, | ||
86 | }; | ||
87 | |||
88 | static struct resource omap3beagle_nand_resource = { | ||
89 | .flags = IORESOURCE_MEM, | ||
90 | }; | ||
91 | |||
92 | static struct platform_device omap3beagle_nand_device = { | ||
93 | .name = "omap2-nand", | ||
94 | .id = -1, | ||
95 | .dev = { | ||
96 | .platform_data = &omap3beagle_nand_data, | ||
97 | }, | ||
98 | .num_resources = 1, | ||
99 | .resource = &omap3beagle_nand_resource, | ||
100 | }; | ||
101 | |||
102 | static struct omap_uart_config omap3_beagle_uart_config __initdata = { | ||
103 | .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), | ||
104 | }; | ||
105 | |||
106 | static void __init omap3_beagle_init_irq(void) | ||
107 | { | ||
108 | omap2_init_common_hw(); | ||
109 | omap_init_irq(); | ||
110 | omap_gpio_init(); | ||
111 | } | ||
112 | |||
113 | static struct platform_device omap3_beagle_lcd_device = { | ||
114 | .name = "omap3beagle_lcd", | ||
115 | .id = -1, | ||
116 | }; | ||
117 | |||
118 | static struct omap_lcd_config omap3_beagle_lcd_config __initdata = { | ||
119 | .ctrl_name = "internal", | ||
120 | }; | ||
121 | |||
122 | static struct gpio_led gpio_leds[] = { | ||
123 | { | ||
124 | .name = "beagleboard::usr0", | ||
125 | .default_trigger = "heartbeat", | ||
126 | .gpio = 150, | ||
127 | }, | ||
128 | { | ||
129 | .name = "beagleboard::usr1", | ||
130 | .default_trigger = "mmc0", | ||
131 | .gpio = 149, | ||
132 | }, | ||
133 | }; | ||
134 | |||
135 | static struct gpio_led_platform_data gpio_led_info = { | ||
136 | .leds = gpio_leds, | ||
137 | .num_leds = ARRAY_SIZE(gpio_leds), | ||
138 | }; | ||
139 | |||
140 | static struct platform_device leds_gpio = { | ||
141 | .name = "leds-gpio", | ||
142 | .id = -1, | ||
143 | .dev = { | ||
144 | .platform_data = &gpio_led_info, | ||
145 | }, | ||
146 | }; | ||
147 | |||
148 | static struct gpio_keys_button gpio_buttons[] = { | ||
149 | { | ||
150 | .code = BTN_EXTRA, | ||
151 | .gpio = 7, | ||
152 | .desc = "user", | ||
153 | .wakeup = 1, | ||
154 | }, | ||
155 | }; | ||
156 | |||
157 | static struct gpio_keys_platform_data gpio_key_info = { | ||
158 | .buttons = gpio_buttons, | ||
159 | .nbuttons = ARRAY_SIZE(gpio_buttons), | ||
160 | }; | ||
161 | |||
162 | static struct platform_device keys_gpio = { | ||
163 | .name = "gpio-keys", | ||
164 | .id = -1, | ||
165 | .dev = { | ||
166 | .platform_data = &gpio_key_info, | ||
167 | }, | ||
168 | }; | ||
169 | |||
170 | static struct omap_board_config_kernel omap3_beagle_config[] __initdata = { | ||
171 | { OMAP_TAG_UART, &omap3_beagle_uart_config }, | ||
172 | { OMAP_TAG_LCD, &omap3_beagle_lcd_config }, | ||
173 | }; | ||
174 | |||
175 | static struct platform_device *omap3_beagle_devices[] __initdata = { | ||
176 | &omap3_beagle_lcd_device, | ||
177 | &leds_gpio, | ||
178 | &keys_gpio, | ||
179 | }; | ||
180 | |||
181 | static void __init omap3beagle_flash_init(void) | ||
182 | { | ||
183 | u8 cs = 0; | ||
184 | u8 nandcs = GPMC_CS_NUM + 1; | ||
185 | |||
186 | u32 gpmc_base_add = OMAP34XX_GPMC_VIRT; | ||
187 | |||
188 | /* find out the chip-select on which NAND exists */ | ||
189 | while (cs < GPMC_CS_NUM) { | ||
190 | u32 ret = 0; | ||
191 | ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); | ||
192 | |||
193 | if ((ret & 0xC00) == 0x800) { | ||
194 | printk(KERN_INFO "Found NAND on CS%d\n", cs); | ||
195 | if (nandcs > GPMC_CS_NUM) | ||
196 | nandcs = cs; | ||
197 | } | ||
198 | cs++; | ||
199 | } | ||
200 | |||
201 | if (nandcs > GPMC_CS_NUM) { | ||
202 | printk(KERN_INFO "NAND: Unable to find configuration " | ||
203 | "in GPMC\n "); | ||
204 | return; | ||
205 | } | ||
206 | |||
207 | if (nandcs < GPMC_CS_NUM) { | ||
208 | omap3beagle_nand_data.cs = nandcs; | ||
209 | omap3beagle_nand_data.gpmc_cs_baseaddr = (void *) | ||
210 | (gpmc_base_add + GPMC_CS0_BASE + nandcs * GPMC_CS_SIZE); | ||
211 | omap3beagle_nand_data.gpmc_baseaddr = (void *) (gpmc_base_add); | ||
212 | |||
213 | printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); | ||
214 | if (platform_device_register(&omap3beagle_nand_device) < 0) | ||
215 | printk(KERN_ERR "Unable to register NAND device\n"); | ||
216 | } | ||
217 | } | ||
218 | |||
219 | static void __init omap3_beagle_init(void) | ||
220 | { | ||
221 | platform_add_devices(omap3_beagle_devices, | ||
222 | ARRAY_SIZE(omap3_beagle_devices)); | ||
223 | omap_board_config = omap3_beagle_config; | ||
224 | omap_board_config_size = ARRAY_SIZE(omap3_beagle_config); | ||
225 | omap_serial_init(); | ||
226 | omap3beagle_flash_init(); | ||
227 | } | ||
228 | |||
229 | static void __init omap3_beagle_map_io(void) | ||
230 | { | ||
231 | omap2_set_globals_343x(); | ||
232 | omap2_map_common_io(); | ||
233 | } | ||
234 | |||
235 | MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | ||
236 | /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */ | ||
237 | .phys_io = 0x48000000, | ||
238 | .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, | ||
239 | .boot_params = 0x80000100, | ||
240 | .map_io = omap3_beagle_map_io, | ||
241 | .init_irq = omap3_beagle_init_irq, | ||
242 | .init_machine = omap3_beagle_init, | ||
243 | .timer = &omap_timer, | ||
244 | MACHINE_END | ||