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 <vireshk@kernel.org>
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 */
23 struct 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 */
184 static 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 
spear300_dt_init(void)192 static 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_default_populate(NULL, spear300_auxdata_lookup, NULL);
198 }
199 
200 static const char * const spear300_dt_board_compat[] = {
201 	"st,spear300",
202 	"st,spear300-evb",
203 	NULL,
204 };
205 
spear300_map_io(void)206 static void __init spear300_map_io(void)
207 {
208 	spear3xx_map_io();
209 }
210 
211 DT_MACHINE_START(SPEAR300_DT, "ST SPEAr300 SoC with Flattened Device Tree")
212 	.map_io		=	spear300_map_io,
213 	.init_time	=	spear3xx_timer_init,
214 	.init_machine	=	spear300_dt_init,
215 	.restart	=	spear_restart,
216 	.dt_compat	=	spear300_dt_board_compat,
217 MACHINE_END
218