103fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt/*
203fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt * SHcompact irqflags support
303fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt *
403fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt * Copyright (C) 2006 - 2009 Paul Mundt
503fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt *
603fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt * This file is subject to the terms and conditions of the GNU General Public
703fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt * License. See the file "COPYING" in the main directory of this archive
803fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt * for more details.
903fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt */
1003fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt#include <linux/irqflags.h>
1103fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt#include <linux/module.h>
1203fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt
13df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsvoid notrace arch_local_irq_restore(unsigned long flags)
1403fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt{
1503fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt	unsigned long __dummy0, __dummy1;
1603fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt
17df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells	if (flags == ARCH_IRQ_DISABLED) {
1803fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		__asm__ __volatile__ (
1903fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			"stc	sr, %0\n\t"
2003fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			"or	#0xf0, %0\n\t"
2103fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			"ldc	%0, sr\n\t"
2203fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			: "=&z" (__dummy0)
2303fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			: /* no inputs */
2403fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			: "memory"
2503fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		);
2603fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt	} else {
2703fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		__asm__ __volatile__ (
2803fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			"stc	sr, %0\n\t"
2903fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			"and	%1, %0\n\t"
3003fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt#ifdef CONFIG_CPU_HAS_SR_RB
3103fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			"stc	r6_bank, %1\n\t"
3203fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			"or	%1, %0\n\t"
3303fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt#endif
3403fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			"ldc	%0, sr\n\t"
3503fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			: "=&r" (__dummy0), "=r" (__dummy1)
36df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howells			: "1" (~ARCH_IRQ_DISABLED)
3703fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt			: "memory"
3803fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		);
3903fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt	}
4003fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt}
41df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David HowellsEXPORT_SYMBOL(arch_local_irq_restore);
4203fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt
43df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David Howellsunsigned long notrace arch_local_save_flags(void)
4403fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt{
4503fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt	unsigned long flags;
4603fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt
4703fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt	__asm__ __volatile__ (
4803fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		"stc	sr, %0\n\t"
4903fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		"and	#0xf0, %0\n\t"
5003fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		: "=&z" (flags)
5103fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		: /* no inputs */
5203fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt		: "memory"
5303fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt	);
5403fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt
5503fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt	return flags;
5603fdb708926d5df2d9b9e62222c1666e20caa9e3Paul Mundt}
57df9ee29270c11dba7d0fe0b83ce47a4d8e8d2101David HowellsEXPORT_SYMBOL(arch_local_save_flags);
58