diff options
Diffstat (limited to 'arch/arm/mach-ux500/cpu-db8500.c')
-rw-r--r-- | arch/arm/mach-ux500/cpu-db8500.c | 123 |
1 files changed, 110 insertions, 13 deletions
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index bcdfe6b1d453..db0bb75e2c76 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -17,18 +17,27 @@ | |||
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | #include <linux/mfd/abx500/ab8500.h> | 19 | #include <linux/mfd/abx500/ab8500.h> |
20 | #include <linux/mfd/dbx500-prcmu.h> | ||
21 | #include <linux/of.h> | ||
22 | #include <linux/of_platform.h> | ||
23 | #include <linux/regulator/machine.h> | ||
24 | #include <linux/platform_data/pinctrl-nomadik.h> | ||
25 | #include <linux/random.h> | ||
20 | 26 | ||
21 | #include <asm/pmu.h> | 27 | #include <asm/pmu.h> |
22 | #include <asm/mach/map.h> | 28 | #include <asm/mach/map.h> |
23 | #include <plat/gpio-nomadik.h> | 29 | #include <asm/mach/arch.h> |
30 | #include <asm/hardware/gic.h> | ||
31 | |||
24 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
25 | #include <mach/setup.h> | 33 | #include <mach/setup.h> |
26 | #include <mach/devices.h> | 34 | #include <mach/devices.h> |
27 | #include <linux/platform_data/usb-musb-ux500.h> | ||
28 | #include <mach/db8500-regs.h> | 35 | #include <mach/db8500-regs.h> |
36 | #include <mach/irqs.h> | ||
29 | 37 | ||
30 | #include "devices-db8500.h" | 38 | #include "devices-db8500.h" |
31 | #include "ste-dma40-db8500.h" | 39 | #include "ste-dma40-db8500.h" |
40 | #include "board-mop500.h" | ||
32 | 41 | ||
33 | /* minimum static i/o mapping required to boot U8500 platforms */ | 42 | /* minimum static i/o mapping required to boot U8500 platforms */ |
34 | static struct map_desc u8500_uart_io_desc[] __initdata = { | 43 | static struct map_desc u8500_uart_io_desc[] __initdata = { |
@@ -158,7 +167,7 @@ static void __init db8500_add_gpios(struct device *parent) | |||
158 | 167 | ||
159 | dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base), | 168 | dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base), |
160 | IRQ_DB8500_GPIO0, &pdata); | 169 | IRQ_DB8500_GPIO0, &pdata); |
161 | dbx500_add_pinctrl(parent, "pinctrl-db8500"); | 170 | dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE); |
162 | } | 171 | } |
163 | 172 | ||
164 | static int usb_db8500_rx_dma_cfg[] = { | 173 | static int usb_db8500_rx_dma_cfg[] = { |
@@ -187,6 +196,8 @@ static const char *db8500_read_soc_id(void) | |||
187 | { | 196 | { |
188 | void __iomem *uid = __io_address(U8500_BB_UID_BASE); | 197 | void __iomem *uid = __io_address(U8500_BB_UID_BASE); |
189 | 198 | ||
199 | /* Throw these device-specific numbers into the entropy pool */ | ||
200 | add_device_randomness(uid, 0x14); | ||
190 | return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x", | 201 | return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x", |
191 | readl((u32 *)uid+1), | 202 | readl((u32 *)uid+1), |
192 | readl((u32 *)uid+1), readl((u32 *)uid+2), | 203 | readl((u32 *)uid+1), readl((u32 *)uid+2), |
@@ -214,9 +225,6 @@ struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500) | |||
214 | db8500_add_gpios(parent); | 225 | db8500_add_gpios(parent); |
215 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | 226 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); |
216 | 227 | ||
217 | platform_device_register_data(parent, | ||
218 | "cpufreq-u8500", -1, NULL, 0); | ||
219 | |||
220 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) | 228 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) |
221 | platform_devs[i]->dev.parent = parent; | 229 | platform_devs[i]->dev.parent = parent; |
222 | 230 | ||
@@ -227,18 +235,15 @@ struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500) | |||
227 | return parent; | 235 | return parent; |
228 | } | 236 | } |
229 | 237 | ||
238 | #ifdef CONFIG_MACH_UX500_DT | ||
239 | |||
230 | /* TODO: Once all pieces are DT:ed, remove completely. */ | 240 | /* TODO: Once all pieces are DT:ed, remove completely. */ |
231 | struct device * __init u8500_of_init_devices(void) | 241 | static struct device * __init u8500_of_init_devices(void) |
232 | { | 242 | { |
233 | struct device *parent; | 243 | struct device *parent = db8500_soc_device_init(); |
234 | |||
235 | parent = db8500_soc_device_init(); | ||
236 | 244 | ||
237 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | 245 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); |
238 | 246 | ||
239 | platform_device_register_data(parent, | ||
240 | "cpufreq-u8500", -1, NULL, 0); | ||
241 | |||
242 | u8500_dma40_device.dev.parent = parent; | 247 | u8500_dma40_device.dev.parent = parent; |
243 | 248 | ||
244 | /* | 249 | /* |
@@ -251,3 +256,95 @@ struct device * __init u8500_of_init_devices(void) | |||
251 | 256 | ||
252 | return parent; | 257 | return parent; |
253 | } | 258 | } |
259 | |||
260 | static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | ||
261 | /* Requires call-back bindings. */ | ||
262 | OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata), | ||
263 | /* Requires DMA bindings. */ | ||
264 | OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), | ||
265 | OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat), | ||
266 | OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat), | ||
267 | OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat), | ||
268 | OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0", &mop500_sdi0_data), | ||
269 | OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1", &mop500_sdi1_data), | ||
270 | OF_DEV_AUXDATA("arm,pl18x", 0x80005000, "sdi2", &mop500_sdi2_data), | ||
271 | OF_DEV_AUXDATA("arm,pl18x", 0x80114000, "sdi4", &mop500_sdi4_data), | ||
272 | /* Requires clock name bindings. */ | ||
273 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e000, "gpio.0", NULL), | ||
274 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e080, "gpio.1", NULL), | ||
275 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e000, "gpio.2", NULL), | ||
276 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e080, "gpio.3", NULL), | ||
277 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e100, "gpio.4", NULL), | ||
278 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e180, "gpio.5", NULL), | ||
279 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL), | ||
280 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL), | ||
281 | OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL), | ||
282 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80004000, "nmk-i2c.0", NULL), | ||
283 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80122000, "nmk-i2c.1", NULL), | ||
284 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80128000, "nmk-i2c.2", NULL), | ||
285 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL), | ||
286 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), | ||
287 | /* Requires device name bindings. */ | ||
288 | OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL), | ||
289 | /* Requires clock name and DMA bindings. */ | ||
290 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000, | ||
291 | "ux500-msp-i2s.0", &msp0_platform_data), | ||
292 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000, | ||
293 | "ux500-msp-i2s.1", &msp1_platform_data), | ||
294 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80117000, | ||
295 | "ux500-msp-i2s.2", &msp2_platform_data), | ||
296 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80125000, | ||
297 | "ux500-msp-i2s.3", &msp3_platform_data), | ||
298 | {}, | ||
299 | }; | ||
300 | |||
301 | static const struct of_device_id u8500_local_bus_nodes[] = { | ||
302 | /* only create devices below soc node */ | ||
303 | { .compatible = "stericsson,db8500", }, | ||
304 | { .compatible = "stericsson,db8500-prcmu", }, | ||
305 | { .compatible = "simple-bus"}, | ||
306 | { }, | ||
307 | }; | ||
308 | |||
309 | static void __init u8500_init_machine(void) | ||
310 | { | ||
311 | struct device *parent = NULL; | ||
312 | |||
313 | /* Pinmaps must be in place before devices register */ | ||
314 | if (of_machine_is_compatible("st-ericsson,mop500")) | ||
315 | mop500_pinmaps_init(); | ||
316 | else if (of_machine_is_compatible("calaosystems,snowball-a9500")) | ||
317 | snowball_pinmaps_init(); | ||
318 | else if (of_machine_is_compatible("st-ericsson,hrefv60+")) | ||
319 | hrefv60_pinmaps_init(); | ||
320 | else if (of_machine_is_compatible("st-ericsson,ccu9540")) {} | ||
321 | /* TODO: Add pinmaps for ccu9540 board. */ | ||
322 | |||
323 | /* TODO: Export SoC, USB, cpu-freq and DMA40 */ | ||
324 | parent = u8500_of_init_devices(); | ||
325 | |||
326 | /* automatically probe child nodes of db8500 device */ | ||
327 | of_platform_populate(NULL, u8500_local_bus_nodes, u8500_auxdata_lookup, parent); | ||
328 | } | ||
329 | |||
330 | static const char * stericsson_dt_platform_compat[] = { | ||
331 | "st-ericsson,u8500", | ||
332 | "st-ericsson,u8540", | ||
333 | "st-ericsson,u9500", | ||
334 | "st-ericsson,u9540", | ||
335 | NULL, | ||
336 | }; | ||
337 | |||
338 | DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)") | ||
339 | .smp = smp_ops(ux500_smp_ops), | ||
340 | .map_io = u8500_map_io, | ||
341 | .init_irq = ux500_init_irq, | ||
342 | /* we re-use nomadik timer here */ | ||
343 | .timer = &ux500_timer, | ||
344 | .handle_irq = gic_handle_irq, | ||
345 | .init_machine = u8500_init_machine, | ||
346 | .init_late = NULL, | ||
347 | .dt_compat = stericsson_dt_platform_compat, | ||
348 | MACHINE_END | ||
349 | |||
350 | #endif | ||