1794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*
2794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * arch/arm/mach-mv78xx0/common.c
3794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov *
4794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * Core functions for Marvell MV78xx0 SoCs
5794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov *
6794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * This file is licensed under the terms of the GNU General Public
7794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * License version 2.  This program is licensed "as is" without any
8794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * warranty of any kind, whether express or implied.
9794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov */
10794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
11794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#include <linux/kernel.h>
12794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#include <linux/init.h>
13794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#include <linux/platform_device.h>
14794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#include <linux/serial_8250.h>
15794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#include <linux/ata_platform.h>
162f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn#include <linux/clk-provider.h>
17712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek#include <linux/ethtool.h>
183c317d00ba4a9489c161857a574432c61fde4a2aAndrew Lunn#include <asm/hardware/cache-feroceon-l2.h>
19794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#include <asm/mach/map.h>
20794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#include <asm/mach/time.h>
21a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/mv78xx0.h>
22fdd8b079e33d4711527ace19798e9db99a056469Nicolas Pitre#include <mach/bridge-regs.h>
23c02cecb92ed49f36196ee9e29d29c4cfcbad05aeArnd Bergmann#include <linux/platform_data/usb-ehci-orion.h>
24c02cecb92ed49f36196ee9e29d29c4cfcbad05aeArnd Bergmann#include <linux/platform_data/mtd-orion_nand.h>
256f088f1d215be5250582b974f83f0e3aa6ad3a28Lennert Buytenhek#include <plat/time.h>
2628a2b45054f2e3f3671e36a6e9efc82756afa31aAndrew Lunn#include <plat/common.h>
2745173d5ed4c9a397db31623bf6469efbd3a239cdAndrew Lunn#include <plat/addr-map.h>
28794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#include "common.h"
29794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
3028a2b45054f2e3f3671e36a6e9efc82756afa31aAndrew Lunnstatic int get_tclk(void);
31794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
32794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
33794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * Common bits
34794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
35794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovint mv78xx0_core_index(void)
36794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
37794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	u32 extra;
38794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
39794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	/*
40794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * Read Extra Features register.
41794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 */
42794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	__asm__("mrc p15, 1, %0, c15, c1, 0" : "=r" (extra));
43794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
44794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	return !!(extra & 0x00004000);
45794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
46794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
47794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovstatic int get_hclk(void)
48794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
49794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	int hclk;
50794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
51794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	/*
52794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * HCLK tick rate is configured by DEV_D[7:5] pins.
53794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 */
54794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	switch ((readl(SAMPLE_AT_RESET_LOW) >> 5) & 7) {
55794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	case 0:
56794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		hclk = 166666667;
57794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		break;
58794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	case 1:
59794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		hclk = 200000000;
60794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		break;
61794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	case 2:
62794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		hclk = 266666667;
63794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		break;
64794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	case 3:
65794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		hclk = 333333333;
66794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		break;
67794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	case 4:
68794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		hclk = 400000000;
69794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		break;
70794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	default:
71794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		panic("unknown HCLK PLL setting: %.8x\n",
72794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov			readl(SAMPLE_AT_RESET_LOW));
73794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	}
74794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
75794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	return hclk;
76794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
77794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
78794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovstatic void get_pclk_l2clk(int hclk, int core_index, int *pclk, int *l2clk)
79794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
80794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	u32 cfg;
81794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
82794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	/*
83794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * Core #0 PCLK/L2CLK is configured by bits [13:8], core #1
84794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * PCLK/L2CLK by bits [19:14].
85794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 */
86794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	if (core_index == 0) {
87794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		cfg = (readl(SAMPLE_AT_RESET_LOW) >> 8) & 0x3f;
88794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	} else {
89794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		cfg = (readl(SAMPLE_AT_RESET_LOW) >> 14) & 0x3f;
90794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	}
91794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
92794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	/*
93794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * Bits [11:8] ([17:14] for core #1) configure the PCLK:HCLK
94794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * ratio (1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6).
95794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 */
96794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	*pclk = ((u64)hclk * (2 + (cfg & 0xf))) >> 1;
97794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
98794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	/*
99794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * Bits [13:12] ([19:18] for core #1) configure the PCLK:L2CLK
100794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * ratio (1, 2, 3).
101794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 */
102794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	*l2clk = *pclk / (((cfg >> 4) & 3) + 1);
103794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
104794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
105794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovstatic int get_tclk(void)
106794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
1072f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn	int tclk_freq;
108794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
109794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	/*
110794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * TCLK tick rate is configured by DEV_A[2:0] strap pins.
111794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 */
112794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	switch ((readl(SAMPLE_AT_RESET_HIGH) >> 6) & 7) {
113794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	case 1:
1142f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn		tclk_freq = 166666667;
115794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		break;
116794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	case 3:
1172f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn		tclk_freq = 200000000;
118794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		break;
119794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	default:
120794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		panic("unknown TCLK PLL setting: %.8x\n",
121794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov			readl(SAMPLE_AT_RESET_HIGH));
122794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	}
123794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
1242f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn	return tclk_freq;
125794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
126794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
127794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
128794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
129794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * I/O Address Mapping
130794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
131794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovstatic struct map_desc mv78xx0_io_desc[] __initdata = {
132794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	{
133383b99610e6084878930d4e4682dfc5e9141b038Thomas Petazzoni		.virtual	= (unsigned long) MV78XX0_CORE_REGS_VIRT_BASE,
134794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		.pfn		= 0,
135794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		.length		= MV78XX0_CORE_REGS_SIZE,
136794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		.type		= MT_DEVICE,
137794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	}, {
138383b99610e6084878930d4e4682dfc5e9141b038Thomas Petazzoni		.virtual	= (unsigned long) MV78XX0_REGS_VIRT_BASE,
139794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		.pfn		= __phys_to_pfn(MV78XX0_REGS_PHYS_BASE),
140794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		.length		= MV78XX0_REGS_SIZE,
141794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		.type		= MT_DEVICE,
142794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	},
143794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov};
144794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
145794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_map_io(void)
146794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
147794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	unsigned long phys;
148794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
149794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	/*
150794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * Map the right set of per-core registers depending on
151794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 * which core we are running on.
152794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	 */
153794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	if (mv78xx0_core_index() == 0) {
154794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		phys = MV78XX0_CORE0_REGS_PHYS_BASE;
155794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	} else {
156794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov		phys = MV78XX0_CORE1_REGS_PHYS_BASE;
157794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	}
158794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	mv78xx0_io_desc[0].pfn = __phys_to_pfn(phys);
159794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
160794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	iotable_init(mv78xx0_io_desc, ARRAY_SIZE(mv78xx0_io_desc));
161794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
162794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
163794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
164794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
1652f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn * CLK tree
1662f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn ****************************************************************************/
1672f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunnstatic struct clk *tclk;
1682f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn
1692f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunnstatic void __init clk_init(void)
1702f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn{
1712f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn	tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT,
1722f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn				       get_tclk());
1734574b886698dfad6209102fed6136622b5fe1c21Andrew Lunn
1744574b886698dfad6209102fed6136622b5fe1c21Andrew Lunn	orion_clkdev_init(tclk);
1752f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn}
1762f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn
1772f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn/*****************************************************************************
178794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * EHCI
179794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
180794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_ehci0_init(void)
181794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
18272053353583230952c4b187e110e9da00dfc3afbAndrew Lunn	orion_ehci_init(USB0_PHYS_BASE, IRQ_MV78XX0_USB_0, EHCI_PHY_NA);
183794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
184794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
185794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
186794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
187794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * EHCI1
188794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
189794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_ehci1_init(void)
190794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
191db33f4de9952af112b0d4f2436ce931ae632aba0Andrew Lunn	orion_ehci_1_init(USB1_PHYS_BASE, IRQ_MV78XX0_USB_1);
192794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
193794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
194794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
195794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
196794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * EHCI2
197794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
198794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_ehci2_init(void)
199794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
200db33f4de9952af112b0d4f2436ce931ae632aba0Andrew Lunn	orion_ehci_2_init(USB2_PHYS_BASE, IRQ_MV78XX0_USB_2);
201794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
202794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
203794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
204794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
205794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * GE00
206794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
207794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data)
208794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
209db33f4de9952af112b0d4f2436ce931ae632aba0Andrew Lunn	orion_ge00_init(eth_data,
2107e3819d820c9aa3536d15fe7310c054bef1f5f04Andrew Lunn			GE00_PHYS_BASE, IRQ_MV78XX0_GE00_SUM,
21158569aee5a1a5dcc25c34a0a2ed9a377874e6b05Arnaud Patard			IRQ_MV78XX0_GE_ERR,
21258569aee5a1a5dcc25c34a0a2ed9a377874e6b05Arnaud Patard			MV643XX_TX_CSUM_DEFAULT_LIMIT);
213794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
214794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
215794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
216794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
217794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * GE01
218794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
219794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data)
220794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
221db33f4de9952af112b0d4f2436ce931ae632aba0Andrew Lunn	orion_ge01_init(eth_data,
2227e3819d820c9aa3536d15fe7310c054bef1f5f04Andrew Lunn			GE01_PHYS_BASE, IRQ_MV78XX0_GE01_SUM,
22358569aee5a1a5dcc25c34a0a2ed9a377874e6b05Arnaud Patard			NO_IRQ,
22458569aee5a1a5dcc25c34a0a2ed9a377874e6b05Arnaud Patard			MV643XX_TX_CSUM_DEFAULT_LIMIT);
225794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
226794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
227794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
228794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
229794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * GE10
230794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
231794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data)
232794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
233712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	u32 dev, rev;
234712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek
235712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	/*
236712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	 * On the Z0, ge10 and ge11 are internally connected back
237712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	 * to back, and not brought out.
238712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	 */
239712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	mv78xx0_pcie_id(&dev, &rev);
240712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	if (dev == MV78X00_Z0_DEV_ID) {
241712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek		eth_data->phy_addr = MV643XX_ETH_PHY_NONE;
242712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek		eth_data->speed = SPEED_1000;
243712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek		eth_data->duplex = DUPLEX_FULL;
244712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	}
245712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek
246db33f4de9952af112b0d4f2436ce931ae632aba0Andrew Lunn	orion_ge10_init(eth_data,
2477e3819d820c9aa3536d15fe7310c054bef1f5f04Andrew Lunn			GE10_PHYS_BASE, IRQ_MV78XX0_GE10_SUM,
248452503ebc7cc4cce5b9e52cf2f03255365a53234Andrew Lunn			NO_IRQ);
249794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
250794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
251794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
252794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
253794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * GE11
254794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
255794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data)
256794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
257712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	u32 dev, rev;
258712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek
259712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	/*
260712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	 * On the Z0, ge10 and ge11 are internally connected back
261712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	 * to back, and not brought out.
262712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	 */
263712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	mv78xx0_pcie_id(&dev, &rev);
264712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	if (dev == MV78X00_Z0_DEV_ID) {
265712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek		eth_data->phy_addr = MV643XX_ETH_PHY_NONE;
266712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek		eth_data->speed = SPEED_1000;
267712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek		eth_data->duplex = DUPLEX_FULL;
268712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek	}
269712424fd95134bf88d27f3885389fe6ab13f34acLennert Buytenhek
270db33f4de9952af112b0d4f2436ce931ae632aba0Andrew Lunn	orion_ge11_init(eth_data,
2717e3819d820c9aa3536d15fe7310c054bef1f5f04Andrew Lunn			GE11_PHYS_BASE, IRQ_MV78XX0_GE11_SUM,
272452503ebc7cc4cce5b9e52cf2f03255365a53234Andrew Lunn			NO_IRQ);
273794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
274794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
275693599438909de47fbfa4246bf67d6c535f719b5Riku Voipio/*****************************************************************************
276aac7ffa3ed121846b61347028828617c5dd1ce46Andrew Lunn * I2C
277693599438909de47fbfa4246bf67d6c535f719b5Riku Voipio ****************************************************************************/
278693599438909de47fbfa4246bf67d6c535f719b5Riku Voipiovoid __init mv78xx0_i2c_init(void)
279693599438909de47fbfa4246bf67d6c535f719b5Riku Voipio{
280aac7ffa3ed121846b61347028828617c5dd1ce46Andrew Lunn	orion_i2c_init(I2C_0_PHYS_BASE, IRQ_MV78XX0_I2C_0, 8);
281aac7ffa3ed121846b61347028828617c5dd1ce46Andrew Lunn	orion_i2c_1_init(I2C_1_PHYS_BASE, IRQ_MV78XX0_I2C_1, 8);
282693599438909de47fbfa4246bf67d6c535f719b5Riku Voipio}
283794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
284794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
285794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * SATA
286794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
287794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_sata_init(struct mv_sata_platform_data *sata_data)
288794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
289db33f4de9952af112b0d4f2436ce931ae632aba0Andrew Lunn	orion_sata_init(sata_data, SATA_PHYS_BASE, IRQ_MV78XX0_SATA);
290794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
291794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
292794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
293794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
294794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * UART0
295794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
296794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_uart0_init(void)
297794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
29828a2b45054f2e3f3671e36a6e9efc82756afa31aAndrew Lunn	orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE,
29974c335761acdfd94736d28ba0b941a2efb9c81f0Andrew Lunn			 IRQ_MV78XX0_UART_0, tclk);
300794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
301794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
302794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
303794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
304794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * UART1
305794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
306794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_uart1_init(void)
307794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
30828a2b45054f2e3f3671e36a6e9efc82756afa31aAndrew Lunn	orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE,
30974c335761acdfd94736d28ba0b941a2efb9c81f0Andrew Lunn			 IRQ_MV78XX0_UART_1, tclk);
310794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
311794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
312794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
313794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
314794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * UART2
315794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
316794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_uart2_init(void)
317794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
31828a2b45054f2e3f3671e36a6e9efc82756afa31aAndrew Lunn	orion_uart2_init(UART2_VIRT_BASE, UART2_PHYS_BASE,
31974c335761acdfd94736d28ba0b941a2efb9c81f0Andrew Lunn			 IRQ_MV78XX0_UART_2, tclk);
320794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
321794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
322794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
323794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * UART3
324794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
325794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_uart3_init(void)
326794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
32728a2b45054f2e3f3671e36a6e9efc82756afa31aAndrew Lunn	orion_uart3_init(UART3_VIRT_BASE, UART3_PHYS_BASE,
32874c335761acdfd94736d28ba0b941a2efb9c81f0Andrew Lunn			 IRQ_MV78XX0_UART_3, tclk);
329794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
330794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
331794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
332794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * Time handling
333794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
3344ee1f6b574765a6c97f945e6b0277e5ccac38cb5Lennert Buytenhekvoid __init mv78xx0_init_early(void)
3354ee1f6b574765a6c97f945e6b0277e5ccac38cb5Lennert Buytenhek{
3364ee1f6b574765a6c97f945e6b0277e5ccac38cb5Lennert Buytenhek	orion_time_set_base(TIMER_VIRT_BASE);
33795b80e0a9ab3c1c8b41af5f2863801708f8f7288Thomas Petazzoni	if (mv78xx0_core_index() == 0)
33895b80e0a9ab3c1c8b41af5f2863801708f8f7288Thomas Petazzoni		mvebu_mbus_init("marvell,mv78xx0-mbus",
33995b80e0a9ab3c1c8b41af5f2863801708f8f7288Thomas Petazzoni				BRIDGE_WINS_CPU0_BASE, BRIDGE_WINS_SZ,
34095b80e0a9ab3c1c8b41af5f2863801708f8f7288Thomas Petazzoni				DDR_WINDOW_CPU0_BASE, DDR_WINDOW_CPU_SZ);
34195b80e0a9ab3c1c8b41af5f2863801708f8f7288Thomas Petazzoni	else
34295b80e0a9ab3c1c8b41af5f2863801708f8f7288Thomas Petazzoni		mvebu_mbus_init("marvell,mv78xx0-mbus",
34395b80e0a9ab3c1c8b41af5f2863801708f8f7288Thomas Petazzoni				BRIDGE_WINS_CPU1_BASE, BRIDGE_WINS_SZ,
34495b80e0a9ab3c1c8b41af5f2863801708f8f7288Thomas Petazzoni				DDR_WINDOW_CPU1_BASE, DDR_WINDOW_CPU_SZ);
3454ee1f6b574765a6c97f945e6b0277e5ccac38cb5Lennert Buytenhek}
3464ee1f6b574765a6c97f945e6b0277e5ccac38cb5Lennert Buytenhek
3476bb27d7349db51b50c40534710fe164ca0d58902Stephen Warrenvoid __init_refok mv78xx0_timer_init(void)
348794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
3494ee1f6b574765a6c97f945e6b0277e5ccac38cb5Lennert Buytenhek	orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR,
3504ee1f6b574765a6c97f945e6b0277e5ccac38cb5Lennert Buytenhek			IRQ_MV78XX0_TIMER_1, get_tclk());
351794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
352794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
353794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
354794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov/*****************************************************************************
355794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov * General
356794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov ****************************************************************************/
357cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhekstatic char * __init mv78xx0_id(void)
358cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek{
359cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	u32 dev, rev;
360cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek
361cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	mv78xx0_pcie_id(&dev, &rev);
362cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek
363cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	if (dev == MV78X00_Z0_DEV_ID) {
364cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek		if (rev == MV78X00_REV_Z0)
365cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek			return "MV78X00-Z0";
366cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek		else
367cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek			return "MV78X00-Rev-Unsupported";
368cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	} else if (dev == MV78100_DEV_ID) {
369cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek		if (rev == MV78100_REV_A0)
370cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek			return "MV78100-A0";
371662aeced1512e008e5613b91de8e8b8e01017cb5Lennert Buytenhek		else if (rev == MV78100_REV_A1)
372662aeced1512e008e5613b91de8e8b8e01017cb5Lennert Buytenhek			return "MV78100-A1";
373cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek		else
374cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek			return "MV78100-Rev-Unsupported";
375cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	} else if (dev == MV78200_DEV_ID) {
376cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek		if (rev == MV78100_REV_A0)
377cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek			return "MV78200-A0";
378cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek		else
379cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek			return "MV78200-Rev-Unsupported";
380cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	} else {
381cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek		return "Device-Unknown";
382cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	}
383cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek}
384cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek
385794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovstatic int __init is_l2_writethrough(void)
386794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
387794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	return !!(readl(CPU_CONTROL) & L2_WRITETHROUGH);
388794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
389794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
390794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonovvoid __init mv78xx0_init(void)
391794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov{
392794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	int core_index;
393794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	int hclk;
394794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	int pclk;
395794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	int l2clk;
396794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
397794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	core_index = mv78xx0_core_index();
398794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	hclk = get_hclk();
399794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	get_pclk_l2clk(hclk, core_index, &pclk, &l2clk);
400794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
401cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	printk(KERN_INFO "%s ", mv78xx0_id());
402cfdeb6376e439c58c2d37de492d2a8c763621022Lennert Buytenhek	printk("core #%d, ", core_index);
403794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	printk("PCLK = %dMHz, ", (pclk + 499999) / 1000000);
404794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	printk("L2 = %dMHz, ", (l2clk + 499999) / 1000000);
405794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	printk("HCLK = %dMHz, ", (hclk + 499999) / 1000000);
4062f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn	printk("TCLK = %dMHz\n", (get_tclk() + 499999) / 1000000);
407794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov
408794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#ifdef CONFIG_CACHE_FEROCEON_L2
409794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov	feroceon_l2_init(is_l2_writethrough());
410794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov#endif
4112f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn
4122f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn	/* Setup root of clk tree */
4132f129bf4aab684bef1e82e747b709a5025ecb698Andrew Lunn	clk_init();
414794d15b25df5dda10efba600d6dd6cd74a7aa9cbStanislav Samsonov}
4159635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King
4167b6d864b48d95e6ea1df7df64475b9cb9616dcf9Robin Holtvoid mv78xx0_restart(enum reboot_mode mode, const char *cmd)
4179635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King{
4189635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	/*
4199635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	 * Enable soft reset to assert RSTOUTn.
4209635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	 */
4219635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK);
4229635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King
4239635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	/*
4249635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	 * Assert soft reset.
4259635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	 */
4269635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	writel(SOFT_RESET, SYSTEM_SOFT_RESET);
4279635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King
4289635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King	while (1)
4299635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King		;
4309635f9cd49b72bddb7e40fcbc151240677b5cf5eRussell King}
431