1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * arch/arm/mach-spear3xx/spear300.c
4 *
5 * SPEAr300 machine source file
6 *
7 * Copyright (C) 2009-2012 ST Microelectronics
8 * Viresh Kumar <vireshk@kernel.org>
9 */
10
11#define pr_fmt(fmt) "SPEAr300: " fmt
12
13#include <linux/amba/pl08x.h>
14#include <linux/of_platform.h>
15#include <asm/mach/arch.h>
16#include "generic.h"
17#include "spear.h"
18
19/* DMAC platform data's slave info */
20struct pl08x_channel_data spear300_dma_info[] = {
21	{
22		.bus_id = "uart0_rx",
23		.min_signal = 2,
24		.max_signal = 2,
25		.muxval = 0,
26		.periph_buses = PL08X_AHB1,
27	}, {
28		.bus_id = "uart0_tx",
29		.min_signal = 3,
30		.max_signal = 3,
31		.muxval = 0,
32		.periph_buses = PL08X_AHB1,
33	}, {
34		.bus_id = "ssp0_rx",
35		.min_signal = 8,
36		.max_signal = 8,
37		.muxval = 0,
38		.periph_buses = PL08X_AHB1,
39	}, {
40		.bus_id = "ssp0_tx",
41		.min_signal = 9,
42		.max_signal = 9,
43		.muxval = 0,
44		.periph_buses = PL08X_AHB1,
45	}, {
46		.bus_id = "i2c_rx",
47		.min_signal = 10,
48		.max_signal = 10,
49		.muxval = 0,
50		.periph_buses = PL08X_AHB1,
51	}, {
52		.bus_id = "i2c_tx",
53		.min_signal = 11,
54		.max_signal = 11,
55		.muxval = 0,
56		.periph_buses = PL08X_AHB1,
57	}, {
58		.bus_id = "irda",
59		.min_signal = 12,
60		.max_signal = 12,
61		.muxval = 0,
62		.periph_buses = PL08X_AHB1,
63	}, {
64		.bus_id = "adc",
65		.min_signal = 13,
66		.max_signal = 13,
67		.muxval = 0,
68		.periph_buses = PL08X_AHB1,
69	}, {
70		.bus_id = "to_jpeg",
71		.min_signal = 14,
72		.max_signal = 14,
73		.muxval = 0,
74		.periph_buses = PL08X_AHB1,
75	}, {
76		.bus_id = "from_jpeg",
77		.min_signal = 15,
78		.max_signal = 15,
79		.muxval = 0,
80		.periph_buses = PL08X_AHB1,
81	}, {
82		.bus_id = "ras0_rx",
83		.min_signal = 0,
84		.max_signal = 0,
85		.muxval = 1,
86		.periph_buses = PL08X_AHB1,
87	}, {
88		.bus_id = "ras0_tx",
89		.min_signal = 1,
90		.max_signal = 1,
91		.muxval = 1,
92		.periph_buses = PL08X_AHB1,
93	}, {
94		.bus_id = "ras1_rx",
95		.min_signal = 2,
96		.max_signal = 2,
97		.muxval = 1,
98		.periph_buses = PL08X_AHB1,
99	}, {
100		.bus_id = "ras1_tx",
101		.min_signal = 3,
102		.max_signal = 3,
103		.muxval = 1,
104		.periph_buses = PL08X_AHB1,
105	}, {
106		.bus_id = "ras2_rx",
107		.min_signal = 4,
108		.max_signal = 4,
109		.muxval = 1,
110		.periph_buses = PL08X_AHB1,
111	}, {
112		.bus_id = "ras2_tx",
113		.min_signal = 5,
114		.max_signal = 5,
115		.muxval = 1,
116		.periph_buses = PL08X_AHB1,
117	}, {
118		.bus_id = "ras3_rx",
119		.min_signal = 6,
120		.max_signal = 6,
121		.muxval = 1,
122		.periph_buses = PL08X_AHB1,
123	}, {
124		.bus_id = "ras3_tx",
125		.min_signal = 7,
126		.max_signal = 7,
127		.muxval = 1,
128		.periph_buses = PL08X_AHB1,
129	}, {
130		.bus_id = "ras4_rx",
131		.min_signal = 8,
132		.max_signal = 8,
133		.muxval = 1,
134		.periph_buses = PL08X_AHB1,
135	}, {
136		.bus_id = "ras4_tx",
137		.min_signal = 9,
138		.max_signal = 9,
139		.muxval = 1,
140		.periph_buses = PL08X_AHB1,
141	}, {
142		.bus_id = "ras5_rx",
143		.min_signal = 10,
144		.max_signal = 10,
145		.muxval = 1,
146		.periph_buses = PL08X_AHB1,
147	}, {
148		.bus_id = "ras5_tx",
149		.min_signal = 11,
150		.max_signal = 11,
151		.muxval = 1,
152		.periph_buses = PL08X_AHB1,
153	}, {
154		.bus_id = "ras6_rx",
155		.min_signal = 12,
156		.max_signal = 12,
157		.muxval = 1,
158		.periph_buses = PL08X_AHB1,
159	}, {
160		.bus_id = "ras6_tx",
161		.min_signal = 13,
162		.max_signal = 13,
163		.muxval = 1,
164		.periph_buses = PL08X_AHB1,
165	}, {
166		.bus_id = "ras7_rx",
167		.min_signal = 14,
168		.max_signal = 14,
169		.muxval = 1,
170		.periph_buses = PL08X_AHB1,
171	}, {
172		.bus_id = "ras7_tx",
173		.min_signal = 15,
174		.max_signal = 15,
175		.muxval = 1,
176		.periph_buses = PL08X_AHB1,
177	},
178};
179
180/* Add SPEAr300 auxdata to pass platform data */
181static struct of_dev_auxdata spear300_auxdata_lookup[] __initdata = {
182	OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
183			&pl022_plat_data),
184	OF_DEV_AUXDATA("arm,pl080", SPEAR_ICM3_DMA_BASE, NULL,
185			&pl080_plat_data),
186	{}
187};
188
189static void __init spear300_dt_init(void)
190{
191	pl080_plat_data.slave_channels = spear300_dma_info;
192	pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear300_dma_info);
193
194	of_platform_default_populate(NULL, spear300_auxdata_lookup, NULL);
195}
196
197static const char * const spear300_dt_board_compat[] = {
198	"st,spear300",
199	"st,spear300-evb",
200	NULL,
201};
202
203static void __init spear300_map_io(void)
204{
205	spear3xx_map_io();
206}
207
208DT_MACHINE_START(SPEAR300_DT, "ST SPEAr300 SoC with Flattened Device Tree")
209	.map_io		=	spear300_map_io,
210	.init_time	=	spear3xx_timer_init,
211	.init_machine	=	spear300_dt_init,
212	.restart	=	spear_restart,
213	.dt_compat	=	spear300_dt_board_compat,
214MACHINE_END
215