xref: /openbmc/linux/arch/arm/mach-spear/spear310.c (revision 7587eb18)
1 /*
2  * arch/arm/mach-spear3xx/spear310.c
3  *
4  * SPEAr310 machine source file
5  *
6  * Copyright (C) 2009-2012 ST Microelectronics
7  * Viresh Kumar <vireshk@kernel.org>
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) "SPEAr310: " fmt
15 
16 #include <linux/amba/pl08x.h>
17 #include <linux/amba/serial.h>
18 #include <linux/of_platform.h>
19 #include <asm/mach/arch.h>
20 #include "generic.h"
21 #include <mach/spear.h>
22 
23 #define SPEAR310_UART1_BASE		UL(0xB2000000)
24 #define SPEAR310_UART2_BASE		UL(0xB2080000)
25 #define SPEAR310_UART3_BASE		UL(0xB2100000)
26 #define SPEAR310_UART4_BASE		UL(0xB2180000)
27 #define SPEAR310_UART5_BASE		UL(0xB2200000)
28 
29 /* DMAC platform data's slave info */
30 struct pl08x_channel_data spear310_dma_info[] = {
31 	{
32 		.bus_id = "uart0_rx",
33 		.min_signal = 2,
34 		.max_signal = 2,
35 		.muxval = 0,
36 		.periph_buses = PL08X_AHB1,
37 	}, {
38 		.bus_id = "uart0_tx",
39 		.min_signal = 3,
40 		.max_signal = 3,
41 		.muxval = 0,
42 		.periph_buses = PL08X_AHB1,
43 	}, {
44 		.bus_id = "ssp0_rx",
45 		.min_signal = 8,
46 		.max_signal = 8,
47 		.muxval = 0,
48 		.periph_buses = PL08X_AHB1,
49 	}, {
50 		.bus_id = "ssp0_tx",
51 		.min_signal = 9,
52 		.max_signal = 9,
53 		.muxval = 0,
54 		.periph_buses = PL08X_AHB1,
55 	}, {
56 		.bus_id = "i2c_rx",
57 		.min_signal = 10,
58 		.max_signal = 10,
59 		.muxval = 0,
60 		.periph_buses = PL08X_AHB1,
61 	}, {
62 		.bus_id = "i2c_tx",
63 		.min_signal = 11,
64 		.max_signal = 11,
65 		.muxval = 0,
66 		.periph_buses = PL08X_AHB1,
67 	}, {
68 		.bus_id = "irda",
69 		.min_signal = 12,
70 		.max_signal = 12,
71 		.muxval = 0,
72 		.periph_buses = PL08X_AHB1,
73 	}, {
74 		.bus_id = "adc",
75 		.min_signal = 13,
76 		.max_signal = 13,
77 		.muxval = 0,
78 		.periph_buses = PL08X_AHB1,
79 	}, {
80 		.bus_id = "to_jpeg",
81 		.min_signal = 14,
82 		.max_signal = 14,
83 		.muxval = 0,
84 		.periph_buses = PL08X_AHB1,
85 	}, {
86 		.bus_id = "from_jpeg",
87 		.min_signal = 15,
88 		.max_signal = 15,
89 		.muxval = 0,
90 		.periph_buses = PL08X_AHB1,
91 	}, {
92 		.bus_id = "uart1_rx",
93 		.min_signal = 0,
94 		.max_signal = 0,
95 		.muxval = 1,
96 		.periph_buses = PL08X_AHB1,
97 	}, {
98 		.bus_id = "uart1_tx",
99 		.min_signal = 1,
100 		.max_signal = 1,
101 		.muxval = 1,
102 		.periph_buses = PL08X_AHB1,
103 	}, {
104 		.bus_id = "uart2_rx",
105 		.min_signal = 2,
106 		.max_signal = 2,
107 		.muxval = 1,
108 		.periph_buses = PL08X_AHB1,
109 	}, {
110 		.bus_id = "uart2_tx",
111 		.min_signal = 3,
112 		.max_signal = 3,
113 		.muxval = 1,
114 		.periph_buses = PL08X_AHB1,
115 	}, {
116 		.bus_id = "uart3_rx",
117 		.min_signal = 4,
118 		.max_signal = 4,
119 		.muxval = 1,
120 		.periph_buses = PL08X_AHB1,
121 	}, {
122 		.bus_id = "uart3_tx",
123 		.min_signal = 5,
124 		.max_signal = 5,
125 		.muxval = 1,
126 		.periph_buses = PL08X_AHB1,
127 	}, {
128 		.bus_id = "uart4_rx",
129 		.min_signal = 6,
130 		.max_signal = 6,
131 		.muxval = 1,
132 		.periph_buses = PL08X_AHB1,
133 	}, {
134 		.bus_id = "uart4_tx",
135 		.min_signal = 7,
136 		.max_signal = 7,
137 		.muxval = 1,
138 		.periph_buses = PL08X_AHB1,
139 	}, {
140 		.bus_id = "uart5_rx",
141 		.min_signal = 8,
142 		.max_signal = 8,
143 		.muxval = 1,
144 		.periph_buses = PL08X_AHB1,
145 	}, {
146 		.bus_id = "uart5_tx",
147 		.min_signal = 9,
148 		.max_signal = 9,
149 		.muxval = 1,
150 		.periph_buses = PL08X_AHB1,
151 	}, {
152 		.bus_id = "ras5_rx",
153 		.min_signal = 10,
154 		.max_signal = 10,
155 		.muxval = 1,
156 		.periph_buses = PL08X_AHB1,
157 	}, {
158 		.bus_id = "ras5_tx",
159 		.min_signal = 11,
160 		.max_signal = 11,
161 		.muxval = 1,
162 		.periph_buses = PL08X_AHB1,
163 	}, {
164 		.bus_id = "ras6_rx",
165 		.min_signal = 12,
166 		.max_signal = 12,
167 		.muxval = 1,
168 		.periph_buses = PL08X_AHB1,
169 	}, {
170 		.bus_id = "ras6_tx",
171 		.min_signal = 13,
172 		.max_signal = 13,
173 		.muxval = 1,
174 		.periph_buses = PL08X_AHB1,
175 	}, {
176 		.bus_id = "ras7_rx",
177 		.min_signal = 14,
178 		.max_signal = 14,
179 		.muxval = 1,
180 		.periph_buses = PL08X_AHB1,
181 	}, {
182 		.bus_id = "ras7_tx",
183 		.min_signal = 15,
184 		.max_signal = 15,
185 		.muxval = 1,
186 		.periph_buses = PL08X_AHB1,
187 	},
188 };
189 
190 /* uart devices plat data */
191 static struct amba_pl011_data spear310_uart_data[] = {
192 	{
193 		.dma_filter = pl08x_filter_id,
194 		.dma_tx_param = "uart1_tx",
195 		.dma_rx_param = "uart1_rx",
196 	}, {
197 		.dma_filter = pl08x_filter_id,
198 		.dma_tx_param = "uart2_tx",
199 		.dma_rx_param = "uart2_rx",
200 	}, {
201 		.dma_filter = pl08x_filter_id,
202 		.dma_tx_param = "uart3_tx",
203 		.dma_rx_param = "uart3_rx",
204 	}, {
205 		.dma_filter = pl08x_filter_id,
206 		.dma_tx_param = "uart4_tx",
207 		.dma_rx_param = "uart4_rx",
208 	}, {
209 		.dma_filter = pl08x_filter_id,
210 		.dma_tx_param = "uart5_tx",
211 		.dma_rx_param = "uart5_rx",
212 	},
213 };
214 
215 /* Add SPEAr310 auxdata to pass platform data */
216 static struct of_dev_auxdata spear310_auxdata_lookup[] __initdata = {
217 	OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
218 			&pl022_plat_data),
219 	OF_DEV_AUXDATA("arm,pl080", SPEAR_ICM3_DMA_BASE, NULL,
220 			&pl080_plat_data),
221 	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART1_BASE, NULL,
222 			&spear310_uart_data[0]),
223 	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART2_BASE, NULL,
224 			&spear310_uart_data[1]),
225 	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART3_BASE, NULL,
226 			&spear310_uart_data[2]),
227 	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART4_BASE, NULL,
228 			&spear310_uart_data[3]),
229 	OF_DEV_AUXDATA("arm,pl011", SPEAR310_UART5_BASE, NULL,
230 			&spear310_uart_data[4]),
231 	{}
232 };
233 
234 static void __init spear310_dt_init(void)
235 {
236 	pl080_plat_data.slave_channels = spear310_dma_info;
237 	pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear310_dma_info);
238 
239 	of_platform_default_populate(NULL, spear310_auxdata_lookup, NULL);
240 }
241 
242 static const char * const spear310_dt_board_compat[] = {
243 	"st,spear310",
244 	"st,spear310-evb",
245 	NULL,
246 };
247 
248 static void __init spear310_map_io(void)
249 {
250 	spear3xx_map_io();
251 }
252 
253 DT_MACHINE_START(SPEAR310_DT, "ST SPEAr310 SoC with Flattened Device Tree")
254 	.map_io		=	spear310_map_io,
255 	.init_time	=	spear3xx_timer_init,
256 	.init_machine	=	spear310_dt_init,
257 	.restart	=	spear_restart,
258 	.dt_compat	=	spear310_dt_board_compat,
259 MACHINE_END
260