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