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