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(®s->ARM_r8); 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic inline void get_fiq_regs(struct pt_regs *regs) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci __get_fiq_regs(®s->ARM_r8); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#endif 58