1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * arch/arm/include/asm/fiq.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Support for FIQ on ARM architectures. 6*4882a593Smuzhiyun * Written by Philip Blundell <philb@gnu.org>, 1998 7*4882a593Smuzhiyun * Re-written by Russell King 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * NOTE: The FIQ mode registers are not magically preserved across 10*4882a593Smuzhiyun * suspend/resume. 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Drivers which require these registers to be preserved across power 13*4882a593Smuzhiyun * management operations must implement appropriate suspend/resume handlers to 14*4882a593Smuzhiyun * save and restore them. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef __ASM_FIQ_H 18*4882a593Smuzhiyun #define __ASM_FIQ_H 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include <asm/ptrace.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun struct fiq_handler { 23*4882a593Smuzhiyun struct fiq_handler *next; 24*4882a593Smuzhiyun /* Name 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun const char *name; 27*4882a593Smuzhiyun /* Called to ask driver to relinquish/ 28*4882a593Smuzhiyun * reacquire FIQ 29*4882a593Smuzhiyun * return zero to accept, or -<errno> 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun int (*fiq_op)(void *, int relinquish); 32*4882a593Smuzhiyun /* data for the relinquish/reacquire functions 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun void *dev_id; 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun extern int claim_fiq(struct fiq_handler *f); 38*4882a593Smuzhiyun extern void release_fiq(struct fiq_handler *f); 39*4882a593Smuzhiyun extern void set_fiq_handler(void *start, unsigned int length); 40*4882a593Smuzhiyun extern void enable_fiq(int fiq); 41*4882a593Smuzhiyun extern void disable_fiq(int fiq); 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* helpers defined in fiqasm.S: */ 44*4882a593Smuzhiyun extern void __set_fiq_regs(unsigned long const *regs); 45*4882a593Smuzhiyun extern void __get_fiq_regs(unsigned long *regs); 46*4882a593Smuzhiyun set_fiq_regs(struct pt_regs const * regs)47*4882a593Smuzhiyunstatic inline void set_fiq_regs(struct pt_regs const *regs) 48*4882a593Smuzhiyun { 49*4882a593Smuzhiyun __set_fiq_regs(®s->ARM_r8); 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun get_fiq_regs(struct pt_regs * regs)52*4882a593Smuzhiyunstatic inline void get_fiq_regs(struct pt_regs *regs) 53*4882a593Smuzhiyun { 54*4882a593Smuzhiyun __get_fiq_regs(®s->ARM_r8); 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #endif 58