Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[pandora-kernel.git] / arch / arm / mach-dove / common.c
1 /*
2  * arch/arm/mach-dove/common.c
3  *
4  * Core functions for Marvell Dove 88AP510 System On Chip
5  *
6  * This file is licensed under the terms of the GNU General Public
7  * License version 2.  This program is licensed "as is" without any
8  * warranty of any kind, whether express or implied.
9  */
10
11 #include <linux/kernel.h>
12 #include <linux/delay.h>
13 #include <linux/init.h>
14 #include <linux/platform_device.h>
15 #include <linux/pci.h>
16 #include <linux/clk.h>
17 #include <linux/mbus.h>
18 #include <linux/ata_platform.h>
19 #include <linux/gpio.h>
20 #include <asm/page.h>
21 #include <asm/setup.h>
22 #include <asm/timex.h>
23 #include <asm/hardware/cache-tauros2.h>
24 #include <asm/mach/map.h>
25 #include <asm/mach/time.h>
26 #include <asm/mach/pci.h>
27 #include <mach/dove.h>
28 #include <mach/bridge-regs.h>
29 #include <asm/mach/arch.h>
30 #include <linux/irq.h>
31 #include <plat/time.h>
32 #include <plat/common.h>
33 #include "common.h"
34
35 static int get_tclk(void);
36
37 /*****************************************************************************
38  * I/O Address Mapping
39  ****************************************************************************/
40 static struct map_desc dove_io_desc[] __initdata = {
41         {
42                 .virtual        = DOVE_SB_REGS_VIRT_BASE,
43                 .pfn            = __phys_to_pfn(DOVE_SB_REGS_PHYS_BASE),
44                 .length         = DOVE_SB_REGS_SIZE,
45                 .type           = MT_DEVICE,
46         }, {
47                 .virtual        = DOVE_NB_REGS_VIRT_BASE,
48                 .pfn            = __phys_to_pfn(DOVE_NB_REGS_PHYS_BASE),
49                 .length         = DOVE_NB_REGS_SIZE,
50                 .type           = MT_DEVICE,
51         }, {
52                 .virtual        = DOVE_PCIE0_IO_VIRT_BASE,
53                 .pfn            = __phys_to_pfn(DOVE_PCIE0_IO_PHYS_BASE),
54                 .length         = DOVE_PCIE0_IO_SIZE,
55                 .type           = MT_DEVICE,
56         }, {
57                 .virtual        = DOVE_PCIE1_IO_VIRT_BASE,
58                 .pfn            = __phys_to_pfn(DOVE_PCIE1_IO_PHYS_BASE),
59                 .length         = DOVE_PCIE1_IO_SIZE,
60                 .type           = MT_DEVICE,
61         },
62 };
63
64 void __init dove_map_io(void)
65 {
66         iotable_init(dove_io_desc, ARRAY_SIZE(dove_io_desc));
67 }
68
69 /*****************************************************************************
70  * EHCI0
71  ****************************************************************************/
72 void __init dove_ehci0_init(void)
73 {
74         orion_ehci_init(&dove_mbus_dram_info,
75                         DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0);
76 }
77
78 /*****************************************************************************
79  * EHCI1
80  ****************************************************************************/
81 void __init dove_ehci1_init(void)
82 {
83         orion_ehci_1_init(&dove_mbus_dram_info,
84                           DOVE_USB1_PHYS_BASE, IRQ_DOVE_USB1);
85 }
86
87 /*****************************************************************************
88  * GE00
89  ****************************************************************************/
90 void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data)
91 {
92         orion_ge00_init(eth_data, &dove_mbus_dram_info,
93                         DOVE_GE00_PHYS_BASE, IRQ_DOVE_GE00_SUM,
94                         0, get_tclk());
95 }
96
97 /*****************************************************************************
98  * SoC RTC
99  ****************************************************************************/
100 void __init dove_rtc_init(void)
101 {
102         orion_rtc_init(DOVE_RTC_PHYS_BASE, IRQ_DOVE_RTC);
103 }
104
105 /*****************************************************************************
106  * SATA
107  ****************************************************************************/
108 void __init dove_sata_init(struct mv_sata_platform_data *sata_data)
109 {
110         orion_sata_init(sata_data, &dove_mbus_dram_info,
111                         DOVE_SATA_PHYS_BASE, IRQ_DOVE_SATA);
112
113 }
114
115 /*****************************************************************************
116  * UART0
117  ****************************************************************************/
118 void __init dove_uart0_init(void)
119 {
120         orion_uart0_init(DOVE_UART0_VIRT_BASE, DOVE_UART0_PHYS_BASE,
121                          IRQ_DOVE_UART_0, get_tclk());
122 }
123
124 /*****************************************************************************
125  * UART1
126  ****************************************************************************/
127 void __init dove_uart1_init(void)
128 {
129         orion_uart1_init(DOVE_UART1_VIRT_BASE, DOVE_UART1_PHYS_BASE,
130                          IRQ_DOVE_UART_1, get_tclk());
131 }
132
133 /*****************************************************************************
134  * UART2
135  ****************************************************************************/
136 void __init dove_uart2_init(void)
137 {
138         orion_uart2_init(DOVE_UART2_VIRT_BASE, DOVE_UART2_PHYS_BASE,
139                          IRQ_DOVE_UART_2, get_tclk());
140 }
141
142 /*****************************************************************************
143  * UART3
144  ****************************************************************************/
145 void __init dove_uart3_init(void)
146 {
147         orion_uart3_init(DOVE_UART3_VIRT_BASE, DOVE_UART3_PHYS_BASE,
148                          IRQ_DOVE_UART_3, get_tclk());
149 }
150
151 /*****************************************************************************
152  * SPI
153  ****************************************************************************/
154 void __init dove_spi0_init(void)
155 {
156         orion_spi_init(DOVE_SPI0_PHYS_BASE, get_tclk());
157 }
158
159 void __init dove_spi1_init(void)
160 {
161         orion_spi_1_init(DOVE_SPI1_PHYS_BASE, get_tclk());
162 }
163
164 /*****************************************************************************
165  * I2C
166  ****************************************************************************/
167 void __init dove_i2c_init(void)
168 {
169         orion_i2c_init(DOVE_I2C_PHYS_BASE, IRQ_DOVE_I2C, 10);
170 }
171
172 /*****************************************************************************
173  * Time handling
174  ****************************************************************************/
175 void __init dove_init_early(void)
176 {
177         orion_time_set_base(TIMER_VIRT_BASE);
178 }
179
180 static int get_tclk(void)
181 {
182         /* use DOVE_RESET_SAMPLE_HI/LO to detect tclk */
183         return 166666667;
184 }
185
186 static void dove_timer_init(void)
187 {
188         orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR,
189                         IRQ_DOVE_BRIDGE, get_tclk());
190 }
191
192 struct sys_timer dove_timer = {
193         .init = dove_timer_init,
194 };
195
196 /*****************************************************************************
197  * XOR 0
198  ****************************************************************************/
199 void __init dove_xor0_init(void)
200 {
201         orion_xor0_init(&dove_mbus_dram_info,
202                         DOVE_XOR0_PHYS_BASE, DOVE_XOR0_HIGH_PHYS_BASE,
203                         IRQ_DOVE_XOR_00, IRQ_DOVE_XOR_01);
204 }
205
206 /*****************************************************************************
207  * XOR 1
208  ****************************************************************************/
209 void __init dove_xor1_init(void)
210 {
211         orion_xor1_init(DOVE_XOR1_PHYS_BASE, DOVE_XOR1_HIGH_PHYS_BASE,
212                         IRQ_DOVE_XOR_10, IRQ_DOVE_XOR_11);
213 }
214
215 /*****************************************************************************
216  * SDIO
217  ****************************************************************************/
218 static u64 sdio_dmamask = DMA_BIT_MASK(32);
219
220 static struct resource dove_sdio0_resources[] = {
221         {
222                 .start  = DOVE_SDIO0_PHYS_BASE,
223                 .end    = DOVE_SDIO0_PHYS_BASE + 0xff,
224                 .flags  = IORESOURCE_MEM,
225         }, {
226                 .start  = IRQ_DOVE_SDIO0,
227                 .end    = IRQ_DOVE_SDIO0,
228                 .flags  = IORESOURCE_IRQ,
229         },
230 };
231
232 static struct platform_device dove_sdio0 = {
233         .name           = "sdhci-dove",
234         .id             = 0,
235         .dev            = {
236                 .dma_mask               = &sdio_dmamask,
237                 .coherent_dma_mask      = DMA_BIT_MASK(32),
238         },
239         .resource       = dove_sdio0_resources,
240         .num_resources  = ARRAY_SIZE(dove_sdio0_resources),
241 };
242
243 void __init dove_sdio0_init(void)
244 {
245         platform_device_register(&dove_sdio0);
246 }
247
248 static struct resource dove_sdio1_resources[] = {
249         {
250                 .start  = DOVE_SDIO1_PHYS_BASE,
251                 .end    = DOVE_SDIO1_PHYS_BASE + 0xff,
252                 .flags  = IORESOURCE_MEM,
253         }, {
254                 .start  = IRQ_DOVE_SDIO1,
255                 .end    = IRQ_DOVE_SDIO1,
256                 .flags  = IORESOURCE_IRQ,
257         },
258 };
259
260 static struct platform_device dove_sdio1 = {
261         .name           = "sdhci-dove",
262         .id             = 1,
263         .dev            = {
264                 .dma_mask               = &sdio_dmamask,
265                 .coherent_dma_mask      = DMA_BIT_MASK(32),
266         },
267         .resource       = dove_sdio1_resources,
268         .num_resources  = ARRAY_SIZE(dove_sdio1_resources),
269 };
270
271 void __init dove_sdio1_init(void)
272 {
273         platform_device_register(&dove_sdio1);
274 }
275
276 void __init dove_init(void)
277 {
278         int tclk;
279
280         tclk = get_tclk();
281
282         printk(KERN_INFO "Dove 88AP510 SoC, ");
283         printk(KERN_INFO "TCLK = %dMHz\n", (tclk + 499999) / 1000000);
284
285 #ifdef CONFIG_CACHE_TAUROS2
286         tauros2_init();
287 #endif
288         dove_setup_cpu_mbus();
289
290         /* internal devices that every board has */
291         dove_rtc_init();
292         dove_xor0_init();
293         dove_xor1_init();
294 }