diff options
Diffstat (limited to 'arch/mips/bcm47xx/setup.c')
| -rw-r--r-- | arch/mips/bcm47xx/setup.c | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c new file mode 100644 index 000000000000..dfc580aae958 --- /dev/null +++ b/arch/mips/bcm47xx/setup.c @@ -0,0 +1,79 @@ +/* + *  Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org> + *  Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org> + *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> + *  Copyright (C) 2006 Michael Buesch <mb@bu3sch.de> + * + *  This program is free software; you can redistribute  it and/or modify it + *  under  the terms of  the GNU General  Public License as published by the + *  Free Software Foundation;  either version 2 of the  License, or (at your + *  option) any later version. + * + *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED + *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF + *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN + *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT, + *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF + *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT + *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *  You should have received a copy of the  GNU General Public License along + *  with this program; if not, write  to the Free Software Foundation, Inc., + *  675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <linux/types.h> +#include <linux/ssb/ssb.h> +#include <asm/reboot.h> +#include <asm/time.h> +#include <bcm47xx.h> + +struct ssb_bus ssb_bcm47xx; +EXPORT_SYMBOL(ssb_bcm47xx); + +static void bcm47xx_machine_restart(char *command) +{ +	printk(KERN_ALERT "Please stand by while rebooting the system...\n"); +	local_irq_disable(); +	/* Set the watchdog timer to reset immediately */ +	ssb_chipco_watchdog_timer_set(&ssb_bcm47xx.chipco, 1); +	while (1) +		cpu_relax(); +} + +static void bcm47xx_machine_halt(void) +{ +	/* Disable interrupts and watchdog and spin forever */ +	local_irq_disable(); +	ssb_chipco_watchdog_timer_set(&ssb_bcm47xx.chipco, 0); +	while (1) +		cpu_relax(); +} + +static int bcm47xx_get_invariants(struct ssb_bus *bus, +				   struct ssb_init_invariants *iv) +{ +	/* TODO: fill ssb_init_invariants using boardtype/boardrev +	 * CFE environment variables. +	 */ +	return 0; +} + +void __init plat_mem_setup(void) +{ +	int err; + +	err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE, +				      bcm47xx_get_invariants); +	if (err) +		panic("Failed to initialize SSB bus (err %d)\n", err); + +	_machine_restart = bcm47xx_machine_restart; +	_machine_halt = bcm47xx_machine_halt; +	pm_power_off = bcm47xx_machine_halt; +	board_time_init = bcm47xx_time_init; +} + |