GNU Linux-libre 6.1.90-gnu
[releases.git] / arch / arm / mach-spear / spear310.c
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, 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