xref: /openbmc/linux/arch/arm/include/asm/fiq.h (revision 2846d84ffa4408c9810fabad74cb7aec410352fc)
14baa9922SRussell King /*
24baa9922SRussell King  *  arch/arm/include/asm/fiq.h
34baa9922SRussell King  *
44baa9922SRussell King  * Support for FIQ on ARM architectures.
54baa9922SRussell King  * Written by Philip Blundell <philb@gnu.org>, 1998
64baa9922SRussell King  * Re-written by Russell King
7*2846d84fSDave Martin  *
8*2846d84fSDave Martin  * NOTE: The FIQ mode registers are not magically preserved across
9*2846d84fSDave Martin  * suspend/resume.
10*2846d84fSDave Martin  *
11*2846d84fSDave Martin  * Drivers which require these registers to be preserved across power
12*2846d84fSDave Martin  * management operations must implement appropriate suspend/resume handlers to
13*2846d84fSDave Martin  * save and restore them.
144baa9922SRussell King  */
154baa9922SRussell King 
164baa9922SRussell King #ifndef __ASM_FIQ_H
174baa9922SRussell King #define __ASM_FIQ_H
184baa9922SRussell King 
194baa9922SRussell King #include <asm/ptrace.h>
204baa9922SRussell King 
214baa9922SRussell King struct fiq_handler {
224baa9922SRussell King 	struct fiq_handler *next;
234baa9922SRussell King 	/* Name
244baa9922SRussell King 	 */
254baa9922SRussell King 	const char *name;
264baa9922SRussell King 	/* Called to ask driver to relinquish/
274baa9922SRussell King 	 * reacquire FIQ
284baa9922SRussell King 	 * return zero to accept, or -<errno>
294baa9922SRussell King 	 */
304baa9922SRussell King 	int (*fiq_op)(void *, int relinquish);
314baa9922SRussell King 	/* data for the relinquish/reacquire functions
324baa9922SRussell King 	 */
334baa9922SRussell King 	void *dev_id;
344baa9922SRussell King };
354baa9922SRussell King 
364baa9922SRussell King extern int claim_fiq(struct fiq_handler *f);
374baa9922SRussell King extern void release_fiq(struct fiq_handler *f);
384baa9922SRussell King extern void set_fiq_handler(void *start, unsigned int length);
394baa9922SRussell King extern void enable_fiq(int fiq);
404baa9922SRussell King extern void disable_fiq(int fiq);
414baa9922SRussell King 
42dc2eb928SDave Martin /* helpers defined in fiqasm.S: */
43dc2eb928SDave Martin extern void __set_fiq_regs(unsigned long const *regs);
44dc2eb928SDave Martin extern void __get_fiq_regs(unsigned long *regs);
45dc2eb928SDave Martin 
46dc2eb928SDave Martin static inline void set_fiq_regs(struct pt_regs const *regs)
47dc2eb928SDave Martin {
48dc2eb928SDave Martin 	__set_fiq_regs(&regs->ARM_r8);
49dc2eb928SDave Martin }
50dc2eb928SDave Martin 
51dc2eb928SDave Martin static inline void get_fiq_regs(struct pt_regs *regs)
52dc2eb928SDave Martin {
53dc2eb928SDave Martin 	__get_fiq_regs(&regs->ARM_r8);
54dc2eb928SDave Martin }
55dc2eb928SDave Martin 
564baa9922SRussell King #endif
57