]>
Commit | Line | Data |
---|---|---|
34e31d87 RS |
1 | /* |
2 | * linux/arch/arm/mach-pxa/pcm027.c | |
3 | * Support for the Phytec phyCORE-PXA270 CPU card (aka PCM-027). | |
4 | * | |
5 | * Refer | |
6 | * http://www.phytec.com/products/sbc/ARM-XScale/phyCORE-XScale-PXA270.html | |
7 | * for additional hardware info | |
8 | * | |
9 | * Author: Juergen Kilb | |
10 | * Created: April 05, 2005 | |
11 | * Copyright: Phytec Messtechnik GmbH | |
12 | * e-Mail: armlinux@phytec.de | |
13 | * | |
14 | * based on Intel Mainstone Board | |
15 | * | |
16 | * Copyright 2007 Juergen Beisert @ Pengutronix (j.beisert@pengutronix.de) | |
17 | * | |
18 | * This program is free software; you can redistribute it and/or modify | |
19 | * it under the terms of the GNU General Public License version 2 as | |
20 | * published by the Free Software Foundation. | |
21 | */ | |
22 | ||
23 | #include <linux/irq.h> | |
24 | #include <linux/platform_device.h> | |
25 | #include <linux/mtd/physmap.h> | |
26 | #include <linux/spi/spi.h> | |
e172274c | 27 | #include <linux/spi/max7301.h> |
34e31d87 | 28 | #include <linux/leds.h> |
e172274c | 29 | |
34e31d87 RS |
30 | #include <asm/mach-types.h> |
31 | #include <asm/mach/arch.h> | |
32 | #include <asm/arch/hardware.h> | |
33 | #include <asm/arch/pxa-regs.h> | |
a683b14d | 34 | #include <asm/arch/pxa2xx-gpio.h> |
c9a28fa7 | 35 | #include <asm/arch/pxa2xx-regs.h> |
34e31d87 RS |
36 | #include <asm/arch/pxa2xx_spi.h> |
37 | #include <asm/arch/pcm027.h> | |
38 | #include "generic.h" | |
39 | ||
40 | /* | |
41 | * ABSTRACT: | |
42 | * | |
43 | * The PXA270 processor comes with a bunch of hardware on its silicon. | |
44 | * Not all of this hardware can be used at the same time and not all | |
45 | * is routed to module's connectors. Also it depends on the baseboard, what | |
46 | * kind of hardware can be used in which way. | |
47 | * -> So this file supports the main devices on the CPU card only! | |
48 | * Refer pcm990-baseboard.c how to extend this features to get a full | |
49 | * blown system with many common interfaces. | |
50 | * | |
51 | * The PCM-027 supports the following interfaces through its connectors and | |
52 | * will be used in pcm990-baseboard.c: | |
53 | * | |
54 | * - LCD support | |
55 | * - MMC support | |
56 | * - IDE/CF card | |
57 | * - FFUART | |
58 | * - BTUART | |
59 | * - IRUART | |
60 | * - AC97 | |
61 | * - SSP | |
62 | * - SSP3 | |
63 | * | |
64 | * Claimed GPIOs: | |
65 | * GPIO0 -> IRQ input from RTC | |
66 | * GPIO2 -> SYS_ENA*) | |
67 | * GPIO3 -> PWR_SCL | |
68 | * GPIO4 -> PWR_SDA | |
69 | * GPIO5 -> PowerCap0*) | |
70 | * GPIO6 -> PowerCap1*) | |
71 | * GPIO7 -> PowerCap2*) | |
72 | * GPIO8 -> PowerCap3*) | |
73 | * GPIO15 -> /CS1 | |
74 | * GPIO20 -> /CS2 | |
75 | * GPIO21 -> /CS3 | |
76 | * GPIO33 -> /CS5 network controller select | |
77 | * GPIO52 -> IRQ from network controller | |
78 | * GPIO78 -> /CS2 | |
79 | * GPIO80 -> /CS4 | |
80 | * GPIO90 -> LED0 | |
81 | * GPIO91 -> LED1 | |
82 | * GPIO114 -> IRQ from CAN controller | |
83 | * GPIO117 -> SCL | |
84 | * GPIO118 -> SDA | |
85 | * | |
86 | * *) CPU internal use only | |
87 | */ | |
88 | ||
89 | /* | |
90 | * SMC91x network controller specific stuff | |
91 | */ | |
92 | static struct resource smc91x_resources[] = { | |
93 | [0] = { | |
94 | .start = PCM027_ETH_PHYS + 0x300, | |
95 | .end = PCM027_ETH_PHYS + PCM027_ETH_SIZE, | |
96 | .flags = IORESOURCE_MEM, | |
97 | }, | |
98 | [1] = { | |
99 | .start = PCM027_ETH_IRQ, | |
100 | .end = PCM027_ETH_IRQ, | |
101 | /* note: smc91x's driver doesn't use the trigger bits yet */ | |
102 | .flags = IORESOURCE_IRQ | PCM027_ETH_IRQ_EDGE, | |
103 | } | |
104 | }; | |
105 | ||
106 | static struct platform_device smc91x_device = { | |
107 | .name = "smc91x", | |
108 | .id = 0, | |
109 | .num_resources = ARRAY_SIZE(smc91x_resources), | |
110 | .resource = smc91x_resources, | |
111 | }; | |
112 | ||
e172274c GL |
113 | /* |
114 | * SPI host and devices | |
115 | */ | |
116 | static struct pxa2xx_spi_master pxa_ssp_master_info = { | |
117 | .num_chipselect = 1, | |
118 | }; | |
119 | ||
120 | static struct max7301_platform_data max7301_info = { | |
121 | .base = -1, | |
122 | }; | |
123 | ||
124 | /* bus_num must match id in pxa2xx_set_spi_info() call */ | |
125 | static struct spi_board_info spi_board_info[] __initdata = { | |
126 | { | |
127 | .modalias = "max7301", | |
128 | .platform_data = &max7301_info, | |
129 | .max_speed_hz = 13000000, | |
130 | .bus_num = 1, | |
131 | .chip_select = 0, | |
132 | .mode = SPI_MODE_0, | |
133 | }, | |
134 | }; | |
135 | ||
136 | /* | |
137 | * NOR flash | |
138 | */ | |
34e31d87 RS |
139 | static struct physmap_flash_data pcm027_flash_data = { |
140 | .width = 4, | |
141 | }; | |
142 | ||
143 | static struct resource pcm027_flash_resource = { | |
144 | .start = PCM027_FLASH_PHYS, | |
145 | .end = PCM027_FLASH_PHYS + PCM027_FLASH_SIZE - 1 , | |
146 | .flags = IORESOURCE_MEM, | |
147 | }; | |
148 | ||
149 | static struct platform_device pcm027_flash = { | |
150 | .name = "physmap-flash", | |
151 | .id = 0, | |
152 | .dev = { | |
153 | .platform_data = &pcm027_flash_data, | |
154 | }, | |
155 | .resource = &pcm027_flash_resource, | |
156 | .num_resources = 1, | |
157 | }; | |
158 | ||
159 | #ifdef CONFIG_LEDS_GPIO | |
160 | ||
161 | static struct gpio_led pcm027_led[] = { | |
162 | { | |
163 | .name = "led0:red", /* FIXME */ | |
164 | .gpio = PCM027_LED_CPU | |
165 | }, | |
166 | { | |
167 | .name = "led1:green", /* FIXME */ | |
168 | .gpio = PCM027_LED_HEARD_BEAT | |
169 | }, | |
170 | }; | |
171 | ||
172 | static struct gpio_led_platform_data pcm027_led_data = { | |
173 | .num_leds = ARRAY_SIZE(pcm027_led), | |
174 | .leds = pcm027_led | |
175 | }; | |
176 | ||
177 | static struct platform_device pcm027_led_dev = { | |
178 | .name = "leds-gpio", | |
179 | .id = 0, | |
180 | .dev = { | |
181 | .platform_data = &pcm027_led_data, | |
182 | }, | |
183 | }; | |
184 | ||
185 | #endif /* CONFIG_LEDS_GPIO */ | |
186 | ||
187 | /* | |
188 | * declare the available device resources on this board | |
189 | */ | |
190 | static struct platform_device *devices[] __initdata = { | |
191 | &smc91x_device, | |
192 | &pcm027_flash, | |
193 | #ifdef CONFIG_LEDS_GPIO | |
194 | &pcm027_led_dev | |
195 | #endif | |
196 | }; | |
197 | ||
198 | /* | |
199 | * pcm027_init - breath some life into the board | |
200 | */ | |
201 | static void __init pcm027_init(void) | |
202 | { | |
203 | /* system bus arbiter setting | |
204 | * - Core_Park | |
205 | * - LCD_wt:DMA_wt:CORE_Wt = 2:3:4 | |
206 | */ | |
207 | ARB_CNTRL = ARB_CORE_PARK | 0x234; | |
208 | ||
209 | platform_add_devices(devices, ARRAY_SIZE(devices)); | |
210 | ||
211 | /* LEDs (on demand only) */ | |
212 | #ifdef CONFIG_LEDS_GPIO | |
213 | pxa_gpio_mode(PCM027_LED_CPU | GPIO_OUT); | |
214 | pxa_gpio_mode(PCM027_LED_HEARD_BEAT | GPIO_OUT); | |
215 | #endif /* CONFIG_LEDS_GPIO */ | |
216 | ||
217 | /* at last call the baseboard to initialize itself */ | |
218 | #ifdef CONFIG_MACH_PCM990_BASEBOARD | |
219 | pcm990_baseboard_init(); | |
220 | #endif | |
e172274c GL |
221 | |
222 | pxa2xx_set_spi_info(1, &pxa_ssp_master_info); | |
223 | spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); | |
34e31d87 RS |
224 | } |
225 | ||
226 | static void __init pcm027_map_io(void) | |
227 | { | |
228 | pxa_map_io(); | |
229 | ||
230 | /* initialize sleep mode regs (wake-up sources, etc) */ | |
231 | PGSR0 = 0x01308000; | |
232 | PGSR1 = 0x00CF0002; | |
233 | PGSR2 = 0x0E294000; | |
234 | PGSR3 = 0x0000C000; | |
235 | PWER = 0x40000000 | PWER_GPIO0 | PWER_GPIO1; | |
236 | PRER = 0x00000000; | |
237 | PFER = 0x00000003; | |
238 | } | |
239 | ||
240 | MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270") | |
241 | /* Maintainer: Pengutronix */ | |
242 | .boot_params = 0xa0000100, | |
243 | .phys_io = 0x40000000, | |
244 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | |
245 | .map_io = pcm027_map_io, | |
246 | .init_irq = pxa27x_init_irq, | |
247 | .timer = &pxa_timer, | |
248 | .init_machine = pcm027_init, | |
249 | MACHINE_END |