Path: blob/master/arch/mips/alchemy/devboards/db1x00/board_setup.c
10820 views
/*1*2* BRIEF MODULE DESCRIPTION3* Alchemy Db1x00 board setup.4*5* Copyright 2000, 2008 MontaVista Software Inc.6* Author: MontaVista Software, Inc. <[email protected]>7*8* This program is free software; you can redistribute it and/or modify it9* under the terms of the GNU General Public License as published by the10* Free Software Foundation; either version 2 of the License, or (at your11* option) any later version.12*13* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED14* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF15* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN16* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,17* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT18* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF19* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON20* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT21* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF22* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.23*24* You should have received a copy of the GNU General Public License along25* with this program; if not, write to the Free Software Foundation, Inc.,26* 675 Mass Ave, Cambridge, MA 02139, USA.27*/2829#include <linux/gpio.h>30#include <linux/init.h>31#include <linux/interrupt.h>32#include <linux/pm.h>3334#include <asm/mach-au1x00/au1000.h>35#include <asm/mach-au1x00/au1xxx_eth.h>36#include <asm/mach-db1x00/db1x00.h>37#include <asm/mach-db1x00/bcsr.h>38#include <asm/reboot.h>3940#include <prom.h>4142#ifdef CONFIG_MIPS_DB150043char irq_tab_alchemy[][5] __initdata = {44[12] = { -1, AU1500_PCI_INTA, 0xff, 0xff, 0xff }, /* IDSEL 12 - HPT371 */45[13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, AU1500_PCI_INTC, AU1500_PCI_INTD }, /* IDSEL 13 - PCI slot */46};4748#endif495051#ifdef CONFIG_MIPS_DB155052char irq_tab_alchemy[][5] __initdata = {53[11] = { -1, AU1550_PCI_INTC, 0xff, 0xff, 0xff }, /* IDSEL 11 - on-board HPT371 */54[12] = { -1, AU1550_PCI_INTB, AU1550_PCI_INTC, AU1550_PCI_INTD, AU1550_PCI_INTA }, /* IDSEL 12 - PCI slot 2 (left) */55[13] = { -1, AU1550_PCI_INTA, AU1550_PCI_INTB, AU1550_PCI_INTC, AU1550_PCI_INTD }, /* IDSEL 13 - PCI slot 1 (right) */56};57#endif585960#ifdef CONFIG_MIPS_BOSPORUS61char irq_tab_alchemy[][5] __initdata = {62[11] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 11 - miniPCI */63[12] = { -1, AU1500_PCI_INTA, 0xff, 0xff, 0xff }, /* IDSEL 12 - SN1741 */64[13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, AU1500_PCI_INTC, AU1500_PCI_INTD }, /* IDSEL 13 - PCI slot */65};6667/*68* Micrel/Kendin 5 port switch attached to MAC0,69* MAC0 is associated with PHY address 5 (== WAN port)70* MAC1 is not associated with any PHY, since it's connected directly71* to the switch.72* no interrupts are used73*/74static struct au1000_eth_platform_data eth0_pdata = {75.phy_static_config = 1,76.phy_addr = 5,77};7879static void bosporus_power_off(void)80{81while (1)82asm volatile (".set mips3 ; wait ; .set mips0");83}8485const char *get_system_type(void)86{87return "Alchemy Bosporus Gateway Reference";88}89#endif909192#ifdef CONFIG_MIPS_MIRAGE93char irq_tab_alchemy[][5] __initdata = {94[11] = { -1, AU1500_PCI_INTD, 0xff, 0xff, 0xff }, /* IDSEL 11 - SMI VGX */95[12] = { -1, 0xff, 0xff, AU1500_PCI_INTC, 0xff }, /* IDSEL 12 - PNX1300 */96[13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 13 - miniPCI */97};9899static void mirage_power_off(void)100{101alchemy_gpio_direction_output(210, 1);102}103104const char *get_system_type(void)105{106return "Alchemy Mirage";107}108#endif109110111#if defined(CONFIG_MIPS_BOSPORUS) || defined(CONFIG_MIPS_MIRAGE)112static void mips_softreset(void)113{114asm volatile ("jr\t%0" : : "r"(0xbfc00000));115}116117#else118119const char *get_system_type(void)120{121return "Alchemy Db1x00";122}123#endif124125126void __init board_setup(void)127{128unsigned long bcsr1, bcsr2;129130bcsr1 = DB1000_BCSR_PHYS_ADDR;131bcsr2 = DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS;132133#ifdef CONFIG_MIPS_DB1000134printk(KERN_INFO "AMD Alchemy Au1000/Db1000 Board\n");135#endif136#ifdef CONFIG_MIPS_DB1500137printk(KERN_INFO "AMD Alchemy Au1500/Db1500 Board\n");138#endif139#ifdef CONFIG_MIPS_DB1100140printk(KERN_INFO "AMD Alchemy Au1100/Db1100 Board\n");141#endif142#ifdef CONFIG_MIPS_BOSPORUS143au1xxx_override_eth_cfg(0, ð0_pdata);144145printk(KERN_INFO "AMD Alchemy Bosporus Board\n");146#endif147#ifdef CONFIG_MIPS_MIRAGE148printk(KERN_INFO "AMD Alchemy Mirage Board\n");149#endif150#ifdef CONFIG_MIPS_DB1550151printk(KERN_INFO "AMD Alchemy Au1550/Db1550 Board\n");152153bcsr1 = DB1550_BCSR_PHYS_ADDR;154bcsr2 = DB1550_BCSR_PHYS_ADDR + DB1550_BCSR_HEXLED_OFS;155#endif156157/* initialize board register space */158bcsr_init(bcsr1, bcsr2);159160/* Not valid for Au1550 */161#if defined(CONFIG_IRDA) && \162(defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1100))163{164u32 pin_func;165166/* Set IRFIRSEL instead of GPIO15 */167pin_func = au_readl(SYS_PINFUNC) | SYS_PF_IRF;168au_writel(pin_func, SYS_PINFUNC);169/* Power off until the driver is in use */170bcsr_mod(BCSR_RESETS, BCSR_RESETS_IRDA_MODE_MASK,171BCSR_RESETS_IRDA_MODE_OFF);172}173#endif174bcsr_write(BCSR_PCMCIA, 0); /* turn off PCMCIA power */175176/* Enable GPIO[31:0] inputs */177alchemy_gpio1_input_enable();178179#ifdef CONFIG_MIPS_MIRAGE180{181u32 pin_func;182183/* GPIO[20] is output */184alchemy_gpio_direction_output(20, 0);185186/* Set GPIO[210:208] instead of SSI_0 */187pin_func = au_readl(SYS_PINFUNC) | SYS_PF_S0;188189/* Set GPIO[215:211] for LEDs */190pin_func |= 5 << 2;191192/* Set GPIO[214:213] for more LEDs */193pin_func |= 5 << 12;194195/* Set GPIO[207:200] instead of PCMCIA/LCD */196pin_func |= SYS_PF_LCD | SYS_PF_PC;197au_writel(pin_func, SYS_PINFUNC);198199/*200* Enable speaker amplifier. This should201* be part of the audio driver.202*/203alchemy_gpio_direction_output(209, 1);204205pm_power_off = mirage_power_off;206_machine_halt = mirage_power_off;207_machine_restart = (void(*)(char *))mips_softreset;208}209#endif210211#ifdef CONFIG_MIPS_BOSPORUS212pm_power_off = bosporus_power_off;213_machine_halt = bosporus_power_off;214_machine_restart = (void(*)(char *))mips_softreset;215#endif216au_sync();217}218219static int __init db1x00_init_irq(void)220{221#if defined(CONFIG_MIPS_MIRAGE)222irq_set_irq_type(AU1500_GPIO7_INT, IRQF_TRIGGER_RISING); /* TS pendown */223#elif defined(CONFIG_MIPS_DB1550)224irq_set_irq_type(AU1550_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */225irq_set_irq_type(AU1550_GPIO1_INT, IRQF_TRIGGER_LOW); /* CD1# */226irq_set_irq_type(AU1550_GPIO3_INT, IRQF_TRIGGER_LOW); /* CARD0# */227irq_set_irq_type(AU1550_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */228irq_set_irq_type(AU1550_GPIO21_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */229irq_set_irq_type(AU1550_GPIO22_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */230#elif defined(CONFIG_MIPS_DB1500)231irq_set_irq_type(AU1500_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */232irq_set_irq_type(AU1500_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */233irq_set_irq_type(AU1500_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */234irq_set_irq_type(AU1500_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */235irq_set_irq_type(AU1500_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */236irq_set_irq_type(AU1500_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */237#elif defined(CONFIG_MIPS_DB1100)238irq_set_irq_type(AU1100_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */239irq_set_irq_type(AU1100_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */240irq_set_irq_type(AU1100_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */241irq_set_irq_type(AU1100_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */242irq_set_irq_type(AU1100_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */243irq_set_irq_type(AU1100_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */244#elif defined(CONFIG_MIPS_DB1000)245irq_set_irq_type(AU1000_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */246irq_set_irq_type(AU1000_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */247irq_set_irq_type(AU1000_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */248irq_set_irq_type(AU1000_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */249irq_set_irq_type(AU1000_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */250irq_set_irq_type(AU1000_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */251#endif252return 0;253}254arch_initcall(db1x00_init_irq);255256257