]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/arm/mach-spear/spear320.c
Merge branch 'late/clksrc' into late/cleanup
[karo-tx-linux.git] / arch / arm / mach-spear / spear320.c
1 /*
2  * arch/arm/mach-spear3xx/spear320.c
3  *
4  * SPEAr320 machine source file
5  *
6  * Copyright (C) 2009-2012 ST Microelectronics
7  * Viresh Kumar <viresh.linux@gmail.com>
8  *
9  * This file is licensed under the terms of the GNU General Public
10  * License version 2. This program is licensed "as is" without any
11  * warranty of any kind, whether express or implied.
12  */
13
14 #define pr_fmt(fmt) "SPEAr320: " fmt
15
16 #include <linux/amba/pl022.h>
17 #include <linux/amba/pl08x.h>
18 #include <linux/amba/serial.h>
19 #include <linux/irqchip.h>
20 #include <linux/of_platform.h>
21 #include <asm/mach/arch.h>
22 #include <asm/mach/map.h>
23 #include "generic.h"
24 #include <mach/spear.h>
25
26 #define SPEAR320_UART1_BASE             UL(0xA3000000)
27 #define SPEAR320_UART2_BASE             UL(0xA4000000)
28 #define SPEAR320_SSP0_BASE              UL(0xA5000000)
29 #define SPEAR320_SSP1_BASE              UL(0xA6000000)
30
31 /* DMAC platform data's slave info */
32 struct pl08x_channel_data spear320_dma_info[] = {
33         {
34                 .bus_id = "uart0_rx",
35                 .min_signal = 2,
36                 .max_signal = 2,
37                 .muxval = 0,
38                 .periph_buses = PL08X_AHB1,
39         }, {
40                 .bus_id = "uart0_tx",
41                 .min_signal = 3,
42                 .max_signal = 3,
43                 .muxval = 0,
44                 .periph_buses = PL08X_AHB1,
45         }, {
46                 .bus_id = "ssp0_rx",
47                 .min_signal = 8,
48                 .max_signal = 8,
49                 .muxval = 0,
50                 .periph_buses = PL08X_AHB1,
51         }, {
52                 .bus_id = "ssp0_tx",
53                 .min_signal = 9,
54                 .max_signal = 9,
55                 .muxval = 0,
56                 .periph_buses = PL08X_AHB1,
57         }, {
58                 .bus_id = "i2c0_rx",
59                 .min_signal = 10,
60                 .max_signal = 10,
61                 .muxval = 0,
62                 .periph_buses = PL08X_AHB1,
63         }, {
64                 .bus_id = "i2c0_tx",
65                 .min_signal = 11,
66                 .max_signal = 11,
67                 .muxval = 0,
68                 .periph_buses = PL08X_AHB1,
69         }, {
70                 .bus_id = "irda",
71                 .min_signal = 12,
72                 .max_signal = 12,
73                 .muxval = 0,
74                 .periph_buses = PL08X_AHB1,
75         }, {
76                 .bus_id = "adc",
77                 .min_signal = 13,
78                 .max_signal = 13,
79                 .muxval = 0,
80                 .periph_buses = PL08X_AHB1,
81         }, {
82                 .bus_id = "to_jpeg",
83                 .min_signal = 14,
84                 .max_signal = 14,
85                 .muxval = 0,
86                 .periph_buses = PL08X_AHB1,
87         }, {
88                 .bus_id = "from_jpeg",
89                 .min_signal = 15,
90                 .max_signal = 15,
91                 .muxval = 0,
92                 .periph_buses = PL08X_AHB1,
93         }, {
94                 .bus_id = "ssp1_rx",
95                 .min_signal = 0,
96                 .max_signal = 0,
97                 .muxval = 1,
98                 .periph_buses = PL08X_AHB2,
99         }, {
100                 .bus_id = "ssp1_tx",
101                 .min_signal = 1,
102                 .max_signal = 1,
103                 .muxval = 1,
104                 .periph_buses = PL08X_AHB2,
105         }, {
106                 .bus_id = "ssp2_rx",
107                 .min_signal = 2,
108                 .max_signal = 2,
109                 .muxval = 1,
110                 .periph_buses = PL08X_AHB2,
111         }, {
112                 .bus_id = "ssp2_tx",
113                 .min_signal = 3,
114                 .max_signal = 3,
115                 .muxval = 1,
116                 .periph_buses = PL08X_AHB2,
117         }, {
118                 .bus_id = "uart1_rx",
119                 .min_signal = 4,
120                 .max_signal = 4,
121                 .muxval = 1,
122                 .periph_buses = PL08X_AHB2,
123         }, {
124                 .bus_id = "uart1_tx",
125                 .min_signal = 5,
126                 .max_signal = 5,
127                 .muxval = 1,
128                 .periph_buses = PL08X_AHB2,
129         }, {
130                 .bus_id = "uart2_rx",
131                 .min_signal = 6,
132                 .max_signal = 6,
133                 .muxval = 1,
134                 .periph_buses = PL08X_AHB2,
135         }, {
136                 .bus_id = "uart2_tx",
137                 .min_signal = 7,
138                 .max_signal = 7,
139                 .muxval = 1,
140                 .periph_buses = PL08X_AHB2,
141         }, {
142                 .bus_id = "i2c1_rx",
143                 .min_signal = 8,
144                 .max_signal = 8,
145                 .muxval = 1,
146                 .periph_buses = PL08X_AHB2,
147         }, {
148                 .bus_id = "i2c1_tx",
149                 .min_signal = 9,
150                 .max_signal = 9,
151                 .muxval = 1,
152                 .periph_buses = PL08X_AHB2,
153         }, {
154                 .bus_id = "i2c2_rx",
155                 .min_signal = 10,
156                 .max_signal = 10,
157                 .muxval = 1,
158                 .periph_buses = PL08X_AHB2,
159         }, {
160                 .bus_id = "i2c2_tx",
161                 .min_signal = 11,
162                 .max_signal = 11,
163                 .muxval = 1,
164                 .periph_buses = PL08X_AHB2,
165         }, {
166                 .bus_id = "i2s_rx",
167                 .min_signal = 12,
168                 .max_signal = 12,
169                 .muxval = 1,
170                 .periph_buses = PL08X_AHB2,
171         }, {
172                 .bus_id = "i2s_tx",
173                 .min_signal = 13,
174                 .max_signal = 13,
175                 .muxval = 1,
176                 .periph_buses = PL08X_AHB2,
177         }, {
178                 .bus_id = "rs485_rx",
179                 .min_signal = 14,
180                 .max_signal = 14,
181                 .muxval = 1,
182                 .periph_buses = PL08X_AHB2,
183         }, {
184                 .bus_id = "rs485_tx",
185                 .min_signal = 15,
186                 .max_signal = 15,
187                 .muxval = 1,
188                 .periph_buses = PL08X_AHB2,
189         },
190 };
191
192 static struct pl022_ssp_controller spear320_ssp_data[] = {
193         {
194                 .bus_id = 1,
195                 .enable_dma = 1,
196                 .dma_filter = pl08x_filter_id,
197                 .dma_tx_param = "ssp1_tx",
198                 .dma_rx_param = "ssp1_rx",
199                 .num_chipselect = 2,
200         }, {
201                 .bus_id = 2,
202                 .enable_dma = 1,
203                 .dma_filter = pl08x_filter_id,
204                 .dma_tx_param = "ssp2_tx",
205                 .dma_rx_param = "ssp2_rx",
206                 .num_chipselect = 2,
207         }
208 };
209
210 static struct amba_pl011_data spear320_uart_data[] = {
211         {
212                 .dma_filter = pl08x_filter_id,
213                 .dma_tx_param = "uart1_tx",
214                 .dma_rx_param = "uart1_rx",
215         }, {
216                 .dma_filter = pl08x_filter_id,
217                 .dma_tx_param = "uart2_tx",
218                 .dma_rx_param = "uart2_rx",
219         },
220 };
221
222 /* Add SPEAr310 auxdata to pass platform data */
223 static struct of_dev_auxdata spear320_auxdata_lookup[] __initdata = {
224         OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
225                         &pl022_plat_data),
226         OF_DEV_AUXDATA("arm,pl080", SPEAR_ICM3_DMA_BASE, NULL,
227                         &pl080_plat_data),
228         OF_DEV_AUXDATA("arm,pl022", SPEAR320_SSP0_BASE, NULL,
229                         &spear320_ssp_data[0]),
230         OF_DEV_AUXDATA("arm,pl022", SPEAR320_SSP1_BASE, NULL,
231                         &spear320_ssp_data[1]),
232         OF_DEV_AUXDATA("arm,pl011", SPEAR320_UART1_BASE, NULL,
233                         &spear320_uart_data[0]),
234         OF_DEV_AUXDATA("arm,pl011", SPEAR320_UART2_BASE, NULL,
235                         &spear320_uart_data[1]),
236         {}
237 };
238
239 static void __init spear320_dt_init(void)
240 {
241         pl080_plat_data.slave_channels = spear320_dma_info;
242         pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear320_dma_info);
243
244         of_platform_populate(NULL, of_default_bus_match_table,
245                         spear320_auxdata_lookup, NULL);
246 }
247
248 static const char * const spear320_dt_board_compat[] = {
249         "st,spear320",
250         "st,spear320-evb",
251         "st,spear320-hmi",
252         NULL,
253 };
254
255 struct map_desc spear320_io_desc[] __initdata = {
256         {
257                 .virtual        = (unsigned long)VA_SPEAR320_SOC_CONFIG_BASE,
258                 .pfn            = __phys_to_pfn(SPEAR320_SOC_CONFIG_BASE),
259                 .length         = SZ_16M,
260                 .type           = MT_DEVICE
261         },
262 };
263
264 static void __init spear320_map_io(void)
265 {
266         iotable_init(spear320_io_desc, ARRAY_SIZE(spear320_io_desc));
267         spear3xx_map_io();
268 }
269
270 DT_MACHINE_START(SPEAR320_DT, "ST SPEAr320 SoC with Flattened Device Tree")
271         .map_io         =       spear320_map_io,
272         .init_irq       =       irqchip_init,
273         .init_time      =       spear3xx_timer_init,
274         .init_machine   =       spear320_dt_init,
275         .restart        =       spear_restart,
276         .dt_compat      =       spear320_dt_board_compat,
277 MACHINE_END