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