diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-omap1/Kconfig | 20 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-ams-delta.c | 116 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-generic.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-h2.c | 200 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-h3.c | 277 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-innovator.c | 56 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-netstar.c | 160 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-nokia770.c | 268 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-osk.c | 95 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-palmte.c | 12 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-perseus2.c | 123 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-voiceblue.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-omap1/devices.c | 40 | ||||
-rw-r--r-- | arch/arm/mach-omap2/Kconfig | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/board-apollon.c | 285 | ||||
-rw-r--r-- | arch/arm/mach-omap2/board-h4.c | 174 | ||||
-rw-r--r-- | arch/arm/mach-omap2/devices.c | 42 | ||||
-rw-r--r-- | arch/arm/plat-omap/devices.c | 143 |
18 files changed, 1772 insertions, 252 deletions
diff --git a/arch/arm/mach-omap1/Kconfig b/arch/arm/mach-omap1/Kconfig index 86a0f0d14345..f8d716ccc1df 100644 --- a/arch/arm/mach-omap1/Kconfig +++ b/arch/arm/mach-omap1/Kconfig | |||
@@ -69,12 +69,6 @@ config MACH_VOICEBLUE | |||
69 | Support for Voiceblue GSM/VoIP gateway. Say Y here if you have | 69 | Support for Voiceblue GSM/VoIP gateway. Say Y here if you have |
70 | such a board. | 70 | such a board. |
71 | 71 | ||
72 | config MACH_NETSTAR | ||
73 | bool "NetStar" | ||
74 | depends on ARCH_OMAP1 && ARCH_OMAP15XX | ||
75 | help | ||
76 | Support for NetStar PBX. Say Y here if you have such a board. | ||
77 | |||
78 | config MACH_OMAP_PALMTE | 72 | config MACH_OMAP_PALMTE |
79 | bool "Palm Tungsten E" | 73 | bool "Palm Tungsten E" |
80 | depends on ARCH_OMAP1 && ARCH_OMAP15XX | 74 | depends on ARCH_OMAP1 && ARCH_OMAP15XX |
@@ -85,6 +79,20 @@ config MACH_OMAP_PALMTE | |||
85 | informations. | 79 | informations. |
86 | Say Y here if you have such a PDA, say NO otherwise. | 80 | Say Y here if you have such a PDA, say NO otherwise. |
87 | 81 | ||
82 | config MACH_NOKIA770 | ||
83 | bool "Nokia 770" | ||
84 | depends on ARCH_OMAP1 && ARCH_OMAP16XX | ||
85 | help | ||
86 | Support for the Nokia 770 Internet Tablet. Say Y here if you | ||
87 | have such a device. | ||
88 | |||
89 | config MACH_AMS_DELTA | ||
90 | bool "Amstrad E3 (Delta)" | ||
91 | depends on ARCH_OMAP1 && ARCH_OMAP15XX | ||
92 | help | ||
93 | Support for the Amstrad E3 (codename Delta) videophone. Say Y here | ||
94 | if you have such a device. | ||
95 | |||
88 | config MACH_OMAP_GENERIC | 96 | config MACH_OMAP_GENERIC |
89 | bool "Generic OMAP board" | 97 | bool "Generic OMAP board" |
90 | depends on ARCH_OMAP1 && (ARCH_OMAP15XX || ARCH_OMAP16XX) | 98 | depends on ARCH_OMAP1 && (ARCH_OMAP15XX || ARCH_OMAP16XX) |
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c new file mode 100644 index 000000000000..6178f046f128 --- /dev/null +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
@@ -0,0 +1,116 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-omap1/board-ams-delta.c | ||
3 | * | ||
4 | * Modified from board-generic.c | ||
5 | * | ||
6 | * Board specific inits for the Amstrad E3 (codename Delta) videophone | ||
7 | * | ||
8 | * Copyright (C) 2006 Jonathan McDowell <noodles@earth.li> | ||
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 | |||
19 | #include <asm/hardware.h> | ||
20 | #include <asm/mach-types.h> | ||
21 | #include <asm/mach/arch.h> | ||
22 | #include <asm/mach/map.h> | ||
23 | |||
24 | #include <asm/arch/board-ams-delta.h> | ||
25 | #include <asm/arch/gpio.h> | ||
26 | #include <asm/arch/mux.h> | ||
27 | #include <asm/arch/usb.h> | ||
28 | #include <asm/arch/board.h> | ||
29 | #include <asm/arch/common.h> | ||
30 | |||
31 | static u8 ams_delta_latch1_reg; | ||
32 | static u16 ams_delta_latch2_reg; | ||
33 | |||
34 | void ams_delta_latch1_write(u8 mask, u8 value) | ||
35 | { | ||
36 | ams_delta_latch1_reg &= ~mask; | ||
37 | ams_delta_latch1_reg |= value; | ||
38 | *(volatile __u8 *) AMS_DELTA_LATCH1_VIRT = ams_delta_latch1_reg; | ||
39 | } | ||
40 | |||
41 | void ams_delta_latch2_write(u16 mask, u16 value) | ||
42 | { | ||
43 | ams_delta_latch2_reg &= ~mask; | ||
44 | ams_delta_latch2_reg |= value; | ||
45 | *(volatile __u16 *) AMS_DELTA_LATCH2_VIRT = ams_delta_latch2_reg; | ||
46 | } | ||
47 | |||
48 | static void __init ams_delta_init_irq(void) | ||
49 | { | ||
50 | omap1_init_common_hw(); | ||
51 | omap_init_irq(); | ||
52 | omap_gpio_init(); | ||
53 | } | ||
54 | |||
55 | static struct map_desc ams_delta_io_desc[] __initdata = { | ||
56 | // AMS_DELTA_LATCH1 | ||
57 | { | ||
58 | .virtual = AMS_DELTA_LATCH1_VIRT, | ||
59 | .pfn = __phys_to_pfn(AMS_DELTA_LATCH1_PHYS), | ||
60 | .length = 0x01000000, | ||
61 | .type = MT_DEVICE | ||
62 | }, | ||
63 | // AMS_DELTA_LATCH2 | ||
64 | { | ||
65 | .virtual = AMS_DELTA_LATCH2_VIRT, | ||
66 | .pfn = __phys_to_pfn(AMS_DELTA_LATCH2_PHYS), | ||
67 | .length = 0x01000000, | ||
68 | .type = MT_DEVICE | ||
69 | }, | ||
70 | // AMS_DELTA_MODEM | ||
71 | { | ||
72 | .virtual = AMS_DELTA_MODEM_VIRT, | ||
73 | .pfn = __phys_to_pfn(AMS_DELTA_MODEM_PHYS), | ||
74 | .length = 0x01000000, | ||
75 | .type = MT_DEVICE | ||
76 | } | ||
77 | }; | ||
78 | |||
79 | static struct omap_uart_config ams_delta_uart_config __initdata = { | ||
80 | .enabled_uarts = 1, | ||
81 | }; | ||
82 | |||
83 | static struct omap_board_config_kernel ams_delta_config[] = { | ||
84 | { OMAP_TAG_UART, &ams_delta_uart_config }, | ||
85 | }; | ||
86 | |||
87 | static void __init ams_delta_init(void) | ||
88 | { | ||
89 | iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc)); | ||
90 | |||
91 | omap_board_config = ams_delta_config; | ||
92 | omap_board_config_size = ARRAY_SIZE(ams_delta_config); | ||
93 | omap_serial_init(); | ||
94 | |||
95 | /* Clear latch2 (NAND, LCD, modem enable) */ | ||
96 | ams_delta_latch2_write(~0, 0); | ||
97 | } | ||
98 | |||
99 | static void __init ams_delta_map_io(void) | ||
100 | { | ||
101 | omap1_map_common_io(); | ||
102 | } | ||
103 | |||
104 | MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)") | ||
105 | /* Maintainer: Jonathan McDowell <noodles@earth.li> */ | ||
106 | .phys_io = 0xfff00000, | ||
107 | .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc, | ||
108 | .boot_params = 0x10000100, | ||
109 | .map_io = ams_delta_map_io, | ||
110 | .init_irq = ams_delta_init_irq, | ||
111 | .init_machine = ams_delta_init, | ||
112 | .timer = &omap_timer, | ||
113 | MACHINE_END | ||
114 | |||
115 | EXPORT_SYMBOL(ams_delta_latch1_write); | ||
116 | EXPORT_SYMBOL(ams_delta_latch2_write); | ||
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index a177e78b2b87..33d01adab1ed 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c | |||
@@ -88,7 +88,7 @@ static struct omap_board_config_kernel generic_config[] = { | |||
88 | static void __init omap_generic_init(void) | 88 | static void __init omap_generic_init(void) |
89 | { | 89 | { |
90 | #ifdef CONFIG_ARCH_OMAP15XX | 90 | #ifdef CONFIG_ARCH_OMAP15XX |
91 | if (cpu_is_omap1510()) { | 91 | if (cpu_is_omap15xx()) { |
92 | generic_config[0].data = &generic1510_usb_config; | 92 | generic_config[0].data = &generic1510_usb_config; |
93 | } | 93 | } |
94 | #endif | 94 | #endif |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 89f0cc74a519..cd3a06dfc0a8 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
@@ -24,7 +24,9 @@ | |||
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
26 | #include <linux/mtd/mtd.h> | 26 | #include <linux/mtd/mtd.h> |
27 | #include <linux/mtd/nand.h> | ||
27 | #include <linux/mtd/partitions.h> | 28 | #include <linux/mtd/partitions.h> |
29 | #include <linux/input.h> | ||
28 | 30 | ||
29 | #include <asm/hardware.h> | 31 | #include <asm/hardware.h> |
30 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
@@ -35,12 +37,55 @@ | |||
35 | #include <asm/arch/gpio.h> | 37 | #include <asm/arch/gpio.h> |
36 | #include <asm/arch/mux.h> | 38 | #include <asm/arch/mux.h> |
37 | #include <asm/arch/tc.h> | 39 | #include <asm/arch/tc.h> |
40 | #include <asm/arch/irda.h> | ||
38 | #include <asm/arch/usb.h> | 41 | #include <asm/arch/usb.h> |
42 | #include <asm/arch/keypad.h> | ||
39 | #include <asm/arch/common.h> | 43 | #include <asm/arch/common.h> |
44 | #include <asm/arch/mcbsp.h> | ||
45 | #include <asm/arch/omap-alsa.h> | ||
40 | 46 | ||
41 | extern int omap_gpio_init(void); | 47 | extern int omap_gpio_init(void); |
42 | 48 | ||
43 | static struct mtd_partition h2_partitions[] = { | 49 | static int h2_keymap[] = { |
50 | KEY(0, 0, KEY_LEFT), | ||
51 | KEY(0, 1, KEY_RIGHT), | ||
52 | KEY(0, 2, KEY_3), | ||
53 | KEY(0, 3, KEY_F10), | ||
54 | KEY(0, 4, KEY_F5), | ||
55 | KEY(0, 5, KEY_9), | ||
56 | KEY(1, 0, KEY_DOWN), | ||
57 | KEY(1, 1, KEY_UP), | ||
58 | KEY(1, 2, KEY_2), | ||
59 | KEY(1, 3, KEY_F9), | ||
60 | KEY(1, 4, KEY_F7), | ||
61 | KEY(1, 5, KEY_0), | ||
62 | KEY(2, 0, KEY_ENTER), | ||
63 | KEY(2, 1, KEY_6), | ||
64 | KEY(2, 2, KEY_1), | ||
65 | KEY(2, 3, KEY_F2), | ||
66 | KEY(2, 4, KEY_F6), | ||
67 | KEY(2, 5, KEY_HOME), | ||
68 | KEY(3, 0, KEY_8), | ||
69 | KEY(3, 1, KEY_5), | ||
70 | KEY(3, 2, KEY_F12), | ||
71 | KEY(3, 3, KEY_F3), | ||
72 | KEY(3, 4, KEY_F8), | ||
73 | KEY(3, 5, KEY_END), | ||
74 | KEY(4, 0, KEY_7), | ||
75 | KEY(4, 1, KEY_4), | ||
76 | KEY(4, 2, KEY_F11), | ||
77 | KEY(4, 3, KEY_F1), | ||
78 | KEY(4, 4, KEY_F4), | ||
79 | KEY(4, 5, KEY_ESC), | ||
80 | KEY(5, 0, KEY_F13), | ||
81 | KEY(5, 1, KEY_F14), | ||
82 | KEY(5, 2, KEY_F15), | ||
83 | KEY(5, 3, KEY_F16), | ||
84 | KEY(5, 4, KEY_SLEEP), | ||
85 | 0 | ||
86 | }; | ||
87 | |||
88 | static struct mtd_partition h2_nor_partitions[] = { | ||
44 | /* bootloader (U-Boot, etc) in first sector */ | 89 | /* bootloader (U-Boot, etc) in first sector */ |
45 | { | 90 | { |
46 | .name = "bootloader", | 91 | .name = "bootloader", |
@@ -71,26 +116,26 @@ static struct mtd_partition h2_partitions[] = { | |||
71 | } | 116 | } |
72 | }; | 117 | }; |
73 | 118 | ||
74 | static struct flash_platform_data h2_flash_data = { | 119 | static struct flash_platform_data h2_nor_data = { |
75 | .map_name = "cfi_probe", | 120 | .map_name = "cfi_probe", |
76 | .width = 2, | 121 | .width = 2, |
77 | .parts = h2_partitions, | 122 | .parts = h2_nor_partitions, |
78 | .nr_parts = ARRAY_SIZE(h2_partitions), | 123 | .nr_parts = ARRAY_SIZE(h2_nor_partitions), |
79 | }; | 124 | }; |
80 | 125 | ||
81 | static struct resource h2_flash_resource = { | 126 | static struct resource h2_nor_resource = { |
82 | /* This is on CS3, wherever it's mapped */ | 127 | /* This is on CS3, wherever it's mapped */ |
83 | .flags = IORESOURCE_MEM, | 128 | .flags = IORESOURCE_MEM, |
84 | }; | 129 | }; |
85 | 130 | ||
86 | static struct platform_device h2_flash_device = { | 131 | static struct platform_device h2_nor_device = { |
87 | .name = "omapflash", | 132 | .name = "omapflash", |
88 | .id = 0, | 133 | .id = 0, |
89 | .dev = { | 134 | .dev = { |
90 | .platform_data = &h2_flash_data, | 135 | .platform_data = &h2_nor_data, |
91 | }, | 136 | }, |
92 | .num_resources = 1, | 137 | .num_resources = 1, |
93 | .resource = &h2_flash_resource, | 138 | .resource = &h2_nor_resource, |
94 | }; | 139 | }; |
95 | 140 | ||
96 | static struct resource h2_smc91x_resources[] = { | 141 | static struct resource h2_smc91x_resources[] = { |
@@ -113,9 +158,119 @@ static struct platform_device h2_smc91x_device = { | |||
113 | .resource = h2_smc91x_resources, | 158 | .resource = h2_smc91x_resources, |
114 | }; | 159 | }; |
115 | 160 | ||
161 | static struct resource h2_kp_resources[] = { | ||
162 | [0] = { | ||
163 | .start = INT_KEYBOARD, | ||
164 | .end = INT_KEYBOARD, | ||
165 | .flags = IORESOURCE_IRQ, | ||
166 | }, | ||
167 | }; | ||
168 | |||
169 | static struct omap_kp_platform_data h2_kp_data = { | ||
170 | .rows = 8, | ||
171 | .cols = 8, | ||
172 | .keymap = h2_keymap, | ||
173 | .rep = 1, | ||
174 | }; | ||
175 | |||
176 | static struct platform_device h2_kp_device = { | ||
177 | .name = "omap-keypad", | ||
178 | .id = -1, | ||
179 | .dev = { | ||
180 | .platform_data = &h2_kp_data, | ||
181 | }, | ||
182 | .num_resources = ARRAY_SIZE(h2_kp_resources), | ||
183 | .resource = h2_kp_resources, | ||
184 | }; | ||
185 | |||
186 | #define H2_IRDA_FIRSEL_GPIO_PIN 17 | ||
187 | |||
188 | #if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) | ||
189 | static int h2_transceiver_mode(struct device *dev, int state) | ||
190 | { | ||
191 | if (state & IR_SIRMODE) | ||
192 | omap_set_gpio_dataout(H2_IRDA_FIRSEL_GPIO_PIN, 0); | ||
193 | else /* MIR/FIR */ | ||
194 | omap_set_gpio_dataout(H2_IRDA_FIRSEL_GPIO_PIN, 1); | ||
195 | |||
196 | return 0; | ||
197 | } | ||
198 | #endif | ||
199 | |||
200 | static struct omap_irda_config h2_irda_data = { | ||
201 | .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, | ||
202 | .rx_channel = OMAP_DMA_UART3_RX, | ||
203 | .tx_channel = OMAP_DMA_UART3_TX, | ||
204 | .dest_start = UART3_THR, | ||
205 | .src_start = UART3_RHR, | ||
206 | .tx_trigger = 0, | ||
207 | .rx_trigger = 0, | ||
208 | }; | ||
209 | |||
210 | static struct resource h2_irda_resources[] = { | ||
211 | [0] = { | ||
212 | .start = INT_UART3, | ||
213 | .end = INT_UART3, | ||
214 | .flags = IORESOURCE_IRQ, | ||
215 | }, | ||
216 | }; | ||
217 | static struct platform_device h2_irda_device = { | ||
218 | .name = "omapirda", | ||
219 | .id = 0, | ||
220 | .dev = { | ||
221 | .platform_data = &h2_irda_data, | ||
222 | }, | ||
223 | .num_resources = ARRAY_SIZE(h2_irda_resources), | ||
224 | .resource = h2_irda_resources, | ||
225 | }; | ||
226 | |||
227 | static struct platform_device h2_lcd_device = { | ||
228 | .name = "lcd_h2", | ||
229 | .id = -1, | ||
230 | }; | ||
231 | |||
232 | static struct omap_mcbsp_reg_cfg mcbsp_regs = { | ||
233 | .spcr2 = FREE | FRST | GRST | XRST | XINTM(3), | ||
234 | .spcr1 = RINTM(3) | RRST, | ||
235 | .rcr2 = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) | | ||
236 | RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(1), | ||
237 | .rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16), | ||
238 | .xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) | | ||
239 | XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG, | ||
240 | .xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16), | ||
241 | .srgr1 = FWID(15), | ||
242 | .srgr2 = GSYNC | CLKSP | FSGM | FPER(31), | ||
243 | |||
244 | .pcr0 = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP, | ||
245 | //.pcr0 = CLKXP | CLKRP, /* mcbsp: slave */ | ||
246 | }; | ||
247 | |||
248 | static struct omap_alsa_codec_config alsa_config = { | ||
249 | .name = "H2 TSC2101", | ||
250 | .mcbsp_regs_alsa = &mcbsp_regs, | ||
251 | .codec_configure_dev = NULL, // tsc2101_configure, | ||
252 | .codec_set_samplerate = NULL, // tsc2101_set_samplerate, | ||
253 | .codec_clock_setup = NULL, // tsc2101_clock_setup, | ||
254 | .codec_clock_on = NULL, // tsc2101_clock_on, | ||
255 | .codec_clock_off = NULL, // tsc2101_clock_off, | ||
256 | .get_default_samplerate = NULL, // tsc2101_get_default_samplerate, | ||
257 | }; | ||
258 | |||
259 | static struct platform_device h2_mcbsp1_device = { | ||
260 | .name = "omap_alsa_mcbsp", | ||
261 | .id = 1, | ||
262 | .dev = { | ||
263 | .platform_data = &alsa_config, | ||
264 | }, | ||
265 | }; | ||
266 | |||
116 | static struct platform_device *h2_devices[] __initdata = { | 267 | static struct platform_device *h2_devices[] __initdata = { |
117 | &h2_flash_device, | 268 | &h2_nor_device, |
118 | &h2_smc91x_device, | 269 | &h2_smc91x_device, |
270 | &h2_irda_device, | ||
271 | &h2_kp_device, | ||
272 | &h2_lcd_device, | ||
273 | &h2_mcbsp1_device, | ||
119 | }; | 274 | }; |
120 | 275 | ||
121 | static void __init h2_init_smc91x(void) | 276 | static void __init h2_init_smc91x(void) |
@@ -164,7 +319,6 @@ static struct omap_uart_config h2_uart_config __initdata = { | |||
164 | }; | 319 | }; |
165 | 320 | ||
166 | static struct omap_lcd_config h2_lcd_config __initdata = { | 321 | static struct omap_lcd_config h2_lcd_config __initdata = { |
167 | .panel_name = "h2", | ||
168 | .ctrl_name = "internal", | 322 | .ctrl_name = "internal", |
169 | }; | 323 | }; |
170 | 324 | ||
@@ -177,16 +331,34 @@ static struct omap_board_config_kernel h2_config[] = { | |||
177 | 331 | ||
178 | static void __init h2_init(void) | 332 | static void __init h2_init(void) |
179 | { | 333 | { |
180 | /* NOTE: revC boards support NAND-boot, which can put NOR on CS2B | 334 | /* Here we assume the NOR boot config: NOR on CS3 (possibly swapped |
181 | * and NAND (either 16bit or 8bit) on CS3. | 335 | * to address 0 by a dip switch), NAND on CS2B. The NAND driver will |
336 | * notice whether a NAND chip is enabled at probe time. | ||
337 | * | ||
338 | * FIXME revC boards (and H3) support NAND-boot, with a dip switch to | ||
339 | * put NOR on CS2B and NAND (which on H2 may be 16bit) on CS3. Try | ||
340 | * detecting that in code here, to avoid probing every possible flash | ||
341 | * configuration... | ||
182 | */ | 342 | */ |
183 | h2_flash_resource.end = h2_flash_resource.start = omap_cs3_phys(); | 343 | h2_nor_resource.end = h2_nor_resource.start = omap_cs3_phys(); |
184 | h2_flash_resource.end += SZ_32M - 1; | 344 | h2_nor_resource.end += SZ_32M - 1; |
345 | |||
346 | omap_cfg_reg(L3_1610_FLASH_CS2B_OE); | ||
347 | omap_cfg_reg(M8_1610_FLASH_CS2B_WE); | ||
185 | 348 | ||
186 | /* MMC: card detect and WP */ | 349 | /* MMC: card detect and WP */ |
187 | // omap_cfg_reg(U19_ARMIO1); /* CD */ | 350 | // omap_cfg_reg(U19_ARMIO1); /* CD */ |
188 | omap_cfg_reg(BALLOUT_V8_ARMIO3); /* WP */ | 351 | omap_cfg_reg(BALLOUT_V8_ARMIO3); /* WP */ |
189 | 352 | ||
353 | /* Irda */ | ||
354 | #if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) | ||
355 | omap_writel(omap_readl(FUNC_MUX_CTRL_A) | 7, FUNC_MUX_CTRL_A); | ||
356 | if (!(omap_request_gpio(H2_IRDA_FIRSEL_GPIO_PIN))) { | ||
357 | omap_set_gpio_direction(H2_IRDA_FIRSEL_GPIO_PIN, 0); | ||
358 | h2_irda_data.transceiver_mode = h2_transceiver_mode; | ||
359 | } | ||
360 | #endif | ||
361 | |||
190 | platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices)); | 362 | platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices)); |
191 | omap_board_config = h2_config; | 363 | omap_board_config = h2_config; |
192 | omap_board_config_size = ARRAY_SIZE(h2_config); | 364 | omap_board_config_size = ARRAY_SIZE(h2_config); |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index d9f386265996..4b8d0ec73cb7 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
@@ -21,8 +21,11 @@ | |||
21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/errno.h> | 23 | #include <linux/errno.h> |
24 | #include <linux/workqueue.h> | ||
24 | #include <linux/mtd/mtd.h> | 25 | #include <linux/mtd/mtd.h> |
26 | #include <linux/mtd/nand.h> | ||
25 | #include <linux/mtd/partitions.h> | 27 | #include <linux/mtd/partitions.h> |
28 | #include <linux/input.h> | ||
26 | 29 | ||
27 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
28 | #include <asm/page.h> | 31 | #include <asm/page.h> |
@@ -33,15 +36,59 @@ | |||
33 | #include <asm/mach/map.h> | 36 | #include <asm/mach/map.h> |
34 | 37 | ||
35 | #include <asm/arch/gpio.h> | 38 | #include <asm/arch/gpio.h> |
39 | #include <asm/arch/gpioexpander.h> | ||
36 | #include <asm/arch/irqs.h> | 40 | #include <asm/arch/irqs.h> |
37 | #include <asm/arch/mux.h> | 41 | #include <asm/arch/mux.h> |
38 | #include <asm/arch/tc.h> | 42 | #include <asm/arch/tc.h> |
43 | #include <asm/arch/irda.h> | ||
39 | #include <asm/arch/usb.h> | 44 | #include <asm/arch/usb.h> |
45 | #include <asm/arch/keypad.h> | ||
46 | #include <asm/arch/dma.h> | ||
40 | #include <asm/arch/common.h> | 47 | #include <asm/arch/common.h> |
41 | 48 | ||
42 | extern int omap_gpio_init(void); | 49 | extern int omap_gpio_init(void); |
43 | 50 | ||
44 | static struct mtd_partition h3_partitions[] = { | 51 | static int h3_keymap[] = { |
52 | KEY(0, 0, KEY_LEFT), | ||
53 | KEY(0, 1, KEY_RIGHT), | ||
54 | KEY(0, 2, KEY_3), | ||
55 | KEY(0, 3, KEY_F10), | ||
56 | KEY(0, 4, KEY_F5), | ||
57 | KEY(0, 5, KEY_9), | ||
58 | KEY(1, 0, KEY_DOWN), | ||
59 | KEY(1, 1, KEY_UP), | ||
60 | KEY(1, 2, KEY_2), | ||
61 | KEY(1, 3, KEY_F9), | ||
62 | KEY(1, 4, KEY_F7), | ||
63 | KEY(1, 5, KEY_0), | ||
64 | KEY(2, 0, KEY_ENTER), | ||
65 | KEY(2, 1, KEY_6), | ||
66 | KEY(2, 2, KEY_1), | ||
67 | KEY(2, 3, KEY_F2), | ||
68 | KEY(2, 4, KEY_F6), | ||
69 | KEY(2, 5, KEY_HOME), | ||
70 | KEY(3, 0, KEY_8), | ||
71 | KEY(3, 1, KEY_5), | ||
72 | KEY(3, 2, KEY_F12), | ||
73 | KEY(3, 3, KEY_F3), | ||
74 | KEY(3, 4, KEY_F8), | ||
75 | KEY(3, 5, KEY_END), | ||
76 | KEY(4, 0, KEY_7), | ||
77 | KEY(4, 1, KEY_4), | ||
78 | KEY(4, 2, KEY_F11), | ||
79 | KEY(4, 3, KEY_F1), | ||
80 | KEY(4, 4, KEY_F4), | ||
81 | KEY(4, 5, KEY_ESC), | ||
82 | KEY(5, 0, KEY_F13), | ||
83 | KEY(5, 1, KEY_F14), | ||
84 | KEY(5, 2, KEY_F15), | ||
85 | KEY(5, 3, KEY_F16), | ||
86 | KEY(5, 4, KEY_SLEEP), | ||
87 | 0 | ||
88 | }; | ||
89 | |||
90 | |||
91 | static struct mtd_partition nor_partitions[] = { | ||
45 | /* bootloader (U-Boot, etc) in first sector */ | 92 | /* bootloader (U-Boot, etc) in first sector */ |
46 | { | 93 | { |
47 | .name = "bootloader", | 94 | .name = "bootloader", |
@@ -72,26 +119,80 @@ static struct mtd_partition h3_partitions[] = { | |||
72 | } | 119 | } |
73 | }; | 120 | }; |
74 | 121 | ||
75 | static struct flash_platform_data h3_flash_data = { | 122 | static struct flash_platform_data nor_data = { |
76 | .map_name = "cfi_probe", | 123 | .map_name = "cfi_probe", |
77 | .width = 2, | 124 | .width = 2, |
78 | .parts = h3_partitions, | 125 | .parts = nor_partitions, |
79 | .nr_parts = ARRAY_SIZE(h3_partitions), | 126 | .nr_parts = ARRAY_SIZE(nor_partitions), |
80 | }; | 127 | }; |
81 | 128 | ||
82 | static struct resource h3_flash_resource = { | 129 | static struct resource nor_resource = { |
83 | /* This is on CS3, wherever it's mapped */ | 130 | /* This is on CS3, wherever it's mapped */ |
84 | .flags = IORESOURCE_MEM, | 131 | .flags = IORESOURCE_MEM, |
85 | }; | 132 | }; |
86 | 133 | ||
87 | static struct platform_device flash_device = { | 134 | static struct platform_device nor_device = { |
88 | .name = "omapflash", | 135 | .name = "omapflash", |
89 | .id = 0, | 136 | .id = 0, |
90 | .dev = { | 137 | .dev = { |
91 | .platform_data = &h3_flash_data, | 138 | .platform_data = &nor_data, |
139 | }, | ||
140 | .num_resources = 1, | ||
141 | .resource = &nor_resource, | ||
142 | }; | ||
143 | |||
144 | static struct mtd_partition nand_partitions[] = { | ||
145 | #if 0 | ||
146 | /* REVISIT: enable these partitions if you make NAND BOOT work */ | ||
147 | { | ||
148 | .name = "xloader", | ||
149 | .offset = 0, | ||
150 | .size = 64 * 1024, | ||
151 | .mask_flags = MTD_WRITEABLE, /* force read-only */ | ||
152 | }, | ||
153 | { | ||
154 | .name = "bootloader", | ||
155 | .offset = MTDPART_OFS_APPEND, | ||
156 | .size = 256 * 1024, | ||
157 | .mask_flags = MTD_WRITEABLE, /* force read-only */ | ||
158 | }, | ||
159 | { | ||
160 | .name = "params", | ||
161 | .offset = MTDPART_OFS_APPEND, | ||
162 | .size = 192 * 1024, | ||
163 | }, | ||
164 | { | ||
165 | .name = "kernel", | ||
166 | .offset = MTDPART_OFS_APPEND, | ||
167 | .size = 2 * SZ_1M, | ||
168 | }, | ||
169 | #endif | ||
170 | { | ||
171 | .name = "filesystem", | ||
172 | .size = MTDPART_SIZ_FULL, | ||
173 | .offset = MTDPART_OFS_APPEND, | ||
174 | }, | ||
175 | }; | ||
176 | |||
177 | /* dip switches control NAND chip access: 8 bit, 16 bit, or neither */ | ||
178 | static struct nand_platform_data nand_data = { | ||
179 | .options = NAND_SAMSUNG_LP_OPTIONS, | ||
180 | .parts = nand_partitions, | ||
181 | .nr_parts = ARRAY_SIZE(nand_partitions), | ||
182 | }; | ||
183 | |||
184 | static struct resource nand_resource = { | ||
185 | .flags = IORESOURCE_MEM, | ||
186 | }; | ||
187 | |||
188 | static struct platform_device nand_device = { | ||
189 | .name = "omapnand", | ||
190 | .id = 0, | ||
191 | .dev = { | ||
192 | .platform_data = &nand_data, | ||
92 | }, | 193 | }, |
93 | .num_resources = 1, | 194 | .num_resources = 1, |
94 | .resource = &h3_flash_resource, | 195 | .resource = &nand_resource, |
95 | }; | 196 | }; |
96 | 197 | ||
97 | static struct resource smc91x_resources[] = { | 198 | static struct resource smc91x_resources[] = { |
@@ -138,10 +239,136 @@ static struct platform_device intlat_device = { | |||
138 | .resource = intlat_resources, | 239 | .resource = intlat_resources, |
139 | }; | 240 | }; |
140 | 241 | ||
242 | static struct resource h3_kp_resources[] = { | ||
243 | [0] = { | ||
244 | .start = INT_KEYBOARD, | ||
245 | .end = INT_KEYBOARD, | ||
246 | .flags = IORESOURCE_IRQ, | ||
247 | }, | ||
248 | }; | ||
249 | |||
250 | static struct omap_kp_platform_data h3_kp_data = { | ||
251 | .rows = 8, | ||
252 | .cols = 8, | ||
253 | .keymap = h3_keymap, | ||
254 | .rep = 1, | ||
255 | }; | ||
256 | |||
257 | static struct platform_device h3_kp_device = { | ||
258 | .name = "omap-keypad", | ||
259 | .id = -1, | ||
260 | .dev = { | ||
261 | .platform_data = &h3_kp_data, | ||
262 | }, | ||
263 | .num_resources = ARRAY_SIZE(h3_kp_resources), | ||
264 | .resource = h3_kp_resources, | ||
265 | }; | ||
266 | |||
267 | |||
268 | /* Select between the IrDA and aGPS module | ||
269 | */ | ||
270 | static int h3_select_irda(struct device *dev, int state) | ||
271 | { | ||
272 | unsigned char expa; | ||
273 | int err = 0; | ||
274 | |||
275 | if ((err = read_gpio_expa(&expa, 0x26))) { | ||
276 | printk(KERN_ERR "Error reading from I/O EXPANDER \n"); | ||
277 | return err; | ||
278 | } | ||
279 | |||
280 | /* 'P6' enable/disable IRDA_TX and IRDA_RX */ | ||
281 | if (state & IR_SEL) { /* IrDA */ | ||
282 | if ((err = write_gpio_expa(expa | 0x40, 0x26))) { | ||
283 | printk(KERN_ERR "Error writing to I/O EXPANDER \n"); | ||
284 | return err; | ||
285 | } | ||
286 | } else { | ||
287 | if ((err = write_gpio_expa(expa & ~0x40, 0x26))) { | ||
288 | printk(KERN_ERR "Error writing to I/O EXPANDER \n"); | ||
289 | return err; | ||
290 | } | ||
291 | } | ||
292 | return err; | ||
293 | } | ||
294 | |||
295 | static void set_trans_mode(void *data) | ||
296 | { | ||
297 | int *mode = data; | ||
298 | unsigned char expa; | ||
299 | int err = 0; | ||
300 | |||
301 | if ((err = read_gpio_expa(&expa, 0x27)) != 0) { | ||
302 | printk(KERN_ERR "Error reading from I/O expander\n"); | ||
303 | } | ||
304 | |||
305 | expa &= ~0x03; | ||
306 | |||
307 | if (*mode & IR_SIRMODE) { | ||
308 | expa |= 0x01; | ||
309 | } else { /* MIR/FIR */ | ||
310 | expa |= 0x03; | ||
311 | } | ||
312 | |||
313 | if ((err = write_gpio_expa(expa, 0x27)) != 0) { | ||
314 | printk(KERN_ERR "Error writing to I/O expander\n"); | ||
315 | } | ||
316 | } | ||
317 | |||
318 | static int h3_transceiver_mode(struct device *dev, int mode) | ||
319 | { | ||
320 | struct omap_irda_config *irda_config = dev->platform_data; | ||
321 | |||
322 | cancel_delayed_work(&irda_config->gpio_expa); | ||
323 | PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode); | ||
324 | schedule_work(&irda_config->gpio_expa); | ||
325 | |||
326 | return 0; | ||
327 | } | ||
328 | |||
329 | static struct omap_irda_config h3_irda_data = { | ||
330 | .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, | ||
331 | .transceiver_mode = h3_transceiver_mode, | ||
332 | .select_irda = h3_select_irda, | ||
333 | .rx_channel = OMAP_DMA_UART3_RX, | ||
334 | .tx_channel = OMAP_DMA_UART3_TX, | ||
335 | .dest_start = UART3_THR, | ||
336 | .src_start = UART3_RHR, | ||
337 | .tx_trigger = 0, | ||
338 | .rx_trigger = 0, | ||
339 | }; | ||
340 | |||
341 | static struct resource h3_irda_resources[] = { | ||
342 | [0] = { | ||
343 | .start = INT_UART3, | ||
344 | .end = INT_UART3, | ||
345 | .flags = IORESOURCE_IRQ, | ||
346 | }, | ||
347 | }; | ||
348 | |||
349 | static struct platform_device h3_irda_device = { | ||
350 | .name = "omapirda", | ||
351 | .id = 0, | ||
352 | .dev = { | ||
353 | .platform_data = &h3_irda_data, | ||
354 | }, | ||
355 | .num_resources = ARRAY_SIZE(h3_irda_resources), | ||
356 | .resource = h3_irda_resources, | ||
357 | }; | ||
358 | |||
359 | static struct platform_device h3_lcd_device = { | ||
360 | .name = "lcd_h3", | ||
361 | .id = -1, | ||
362 | }; | ||
363 | |||
141 | static struct platform_device *devices[] __initdata = { | 364 | static struct platform_device *devices[] __initdata = { |
142 | &flash_device, | 365 | &nor_device, |
366 | &nand_device, | ||
143 | &smc91x_device, | 367 | &smc91x_device, |
144 | &intlat_device, | 368 | &intlat_device, |
369 | &h3_irda_device, | ||
370 | &h3_kp_device, | ||
371 | &h3_lcd_device, | ||
145 | }; | 372 | }; |
146 | 373 | ||
147 | static struct omap_usb_config h3_usb_config __initdata = { | 374 | static struct omap_usb_config h3_usb_config __initdata = { |
@@ -171,7 +398,6 @@ static struct omap_uart_config h3_uart_config __initdata = { | |||
171 | }; | 398 | }; |
172 | 399 | ||
173 | static struct omap_lcd_config h3_lcd_config __initdata = { | 400 | static struct omap_lcd_config h3_lcd_config __initdata = { |
174 | .panel_name = "h3", | ||
175 | .ctrl_name = "internal", | 401 | .ctrl_name = "internal", |
176 | }; | 402 | }; |
177 | 403 | ||
@@ -182,11 +408,36 @@ static struct omap_board_config_kernel h3_config[] = { | |||
182 | { OMAP_TAG_LCD, &h3_lcd_config }, | 408 | { OMAP_TAG_LCD, &h3_lcd_config }, |
183 | }; | 409 | }; |
184 | 410 | ||
411 | #define H3_NAND_RB_GPIO_PIN 10 | ||
412 | |||
413 | static int nand_dev_ready(struct nand_platform_data *data) | ||
414 | { | ||
415 | return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN); | ||
416 | } | ||
417 | |||
185 | static void __init h3_init(void) | 418 | static void __init h3_init(void) |
186 | { | 419 | { |
187 | h3_flash_resource.end = h3_flash_resource.start = omap_cs3_phys(); | 420 | /* Here we assume the NOR boot config: NOR on CS3 (possibly swapped |
188 | h3_flash_resource.end += OMAP_CS3_SIZE - 1; | 421 | * to address 0 by a dip switch), NAND on CS2B. The NAND driver will |
189 | (void) platform_add_devices(devices, ARRAY_SIZE(devices)); | 422 | * notice whether a NAND chip is enabled at probe time. |
423 | * | ||
424 | * H3 support NAND-boot, with a dip switch to put NOR on CS2B and NAND | ||
425 | * (which on H2 may be 16bit) on CS3. Try detecting that in code here, | ||
426 | * to avoid probing every possible flash configuration... | ||
427 | */ | ||
428 | nor_resource.end = nor_resource.start = omap_cs3_phys(); | ||
429 | nor_resource.end += SZ_32M - 1; | ||
430 | |||
431 | nand_resource.end = nand_resource.start = OMAP_CS2B_PHYS; | ||
432 | nand_resource.end += SZ_4K - 1; | ||
433 | if (!(omap_request_gpio(H3_NAND_RB_GPIO_PIN))) | ||
434 | nand_data.dev_ready = nand_dev_ready; | ||
435 | |||
436 | /* GPIO10 Func_MUX_CTRL reg bit 29:27, Configure V2 to mode1 as GPIO */ | ||
437 | /* GPIO10 pullup/down register, Enable pullup on GPIO10 */ | ||
438 | omap_cfg_reg(V2_1710_GPIO10); | ||
439 | |||
440 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
190 | omap_board_config = h3_config; | 441 | omap_board_config = h3_config; |
191 | omap_board_config_size = ARRAY_SIZE(h3_config); | 442 | omap_board_config_size = ARRAY_SIZE(h3_config); |
192 | omap_serial_init(); | 443 | omap_serial_init(); |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index a04e4332915e..e90c137a4cf3 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
23 | #include <linux/mtd/mtd.h> | 23 | #include <linux/mtd/mtd.h> |
24 | #include <linux/mtd/partitions.h> | 24 | #include <linux/mtd/partitions.h> |
25 | #include <linux/input.h> | ||
25 | 26 | ||
26 | #include <asm/hardware.h> | 27 | #include <asm/hardware.h> |
27 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
@@ -34,8 +35,22 @@ | |||
34 | #include <asm/arch/gpio.h> | 35 | #include <asm/arch/gpio.h> |
35 | #include <asm/arch/tc.h> | 36 | #include <asm/arch/tc.h> |
36 | #include <asm/arch/usb.h> | 37 | #include <asm/arch/usb.h> |
38 | #include <asm/arch/keypad.h> | ||
37 | #include <asm/arch/common.h> | 39 | #include <asm/arch/common.h> |
38 | 40 | ||
41 | static int innovator_keymap[] = { | ||
42 | KEY(0, 0, KEY_F1), | ||
43 | KEY(0, 3, KEY_DOWN), | ||
44 | KEY(1, 1, KEY_F2), | ||
45 | KEY(1, 2, KEY_RIGHT), | ||
46 | KEY(2, 0, KEY_F3), | ||
47 | KEY(2, 1, KEY_F4), | ||
48 | KEY(2, 2, KEY_UP), | ||
49 | KEY(3, 2, KEY_ENTER), | ||
50 | KEY(3, 3, KEY_LEFT), | ||
51 | 0 | ||
52 | }; | ||
53 | |||
39 | static struct mtd_partition innovator_partitions[] = { | 54 | static struct mtd_partition innovator_partitions[] = { |
40 | /* bootloader (U-Boot, etc) in first sector */ | 55 | /* bootloader (U-Boot, etc) in first sector */ |
41 | { | 56 | { |
@@ -97,6 +112,31 @@ static struct platform_device innovator_flash_device = { | |||
97 | .resource = &innovator_flash_resource, | 112 | .resource = &innovator_flash_resource, |
98 | }; | 113 | }; |
99 | 114 | ||
115 | static struct resource innovator_kp_resources[] = { | ||
116 | [0] = { | ||
117 | .start = INT_KEYBOARD, | ||
118 | .end = INT_KEYBOARD, | ||
119 | .flags = IORESOURCE_IRQ, | ||
120 | }, | ||
121 | }; | ||
122 | |||
123 | static struct omap_kp_platform_data innovator_kp_data = { | ||
124 | .rows = 8, | ||
125 | .cols = 8, | ||
126 | .keymap = innovator_keymap, | ||
127 | }; | ||
128 | |||
129 | static struct platform_device innovator_kp_device = { | ||
130 | .name = "omap-keypad", | ||
131 | .id = -1, | ||
132 | .dev = { | ||
133 | .platform_data = &innovator_kp_data, | ||
134 | }, | ||
135 | .num_resources = ARRAY_SIZE(innovator_kp_resources), | ||
136 | .resource = innovator_kp_resources, | ||
137 | }; | ||
138 | |||
139 | |||
100 | #ifdef CONFIG_ARCH_OMAP15XX | 140 | #ifdef CONFIG_ARCH_OMAP15XX |
101 | 141 | ||
102 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ | 142 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ |
@@ -129,9 +169,16 @@ static struct platform_device innovator1510_smc91x_device = { | |||
129 | .resource = innovator1510_smc91x_resources, | 169 | .resource = innovator1510_smc91x_resources, |
130 | }; | 170 | }; |
131 | 171 | ||
172 | static struct platform_device innovator1510_lcd_device = { | ||
173 | .name = "lcd_inn1510", | ||
174 | .id = -1, | ||
175 | }; | ||
176 | |||
132 | static struct platform_device *innovator1510_devices[] __initdata = { | 177 | static struct platform_device *innovator1510_devices[] __initdata = { |
133 | &innovator_flash_device, | 178 | &innovator_flash_device, |
134 | &innovator1510_smc91x_device, | 179 | &innovator1510_smc91x_device, |
180 | &innovator_kp_device, | ||
181 | &innovator1510_lcd_device, | ||
135 | }; | 182 | }; |
136 | 183 | ||
137 | #endif /* CONFIG_ARCH_OMAP15XX */ | 184 | #endif /* CONFIG_ARCH_OMAP15XX */ |
@@ -158,9 +205,16 @@ static struct platform_device innovator1610_smc91x_device = { | |||
158 | .resource = innovator1610_smc91x_resources, | 205 | .resource = innovator1610_smc91x_resources, |
159 | }; | 206 | }; |
160 | 207 | ||
208 | static struct platform_device innovator1610_lcd_device = { | ||
209 | .name = "inn1610_lcd", | ||
210 | .id = -1, | ||
211 | }; | ||
212 | |||
161 | static struct platform_device *innovator1610_devices[] __initdata = { | 213 | static struct platform_device *innovator1610_devices[] __initdata = { |
162 | &innovator_flash_device, | 214 | &innovator_flash_device, |
163 | &innovator1610_smc91x_device, | 215 | &innovator1610_smc91x_device, |
216 | &innovator_kp_device, | ||
217 | &innovator1610_lcd_device, | ||
164 | }; | 218 | }; |
165 | 219 | ||
166 | #endif /* CONFIG_ARCH_OMAP16XX */ | 220 | #endif /* CONFIG_ARCH_OMAP16XX */ |
@@ -206,7 +260,6 @@ static struct omap_usb_config innovator1510_usb_config __initdata = { | |||
206 | }; | 260 | }; |
207 | 261 | ||
208 | static struct omap_lcd_config innovator1510_lcd_config __initdata = { | 262 | static struct omap_lcd_config innovator1510_lcd_config __initdata = { |
209 | .panel_name = "inn1510", | ||
210 | .ctrl_name = "internal", | 263 | .ctrl_name = "internal", |
211 | }; | 264 | }; |
212 | #endif | 265 | #endif |
@@ -228,7 +281,6 @@ static struct omap_usb_config h2_usb_config __initdata = { | |||
228 | }; | 281 | }; |
229 | 282 | ||
230 | static struct omap_lcd_config innovator1610_lcd_config __initdata = { | 283 | static struct omap_lcd_config innovator1610_lcd_config __initdata = { |
231 | .panel_name = "inn1610", | ||
232 | .ctrl_name = "internal", | 284 | .ctrl_name = "internal", |
233 | }; | 285 | }; |
234 | #endif | 286 | #endif |
diff --git a/arch/arm/mach-omap1/board-netstar.c b/arch/arm/mach-omap1/board-netstar.c deleted file mode 100644 index 7520e602d7a2..000000000000 --- a/arch/arm/mach-omap1/board-netstar.c +++ /dev/null | |||
@@ -1,160 +0,0 @@ | |||
1 | /* | ||
2 | * Modified from board-generic.c | ||
3 | * | ||
4 | * Copyright (C) 2004 2N Telekomunikace, Ladislav Michl <michl@2n.cz> | ||
5 | * | ||
6 | * Code for Netstar OMAP board. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/delay.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/notifier.h> | ||
19 | #include <linux/reboot.h> | ||
20 | |||
21 | #include <asm/hardware.h> | ||
22 | #include <asm/mach-types.h> | ||
23 | #include <asm/mach/arch.h> | ||
24 | #include <asm/mach/map.h> | ||
25 | |||
26 | #include <asm/arch/gpio.h> | ||
27 | #include <asm/arch/mux.h> | ||
28 | #include <asm/arch/usb.h> | ||
29 | #include <asm/arch/common.h> | ||
30 | |||
31 | extern void __init omap_init_time(void); | ||
32 | extern int omap_gpio_init(void); | ||
33 | |||
34 | static struct resource netstar_smc91x_resources[] = { | ||
35 | [0] = { | ||
36 | .start = OMAP_CS1_PHYS + 0x300, | ||
37 | .end = OMAP_CS1_PHYS + 0x300 + 16, | ||
38 | .flags = IORESOURCE_MEM, | ||
39 | }, | ||
40 | [1] = { | ||
41 | .start = OMAP_GPIO_IRQ(8), | ||
42 | .end = OMAP_GPIO_IRQ(8), | ||
43 | .flags = IORESOURCE_IRQ, | ||
44 | }, | ||
45 | }; | ||
46 | |||
47 | static struct platform_device netstar_smc91x_device = { | ||
48 | .name = "smc91x", | ||
49 | .id = 0, | ||
50 | .num_resources = ARRAY_SIZE(netstar_smc91x_resources), | ||
51 | .resource = netstar_smc91x_resources, | ||
52 | }; | ||
53 | |||
54 | static struct platform_device *netstar_devices[] __initdata = { | ||
55 | &netstar_smc91x_device, | ||
56 | }; | ||
57 | |||
58 | static struct omap_uart_config netstar_uart_config __initdata = { | ||
59 | .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), | ||
60 | }; | ||
61 | |||
62 | static struct omap_board_config_kernel netstar_config[] = { | ||
63 | { OMAP_TAG_UART, &netstar_uart_config }, | ||
64 | }; | ||
65 | |||
66 | static void __init netstar_init_irq(void) | ||
67 | { | ||
68 | omap1_init_common_hw(); | ||
69 | omap_init_irq(); | ||
70 | omap_gpio_init(); | ||
71 | } | ||
72 | |||
73 | static void __init netstar_init(void) | ||
74 | { | ||
75 | /* green LED */ | ||
76 | omap_request_gpio(4); | ||
77 | omap_set_gpio_direction(4, 0); | ||
78 | /* smc91x reset */ | ||
79 | omap_request_gpio(7); | ||
80 | omap_set_gpio_direction(7, 0); | ||
81 | omap_set_gpio_dataout(7, 1); | ||
82 | udelay(2); /* wait at least 100ns */ | ||
83 | omap_set_gpio_dataout(7, 0); | ||
84 | mdelay(50); /* 50ms until PHY ready */ | ||
85 | /* smc91x interrupt pin */ | ||
86 | omap_request_gpio(8); | ||
87 | |||
88 | omap_request_gpio(12); | ||
89 | omap_request_gpio(13); | ||
90 | omap_request_gpio(14); | ||
91 | omap_request_gpio(15); | ||
92 | set_irq_type(OMAP_GPIO_IRQ(12), IRQT_FALLING); | ||
93 | set_irq_type(OMAP_GPIO_IRQ(13), IRQT_FALLING); | ||
94 | set_irq_type(OMAP_GPIO_IRQ(14), IRQT_FALLING); | ||
95 | set_irq_type(OMAP_GPIO_IRQ(15), IRQT_FALLING); | ||
96 | |||
97 | platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices)); | ||
98 | |||
99 | /* Switch on green LED */ | ||
100 | omap_set_gpio_dataout(4, 0); | ||
101 | /* Switch off red LED */ | ||
102 | omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */ | ||
103 | omap_writeb(0x80, OMAP_LPG1_LCR); | ||
104 | |||
105 | omap_board_config = netstar_config; | ||
106 | omap_board_config_size = ARRAY_SIZE(netstar_config); | ||
107 | omap_serial_init(); | ||
108 | } | ||
109 | |||
110 | static void __init netstar_map_io(void) | ||
111 | { | ||
112 | omap1_map_common_io(); | ||
113 | } | ||
114 | |||
115 | #define MACHINE_PANICED 1 | ||
116 | #define MACHINE_REBOOTING 2 | ||
117 | #define MACHINE_REBOOT 4 | ||
118 | static unsigned long machine_state; | ||
119 | |||
120 | static int panic_event(struct notifier_block *this, unsigned long event, | ||
121 | void *ptr) | ||
122 | { | ||
123 | if (test_and_set_bit(MACHINE_PANICED, &machine_state)) | ||
124 | return NOTIFY_DONE; | ||
125 | |||
126 | /* Switch off green LED */ | ||
127 | omap_set_gpio_dataout(4, 1); | ||
128 | /* Flash red LED */ | ||
129 | omap_writeb(0x78, OMAP_LPG1_LCR); | ||
130 | omap_writeb(0x01, OMAP_LPG1_PMR); /* Enable clock */ | ||
131 | |||
132 | return NOTIFY_DONE; | ||
133 | } | ||
134 | |||
135 | static struct notifier_block panic_block = { | ||
136 | .notifier_call = panic_event, | ||
137 | }; | ||
138 | |||
139 | static int __init netstar_late_init(void) | ||
140 | { | ||
141 | /* TODO: Setup front panel switch here */ | ||
142 | |||
143 | /* Setup panic notifier */ | ||
144 | atomic_notifier_chain_register(&panic_notifier_list, &panic_block); | ||
145 | |||
146 | return 0; | ||
147 | } | ||
148 | |||
149 | postcore_initcall(netstar_late_init); | ||
150 | |||
151 | MACHINE_START(NETSTAR, "NetStar OMAP5910") | ||
152 | /* Maintainer: Ladislav Michl <michl@2n.cz> */ | ||
153 | .phys_io = 0xfff00000, | ||
154 | .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc, | ||
155 | .boot_params = 0x10000100, | ||
156 | .map_io = netstar_map_io, | ||
157 | .init_irq = netstar_init_irq, | ||
158 | .init_machine = netstar_init, | ||
159 | .timer = &omap_timer, | ||
160 | MACHINE_END | ||
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c new file mode 100644 index 000000000000..02b980d77b12 --- /dev/null +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
@@ -0,0 +1,268 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-omap1/board-nokia770.c | ||
3 | * | ||
4 | * Modified from board-generic.c | ||
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 version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/input.h> | ||
15 | #include <linux/clk.h> | ||
16 | |||
17 | #include <linux/spi/spi.h> | ||
18 | #include <linux/spi/ads7846.h> | ||
19 | |||
20 | #include <asm/hardware.h> | ||
21 | #include <asm/mach-types.h> | ||
22 | #include <asm/mach/arch.h> | ||
23 | #include <asm/mach/map.h> | ||
24 | |||
25 | #include <asm/arch/gpio.h> | ||
26 | #include <asm/arch/mux.h> | ||
27 | #include <asm/arch/usb.h> | ||
28 | #include <asm/arch/board.h> | ||
29 | #include <asm/arch/keypad.h> | ||
30 | #include <asm/arch/common.h> | ||
31 | #include <asm/arch/dsp_common.h> | ||
32 | #include <asm/arch/aic23.h> | ||
33 | #include <asm/arch/gpio.h> | ||
34 | |||
35 | static void __init omap_nokia770_init_irq(void) | ||
36 | { | ||
37 | /* On Nokia 770, the SleepX signal is masked with an | ||
38 | * MPUIO line by default. It has to be unmasked for it | ||
39 | * to become functional */ | ||
40 | |||
41 | /* SleepX mask direction */ | ||
42 | omap_writew((omap_readw(0xfffb5008) & ~2), 0xfffb5008); | ||
43 | /* Unmask SleepX signal */ | ||
44 | omap_writew((omap_readw(0xfffb5004) & ~2), 0xfffb5004); | ||
45 | |||
46 | omap1_init_common_hw(); | ||
47 | omap_init_irq(); | ||
48 | } | ||
49 | |||
50 | static int nokia770_keymap[] = { | ||
51 | KEY(0, 1, GROUP_0 | KEY_UP), | ||
52 | KEY(0, 2, GROUP_1 | KEY_F5), | ||
53 | KEY(1, 0, GROUP_0 | KEY_LEFT), | ||
54 | KEY(1, 1, GROUP_0 | KEY_ENTER), | ||
55 | KEY(1, 2, GROUP_0 | KEY_RIGHT), | ||
56 | KEY(2, 0, GROUP_1 | KEY_ESC), | ||
57 | KEY(2, 1, GROUP_0 | KEY_DOWN), | ||
58 | KEY(2, 2, GROUP_1 | KEY_F4), | ||
59 | KEY(3, 0, GROUP_2 | KEY_F7), | ||
60 | KEY(3, 1, GROUP_2 | KEY_F8), | ||
61 | KEY(3, 2, GROUP_2 | KEY_F6), | ||
62 | 0 | ||
63 | }; | ||
64 | |||
65 | static struct resource nokia770_kp_resources[] = { | ||
66 | [0] = { | ||
67 | .start = INT_KEYBOARD, | ||
68 | .end = INT_KEYBOARD, | ||
69 | .flags = IORESOURCE_IRQ, | ||
70 | }, | ||
71 | }; | ||
72 | |||
73 | static struct omap_kp_platform_data nokia770_kp_data = { | ||
74 | .rows = 8, | ||
75 | .cols = 8, | ||
76 | .keymap = nokia770_keymap | ||
77 | }; | ||
78 | |||
79 | static struct platform_device nokia770_kp_device = { | ||
80 | .name = "omap-keypad", | ||
81 | .id = -1, | ||
82 | .dev = { | ||
83 | .platform_data = &nokia770_kp_data, | ||
84 | }, | ||
85 | .num_resources = ARRAY_SIZE(nokia770_kp_resources), | ||
86 | .resource = nokia770_kp_resources, | ||
87 | }; | ||
88 | |||
89 | static struct platform_device *nokia770_devices[] __initdata = { | ||
90 | &nokia770_kp_device, | ||
91 | }; | ||
92 | |||
93 | static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = { | ||
94 | .x_max = 0x0fff, | ||
95 | .y_max = 0x0fff, | ||
96 | .x_plate_ohms = 180, | ||
97 | .pressure_max = 255, | ||
98 | .debounce_max = 10, | ||
99 | .debounce_tol = 3, | ||
100 | }; | ||
101 | |||
102 | static struct spi_board_info nokia770_spi_board_info[] __initdata = { | ||
103 | [0] = { | ||
104 | .modalias = "lcd_lph8923", | ||
105 | .bus_num = 2, | ||
106 | .chip_select = 3, | ||
107 | .max_speed_hz = 12000000, | ||
108 | }, | ||
109 | [1] = { | ||
110 | .modalias = "ads7846", | ||
111 | .bus_num = 2, | ||
112 | .chip_select = 0, | ||
113 | .max_speed_hz = 2500000, | ||
114 | .irq = OMAP_GPIO_IRQ(15), | ||
115 | .platform_data = &nokia770_ads7846_platform_data, | ||
116 | }, | ||
117 | }; | ||
118 | |||
119 | |||
120 | /* assume no Mini-AB port */ | ||
121 | |||
122 | static struct omap_usb_config nokia770_usb_config __initdata = { | ||
123 | .otg = 1, | ||
124 | .register_host = 1, | ||
125 | .register_dev = 1, | ||
126 | .hmc_mode = 16, | ||
127 | .pins[0] = 6, | ||
128 | }; | ||
129 | |||
130 | static struct omap_mmc_config nokia770_mmc_config __initdata = { | ||
131 | .mmc[0] = { | ||
132 | .enabled = 0, | ||
133 | .wire4 = 0, | ||
134 | .wp_pin = -1, | ||
135 | .power_pin = -1, | ||
136 | .switch_pin = -1, | ||
137 | }, | ||
138 | .mmc[1] = { | ||
139 | .enabled = 0, | ||
140 | .wire4 = 0, | ||
141 | .wp_pin = -1, | ||
142 | .power_pin = -1, | ||
143 | .switch_pin = -1, | ||
144 | }, | ||
145 | }; | ||
146 | |||
147 | static struct omap_board_config_kernel nokia770_config[] = { | ||
148 | { OMAP_TAG_USB, NULL }, | ||
149 | { OMAP_TAG_MMC, &nokia770_mmc_config }, | ||
150 | }; | ||
151 | |||
152 | /* | ||
153 | * audio power control | ||
154 | */ | ||
155 | #define HEADPHONE_GPIO 14 | ||
156 | #define AMPLIFIER_CTRL_GPIO 58 | ||
157 | |||
158 | static struct clk *dspxor_ck; | ||
159 | static DECLARE_MUTEX(audio_pwr_sem); | ||
160 | /* | ||
161 | * audio_pwr_state | ||
162 | * +--+-------------------------+---------------------------------------+ | ||
163 | * |-1|down |power-up request -> 0 | | ||
164 | * +--+-------------------------+---------------------------------------+ | ||
165 | * | 0|up |power-down(1) request -> 1 | | ||
166 | * | | |power-down(2) request -> (ignore) | | ||
167 | * +--+-------------------------+---------------------------------------+ | ||
168 | * | 1|up, |power-up request -> 0 | | ||
169 | * | |received down(1) request |power-down(2) request -> -1 | | ||
170 | * +--+-------------------------+---------------------------------------+ | ||
171 | */ | ||
172 | static int audio_pwr_state = -1; | ||
173 | |||
174 | /* | ||
175 | * audio_pwr_up / down should be called under audio_pwr_sem | ||
176 | */ | ||
177 | static void nokia770_audio_pwr_up(void) | ||
178 | { | ||
179 | clk_enable(dspxor_ck); | ||
180 | |||
181 | /* Turn on codec */ | ||
182 | tlv320aic23_power_up(); | ||
183 | |||
184 | if (omap_get_gpio_datain(HEADPHONE_GPIO)) | ||
185 | /* HP not connected, turn on amplifier */ | ||
186 | omap_set_gpio_dataout(AMPLIFIER_CTRL_GPIO, 1); | ||
187 | else | ||
188 | /* HP connected, do not turn on amplifier */ | ||
189 | printk("HP connected\n"); | ||
190 | } | ||
191 | |||
192 | static void codec_delayed_power_down(void *arg) | ||
193 | { | ||
194 | down(&audio_pwr_sem); | ||
195 | if (audio_pwr_state == -1) | ||
196 | tlv320aic23_power_down(); | ||
197 | clk_disable(dspxor_ck); | ||
198 | up(&audio_pwr_sem); | ||
199 | } | ||
200 | |||
201 | static DECLARE_WORK(codec_power_down_work, codec_delayed_power_down, NULL); | ||
202 | |||
203 | static void nokia770_audio_pwr_down(void) | ||
204 | { | ||
205 | /* Turn off amplifier */ | ||
206 | omap_set_gpio_dataout(AMPLIFIER_CTRL_GPIO, 0); | ||
207 | |||
208 | /* Turn off codec: schedule delayed work */ | ||
209 | schedule_delayed_work(&codec_power_down_work, HZ / 20); /* 50ms */ | ||
210 | } | ||
211 | |||
212 | void nokia770_audio_pwr_up_request(int stage) | ||
213 | { | ||
214 | down(&audio_pwr_sem); | ||
215 | if (audio_pwr_state == -1) | ||
216 | nokia770_audio_pwr_up(); | ||
217 | /* force audio_pwr_state = 0, even if it was 1. */ | ||
218 | audio_pwr_state = 0; | ||
219 | up(&audio_pwr_sem); | ||
220 | } | ||
221 | |||
222 | void nokia770_audio_pwr_down_request(int stage) | ||
223 | { | ||
224 | down(&audio_pwr_sem); | ||
225 | switch (stage) { | ||
226 | case 1: | ||
227 | if (audio_pwr_state == 0) | ||
228 | audio_pwr_state = 1; | ||
229 | break; | ||
230 | case 2: | ||
231 | if (audio_pwr_state == 1) { | ||
232 | nokia770_audio_pwr_down(); | ||
233 | audio_pwr_state = -1; | ||
234 | } | ||
235 | break; | ||
236 | } | ||
237 | up(&audio_pwr_sem); | ||
238 | } | ||
239 | |||
240 | static void __init omap_nokia770_init(void) | ||
241 | { | ||
242 | nokia770_config[0].data = &nokia770_usb_config; | ||
243 | |||
244 | platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices)); | ||
245 | spi_register_board_info(nokia770_spi_board_info, | ||
246 | ARRAY_SIZE(nokia770_spi_board_info)); | ||
247 | omap_board_config = nokia770_config; | ||
248 | omap_board_config_size = ARRAY_SIZE(nokia770_config); | ||
249 | omap_serial_init(); | ||
250 | omap_dsp_audio_pwr_up_request = nokia770_audio_pwr_up_request; | ||
251 | omap_dsp_audio_pwr_down_request = nokia770_audio_pwr_down_request; | ||
252 | dspxor_ck = clk_get(0, "dspxor_ck"); | ||
253 | } | ||
254 | |||
255 | static void __init omap_nokia770_map_io(void) | ||
256 | { | ||
257 | omap1_map_common_io(); | ||
258 | } | ||
259 | |||
260 | MACHINE_START(NOKIA770, "Nokia 770") | ||
261 | .phys_io = 0xfff00000, | ||
262 | .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc, | ||
263 | .boot_params = 0x10000100, | ||
264 | .map_io = omap_nokia770_map_io, | ||
265 | .init_irq = omap_nokia770_init_irq, | ||
266 | .init_machine = omap_nokia770_init, | ||
267 | .timer = &omap_timer, | ||
268 | MACHINE_END | ||
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 543fa136106d..1160093e8ef6 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c | |||
@@ -33,6 +33,7 @@ | |||
33 | 33 | ||
34 | #include <linux/mtd/mtd.h> | 34 | #include <linux/mtd/mtd.h> |
35 | #include <linux/mtd/partitions.h> | 35 | #include <linux/mtd/partitions.h> |
36 | #include <linux/input.h> | ||
36 | 37 | ||
37 | #include <asm/hardware.h> | 38 | #include <asm/hardware.h> |
38 | #include <asm/mach-types.h> | 39 | #include <asm/mach-types.h> |
@@ -44,7 +45,24 @@ | |||
44 | #include <asm/arch/usb.h> | 45 | #include <asm/arch/usb.h> |
45 | #include <asm/arch/mux.h> | 46 | #include <asm/arch/mux.h> |
46 | #include <asm/arch/tc.h> | 47 | #include <asm/arch/tc.h> |
48 | #include <asm/arch/keypad.h> | ||
47 | #include <asm/arch/common.h> | 49 | #include <asm/arch/common.h> |
50 | #include <asm/arch/mcbsp.h> | ||
51 | #include <asm/arch/omap-alsa.h> | ||
52 | |||
53 | static int osk_keymap[] = { | ||
54 | KEY(0, 0, KEY_F1), | ||
55 | KEY(0, 3, KEY_UP), | ||
56 | KEY(1, 1, KEY_LEFTCTRL), | ||
57 | KEY(1, 2, KEY_LEFT), | ||
58 | KEY(2, 0, KEY_SPACE), | ||
59 | KEY(2, 1, KEY_ESC), | ||
60 | KEY(2, 2, KEY_DOWN), | ||
61 | KEY(3, 2, KEY_ENTER), | ||
62 | KEY(3, 3, KEY_RIGHT), | ||
63 | 0 | ||
64 | }; | ||
65 | |||
48 | 66 | ||
49 | static struct mtd_partition osk_partitions[] = { | 67 | static struct mtd_partition osk_partitions[] = { |
50 | /* bootloader (U-Boot, etc) in first sector */ | 68 | /* bootloader (U-Boot, etc) in first sector */ |
@@ -133,9 +151,69 @@ static struct platform_device osk5912_cf_device = { | |||
133 | .resource = osk5912_cf_resources, | 151 | .resource = osk5912_cf_resources, |
134 | }; | 152 | }; |
135 | 153 | ||
154 | #define DEFAULT_BITPERSAMPLE 16 | ||
155 | |||
156 | static struct omap_mcbsp_reg_cfg mcbsp_regs = { | ||
157 | .spcr2 = FREE | FRST | GRST | XRST | XINTM(3), | ||
158 | .spcr1 = RINTM(3) | RRST, | ||
159 | .rcr2 = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) | | ||
160 | RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(0), | ||
161 | .rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16), | ||
162 | .xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) | | ||
163 | XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(0) | XFIG, | ||
164 | .xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16), | ||
165 | .srgr1 = FWID(DEFAULT_BITPERSAMPLE - 1), | ||
166 | .srgr2 = GSYNC | CLKSP | FSGM | FPER(DEFAULT_BITPERSAMPLE * 2 - 1), | ||
167 | /*.pcr0 = FSXM | FSRM | CLKXM | CLKRM | CLKXP | CLKRP,*/ /* mcbsp: master */ | ||
168 | .pcr0 = CLKXP | CLKRP, /* mcbsp: slave */ | ||
169 | }; | ||
170 | |||
171 | static struct omap_alsa_codec_config alsa_config = { | ||
172 | .name = "OSK AIC23", | ||
173 | .mcbsp_regs_alsa = &mcbsp_regs, | ||
174 | .codec_configure_dev = NULL, // aic23_configure, | ||
175 | .codec_set_samplerate = NULL, // aic23_set_samplerate, | ||
176 | .codec_clock_setup = NULL, // aic23_clock_setup, | ||
177 | .codec_clock_on = NULL, // aic23_clock_on, | ||
178 | .codec_clock_off = NULL, // aic23_clock_off, | ||
179 | .get_default_samplerate = NULL, // aic23_get_default_samplerate, | ||
180 | }; | ||
181 | |||
136 | static struct platform_device osk5912_mcbsp1_device = { | 182 | static struct platform_device osk5912_mcbsp1_device = { |
137 | .name = "omap_mcbsp", | 183 | .name = "omap_alsa_mcbsp", |
138 | .id = 1, | 184 | .id = 1, |
185 | .dev = { | ||
186 | .platform_data = &alsa_config, | ||
187 | }, | ||
188 | }; | ||
189 | |||
190 | static struct resource osk5912_kp_resources[] = { | ||
191 | [0] = { | ||
192 | .start = INT_KEYBOARD, | ||
193 | .end = INT_KEYBOARD, | ||
194 | .flags = IORESOURCE_IRQ, | ||
195 | }, | ||
196 | }; | ||
197 | |||
198 | static struct omap_kp_platform_data osk_kp_data = { | ||
199 | .rows = 8, | ||
200 | .cols = 8, | ||
201 | .keymap = osk_keymap, | ||
202 | }; | ||
203 | |||
204 | static struct platform_device osk5912_kp_device = { | ||
205 | .name = "omap-keypad", | ||
206 | .id = -1, | ||
207 | .dev = { | ||
208 | .platform_data = &osk_kp_data, | ||
209 | }, | ||
210 | .num_resources = ARRAY_SIZE(osk5912_kp_resources), | ||
211 | .resource = osk5912_kp_resources, | ||
212 | }; | ||
213 | |||
214 | static struct platform_device osk5912_lcd_device = { | ||
215 | .name = "lcd_osk", | ||
216 | .id = -1, | ||
139 | }; | 217 | }; |
140 | 218 | ||
141 | static struct platform_device *osk5912_devices[] __initdata = { | 219 | static struct platform_device *osk5912_devices[] __initdata = { |
@@ -143,6 +221,8 @@ static struct platform_device *osk5912_devices[] __initdata = { | |||
143 | &osk5912_smc91x_device, | 221 | &osk5912_smc91x_device, |
144 | &osk5912_cf_device, | 222 | &osk5912_cf_device, |
145 | &osk5912_mcbsp1_device, | 223 | &osk5912_mcbsp1_device, |
224 | &osk5912_kp_device, | ||
225 | &osk5912_lcd_device, | ||
146 | }; | 226 | }; |
147 | 227 | ||
148 | static void __init osk_init_smc91x(void) | 228 | static void __init osk_init_smc91x(void) |
@@ -197,7 +277,6 @@ static struct omap_uart_config osk_uart_config __initdata = { | |||
197 | }; | 277 | }; |
198 | 278 | ||
199 | static struct omap_lcd_config osk_lcd_config __initdata = { | 279 | static struct omap_lcd_config osk_lcd_config __initdata = { |
200 | .panel_name = "osk", | ||
201 | .ctrl_name = "internal", | 280 | .ctrl_name = "internal", |
202 | }; | 281 | }; |
203 | 282 | ||
@@ -255,8 +334,18 @@ static void __init osk_mistral_init(void) | |||
255 | static void __init osk_mistral_init(void) { } | 334 | static void __init osk_mistral_init(void) { } |
256 | #endif | 335 | #endif |
257 | 336 | ||
337 | #define EMIFS_CS3_VAL (0x88013141) | ||
338 | |||
258 | static void __init osk_init(void) | 339 | static void __init osk_init(void) |
259 | { | 340 | { |
341 | /* Workaround for wrong CS3 (NOR flash) timing | ||
342 | * There are some U-Boot versions out there which configure | ||
343 | * wrong CS3 memory timings. This mainly leads to CRC | ||
344 | * or similiar errors if you use NOR flash (e.g. with JFFS2) | ||
345 | */ | ||
346 | if (EMIFS_CCS(3) != EMIFS_CS3_VAL) | ||
347 | EMIFS_CCS(3) = EMIFS_CS3_VAL; | ||
348 | |||
260 | osk_flash_resource.end = osk_flash_resource.start = omap_cs3_phys(); | 349 | osk_flash_resource.end = osk_flash_resource.start = omap_cs3_phys(); |
261 | osk_flash_resource.end += SZ_32M - 1; | 350 | osk_flash_resource.end += SZ_32M - 1; |
262 | platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices)); | 351 | platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices)); |
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index e488f7236775..4bc8a62909b9 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c | |||
@@ -38,6 +38,15 @@ static void __init omap_generic_init_irq(void) | |||
38 | omap_init_irq(); | 38 | omap_init_irq(); |
39 | } | 39 | } |
40 | 40 | ||
41 | static struct platform_device palmte_lcd_device = { | ||
42 | .name = "lcd_palmte", | ||
43 | .id = -1, | ||
44 | }; | ||
45 | |||
46 | static struct platform_device *devices[] __initdata = { | ||
47 | &palmte_lcd_device, | ||
48 | }; | ||
49 | |||
41 | static struct omap_usb_config palmte_usb_config __initdata = { | 50 | static struct omap_usb_config palmte_usb_config __initdata = { |
42 | .register_dev = 1, | 51 | .register_dev = 1, |
43 | .hmc_mode = 0, | 52 | .hmc_mode = 0, |
@@ -55,7 +64,6 @@ static struct omap_mmc_config palmte_mmc_config __initdata = { | |||
55 | }; | 64 | }; |
56 | 65 | ||
57 | static struct omap_lcd_config palmte_lcd_config __initdata = { | 66 | static struct omap_lcd_config palmte_lcd_config __initdata = { |
58 | .panel_name = "palmte", | ||
59 | .ctrl_name = "internal", | 67 | .ctrl_name = "internal", |
60 | }; | 68 | }; |
61 | 69 | ||
@@ -69,6 +77,8 @@ static void __init omap_generic_init(void) | |||
69 | { | 77 | { |
70 | omap_board_config = palmte_config; | 78 | omap_board_config = palmte_config; |
71 | omap_board_config_size = ARRAY_SIZE(palmte_config); | 79 | omap_board_config_size = ARRAY_SIZE(palmte_config); |
80 | |||
81 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
72 | } | 82 | } |
73 | 83 | ||
74 | static void __init omap_generic_map_io(void) | 84 | static void __init omap_generic_map_io(void) |
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 3913a3cc0ce6..64b45d8ae357 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c | |||
@@ -16,7 +16,9 @@ | |||
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
18 | #include <linux/mtd/mtd.h> | 18 | #include <linux/mtd/mtd.h> |
19 | #include <linux/mtd/nand.h> | ||
19 | #include <linux/mtd/partitions.h> | 20 | #include <linux/mtd/partitions.h> |
21 | #include <linux/input.h> | ||
20 | 22 | ||
21 | #include <asm/hardware.h> | 23 | #include <asm/hardware.h> |
22 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
@@ -28,9 +30,44 @@ | |||
28 | #include <asm/arch/gpio.h> | 30 | #include <asm/arch/gpio.h> |
29 | #include <asm/arch/mux.h> | 31 | #include <asm/arch/mux.h> |
30 | #include <asm/arch/fpga.h> | 32 | #include <asm/arch/fpga.h> |
33 | #include <asm/arch/keypad.h> | ||
31 | #include <asm/arch/common.h> | 34 | #include <asm/arch/common.h> |
32 | #include <asm/arch/board.h> | 35 | #include <asm/arch/board.h> |
33 | 36 | ||
37 | static int p2_keymap[] = { | ||
38 | KEY(0,0,KEY_UP), | ||
39 | KEY(0,1,KEY_RIGHT), | ||
40 | KEY(0,2,KEY_LEFT), | ||
41 | KEY(0,3,KEY_DOWN), | ||
42 | KEY(0,4,KEY_CENTER), | ||
43 | KEY(0,5,KEY_0_5), | ||
44 | KEY(1,0,KEY_SOFT2), | ||
45 | KEY(1,1,KEY_SEND), | ||
46 | KEY(1,2,KEY_END), | ||
47 | KEY(1,3,KEY_VOLUMEDOWN), | ||
48 | KEY(1,4,KEY_VOLUMEUP), | ||
49 | KEY(1,5,KEY_RECORD), | ||
50 | KEY(2,0,KEY_SOFT1), | ||
51 | KEY(2,1,KEY_3), | ||
52 | KEY(2,2,KEY_6), | ||
53 | KEY(2,3,KEY_9), | ||
54 | KEY(2,4,KEY_SHARP), | ||
55 | KEY(2,5,KEY_2_5), | ||
56 | KEY(3,0,KEY_BACK), | ||
57 | KEY(3,1,KEY_2), | ||
58 | KEY(3,2,KEY_5), | ||
59 | KEY(3,3,KEY_8), | ||
60 | KEY(3,4,KEY_0), | ||
61 | KEY(3,5,KEY_HEADSETHOOK), | ||
62 | KEY(4,0,KEY_HOME), | ||
63 | KEY(4,1,KEY_1), | ||
64 | KEY(4,2,KEY_4), | ||
65 | KEY(4,3,KEY_7), | ||
66 | KEY(4,4,KEY_STAR), | ||
67 | KEY(4,5,KEY_POWER), | ||
68 | 0 | ||
69 | }; | ||
70 | |||
34 | static struct resource smc91x_resources[] = { | 71 | static struct resource smc91x_resources[] = { |
35 | [0] = { | 72 | [0] = { |
36 | .start = H2P2_DBG_FPGA_ETHR_START, /* Physical */ | 73 | .start = H2P2_DBG_FPGA_ETHR_START, /* Physical */ |
@@ -44,7 +81,7 @@ static struct resource smc91x_resources[] = { | |||
44 | }, | 81 | }, |
45 | }; | 82 | }; |
46 | 83 | ||
47 | static struct mtd_partition p2_partitions[] = { | 84 | static struct mtd_partition nor_partitions[] = { |
48 | /* bootloader (U-Boot, etc) in first sector */ | 85 | /* bootloader (U-Boot, etc) in first sector */ |
49 | { | 86 | { |
50 | .name = "bootloader", | 87 | .name = "bootloader", |
@@ -75,27 +112,47 @@ static struct mtd_partition p2_partitions[] = { | |||
75 | }, | 112 | }, |
76 | }; | 113 | }; |
77 | 114 | ||
78 | static struct flash_platform_data p2_flash_data = { | 115 | static struct flash_platform_data nor_data = { |
79 | .map_name = "cfi_probe", | 116 | .map_name = "cfi_probe", |
80 | .width = 2, | 117 | .width = 2, |
81 | .parts = p2_partitions, | 118 | .parts = nor_partitions, |
82 | .nr_parts = ARRAY_SIZE(p2_partitions), | 119 | .nr_parts = ARRAY_SIZE(nor_partitions), |
83 | }; | 120 | }; |
84 | 121 | ||
85 | static struct resource p2_flash_resource = { | 122 | static struct resource nor_resource = { |
86 | .start = OMAP_CS0_PHYS, | 123 | .start = OMAP_CS0_PHYS, |
87 | .end = OMAP_CS0_PHYS + SZ_32M - 1, | 124 | .end = OMAP_CS0_PHYS + SZ_32M - 1, |
88 | .flags = IORESOURCE_MEM, | 125 | .flags = IORESOURCE_MEM, |
89 | }; | 126 | }; |
90 | 127 | ||
91 | static struct platform_device p2_flash_device = { | 128 | static struct platform_device nor_device = { |
92 | .name = "omapflash", | 129 | .name = "omapflash", |
93 | .id = 0, | 130 | .id = 0, |
94 | .dev = { | 131 | .dev = { |
95 | .platform_data = &p2_flash_data, | 132 | .platform_data = &nor_data, |
133 | }, | ||
134 | .num_resources = 1, | ||
135 | .resource = &nor_resource, | ||
136 | }; | ||
137 | |||
138 | static struct nand_platform_data nand_data = { | ||
139 | .options = NAND_SAMSUNG_LP_OPTIONS, | ||
140 | }; | ||
141 | |||
142 | static struct resource nand_resource = { | ||
143 | .start = OMAP_CS3_PHYS, | ||
144 | .end = OMAP_CS3_PHYS + SZ_4K - 1, | ||
145 | .flags = IORESOURCE_MEM, | ||
146 | }; | ||
147 | |||
148 | static struct platform_device nand_device = { | ||
149 | .name = "omapnand", | ||
150 | .id = 0, | ||
151 | .dev = { | ||
152 | .platform_data = &nand_data, | ||
96 | }, | 153 | }, |
97 | .num_resources = 1, | 154 | .num_resources = 1, |
98 | .resource = &p2_flash_resource, | 155 | .resource = &nand_resource, |
99 | }; | 156 | }; |
100 | 157 | ||
101 | static struct platform_device smc91x_device = { | 158 | static struct platform_device smc91x_device = { |
@@ -105,17 +162,55 @@ static struct platform_device smc91x_device = { | |||
105 | .resource = smc91x_resources, | 162 | .resource = smc91x_resources, |
106 | }; | 163 | }; |
107 | 164 | ||
165 | static struct resource kp_resources[] = { | ||
166 | [0] = { | ||
167 | .start = INT_730_MPUIO_KEYPAD, | ||
168 | .end = INT_730_MPUIO_KEYPAD, | ||
169 | .flags = IORESOURCE_IRQ, | ||
170 | }, | ||
171 | }; | ||
172 | |||
173 | static struct omap_kp_platform_data kp_data = { | ||
174 | .rows = 8, | ||
175 | .cols = 8, | ||
176 | .keymap = p2_keymap, | ||
177 | }; | ||
178 | |||
179 | static struct platform_device kp_device = { | ||
180 | .name = "omap-keypad", | ||
181 | .id = -1, | ||
182 | .dev = { | ||
183 | .platform_data = &kp_data, | ||
184 | }, | ||
185 | .num_resources = ARRAY_SIZE(kp_resources), | ||
186 | .resource = kp_resources, | ||
187 | }; | ||
188 | |||
189 | static struct platform_device lcd_device = { | ||
190 | .name = "lcd_p2", | ||
191 | .id = -1, | ||
192 | }; | ||
193 | |||
108 | static struct platform_device *devices[] __initdata = { | 194 | static struct platform_device *devices[] __initdata = { |
109 | &p2_flash_device, | 195 | &nor_device, |
196 | &nand_device, | ||
110 | &smc91x_device, | 197 | &smc91x_device, |
198 | &kp_device, | ||
199 | &lcd_device, | ||
111 | }; | 200 | }; |
112 | 201 | ||
202 | #define P2_NAND_RB_GPIO_PIN 62 | ||
203 | |||
204 | static int nand_dev_ready(struct nand_platform_data *data) | ||
205 | { | ||
206 | return omap_get_gpio_datain(P2_NAND_RB_GPIO_PIN); | ||
207 | } | ||
208 | |||
113 | static struct omap_uart_config perseus2_uart_config __initdata = { | 209 | static struct omap_uart_config perseus2_uart_config __initdata = { |
114 | .enabled_uarts = ((1 << 0) | (1 << 1)), | 210 | .enabled_uarts = ((1 << 0) | (1 << 1)), |
115 | }; | 211 | }; |
116 | 212 | ||
117 | static struct omap_lcd_config perseus2_lcd_config __initdata = { | 213 | static struct omap_lcd_config perseus2_lcd_config __initdata = { |
118 | .panel_name = "p2", | ||
119 | .ctrl_name = "internal", | 214 | .ctrl_name = "internal", |
120 | }; | 215 | }; |
121 | 216 | ||
@@ -126,7 +221,13 @@ static struct omap_board_config_kernel perseus2_config[] = { | |||
126 | 221 | ||
127 | static void __init omap_perseus2_init(void) | 222 | static void __init omap_perseus2_init(void) |
128 | { | 223 | { |
129 | (void) platform_add_devices(devices, ARRAY_SIZE(devices)); | 224 | if (!(omap_request_gpio(P2_NAND_RB_GPIO_PIN))) |
225 | nand_data.dev_ready = nand_dev_ready; | ||
226 | |||
227 | omap_cfg_reg(L3_1610_FLASH_CS2B_OE); | ||
228 | omap_cfg_reg(M8_1610_FLASH_CS2B_WE); | ||
229 | |||
230 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
130 | 231 | ||
131 | omap_board_config = perseus2_config; | 232 | omap_board_config = perseus2_config; |
132 | omap_board_config_size = ARRAY_SIZE(perseus2_config); | 233 | omap_board_config_size = ARRAY_SIZE(perseus2_config); |
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 52e4a9d69642..447a586eb334 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c | |||
@@ -155,9 +155,9 @@ static struct omap_uart_config voiceblue_uart_config __initdata = { | |||
155 | }; | 155 | }; |
156 | 156 | ||
157 | static struct omap_board_config_kernel voiceblue_config[] = { | 157 | static struct omap_board_config_kernel voiceblue_config[] = { |
158 | { OMAP_TAG_USB, &voiceblue_usb_config }, | 158 | { OMAP_TAG_USB, &voiceblue_usb_config }, |
159 | { OMAP_TAG_MMC, &voiceblue_mmc_config }, | 159 | { OMAP_TAG_MMC, &voiceblue_mmc_config }, |
160 | { OMAP_TAG_UART, &voiceblue_uart_config }, | 160 | { OMAP_TAG_UART, &voiceblue_uart_config }, |
161 | }; | 161 | }; |
162 | 162 | ||
163 | static void __init voiceblue_init_irq(void) | 163 | static void __init voiceblue_init_irq(void) |
@@ -235,7 +235,7 @@ static struct notifier_block panic_block = { | |||
235 | static int __init voiceblue_setup(void) | 235 | static int __init voiceblue_setup(void) |
236 | { | 236 | { |
237 | /* Setup panic notifier */ | 237 | /* Setup panic notifier */ |
238 | atomic_notifier_chain_register(&panic_notifier_list, &panic_block); | 238 | notifier_chain_register(&panic_notifier_list, &panic_block); |
239 | 239 | ||
240 | return 0; | 240 | return 0; |
241 | } | 241 | } |
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index ecbc47514adc..876c38da14f7 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c | |||
@@ -99,6 +99,45 @@ static void omap_init_rtc(void) | |||
99 | static inline void omap_init_rtc(void) {} | 99 | static inline void omap_init_rtc(void) {} |
100 | #endif | 100 | #endif |
101 | 101 | ||
102 | #if defined(CONFIG_OMAP_STI) | ||
103 | |||
104 | #define OMAP1_STI_BASE IO_ADDRESS(0xfffea000) | ||
105 | #define OMAP1_STI_CHANNEL_BASE (OMAP1_STI_BASE + 0x400) | ||
106 | |||
107 | static struct resource sti_resources[] = { | ||
108 | { | ||
109 | .start = OMAP1_STI_BASE, | ||
110 | .end = OMAP1_STI_BASE + SZ_1K - 1, | ||
111 | .flags = IORESOURCE_MEM, | ||
112 | }, | ||
113 | { | ||
114 | .start = OMAP1_STI_CHANNEL_BASE, | ||
115 | .end = OMAP1_STI_CHANNEL_BASE + SZ_1K - 1, | ||
116 | .flags = IORESOURCE_MEM, | ||
117 | }, | ||
118 | { | ||
119 | .start = INT_1610_STI, | ||
120 | .flags = IORESOURCE_IRQ, | ||
121 | } | ||
122 | }; | ||
123 | |||
124 | static struct platform_device sti_device = { | ||
125 | .name = "sti", | ||
126 | .id = -1, | ||
127 | .dev = { | ||
128 | .release = omap_nop_release, | ||
129 | }, | ||
130 | .num_resources = ARRAY_SIZE(sti_resources), | ||
131 | .resource = sti_resources, | ||
132 | }; | ||
133 | |||
134 | static inline void omap_init_sti(void) | ||
135 | { | ||
136 | platform_device_register(&sti_device); | ||
137 | } | ||
138 | #else | ||
139 | static inline void omap_init_sti(void) {} | ||
140 | #endif | ||
102 | 141 | ||
103 | /*-------------------------------------------------------------------------*/ | 142 | /*-------------------------------------------------------------------------*/ |
104 | 143 | ||
@@ -129,6 +168,7 @@ static int __init omap1_init_devices(void) | |||
129 | */ | 168 | */ |
130 | omap_init_irda(); | 169 | omap_init_irda(); |
131 | omap_init_rtc(); | 170 | omap_init_rtc(); |
171 | omap_init_sti(); | ||
132 | 172 | ||
133 | return 0; | 173 | return 0; |
134 | } | 174 | } |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 578880943cf2..537dd2e6d380 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -20,3 +20,6 @@ config MACH_OMAP_H4 | |||
20 | bool "OMAP 2420 H4 board" | 20 | bool "OMAP 2420 H4 board" |
21 | depends on ARCH_OMAP2 && ARCH_OMAP24XX | 21 | depends on ARCH_OMAP2 && ARCH_OMAP24XX |
22 | 22 | ||
23 | config MACH_OMAP_APOLLON | ||
24 | bool "OMAP 2420 Apollon board" | ||
25 | depends on ARCH_OMAP2 && ARCH_OMAP24XX | ||
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c new file mode 100644 index 000000000000..6c6ba172cdf6 --- /dev/null +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -0,0 +1,285 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-omap/omap2/board-apollon.c | ||
3 | * | ||
4 | * Copyright (C) 2005,2006 Samsung Electronics | ||
5 | * Author: Kyungmin Park <kyungmin.park@samsung.com> | ||
6 | * | ||
7 | * Modified from mach-omap/omap2/board-h4.c | ||
8 | * | ||
9 | * Code for apollon OMAP2 board. Should work on many OMAP2 systems where | ||
10 | * the bootloader passes the board-specific data to the kernel. | ||
11 | * Do not put any board specific code to this file; create a new machine | ||
12 | * type if you need custom low-level initializations. | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License version 2 as | ||
16 | * published by the Free Software Foundation. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/mtd/mtd.h> | ||
23 | #include <linux/mtd/partitions.h> | ||
24 | #include <linux/mtd/onenand.h> | ||
25 | #include <linux/interrupt.h> | ||
26 | #include <linux/delay.h> | ||
27 | |||
28 | #include <asm/hardware.h> | ||
29 | #include <asm/mach-types.h> | ||
30 | #include <asm/mach/arch.h> | ||
31 | #include <asm/mach/flash.h> | ||
32 | |||
33 | #include <asm/arch/gpio.h> | ||
34 | #include <asm/arch/mux.h> | ||
35 | #include <asm/arch/usb.h> | ||
36 | #include <asm/arch/board.h> | ||
37 | #include <asm/arch/common.h> | ||
38 | #include "prcm-regs.h" | ||
39 | |||
40 | /* LED & Switch macros */ | ||
41 | #define LED0_GPIO13 13 | ||
42 | #define LED1_GPIO14 14 | ||
43 | #define LED2_GPIO15 15 | ||
44 | #define SW_ENTER_GPIO16 16 | ||
45 | #define SW_UP_GPIO17 17 | ||
46 | #define SW_DOWN_GPIO58 58 | ||
47 | |||
48 | static struct mtd_partition apollon_partitions[] = { | ||
49 | { | ||
50 | .name = "X-Loader + U-Boot", | ||
51 | .offset = 0, | ||
52 | .size = SZ_128K, | ||
53 | .mask_flags = MTD_WRITEABLE, | ||
54 | }, | ||
55 | { | ||
56 | .name = "params", | ||
57 | .offset = MTDPART_OFS_APPEND, | ||
58 | .size = SZ_128K, | ||
59 | }, | ||
60 | { | ||
61 | .name = "kernel", | ||
62 | .offset = MTDPART_OFS_APPEND, | ||
63 | .size = SZ_2M, | ||
64 | }, | ||
65 | { | ||
66 | .name = "rootfs", | ||
67 | .offset = MTDPART_OFS_APPEND, | ||
68 | .size = SZ_16M, | ||
69 | }, | ||
70 | { | ||
71 | .name = "filesystem00", | ||
72 | .offset = MTDPART_OFS_APPEND, | ||
73 | .size = SZ_32M, | ||
74 | }, | ||
75 | { | ||
76 | .name = "filesystem01", | ||
77 | .offset = MTDPART_OFS_APPEND, | ||
78 | .size = MTDPART_SIZ_FULL, | ||
79 | }, | ||
80 | }; | ||
81 | |||
82 | static struct flash_platform_data apollon_flash_data = { | ||
83 | .parts = apollon_partitions, | ||
84 | .nr_parts = ARRAY_SIZE(apollon_partitions), | ||
85 | }; | ||
86 | |||
87 | static struct resource apollon_flash_resource = { | ||
88 | .start = APOLLON_CS0_BASE, | ||
89 | .end = APOLLON_CS0_BASE + SZ_128K, | ||
90 | .flags = IORESOURCE_MEM, | ||
91 | }; | ||
92 | |||
93 | static struct platform_device apollon_onenand_device = { | ||
94 | .name = "onenand", | ||
95 | .id = -1, | ||
96 | .dev = { | ||
97 | .platform_data = &apollon_flash_data, | ||
98 | }, | ||
99 | .num_resources = ARRAY_SIZE(&apollon_flash_resource), | ||
100 | .resource = &apollon_flash_resource, | ||
101 | }; | ||
102 | |||
103 | static struct resource apollon_smc91x_resources[] = { | ||
104 | [0] = { | ||
105 | .start = APOLLON_ETHR_START, /* Physical */ | ||
106 | .end = APOLLON_ETHR_START + 0xf, | ||
107 | .flags = IORESOURCE_MEM, | ||
108 | }, | ||
109 | [1] = { | ||
110 | .start = OMAP_GPIO_IRQ(APOLLON_ETHR_GPIO_IRQ), | ||
111 | .end = OMAP_GPIO_IRQ(APOLLON_ETHR_GPIO_IRQ), | ||
112 | .flags = IORESOURCE_IRQ, | ||
113 | }, | ||
114 | }; | ||
115 | |||
116 | static struct platform_device apollon_smc91x_device = { | ||
117 | .name = "smc91x", | ||
118 | .id = -1, | ||
119 | .num_resources = ARRAY_SIZE(apollon_smc91x_resources), | ||
120 | .resource = apollon_smc91x_resources, | ||
121 | }; | ||
122 | |||
123 | static struct platform_device apollon_lcd_device = { | ||
124 | .name = "apollon_lcd", | ||
125 | .id = -1, | ||
126 | }; | ||
127 | |||
128 | static struct platform_device *apollon_devices[] __initdata = { | ||
129 | &apollon_onenand_device, | ||
130 | &apollon_smc91x_device, | ||
131 | &apollon_lcd_device, | ||
132 | }; | ||
133 | |||
134 | static inline void __init apollon_init_smc91x(void) | ||
135 | { | ||
136 | /* Make sure CS1 timings are correct */ | ||
137 | GPMC_CONFIG1_1 = 0x00011203; | ||
138 | GPMC_CONFIG2_1 = 0x001f1f01; | ||
139 | GPMC_CONFIG3_1 = 0x00080803; | ||
140 | GPMC_CONFIG4_1 = 0x1c091c09; | ||
141 | GPMC_CONFIG5_1 = 0x041f1f1f; | ||
142 | GPMC_CONFIG6_1 = 0x000004c4; | ||
143 | GPMC_CONFIG7_1 = 0x00000f40 | (APOLLON_CS1_BASE >> 24); | ||
144 | udelay(100); | ||
145 | |||
146 | omap_cfg_reg(W4__24XX_GPIO74); | ||
147 | if (omap_request_gpio(APOLLON_ETHR_GPIO_IRQ) < 0) { | ||
148 | printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n", | ||
149 | APOLLON_ETHR_GPIO_IRQ); | ||
150 | return; | ||
151 | } | ||
152 | omap_set_gpio_direction(APOLLON_ETHR_GPIO_IRQ, 1); | ||
153 | } | ||
154 | |||
155 | static void __init omap_apollon_init_irq(void) | ||
156 | { | ||
157 | omap2_init_common_hw(); | ||
158 | omap_init_irq(); | ||
159 | omap_gpio_init(); | ||
160 | apollon_init_smc91x(); | ||
161 | } | ||
162 | |||
163 | static struct omap_uart_config apollon_uart_config __initdata = { | ||
164 | .enabled_uarts = (1 << 0) | (0 << 1) | (0 << 2), | ||
165 | }; | ||
166 | |||
167 | static struct omap_mmc_config apollon_mmc_config __initdata = { | ||
168 | .mmc [0] = { | ||
169 | .enabled = 0, | ||
170 | .wire4 = 0, | ||
171 | .wp_pin = -1, | ||
172 | .power_pin = -1, | ||
173 | .switch_pin = -1, | ||
174 | }, | ||
175 | }; | ||
176 | |||
177 | static struct omap_lcd_config apollon_lcd_config __initdata = { | ||
178 | .ctrl_name = "internal", | ||
179 | }; | ||
180 | |||
181 | static struct omap_board_config_kernel apollon_config[] = { | ||
182 | { OMAP_TAG_UART, &apollon_uart_config }, | ||
183 | { OMAP_TAG_MMC, &apollon_mmc_config }, | ||
184 | { OMAP_TAG_LCD, &apollon_lcd_config }, | ||
185 | }; | ||
186 | |||
187 | static void __init apollon_led_init(void) | ||
188 | { | ||
189 | /* LED0 - AA10 */ | ||
190 | omap_cfg_reg(AA10_242X_GPIO13); | ||
191 | omap_request_gpio(LED0_GPIO13); | ||
192 | omap_set_gpio_direction(LED0_GPIO13, 0); | ||
193 | omap_set_gpio_dataout(LED0_GPIO13, 0); | ||
194 | /* LED1 - AA6 */ | ||
195 | omap_cfg_reg(AA6_242X_GPIO14); | ||
196 | omap_request_gpio(LED1_GPIO14); | ||
197 | omap_set_gpio_direction(LED1_GPIO14, 0); | ||
198 | omap_set_gpio_dataout(LED1_GPIO14, 0); | ||
199 | /* LED2 - AA4 */ | ||
200 | omap_cfg_reg(AA4_242X_GPIO15); | ||
201 | omap_request_gpio(LED2_GPIO15); | ||
202 | omap_set_gpio_direction(LED2_GPIO15, 0); | ||
203 | omap_set_gpio_dataout(LED2_GPIO15, 0); | ||
204 | } | ||
205 | |||
206 | static irqreturn_t apollon_sw_interrupt(int irq, void *ignored, struct pt_regs *regs) | ||
207 | { | ||
208 | static unsigned int led0, led1, led2; | ||
209 | |||
210 | if (irq == OMAP_GPIO_IRQ(SW_ENTER_GPIO16)) | ||
211 | omap_set_gpio_dataout(LED0_GPIO13, led0 ^= 1); | ||
212 | else if (irq == OMAP_GPIO_IRQ(SW_UP_GPIO17)) | ||
213 | omap_set_gpio_dataout(LED1_GPIO14, led1 ^= 1); | ||
214 | else if (irq == OMAP_GPIO_IRQ(SW_DOWN_GPIO58)) | ||
215 | omap_set_gpio_dataout(LED2_GPIO15, led2 ^= 1); | ||
216 | |||
217 | return IRQ_HANDLED; | ||
218 | } | ||
219 | |||
220 | static void __init apollon_sw_init(void) | ||
221 | { | ||
222 | /* Enter SW - Y11 */ | ||
223 | omap_cfg_reg(Y11_242X_GPIO16); | ||
224 | omap_request_gpio(SW_ENTER_GPIO16); | ||
225 | omap_set_gpio_direction(SW_ENTER_GPIO16, 1); | ||
226 | /* Up SW - AA12 */ | ||
227 | omap_cfg_reg(AA12_242X_GPIO17); | ||
228 | omap_request_gpio(SW_UP_GPIO17); | ||
229 | omap_set_gpio_direction(SW_UP_GPIO17, 1); | ||
230 | /* Down SW - AA8 */ | ||
231 | omap_cfg_reg(AA8_242X_GPIO58); | ||
232 | omap_request_gpio(SW_DOWN_GPIO58); | ||
233 | omap_set_gpio_direction(SW_DOWN_GPIO58, 1); | ||
234 | |||
235 | set_irq_type(OMAP_GPIO_IRQ(SW_ENTER_GPIO16), IRQT_RISING); | ||
236 | if (request_irq(OMAP_GPIO_IRQ(SW_ENTER_GPIO16), &apollon_sw_interrupt, | ||
237 | SA_SHIRQ, "enter sw", | ||
238 | &apollon_sw_interrupt)) | ||
239 | return; | ||
240 | set_irq_type(OMAP_GPIO_IRQ(SW_UP_GPIO17), IRQT_RISING); | ||
241 | if (request_irq(OMAP_GPIO_IRQ(SW_UP_GPIO17), &apollon_sw_interrupt, | ||
242 | SA_SHIRQ, "up sw", | ||
243 | &apollon_sw_interrupt)) | ||
244 | return; | ||
245 | set_irq_type(OMAP_GPIO_IRQ(SW_DOWN_GPIO58), IRQT_RISING); | ||
246 | if (request_irq(OMAP_GPIO_IRQ(SW_DOWN_GPIO58), &apollon_sw_interrupt, | ||
247 | SA_SHIRQ, "down sw", | ||
248 | &apollon_sw_interrupt)) | ||
249 | return; | ||
250 | } | ||
251 | |||
252 | static void __init omap_apollon_init(void) | ||
253 | { | ||
254 | apollon_led_init(); | ||
255 | apollon_sw_init(); | ||
256 | |||
257 | /* REVISIT: where's the correct place */ | ||
258 | omap_cfg_reg(W19_24XX_SYS_NIRQ); | ||
259 | |||
260 | /* | ||
261 | * Make sure the serial ports are muxed on at this point. | ||
262 | * You have to mux them off in device drivers later on | ||
263 | * if not needed. | ||
264 | */ | ||
265 | platform_add_devices(apollon_devices, ARRAY_SIZE(apollon_devices)); | ||
266 | omap_board_config = apollon_config; | ||
267 | omap_board_config_size = ARRAY_SIZE(apollon_config); | ||
268 | omap_serial_init(); | ||
269 | } | ||
270 | |||
271 | static void __init omap_apollon_map_io(void) | ||
272 | { | ||
273 | omap2_map_common_io(); | ||
274 | } | ||
275 | |||
276 | MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") | ||
277 | /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */ | ||
278 | .phys_io = 0x48000000, | ||
279 | .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, | ||
280 | .boot_params = 0x80000100, | ||
281 | .map_io = omap_apollon_map_io, | ||
282 | .init_irq = omap_apollon_init_irq, | ||
283 | .init_machine = omap_apollon_init, | ||
284 | .timer = &omap_timer, | ||
285 | MACHINE_END | ||
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index a300d634d8a5..4933fce766c8 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -17,6 +17,8 @@ | |||
17 | #include <linux/mtd/mtd.h> | 17 | #include <linux/mtd/mtd.h> |
18 | #include <linux/mtd/partitions.h> | 18 | #include <linux/mtd/partitions.h> |
19 | #include <linux/delay.h> | 19 | #include <linux/delay.h> |
20 | #include <linux/workqueue.h> | ||
21 | #include <linux/input.h> | ||
20 | 22 | ||
21 | #include <asm/hardware.h> | 23 | #include <asm/hardware.h> |
22 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
@@ -25,15 +27,57 @@ | |||
25 | #include <asm/mach/flash.h> | 27 | #include <asm/mach/flash.h> |
26 | 28 | ||
27 | #include <asm/arch/gpio.h> | 29 | #include <asm/arch/gpio.h> |
30 | #include <asm/arch/gpioexpander.h> | ||
28 | #include <asm/arch/mux.h> | 31 | #include <asm/arch/mux.h> |
29 | #include <asm/arch/usb.h> | 32 | #include <asm/arch/usb.h> |
33 | #include <asm/arch/irda.h> | ||
30 | #include <asm/arch/board.h> | 34 | #include <asm/arch/board.h> |
31 | #include <asm/arch/common.h> | 35 | #include <asm/arch/common.h> |
32 | #include <asm/arch/prcm.h> | 36 | #include <asm/arch/keypad.h> |
37 | #include <asm/arch/menelaus.h> | ||
38 | #include <asm/arch/dma.h> | ||
39 | #include "prcm-regs.h" | ||
33 | 40 | ||
34 | #include <asm/io.h> | 41 | #include <asm/io.h> |
35 | #include <asm/delay.h> | 42 | #include <asm/delay.h> |
36 | 43 | ||
44 | static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 }; | ||
45 | static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 }; | ||
46 | |||
47 | static int h4_keymap[] = { | ||
48 | KEY(0, 0, KEY_LEFT), | ||
49 | KEY(0, 1, KEY_RIGHT), | ||
50 | KEY(0, 2, KEY_A), | ||
51 | KEY(0, 3, KEY_B), | ||
52 | KEY(0, 4, KEY_C), | ||
53 | KEY(1, 0, KEY_DOWN), | ||
54 | KEY(1, 1, KEY_UP), | ||
55 | KEY(1, 2, KEY_E), | ||
56 | KEY(1, 3, KEY_F), | ||
57 | KEY(1, 4, KEY_G), | ||
58 | KEY(2, 0, KEY_ENTER), | ||
59 | KEY(2, 1, KEY_I), | ||
60 | KEY(2, 2, KEY_J), | ||
61 | KEY(2, 3, KEY_K), | ||
62 | KEY(2, 4, KEY_3), | ||
63 | KEY(3, 0, KEY_M), | ||
64 | KEY(3, 1, KEY_N), | ||
65 | KEY(3, 2, KEY_O), | ||
66 | KEY(3, 3, KEY_P), | ||
67 | KEY(3, 4, KEY_Q), | ||
68 | KEY(4, 0, KEY_R), | ||
69 | KEY(4, 1, KEY_4), | ||
70 | KEY(4, 2, KEY_T), | ||
71 | KEY(4, 3, KEY_U), | ||
72 | KEY(4, 4, KEY_ENTER), | ||
73 | KEY(5, 0, KEY_V), | ||
74 | KEY(5, 1, KEY_W), | ||
75 | KEY(5, 2, KEY_L), | ||
76 | KEY(5, 3, KEY_S), | ||
77 | KEY(5, 4, KEY_ENTER), | ||
78 | 0 | ||
79 | }; | ||
80 | |||
37 | static struct mtd_partition h4_partitions[] = { | 81 | static struct mtd_partition h4_partitions[] = { |
38 | /* bootloader (U-Boot, etc) in first sector */ | 82 | /* bootloader (U-Boot, etc) in first sector */ |
39 | { | 83 | { |
@@ -108,9 +152,123 @@ static struct platform_device h4_smc91x_device = { | |||
108 | .resource = h4_smc91x_resources, | 152 | .resource = h4_smc91x_resources, |
109 | }; | 153 | }; |
110 | 154 | ||
155 | /* Select between the IrDA and aGPS module | ||
156 | */ | ||
157 | static int h4_select_irda(struct device *dev, int state) | ||
158 | { | ||
159 | unsigned char expa; | ||
160 | int err = 0; | ||
161 | |||
162 | if ((err = read_gpio_expa(&expa, 0x21))) { | ||
163 | printk(KERN_ERR "Error reading from I/O expander\n"); | ||
164 | return err; | ||
165 | } | ||
166 | |||
167 | /* 'P6' enable/disable IRDA_TX and IRDA_RX */ | ||
168 | if (state & IR_SEL) { /* IrDa */ | ||
169 | if ((err = write_gpio_expa(expa | 0x01, 0x21))) { | ||
170 | printk(KERN_ERR "Error writing to I/O expander\n"); | ||
171 | return err; | ||
172 | } | ||
173 | } else { | ||
174 | if ((err = write_gpio_expa(expa & ~0x01, 0x21))) { | ||
175 | printk(KERN_ERR "Error writing to I/O expander\n"); | ||
176 | return err; | ||
177 | } | ||
178 | } | ||
179 | return err; | ||
180 | } | ||
181 | |||
182 | static void set_trans_mode(void *data) | ||
183 | { | ||
184 | int *mode = data; | ||
185 | unsigned char expa; | ||
186 | int err = 0; | ||
187 | |||
188 | if ((err = read_gpio_expa(&expa, 0x20)) != 0) { | ||
189 | printk(KERN_ERR "Error reading from I/O expander\n"); | ||
190 | } | ||
191 | |||
192 | expa &= ~0x01; | ||
193 | |||
194 | if (!(*mode & IR_SIRMODE)) { /* MIR/FIR */ | ||
195 | expa |= 0x01; | ||
196 | } | ||
197 | |||
198 | if ((err = write_gpio_expa(expa, 0x20)) != 0) { | ||
199 | printk(KERN_ERR "Error writing to I/O expander\n"); | ||
200 | } | ||
201 | } | ||
202 | |||
203 | static int h4_transceiver_mode(struct device *dev, int mode) | ||
204 | { | ||
205 | struct omap_irda_config *irda_config = dev->platform_data; | ||
206 | |||
207 | cancel_delayed_work(&irda_config->gpio_expa); | ||
208 | PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode); | ||
209 | schedule_work(&irda_config->gpio_expa); | ||
210 | |||
211 | return 0; | ||
212 | } | ||
213 | |||
214 | static struct omap_irda_config h4_irda_data = { | ||
215 | .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, | ||
216 | .transceiver_mode = h4_transceiver_mode, | ||
217 | .select_irda = h4_select_irda, | ||
218 | .rx_channel = OMAP24XX_DMA_UART3_RX, | ||
219 | .tx_channel = OMAP24XX_DMA_UART3_TX, | ||
220 | .dest_start = OMAP_UART3_BASE, | ||
221 | .src_start = OMAP_UART3_BASE, | ||
222 | .tx_trigger = OMAP24XX_DMA_UART3_TX, | ||
223 | .rx_trigger = OMAP24XX_DMA_UART3_RX, | ||
224 | }; | ||
225 | |||
226 | static struct resource h4_irda_resources[] = { | ||
227 | [0] = { | ||
228 | .start = INT_24XX_UART3_IRQ, | ||
229 | .end = INT_24XX_UART3_IRQ, | ||
230 | .flags = IORESOURCE_IRQ, | ||
231 | }, | ||
232 | }; | ||
233 | |||
234 | static struct platform_device h4_irda_device = { | ||
235 | .name = "omapirda", | ||
236 | .id = -1, | ||
237 | .dev = { | ||
238 | .platform_data = &h4_irda_data, | ||
239 | }, | ||
240 | .num_resources = 1, | ||
241 | .resource = h4_irda_resources, | ||
242 | }; | ||
243 | |||
244 | static struct omap_kp_platform_data h4_kp_data = { | ||
245 | .rows = 6, | ||
246 | .cols = 7, | ||
247 | .keymap = h4_keymap, | ||
248 | .rep = 1, | ||
249 | .row_gpios = row_gpios, | ||
250 | .col_gpios = col_gpios, | ||
251 | }; | ||
252 | |||
253 | static struct platform_device h4_kp_device = { | ||
254 | .name = "omap-keypad", | ||
255 | .id = -1, | ||
256 | .dev = { | ||
257 | .platform_data = &h4_kp_data, | ||
258 | }, | ||
259 | }; | ||
260 | |||
261 | static struct platform_device h4_lcd_device = { | ||
262 | .name = "lcd_h4", | ||
263 | .id = -1, | ||
264 | }; | ||
265 | |||
111 | static struct platform_device *h4_devices[] __initdata = { | 266 | static struct platform_device *h4_devices[] __initdata = { |
112 | &h4_smc91x_device, | 267 | &h4_smc91x_device, |
113 | &h4_flash_device, | 268 | &h4_flash_device, |
269 | &h4_irda_device, | ||
270 | &h4_kp_device, | ||
271 | &h4_lcd_device, | ||
114 | }; | 272 | }; |
115 | 273 | ||
116 | static inline void __init h4_init_smc91x(void) | 274 | static inline void __init h4_init_smc91x(void) |
@@ -157,7 +315,6 @@ static struct omap_mmc_config h4_mmc_config __initdata = { | |||
157 | }; | 315 | }; |
158 | 316 | ||
159 | static struct omap_lcd_config h4_lcd_config __initdata = { | 317 | static struct omap_lcd_config h4_lcd_config __initdata = { |
160 | .panel_name = "h4", | ||
161 | .ctrl_name = "internal", | 318 | .ctrl_name = "internal", |
162 | }; | 319 | }; |
163 | 320 | ||
@@ -174,6 +331,19 @@ static void __init omap_h4_init(void) | |||
174 | * You have to mux them off in device drivers later on | 331 | * You have to mux them off in device drivers later on |
175 | * if not needed. | 332 | * if not needed. |
176 | */ | 333 | */ |
334 | #if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) | ||
335 | omap_cfg_reg(K15_24XX_UART3_TX); | ||
336 | omap_cfg_reg(K14_24XX_UART3_RX); | ||
337 | #endif | ||
338 | |||
339 | #if defined(CONFIG_KEYBOARD_OMAP) || defined(CONFIG_KEYBOARD_OMAP_MODULE) | ||
340 | if (omap_has_menelaus()) { | ||
341 | row_gpios[5] = 0; | ||
342 | col_gpios[2] = 15; | ||
343 | col_gpios[6] = 18; | ||
344 | } | ||
345 | #endif | ||
346 | |||
177 | platform_add_devices(h4_devices, ARRAY_SIZE(h4_devices)); | 347 | platform_add_devices(h4_devices, ARRAY_SIZE(h4_devices)); |
178 | omap_board_config = h4_config; | 348 | omap_board_config = h4_config; |
179 | omap_board_config_size = ARRAY_SIZE(h4_config); | 349 | omap_board_config_size = ARRAY_SIZE(h4_config); |
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 7181edb89352..def9e5370edf 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -74,6 +74,47 @@ static void omap_init_i2c(void) {} | |||
74 | 74 | ||
75 | #endif | 75 | #endif |
76 | 76 | ||
77 | #if defined(CONFIG_OMAP_STI) | ||
78 | |||
79 | #define OMAP2_STI_BASE IO_ADDRESS(0x48068000) | ||
80 | #define OMAP2_STI_CHANNEL_BASE 0x54000000 | ||
81 | #define OMAP2_STI_IRQ 4 | ||
82 | |||
83 | static struct resource sti_resources[] = { | ||
84 | { | ||
85 | .start = OMAP2_STI_BASE, | ||
86 | .end = OMAP2_STI_BASE + 0x7ff, | ||
87 | .flags = IORESOURCE_MEM, | ||
88 | }, | ||
89 | { | ||
90 | .start = OMAP2_STI_CHANNEL_BASE, | ||
91 | .end = OMAP2_STI_CHANNEL_BASE + SZ_64K - 1, | ||
92 | .flags = IORESOURCE_MEM, | ||
93 | }, | ||
94 | { | ||
95 | .start = OMAP2_STI_IRQ, | ||
96 | .flags = IORESOURCE_IRQ, | ||
97 | } | ||
98 | }; | ||
99 | |||
100 | static struct platform_device sti_device = { | ||
101 | .name = "sti", | ||
102 | .id = -1, | ||
103 | .dev = { | ||
104 | .release = omap_nop_release, | ||
105 | }, | ||
106 | .num_resources = ARRAY_SIZE(sti_resources), | ||
107 | .resource = sti_resources, | ||
108 | }; | ||
109 | |||
110 | static inline void omap_init_sti(void) | ||
111 | { | ||
112 | platform_device_register(&sti_device); | ||
113 | } | ||
114 | #else | ||
115 | static inline void omap_init_sti(void) {} | ||
116 | #endif | ||
117 | |||
77 | /*-------------------------------------------------------------------------*/ | 118 | /*-------------------------------------------------------------------------*/ |
78 | 119 | ||
79 | static int __init omap2_init_devices(void) | 120 | static int __init omap2_init_devices(void) |
@@ -82,6 +123,7 @@ static int __init omap2_init_devices(void) | |||
82 | * in alphabetical order so they're easier to sort through. | 123 | * in alphabetical order so they're easier to sort through. |
83 | */ | 124 | */ |
84 | omap_init_i2c(); | 125 | omap_init_i2c(); |
126 | omap_init_sti(); | ||
85 | 127 | ||
86 | return 0; | 128 | return 0; |
87 | } | 129 | } |
diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index 9dcce904b608..079b67deac0f 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <asm/arch/board.h> | 24 | #include <asm/arch/board.h> |
25 | #include <asm/arch/mux.h> | 25 | #include <asm/arch/mux.h> |
26 | #include <asm/arch/gpio.h> | 26 | #include <asm/arch/gpio.h> |
27 | #include <asm/arch/menelaus.h> | ||
27 | 28 | ||
28 | 29 | ||
29 | void omap_nop_release(struct device *dev) | 30 | void omap_nop_release(struct device *dev) |
@@ -98,6 +99,62 @@ static inline void omap_init_i2c(void) {} | |||
98 | #endif | 99 | #endif |
99 | 100 | ||
100 | /*-------------------------------------------------------------------------*/ | 101 | /*-------------------------------------------------------------------------*/ |
102 | #if defined(CONFIG_KEYBOARD_OMAP) || defined(CONFIG_KEYBOARD_OMAP_MODULE) | ||
103 | |||
104 | static void omap_init_kp(void) | ||
105 | { | ||
106 | if (machine_is_omap_h2() || machine_is_omap_h3()) { | ||
107 | omap_cfg_reg(F18_1610_KBC0); | ||
108 | omap_cfg_reg(D20_1610_KBC1); | ||
109 | omap_cfg_reg(D19_1610_KBC2); | ||
110 | omap_cfg_reg(E18_1610_KBC3); | ||
111 | omap_cfg_reg(C21_1610_KBC4); | ||
112 | |||
113 | omap_cfg_reg(G18_1610_KBR0); | ||
114 | omap_cfg_reg(F19_1610_KBR1); | ||
115 | omap_cfg_reg(H14_1610_KBR2); | ||
116 | omap_cfg_reg(E20_1610_KBR3); | ||
117 | omap_cfg_reg(E19_1610_KBR4); | ||
118 | omap_cfg_reg(N19_1610_KBR5); | ||
119 | } else if (machine_is_omap_perseus2()) { | ||
120 | omap_cfg_reg(E2_730_KBR0); | ||
121 | omap_cfg_reg(J7_730_KBR1); | ||
122 | omap_cfg_reg(E1_730_KBR2); | ||
123 | omap_cfg_reg(F3_730_KBR3); | ||
124 | omap_cfg_reg(D2_730_KBR4); | ||
125 | |||
126 | omap_cfg_reg(C2_730_KBC0); | ||
127 | omap_cfg_reg(D3_730_KBC1); | ||
128 | omap_cfg_reg(E4_730_KBC2); | ||
129 | omap_cfg_reg(F4_730_KBC3); | ||
130 | omap_cfg_reg(E3_730_KBC4); | ||
131 | } else if (machine_is_omap_h4()) { | ||
132 | omap_cfg_reg(T19_24XX_KBR0); | ||
133 | omap_cfg_reg(R19_24XX_KBR1); | ||
134 | omap_cfg_reg(V18_24XX_KBR2); | ||
135 | omap_cfg_reg(M21_24XX_KBR3); | ||
136 | omap_cfg_reg(E5__24XX_KBR4); | ||
137 | if (omap_has_menelaus()) { | ||
138 | omap_cfg_reg(B3__24XX_KBR5); | ||
139 | omap_cfg_reg(AA4_24XX_KBC2); | ||
140 | omap_cfg_reg(B13_24XX_KBC6); | ||
141 | } else { | ||
142 | omap_cfg_reg(M18_24XX_KBR5); | ||
143 | omap_cfg_reg(H19_24XX_KBC2); | ||
144 | omap_cfg_reg(N19_24XX_KBC6); | ||
145 | } | ||
146 | omap_cfg_reg(R20_24XX_KBC0); | ||
147 | omap_cfg_reg(M14_24XX_KBC1); | ||
148 | omap_cfg_reg(V17_24XX_KBC3); | ||
149 | omap_cfg_reg(P21_24XX_KBC4); | ||
150 | omap_cfg_reg(L14_24XX_KBC5); | ||
151 | } | ||
152 | } | ||
153 | #else | ||
154 | static inline void omap_init_kp(void) {} | ||
155 | #endif | ||
156 | |||
157 | /*-------------------------------------------------------------------------*/ | ||
101 | 158 | ||
102 | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) | 159 | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) |
103 | 160 | ||
@@ -240,6 +297,55 @@ static void __init omap_init_mmc(void) | |||
240 | static inline void omap_init_mmc(void) {} | 297 | static inline void omap_init_mmc(void) {} |
241 | #endif | 298 | #endif |
242 | 299 | ||
300 | /*-------------------------------------------------------------------------*/ | ||
301 | |||
302 | /* Numbering for the SPI-capable controllers when used for SPI: | ||
303 | * spi = 1 | ||
304 | * uwire = 2 | ||
305 | * mmc1..2 = 3..4 | ||
306 | * mcbsp1..3 = 5..7 | ||
307 | */ | ||
308 | |||
309 | #if defined(CONFIG_SPI_OMAP_UWIRE) || defined(CONFIG_SPI_OMAP_UWIRE_MODULE) | ||
310 | |||
311 | #define OMAP_UWIRE_BASE 0xfffb3000 | ||
312 | |||
313 | static struct resource uwire_resources[] = { | ||
314 | { | ||
315 | .start = OMAP_UWIRE_BASE, | ||
316 | .end = OMAP_UWIRE_BASE + 0x20, | ||
317 | .flags = IORESOURCE_MEM, | ||
318 | }, | ||
319 | }; | ||
320 | |||
321 | static struct platform_device omap_uwire_device = { | ||
322 | .name = "omap_uwire", | ||
323 | .id = -1, | ||
324 | .dev = { | ||
325 | .release = omap_nop_release, | ||
326 | }, | ||
327 | .num_resources = ARRAY_SIZE(uwire_resources), | ||
328 | .resource = uwire_resources, | ||
329 | }; | ||
330 | |||
331 | static void omap_init_uwire(void) | ||
332 | { | ||
333 | /* FIXME define and use a boot tag; not all boards will be hooking | ||
334 | * up devices to the microwire controller, and multi-board configs | ||
335 | * mean that CONFIG_SPI_OMAP_UWIRE may be configured anyway... | ||
336 | */ | ||
337 | |||
338 | /* board-specific code must configure chipselects (only a few | ||
339 | * are normally used) and SCLK/SDI/SDO (each has two choices). | ||
340 | */ | ||
341 | (void) platform_device_register(&omap_uwire_device); | ||
342 | } | ||
343 | #else | ||
344 | static inline void omap_init_uwire(void) {} | ||
345 | #endif | ||
346 | |||
347 | /*-------------------------------------------------------------------------*/ | ||
348 | |||
243 | #if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE) | 349 | #if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE) |
244 | 350 | ||
245 | #ifdef CONFIG_ARCH_OMAP24XX | 351 | #ifdef CONFIG_ARCH_OMAP24XX |
@@ -310,40 +416,6 @@ static void omap_init_rng(void) | |||
310 | static inline void omap_init_rng(void) {} | 416 | static inline void omap_init_rng(void) {} |
311 | #endif | 417 | #endif |
312 | 418 | ||
313 | #if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) | ||
314 | |||
315 | static struct omap_lcd_config omap_fb_conf; | ||
316 | |||
317 | static u64 omap_fb_dma_mask = ~(u32)0; | ||
318 | |||
319 | static struct platform_device omap_fb_device = { | ||
320 | .name = "omapfb", | ||
321 | .id = -1, | ||
322 | .dev = { | ||
323 | .release = omap_nop_release, | ||
324 | .dma_mask = &omap_fb_dma_mask, | ||
325 | .coherent_dma_mask = ~(u32)0, | ||
326 | .platform_data = &omap_fb_conf, | ||
327 | }, | ||
328 | .num_resources = 0, | ||
329 | }; | ||
330 | |||
331 | static inline void omap_init_fb(void) | ||
332 | { | ||
333 | const struct omap_lcd_config *conf; | ||
334 | |||
335 | conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config); | ||
336 | if (conf != NULL) | ||
337 | omap_fb_conf = *conf; | ||
338 | platform_device_register(&omap_fb_device); | ||
339 | } | ||
340 | |||
341 | #else | ||
342 | |||
343 | static inline void omap_init_fb(void) {} | ||
344 | |||
345 | #endif | ||
346 | |||
347 | /* | 419 | /* |
348 | * This gets called after board-specific INIT_MACHINE, and initializes most | 420 | * This gets called after board-specific INIT_MACHINE, and initializes most |
349 | * on-chip peripherals accessible on this board (except for few like USB): | 421 | * on-chip peripherals accessible on this board (except for few like USB): |
@@ -369,9 +441,10 @@ static int __init omap_init_devices(void) | |||
369 | /* please keep these calls, and their implementations above, | 441 | /* please keep these calls, and their implementations above, |
370 | * in alphabetical order so they're easier to sort through. | 442 | * in alphabetical order so they're easier to sort through. |
371 | */ | 443 | */ |
372 | omap_init_fb(); | ||
373 | omap_init_i2c(); | 444 | omap_init_i2c(); |
445 | omap_init_kp(); | ||
374 | omap_init_mmc(); | 446 | omap_init_mmc(); |
447 | omap_init_uwire(); | ||
375 | omap_init_wdt(); | 448 | omap_init_wdt(); |
376 | omap_init_rng(); | 449 | omap_init_rng(); |
377 | 450 | ||