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 | |
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, lookup: 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 | |
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 | |