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 */
27struct 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 */
188static 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 */
213static 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
231static 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
239static const char * const spear310_dt_board_compat[] = {
240	"st,spear310",
241	"st,spear310-evb",
242	NULL,
243};
244
245static void __init spear310_map_io(void)
246{
247	spear3xx_map_io();
248}
249
250DT_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,
256MACHINE_END
257