Drivers which make use of the FIQ interrupt may require the state of the FIQ mode registers to be preserved across suspend/resume. Because the FIQ mode registers are not saved and restored automatically by the kernel, driver authors will need to do the appropriate save/restore in their own driver suspend/resume handlers. Implementing global automatic save/restore of the FIQ state does not appear appropriate, since this by itself is not sufficient for FIQ-based drivers to function correctly across suspend/resume in any case. This patch adds a brief explanatory note to fiq.h documenting the requirement placed on driver authors. Signed-off-by: Dave Martin <dave.martin@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
		
			
				
	
	
		
			56 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 *  arch/arm/include/asm/fiq.h
 | 
						|
 *
 | 
						|
 * Support for FIQ on ARM architectures.
 | 
						|
 * Written by Philip Blundell <philb@gnu.org>, 1998
 | 
						|
 * Re-written by Russell King
 | 
						|
 *
 | 
						|
 * NOTE: The FIQ mode registers are not magically preserved across
 | 
						|
 * suspend/resume.
 | 
						|
 *
 | 
						|
 * Drivers which require these registers to be preserved across power
 | 
						|
 * management operations must implement appropriate suspend/resume handlers to
 | 
						|
 * save and restore them.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef __ASM_FIQ_H
 | 
						|
#define __ASM_FIQ_H
 | 
						|
 | 
						|
#include <asm/ptrace.h>
 | 
						|
 | 
						|
struct fiq_handler {
 | 
						|
	struct fiq_handler *next;
 | 
						|
	/* Name
 | 
						|
	 */
 | 
						|
	const char *name;
 | 
						|
	/* Called to ask driver to relinquish/
 | 
						|
	 * reacquire FIQ
 | 
						|
	 * return zero to accept, or -<errno>
 | 
						|
	 */
 | 
						|
	int (*fiq_op)(void *, int relinquish);
 | 
						|
	/* data for the relinquish/reacquire functions
 | 
						|
	 */
 | 
						|
	void *dev_id;
 | 
						|
};
 | 
						|
 | 
						|
extern int claim_fiq(struct fiq_handler *f);
 | 
						|
extern void release_fiq(struct fiq_handler *f);
 | 
						|
extern void set_fiq_handler(void *start, unsigned int length);
 | 
						|
extern void enable_fiq(int fiq);
 | 
						|
extern void disable_fiq(int fiq);
 | 
						|
 | 
						|
/* helpers defined in fiqasm.S: */
 | 
						|
extern void __set_fiq_regs(unsigned long const *regs);
 | 
						|
extern void __get_fiq_regs(unsigned long *regs);
 | 
						|
 | 
						|
static inline void set_fiq_regs(struct pt_regs const *regs)
 | 
						|
{
 | 
						|
	__set_fiq_regs(®s->ARM_r8);
 | 
						|
}
 | 
						|
 | 
						|
static inline void get_fiq_regs(struct pt_regs *regs)
 | 
						|
{
 | 
						|
	__get_fiq_regs(®s->ARM_r8);
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |