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