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