xref: /openbmc/linux/arch/xtensa/platforms/iss/setup.c (revision d0b73b48)
1 /*
2  *
3  * arch/xtensa/platform-iss/setup.c
4  *
5  * Platform specific initialization.
6  *
7  * Authors: Chris Zankel <chris@zankel.net>
8  *          Joe Taylor <joe@tensilica.com>
9  *
10  * Copyright 2001 - 2005 Tensilica Inc.
11  *
12  * This program is free software; you can redistribute  it and/or modify it
13  * under  the terms of  the GNU General  Public License as published by the
14  * Free Software Foundation;  either version 2 of the  License, or (at your
15  * option) any later version.
16  *
17  */
18 #include <linux/stddef.h>
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/errno.h>
22 #include <linux/reboot.h>
23 #include <linux/kdev_t.h>
24 #include <linux/types.h>
25 #include <linux/major.h>
26 #include <linux/blkdev.h>
27 #include <linux/console.h>
28 #include <linux/delay.h>
29 #include <linux/stringify.h>
30 #include <linux/notifier.h>
31 
32 #include <asm/platform.h>
33 #include <asm/bootparam.h>
34 
35 
36 void __init platform_init(bp_tag_t* bootparam)
37 {
38 
39 }
40 
41 #ifdef CONFIG_PCI
42 void platform_pcibios_init(void)
43 {
44 }
45 #endif
46 
47 void platform_halt(void)
48 {
49 	pr_info(" ** Called platform_halt() **\n");
50 	__asm__ __volatile__("movi a2, 1\nsimcall\n");
51 }
52 
53 void platform_power_off(void)
54 {
55 	pr_info(" ** Called platform_power_off() **\n");
56 	__asm__ __volatile__("movi a2, 1\nsimcall\n");
57 }
58 void platform_restart(void)
59 {
60 	/* Flush and reset the mmu, simulate a processor reset, and
61 	 * jump to the reset vector. */
62 
63 	__asm__ __volatile__("movi	a2, 15\n\t"
64 			     "wsr	a2, icountlevel\n\t"
65 			     "movi	a2, 0\n\t"
66 			     "wsr	a2, icount\n\t"
67 			     "wsr	a2, ibreakenable\n\t"
68 			     "wsr	a2, lcount\n\t"
69 			     "movi	a2, 0x1f\n\t"
70 			     "wsr	a2, ps\n\t"
71 			     "isync\n\t"
72 			     "jx	%0\n\t"
73 			     :
74 			     : "a" (XCHAL_RESET_VECTOR_VADDR)
75 			     : "a2");
76 
77 	/* control never gets here */
78 }
79 
80 extern void iss_net_poll(void);
81 
82 const char twirl[]="|/-\\|/-\\";
83 
84 void platform_heartbeat(void)
85 {
86 #if 0
87 	static int i = 0, j = 0;
88 
89 	if (--i < 0) {
90 		i = 99;
91 		printk("\r%c\r", twirl[j++]);
92 		if (j == 8)
93 			j = 0;
94 	}
95 #endif
96 }
97 
98 
99 
100 static int
101 iss_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
102 {
103 	__asm__ __volatile__("movi a2, -1; simcall\n");
104 	return NOTIFY_DONE;
105 }
106 
107 static struct notifier_block iss_panic_block = {
108 	iss_panic_event,
109 	NULL,
110 	0
111 };
112 
113 void __init platform_setup(char **p_cmdline)
114 {
115 	atomic_notifier_chain_register(&panic_notifier_list, &iss_panic_block);
116 }
117