[ARM] 4744/1: pcm027: add support for phyCORE-PXA270 CPU module
[linux-2.6.git] / arch / arm / mach-pxa / pcm027.c
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>
27 #include <linux/leds.h>
28 #include <asm/mach-types.h>
29 #include <asm/mach/arch.h>
30 #include <asm/arch/hardware.h>
31 #include <asm/arch/pxa-regs.h>
32 #include <asm/arch/pxa2xx_spi.h>
33 #include <asm/arch/pcm027.h>
34 #include "generic.h"
35
36 /*
37  * ABSTRACT:
38  *
39  * The PXA270 processor comes with a bunch of hardware on its silicon.
40  * Not all of this hardware can be used at the same time and not all
41  * is routed to module's connectors. Also it depends on the baseboard, what
42  * kind of hardware can be used in which way.
43  * -> So this file supports the main devices on the CPU card only!
44  * Refer pcm990-baseboard.c how to extend this features to get a full
45  * blown system with many common interfaces.
46  *
47  * The PCM-027 supports the following interfaces through its connectors and
48  * will be used in pcm990-baseboard.c:
49  *
50  * - LCD support
51  * - MMC support
52  * - IDE/CF card
53  * - FFUART
54  * - BTUART
55  * - IRUART
56  * - AC97
57  * - SSP
58  * - SSP3
59  *
60  * Claimed GPIOs:
61  * GPIO0 -> IRQ input from RTC
62  * GPIO2 -> SYS_ENA*)
63  * GPIO3 -> PWR_SCL
64  * GPIO4 -> PWR_SDA
65  * GPIO5 -> PowerCap0*)
66  * GPIO6 -> PowerCap1*)
67  * GPIO7 -> PowerCap2*)
68  * GPIO8 -> PowerCap3*)
69  * GPIO15 -> /CS1
70  * GPIO20 -> /CS2
71  * GPIO21 -> /CS3
72  * GPIO33 -> /CS5 network controller select
73  * GPIO52 -> IRQ from network controller
74  * GPIO78 -> /CS2
75  * GPIO80 -> /CS4
76  * GPIO90 -> LED0
77  * GPIO91 -> LED1
78  * GPIO114 -> IRQ from CAN controller
79  * GPIO117 -> SCL
80  * GPIO118 -> SDA
81  *
82  * *) CPU internal use only
83  */
84
85 /*
86  * SMC91x network controller specific stuff
87  */
88 static struct resource smc91x_resources[] = {
89         [0] = {
90                 .start  = PCM027_ETH_PHYS + 0x300,
91                 .end    = PCM027_ETH_PHYS + PCM027_ETH_SIZE,
92                 .flags  = IORESOURCE_MEM,
93         },
94         [1] = {
95                 .start  = PCM027_ETH_IRQ,
96                 .end    = PCM027_ETH_IRQ,
97                 /* note: smc91x's driver doesn't use the trigger bits yet */
98                 .flags  = IORESOURCE_IRQ | PCM027_ETH_IRQ_EDGE,
99         }
100 };
101
102 static struct platform_device smc91x_device = {
103         .name           = "smc91x",
104         .id             = 0,
105         .num_resources  = ARRAY_SIZE(smc91x_resources),
106         .resource       = smc91x_resources,
107 };
108
109 static struct physmap_flash_data pcm027_flash_data = {
110         .width  = 4,
111 };
112
113 static struct resource pcm027_flash_resource = {
114         .start          = PCM027_FLASH_PHYS,
115         .end            = PCM027_FLASH_PHYS + PCM027_FLASH_SIZE - 1 ,
116         .flags          = IORESOURCE_MEM,
117 };
118
119 static struct platform_device pcm027_flash = {
120         .name           = "physmap-flash",
121         .id             = 0,
122         .dev            = {
123                 .platform_data  = &pcm027_flash_data,
124         },
125         .resource       = &pcm027_flash_resource,
126         .num_resources  = 1,
127 };
128
129 #ifdef CONFIG_LEDS_GPIO
130
131 static struct gpio_led pcm027_led[] = {
132         {
133                 .name = "led0:red",     /* FIXME */
134                 .gpio = PCM027_LED_CPU
135         },
136         {
137                 .name = "led1:green",   /* FIXME */
138                 .gpio = PCM027_LED_HEARD_BEAT
139         },
140 };
141
142 static struct gpio_led_platform_data pcm027_led_data = {
143         .num_leds       = ARRAY_SIZE(pcm027_led),
144         .leds           = pcm027_led
145 };
146
147 static struct platform_device pcm027_led_dev = {
148         .name           = "leds-gpio",
149         .id             = 0,
150         .dev            = {
151                 .platform_data  = &pcm027_led_data,
152         },
153 };
154
155 #endif /* CONFIG_LEDS_GPIO */
156
157 /*
158  * declare the available device resources on this board
159  */
160 static struct platform_device *devices[] __initdata = {
161         &smc91x_device,
162         &pcm027_flash,
163 #ifdef CONFIG_LEDS_GPIO
164         &pcm027_led_dev
165 #endif
166 };
167
168 /*
169  * pcm027_init - breath some life into the board
170  */
171 static void __init pcm027_init(void)
172 {
173         /* system bus arbiter setting
174          * - Core_Park
175          * - LCD_wt:DMA_wt:CORE_Wt = 2:3:4
176          */
177         ARB_CNTRL = ARB_CORE_PARK | 0x234;
178
179         platform_add_devices(devices, ARRAY_SIZE(devices));
180
181         /* LEDs (on demand only) */
182 #ifdef CONFIG_LEDS_GPIO
183         pxa_gpio_mode(PCM027_LED_CPU | GPIO_OUT);
184         pxa_gpio_mode(PCM027_LED_HEARD_BEAT | GPIO_OUT);
185 #endif /* CONFIG_LEDS_GPIO */
186
187         /* at last call the baseboard to initialize itself */
188 #ifdef CONFIG_MACH_PCM990_BASEBOARD
189         pcm990_baseboard_init();
190 #endif
191 }
192
193 static void __init pcm027_map_io(void)
194 {
195         pxa_map_io();
196
197         /* initialize sleep mode regs (wake-up sources, etc) */
198         PGSR0 = 0x01308000;
199         PGSR1 = 0x00CF0002;
200         PGSR2 = 0x0E294000;
201         PGSR3 = 0x0000C000;
202         PWER  = 0x40000000 | PWER_GPIO0 | PWER_GPIO1;
203         PRER  = 0x00000000;
204         PFER  = 0x00000003;
205 }
206
207 MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270")
208         /* Maintainer: Pengutronix */
209         .boot_params    = 0xa0000100,
210         .phys_io        = 0x40000000,
211         .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
212         .map_io         = pcm027_map_io,
213         .init_irq       = pxa27x_init_irq,
214         .timer          = &pxa_timer,
215         .init_machine   = pcm027_init,
216 MACHINE_END