 2846d84ffa
			
		
	
	
	2846d84ffa
	
	
	
		
			
			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
 |