11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
24baa9922430662431231ac637adedddbb0cfb2d7Russell King *  arch/arm/include/asm/fiq.h
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Support for FIQ on ARM architectures.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Written by Philip Blundell <philb@gnu.org>, 1998
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Re-written by Russell King
72846d84ffa4408c9810fabad74cb7aec410352fcDave Martin *
82846d84ffa4408c9810fabad74cb7aec410352fcDave Martin * NOTE: The FIQ mode registers are not magically preserved across
92846d84ffa4408c9810fabad74cb7aec410352fcDave Martin * suspend/resume.
102846d84ffa4408c9810fabad74cb7aec410352fcDave Martin *
112846d84ffa4408c9810fabad74cb7aec410352fcDave Martin * Drivers which require these registers to be preserved across power
122846d84ffa4408c9810fabad74cb7aec410352fcDave Martin * management operations must implement appropriate suspend/resume handlers to
132846d84ffa4408c9810fabad74cb7aec410352fcDave Martin * save and restore them.
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASM_FIQ_H
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __ASM_FIQ_H
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/ptrace.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct fiq_handler {
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct fiq_handler *next;
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Name
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char *name;
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Called to ask driver to relinquish/
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * reacquire FIQ
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * return zero to accept, or -<errno>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int (*fiq_op)(void *, int relinquish);
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* data for the relinquish/reacquire functions
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void *dev_id;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int claim_fiq(struct fiq_handler *f);
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void release_fiq(struct fiq_handler *f);
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void set_fiq_handler(void *start, unsigned int length);
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void enable_fiq(int fiq);
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void disable_fiq(int fiq);
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin/* helpers defined in fiqasm.S: */
43dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martinextern void __set_fiq_regs(unsigned long const *regs);
44dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martinextern void __get_fiq_regs(unsigned long *regs);
45dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin
46dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martinstatic inline void set_fiq_regs(struct pt_regs const *regs)
47dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin{
48dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin	__set_fiq_regs(&regs->ARM_r8);
49dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin}
50dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin
51dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martinstatic inline void get_fiq_regs(struct pt_regs *regs)
52dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin{
53dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin	__get_fiq_regs(&regs->ARM_r8);
54dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin}
55dc2eb928a1bcf6a48f40c1f2ff21b66bdbf91a3cDave Martin
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
57