Path: blob/master/arch/mips/alchemy/devboards/pb1000/board_setup.c
10820 views
/*1* Copyright 2000, 2008 MontaVista Software Inc.2* Author: MontaVista Software, Inc. <[email protected]>3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License as published by the6* Free Software Foundation; either version 2 of the License, or (at your7* option) any later version.8*9* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED10* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF11* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN12* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,13* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT14* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF15* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON16* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT17* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF18* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.19*20* You should have received a copy of the GNU General Public License along21* with this program; if not, write to the Free Software Foundation, Inc.,22* 675 Mass Ave, Cambridge, MA 02139, USA.23*/2425#include <linux/delay.h>26#include <linux/gpio.h>27#include <linux/init.h>28#include <linux/interrupt.h>29#include <linux/pm.h>30#include <asm/mach-au1x00/au1000.h>31#include <asm/mach-pb1x00/pb1000.h>32#include <asm/reboot.h>33#include <prom.h>3435#include "../platform.h"3637const char *get_system_type(void)38{39return "Alchemy Pb1000";40}4142static void board_reset(char *c)43{44asm volatile ("jr %0" : : "r" (0xbfc00000));45}4647static void board_power_off(void)48{49while (1)50asm volatile (51" .set mips32 \n"52" wait \n"53" .set mips0 \n");54}5556void __init board_setup(void)57{58u32 pin_func, static_cfg0;59u32 sys_freqctrl, sys_clksrc;60u32 prid = read_c0_prid();6162sys_freqctrl = 0;63sys_clksrc = 0;6465/* Set AUX clock to 12 MHz * 8 = 96 MHz */66au_writel(8, SYS_AUXPLL);67alchemy_gpio1_input_enable();68udelay(100);6970#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)71/* Zero and disable FREQ2 */72sys_freqctrl = au_readl(SYS_FREQCTRL0);73sys_freqctrl &= ~0xFFF00000;74au_writel(sys_freqctrl, SYS_FREQCTRL0);7576/* Zero and disable USBH/USBD clocks */77sys_clksrc = au_readl(SYS_CLKSRC);78sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |79SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);80au_writel(sys_clksrc, SYS_CLKSRC);8182sys_freqctrl = au_readl(SYS_FREQCTRL0);83sys_freqctrl &= ~0xFFF00000;8485sys_clksrc = au_readl(SYS_CLKSRC);86sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |87SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);8889switch (prid & 0x000000FF) {90case 0x00: /* DA */91case 0x01: /* HA */92case 0x02: /* HB */93/* CPU core freq to 48 MHz to slow it way down... */94au_writel(4, SYS_CPUPLL);9596/*97* Setup 48 MHz FREQ2 from CPUPLL for USB Host98* FRDIV2 = 3 -> div by 8 of 384 MHz -> 48 MHz99*/100sys_freqctrl |= (3 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2;101au_writel(sys_freqctrl, SYS_FREQCTRL0);102103/* CPU core freq to 384 MHz */104au_writel(0x20, SYS_CPUPLL);105106printk(KERN_INFO "Au1000: 48 MHz OHCI workaround enabled\n");107break;108109default: /* HC and newer */110/* FREQ2 = aux / 2 = 48 MHz */111sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) |112SYS_FC_FE2 | SYS_FC_FS2;113au_writel(sys_freqctrl, SYS_FREQCTRL0);114break;115}116117/*118* Route 48 MHz FREQ2 into USB Host and/or Device119*/120sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT;121au_writel(sys_clksrc, SYS_CLKSRC);122123/* Configure pins GPIO[14:9] as GPIO */124pin_func = au_readl(SYS_PINFUNC) & ~(SYS_PF_UR3 | SYS_PF_USB);125126/* 2nd USB port is USB host */127pin_func |= SYS_PF_USB;128129au_writel(pin_func, SYS_PINFUNC);130131alchemy_gpio_direction_input(11);132alchemy_gpio_direction_input(13);133alchemy_gpio_direction_output(4, 0);134alchemy_gpio_direction_output(5, 0);135#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */136137/* Make GPIO 15 an input (for interrupt line) */138pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_IRF;139/* We don't need I2S, so make it available for GPIO[31:29] */140pin_func |= SYS_PF_I2S;141au_writel(pin_func, SYS_PINFUNC);142143alchemy_gpio_direction_input(15);144145static_cfg0 = au_readl(MEM_STCFG0) & ~0xc00;146au_writel(static_cfg0, MEM_STCFG0);147148/* configure RCE2* for LCD */149au_writel(0x00000004, MEM_STCFG2);150151/* MEM_STTIME2 */152au_writel(0x09000000, MEM_STTIME2);153154/* Set 32-bit base address decoding for RCE2* */155au_writel(0x10003ff0, MEM_STADDR2);156157/*158* PCI CPLD setup159* Expand CE0 to cover PCI160*/161au_writel(0x11803e40, MEM_STADDR1);162163/* Burst visibility on */164au_writel(au_readl(MEM_STCFG0) | 0x1000, MEM_STCFG0);165166au_writel(0x83, MEM_STCFG1); /* ewait enabled, flash timing */167au_writel(0x33030a10, MEM_STTIME1); /* slower timing for FPGA */168169/* Setup the static bus controller */170au_writel(0x00000002, MEM_STCFG3); /* type = PCMCIA */171au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */172au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */173174/*175* Enable Au1000 BCLK switching - note: sed1356 must not use176* its BCLK (Au1000 LCLK) for any timings177*/178switch (prid & 0x000000FF) {179case 0x00: /* DA */180case 0x01: /* HA */181case 0x02: /* HB */182break;183default: /* HC and newer */184/*185* Enable sys bus clock divider when IDLE state or no bus186* activity.187*/188au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);189break;190}191192pm_power_off = board_power_off;193_machine_halt = board_power_off;194_machine_restart = board_reset;195}196197static int __init pb1000_init_irq(void)198{199irq_set_irq_type(AU1000_GPIO15_INT, IRQF_TRIGGER_LOW);200return 0;201}202arch_initcall(pb1000_init_irq);203204static int __init pb1000_device_init(void)205{206return db1x_register_norflash(8 * 1024 * 1024, 4, 0);207}208device_initcall(pb1000_device_init);209210211