1/*
2 * SHcompact irqflags support
3 *
4 * Copyright (C) 2006 - 2009 Paul Mundt
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
10#include <linux/irqflags.h>
11#include <linux/module.h>
12
13void notrace arch_local_irq_restore(unsigned long flags)
14{
15	unsigned long __dummy0, __dummy1;
16
17	if (flags == ARCH_IRQ_DISABLED) {
18		__asm__ __volatile__ (
19			"stc	sr, %0\n\t"
20			"or	#0xf0, %0\n\t"
21			"ldc	%0, sr\n\t"
22			: "=&z" (__dummy0)
23			: /* no inputs */
24			: "memory"
25		);
26	} else {
27		__asm__ __volatile__ (
28			"stc	sr, %0\n\t"
29			"and	%1, %0\n\t"
30#ifdef CONFIG_CPU_HAS_SR_RB
31			"stc	r6_bank, %1\n\t"
32			"or	%1, %0\n\t"
33#endif
34			"ldc	%0, sr\n\t"
35			: "=&r" (__dummy0), "=r" (__dummy1)
36			: "1" (~ARCH_IRQ_DISABLED)
37			: "memory"
38		);
39	}
40}
41EXPORT_SYMBOL(arch_local_irq_restore);
42
43unsigned long notrace arch_local_save_flags(void)
44{
45	unsigned long flags;
46
47	__asm__ __volatile__ (
48		"stc	sr, %0\n\t"
49		"and	#0xf0, %0\n\t"
50		: "=&z" (flags)
51		: /* no inputs */
52		: "memory"
53	);
54
55	return flags;
56}
57EXPORT_SYMBOL(arch_local_save_flags);
58