setup.c 2.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
/*
 *
 * arch/xtensa/platform-iss/setup.c
 *
 * Platform specific initialization.
 *
 * Authors: Chris Zankel <chris@zankel.net>
 *          Joe Taylor <joe@tensilica.com>
 *
 * Copyright 2001 - 2005 Tensilica Inc.
 *
 * 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.
 *
 */
#include <linux/stddef.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/reboot.h>
#include <linux/kdev_t.h>
#include <linux/types.h>
#include <linux/major.h>
#include <linux/blkdev.h>
#include <linux/console.h>
#include <linux/delay.h>
#include <linux/stringify.h>
#include <linux/notifier.h>

#include <asm/platform.h>
#include <asm/bootparam.h>


void __init platform_init(bp_tag_t* bootparam)
{

}

41 42 43 44 45 46
#ifdef CONFIG_PCI
void platform_pcibios_init(void)
{
}
#endif

47 48
void platform_halt(void)
{
49 50
	pr_info(" ** Called platform_halt() **\n");
	__asm__ __volatile__("movi a2, 1\nsimcall\n");
51 52 53 54
}

void platform_power_off(void)
{
55 56
	pr_info(" ** Called platform_power_off() **\n");
	__asm__ __volatile__("movi a2, 1\nsimcall\n");
57 58 59 60 61 62 63
}
void platform_restart(void)
{
	/* Flush and reset the mmu, simulate a processor reset, and
	 * jump to the reset vector. */

	__asm__ __volatile__("movi	a2, 15\n\t"
M
Max Filippov 已提交
64
			     "wsr	a2, icountlevel\n\t"
65
			     "movi	a2, 0\n\t"
M
Max Filippov 已提交
66 67 68
			     "wsr	a2, icount\n\t"
			     "wsr	a2, ibreakenable\n\t"
			     "wsr	a2, lcount\n\t"
69
			     "movi	a2, 0x1f\n\t"
M
Max Filippov 已提交
70
			     "wsr	a2, ps\n\t"
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
			     "isync\n\t"
			     "jx	%0\n\t"
			     :
			     : "a" (XCHAL_RESET_VECTOR_VADDR)
			     : "a2");

	/* control never gets here */
}

extern void iss_net_poll(void);

const char twirl[]="|/-\\|/-\\";

void platform_heartbeat(void)
{
#if 0
	static int i = 0, j = 0;

	if (--i < 0) {
		i = 99;
		printk("\r%c\r", twirl[j++]);
		if (j == 8)
			j = 0;
	}
#endif
}



static int
iss_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
{
	__asm__ __volatile__("movi a2, -1; simcall\n");
	return NOTIFY_DONE;
}

static struct notifier_block iss_panic_block = {
	iss_panic_event,
	NULL,
	0
};

void __init platform_setup(char **p_cmdline)
{
115
	atomic_notifier_chain_register(&panic_notifier_list, &iss_panic_block);
116
}