xref: /kernel/linux/linux-5.10/arch/sh/kernel/irq_32.c (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * SHcompact irqflags support
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2006 - 2009 Paul Mundt
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci#include <linux/irqflags.h>
88c2ecf20Sopenharmony_ci#include <linux/module.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_civoid notrace arch_local_irq_restore(unsigned long flags)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	unsigned long __dummy0, __dummy1;
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci	if (flags == ARCH_IRQ_DISABLED) {
158c2ecf20Sopenharmony_ci		__asm__ __volatile__ (
168c2ecf20Sopenharmony_ci			"stc	sr, %0\n\t"
178c2ecf20Sopenharmony_ci			"or	#0xf0, %0\n\t"
188c2ecf20Sopenharmony_ci			"ldc	%0, sr\n\t"
198c2ecf20Sopenharmony_ci			: "=&z" (__dummy0)
208c2ecf20Sopenharmony_ci			: /* no inputs */
218c2ecf20Sopenharmony_ci			: "memory"
228c2ecf20Sopenharmony_ci		);
238c2ecf20Sopenharmony_ci	} else {
248c2ecf20Sopenharmony_ci		__asm__ __volatile__ (
258c2ecf20Sopenharmony_ci			"stc	sr, %0\n\t"
268c2ecf20Sopenharmony_ci			"and	%1, %0\n\t"
278c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_HAS_SR_RB
288c2ecf20Sopenharmony_ci			"stc	r6_bank, %1\n\t"
298c2ecf20Sopenharmony_ci			"or	%1, %0\n\t"
308c2ecf20Sopenharmony_ci#endif
318c2ecf20Sopenharmony_ci			"ldc	%0, sr\n\t"
328c2ecf20Sopenharmony_ci			: "=&r" (__dummy0), "=r" (__dummy1)
338c2ecf20Sopenharmony_ci			: "1" (~ARCH_IRQ_DISABLED)
348c2ecf20Sopenharmony_ci			: "memory"
358c2ecf20Sopenharmony_ci		);
368c2ecf20Sopenharmony_ci	}
378c2ecf20Sopenharmony_ci}
388c2ecf20Sopenharmony_ciEXPORT_SYMBOL(arch_local_irq_restore);
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ciunsigned long notrace arch_local_save_flags(void)
418c2ecf20Sopenharmony_ci{
428c2ecf20Sopenharmony_ci	unsigned long flags;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	__asm__ __volatile__ (
458c2ecf20Sopenharmony_ci		"stc	sr, %0\n\t"
468c2ecf20Sopenharmony_ci		"and	#0xf0, %0\n\t"
478c2ecf20Sopenharmony_ci		: "=&z" (flags)
488c2ecf20Sopenharmony_ci		: /* no inputs */
498c2ecf20Sopenharmony_ci		: "memory"
508c2ecf20Sopenharmony_ci	);
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	return flags;
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ciEXPORT_SYMBOL(arch_local_save_flags);
55