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