10361c7e5SArnd Bergmann /* SPDX-License-Identifier: GPL-2.0-or-later */ 20361c7e5SArnd Bergmann /* 30361c7e5SArnd Bergmann * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org> 40361c7e5SArnd Bergmann */ 50361c7e5SArnd Bergmann 60361c7e5SArnd Bergmann #include <asm/mach-types.h> 70361c7e5SArnd Bergmann __raw_readl(unsigned int ptr)80361c7e5SArnd Bergmannstatic inline unsigned int __raw_readl(unsigned int ptr) 90361c7e5SArnd Bergmann { 100361c7e5SArnd Bergmann return *((volatile unsigned int *)ptr); 110361c7e5SArnd Bergmann } 120361c7e5SArnd Bergmann __raw_writeb(unsigned char value,unsigned int ptr)130361c7e5SArnd Bergmannstatic inline void __raw_writeb(unsigned char value, unsigned int ptr) 140361c7e5SArnd Bergmann { 150361c7e5SArnd Bergmann *((volatile unsigned char *)ptr) = value; 160361c7e5SArnd Bergmann } 170361c7e5SArnd Bergmann __raw_writel(unsigned int value,unsigned int ptr)180361c7e5SArnd Bergmannstatic inline void __raw_writel(unsigned int value, unsigned int ptr) 190361c7e5SArnd Bergmann { 200361c7e5SArnd Bergmann *((volatile unsigned int *)ptr) = value; 210361c7e5SArnd Bergmann } 220361c7e5SArnd Bergmann 230361c7e5SArnd Bergmann /* 240361c7e5SArnd Bergmann * Some bootloaders don't turn off DMA from the ethernet MAC before 250361c7e5SArnd Bergmann * jumping to linux, which means that we might end up with bits of RX 260361c7e5SArnd Bergmann * status and packet data scribbled over the uncompressed kernel image. 270361c7e5SArnd Bergmann * Work around this by resetting the ethernet MAC before we uncompress. 280361c7e5SArnd Bergmann */ 290361c7e5SArnd Bergmann #define PHYS_ETH_SELF_CTL 0x80010020 300361c7e5SArnd Bergmann #define ETH_SELF_CTL_RESET 0x00000001 310361c7e5SArnd Bergmann ep93xx_ethernet_reset(void)320361c7e5SArnd Bergmannstatic inline void ep93xx_ethernet_reset(void) 330361c7e5SArnd Bergmann { 340361c7e5SArnd Bergmann unsigned int v; 350361c7e5SArnd Bergmann 360361c7e5SArnd Bergmann /* Reset the ethernet MAC. */ 370361c7e5SArnd Bergmann v = __raw_readl(PHYS_ETH_SELF_CTL); 380361c7e5SArnd Bergmann __raw_writel(v | ETH_SELF_CTL_RESET, PHYS_ETH_SELF_CTL); 390361c7e5SArnd Bergmann 400361c7e5SArnd Bergmann /* Wait for reset to finish. */ 410361c7e5SArnd Bergmann while (__raw_readl(PHYS_ETH_SELF_CTL) & ETH_SELF_CTL_RESET) 420361c7e5SArnd Bergmann ; 430361c7e5SArnd Bergmann } 440361c7e5SArnd Bergmann 450361c7e5SArnd Bergmann #define TS72XX_WDT_CONTROL_PHYS_BASE 0x23800000 460361c7e5SArnd Bergmann #define TS72XX_WDT_FEED_PHYS_BASE 0x23c00000 470361c7e5SArnd Bergmann #define TS72XX_WDT_FEED_VAL 0x05 480361c7e5SArnd Bergmann ts72xx_watchdog_disable(void)490361c7e5SArnd Bergmannstatic inline void __maybe_unused ts72xx_watchdog_disable(void) 500361c7e5SArnd Bergmann { 510361c7e5SArnd Bergmann __raw_writeb(TS72XX_WDT_FEED_VAL, TS72XX_WDT_FEED_PHYS_BASE); 520361c7e5SArnd Bergmann __raw_writeb(0, TS72XX_WDT_CONTROL_PHYS_BASE); 530361c7e5SArnd Bergmann } 540361c7e5SArnd Bergmann ep93xx_decomp_setup(void)550361c7e5SArnd Bergmannstatic inline void ep93xx_decomp_setup(void) 560361c7e5SArnd Bergmann { 570361c7e5SArnd Bergmann if (machine_is_ts72xx()) 580361c7e5SArnd Bergmann ts72xx_watchdog_disable(); 590361c7e5SArnd Bergmann 60*ca2259c3SArnd Bergmann if (machine_is_edb9301() || 610361c7e5SArnd Bergmann machine_is_edb9302() || 620361c7e5SArnd Bergmann machine_is_edb9302a() || 630361c7e5SArnd Bergmann machine_is_edb9302a() || 640361c7e5SArnd Bergmann machine_is_edb9307() || 650361c7e5SArnd Bergmann machine_is_edb9307a() || 660361c7e5SArnd Bergmann machine_is_edb9307a() || 670361c7e5SArnd Bergmann machine_is_edb9312() || 680361c7e5SArnd Bergmann machine_is_edb9315() || 690361c7e5SArnd Bergmann machine_is_edb9315a() || 700361c7e5SArnd Bergmann machine_is_edb9315a() || 710361c7e5SArnd Bergmann machine_is_ts72xx() || 720361c7e5SArnd Bergmann machine_is_bk3() || 730361c7e5SArnd Bergmann machine_is_vision_ep9307()) 740361c7e5SArnd Bergmann ep93xx_ethernet_reset(); 750361c7e5SArnd Bergmann } 76