162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  arch/arm/include/asm/fiq.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Support for FIQ on ARM architectures.
662306a36Sopenharmony_ci * Written by Philip Blundell <philb@gnu.org>, 1998
762306a36Sopenharmony_ci * Re-written by Russell King
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * NOTE: The FIQ mode registers are not magically preserved across
1062306a36Sopenharmony_ci * suspend/resume.
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * Drivers which require these registers to be preserved across power
1362306a36Sopenharmony_ci * management operations must implement appropriate suspend/resume handlers to
1462306a36Sopenharmony_ci * save and restore them.
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifndef __ASM_FIQ_H
1862306a36Sopenharmony_ci#define __ASM_FIQ_H
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <asm/ptrace.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct fiq_handler {
2362306a36Sopenharmony_ci	struct fiq_handler *next;
2462306a36Sopenharmony_ci	/* Name
2562306a36Sopenharmony_ci	 */
2662306a36Sopenharmony_ci	const char *name;
2762306a36Sopenharmony_ci	/* Called to ask driver to relinquish/
2862306a36Sopenharmony_ci	 * reacquire FIQ
2962306a36Sopenharmony_ci	 * return zero to accept, or -<errno>
3062306a36Sopenharmony_ci	 */
3162306a36Sopenharmony_ci	int (*fiq_op)(void *, int relinquish);
3262306a36Sopenharmony_ci	/* data for the relinquish/reacquire functions
3362306a36Sopenharmony_ci	 */
3462306a36Sopenharmony_ci	void *dev_id;
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ciextern int claim_fiq(struct fiq_handler *f);
3862306a36Sopenharmony_ciextern void release_fiq(struct fiq_handler *f);
3962306a36Sopenharmony_ciextern void set_fiq_handler(void *start, unsigned int length);
4062306a36Sopenharmony_ciextern void enable_fiq(int fiq);
4162306a36Sopenharmony_ciextern void disable_fiq(int fiq);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/* helpers defined in fiqasm.S: */
4462306a36Sopenharmony_ciextern void __set_fiq_regs(unsigned long const *regs);
4562306a36Sopenharmony_ciextern void __get_fiq_regs(unsigned long *regs);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic inline void set_fiq_regs(struct pt_regs const *regs)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	__set_fiq_regs(&regs->ARM_r8);
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic inline void get_fiq_regs(struct pt_regs *regs)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	__get_fiq_regs(&regs->ARM_r8);
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#endif
58