blob: 4ea03ad4117971060d3807d7a5f88f3460a02ef6 [file] [log] [blame]
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +02001/*
2 * Device Tree support for Armada 370 and XP platforms.
3 *
4 * Copyright (C) 2012 Marvell
5 *
6 * Lior Amsalem <alior@marvell.com>
7 * Gregory CLEMENT <gregory.clement@free-electrons.com>
8 * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
9 *
10 * This file is licensed under the terms of the GNU General Public
11 * License version 2. This program is licensed "as is" without any
12 * warranty of any kind, whether express or implied.
13 */
14
15#include <linux/kernel.h>
16#include <linux/init.h>
Sebastian Hesselbarth9cbbc512013-05-11 03:08:09 +020017#include <linux/clk-provider.h>
Thomas Petazzonid834d262013-06-05 09:04:59 +020018#include <linux/of_address.h>
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020019#include <linux/of_platform.h>
20#include <linux/io.h>
Ezequiel Garcia573145f2013-08-13 11:43:12 -030021#include <linux/clocksource.h>
Gregory CLEMENT53d2f882012-10-26 14:30:46 +020022#include <linux/dma-mapping.h>
Thomas Petazzoni87e1bed2013-03-21 17:59:15 +010023#include <linux/mbus.h>
Thomas Petazzonie33369c2013-04-09 23:26:14 +020024#include <asm/hardware/cache-l2x0.h>
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020025#include <asm/mach/arch.h>
26#include <asm/mach/map.h>
27#include <asm/mach/time.h>
Rob Herring6eb5be32012-09-02 14:57:33 -050028#include "armada-370-xp.h"
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020029#include "common.h"
Gregory CLEMENT45f59842012-11-14 22:51:08 +010030#include "coherency.h"
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020031
Thomas Petazzonic589f9b2013-05-21 12:33:28 +020032static void __init armada_370_xp_map_io(void)
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020033{
Thomas Petazzoni488275b2013-06-05 09:04:57 +020034 debug_ll_io_init();
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020035}
36
Thomas Petazzonid834d262013-06-05 09:04:59 +020037/*
38 * This initialization will be replaced by a DT-based
39 * initialization once the mvebu-mbus driver gains DT support.
40 */
Gregory CLEMENT9d202782012-11-17 15:22:24 +010041
Thomas Petazzonid834d262013-06-05 09:04:59 +020042#define ARMADA_370_XP_MBUS_WINS_OFFS 0x20000
43#define ARMADA_370_XP_MBUS_WINS_SIZE 0x100
44#define ARMADA_370_XP_SDRAM_WINS_OFFS 0x20180
45#define ARMADA_370_XP_SDRAM_WINS_SIZE 0x20
46
47static void __init armada_370_xp_mbus_init(void)
Gregory CLEMENT53d2f882012-10-26 14:30:46 +020048{
Thomas Petazzoni87e1bed2013-03-21 17:59:15 +010049 char *mbus_soc_name;
Thomas Petazzonid834d262013-06-05 09:04:59 +020050 struct device_node *dn;
51 const __be32 mbus_wins_offs = cpu_to_be32(ARMADA_370_XP_MBUS_WINS_OFFS);
52 const __be32 sdram_wins_offs = cpu_to_be32(ARMADA_370_XP_SDRAM_WINS_OFFS);
Thomas Petazzoni87e1bed2013-03-21 17:59:15 +010053
Thomas Petazzoni87e1bed2013-03-21 17:59:15 +010054 if (of_machine_is_compatible("marvell,armada370"))
55 mbus_soc_name = "marvell,armada370-mbus";
56 else
57 mbus_soc_name = "marvell,armadaxp-mbus";
58
Thomas Petazzonid834d262013-06-05 09:04:59 +020059 dn = of_find_node_by_name(NULL, "internal-regs");
60 BUG_ON(!dn);
Linus Torvalds1bf25e72013-05-07 11:22:14 -070061
Thomas Petazzonid834d262013-06-05 09:04:59 +020062 mvebu_mbus_init(mbus_soc_name,
63 of_translate_address(dn, &mbus_wins_offs),
64 ARMADA_370_XP_MBUS_WINS_SIZE,
65 of_translate_address(dn, &sdram_wins_offs),
66 ARMADA_370_XP_SDRAM_WINS_SIZE);
67}
68
69static void __init armada_370_xp_timer_and_clk_init(void)
70{
Olof Johansson5ae13ef2013-06-14 15:18:25 -070071 of_clk_init(NULL);
Ezequiel Garcia573145f2013-08-13 11:43:12 -030072 clocksource_of_init();
Thomas Petazzonid834d262013-06-05 09:04:59 +020073 coherency_init();
74 armada_370_xp_mbus_init();
Thomas Petazzonie33369c2013-04-09 23:26:14 +020075#ifdef CONFIG_CACHE_L2X0
76 l2x0_of_init(0, ~0UL);
77#endif
Gregory CLEMENT53d2f882012-10-26 14:30:46 +020078}
79
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020080static void __init armada_370_xp_dt_init(void)
81{
82 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
83}
84
Thomas Petazzoni61505e12012-11-09 16:26:26 +010085static const char * const armada_370_xp_dt_compat[] = {
86 "marvell,armada-370-xp",
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020087 NULL,
88};
89
Thomas Petazzoni8c4340f2012-11-12 12:03:38 +010090DT_MACHINE_START(ARMADA_XP_DT, "Marvell Armada 370/XP (Device Tree)")
Gregory CLEMENT45f59842012-11-14 22:51:08 +010091 .smp = smp_ops(armada_xp_smp_ops),
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020092 .init_machine = armada_370_xp_dt_init,
93 .map_io = armada_370_xp_map_io,
Stephen Warren6bb27d72012-11-08 12:40:59 -070094 .init_time = armada_370_xp_timer_and_clk_init,
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020095 .restart = mvebu_restart,
Thomas Petazzoni61505e12012-11-09 16:26:26 +010096 .dt_compat = armada_370_xp_dt_compat,
Thomas Petazzoni9ae6f742012-06-13 19:01:28 +020097MACHINE_END