83 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			83 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Interrupt handling H8/300H depend.
							 | 
						||
| 
								 | 
							
								 * Yoshinori Sato <ysato@users.sourceforge.jp>
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <linux/init.h>
							 | 
						||
| 
								 | 
							
								#include <linux/errno.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <asm/ptrace.h>
							 | 
						||
| 
								 | 
							
								#include <asm/traps.h>
							 | 
						||
| 
								 | 
							
								#include <asm/irq.h>
							 | 
						||
| 
								 | 
							
								#include <asm/io.h>
							 | 
						||
| 
								 | 
							
								#include <asm/gpio.h>
							 | 
						||
| 
								 | 
							
								#include <asm/regs306x.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const int __initdata h8300_saved_vectors[] = {
							 | 
						||
| 
								 | 
							
								#if defined(CONFIG_GDB_DEBUG)
							 | 
						||
| 
								 | 
							
									TRAP3_VEC,	/* TRAPA #3 is GDB breakpoint */
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
									-1,
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const h8300_vector __initdata h8300_trap_table[] = {
							 | 
						||
| 
								 | 
							
									0, 0, 0, 0, 0, 0, 0, 0,
							 | 
						||
| 
								 | 
							
									system_call,
							 | 
						||
| 
								 | 
							
									0,
							 | 
						||
| 
								 | 
							
									0,
							 | 
						||
| 
								 | 
							
									trace_break,
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int h8300_enable_irq_pin(unsigned int irq)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int bitmask;
							 | 
						||
| 
								 | 
							
									if (irq < EXT_IRQ0 || irq > EXT_IRQ5)
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* initialize IRQ pin */
							 | 
						||
| 
								 | 
							
									bitmask = 1 << (irq - EXT_IRQ0);
							 | 
						||
| 
								 | 
							
									switch(irq) {
							 | 
						||
| 
								 | 
							
									case EXT_IRQ0:
							 | 
						||
| 
								 | 
							
									case EXT_IRQ1:
							 | 
						||
| 
								 | 
							
									case EXT_IRQ2:
							 | 
						||
| 
								 | 
							
									case EXT_IRQ3:
							 | 
						||
| 
								 | 
							
										if (H8300_GPIO_RESERVE(H8300_GPIO_P8, bitmask) == 0)
							 | 
						||
| 
								 | 
							
											return -EBUSY;
							 | 
						||
| 
								 | 
							
										H8300_GPIO_DDR(H8300_GPIO_P8, bitmask, H8300_GPIO_INPUT);
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									case EXT_IRQ4:
							 | 
						||
| 
								 | 
							
									case EXT_IRQ5:
							 | 
						||
| 
								 | 
							
										if (H8300_GPIO_RESERVE(H8300_GPIO_P9, bitmask) == 0)
							 | 
						||
| 
								 | 
							
											return -EBUSY;
							 | 
						||
| 
								 | 
							
										H8300_GPIO_DDR(H8300_GPIO_P9, bitmask, H8300_GPIO_INPUT);
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void h8300_disable_irq_pin(unsigned int irq)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int bitmask;
							 | 
						||
| 
								 | 
							
									if (irq < EXT_IRQ0 || irq > EXT_IRQ5)
							 | 
						||
| 
								 | 
							
										return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* disable interrupt & release IRQ pin */
							 | 
						||
| 
								 | 
							
									bitmask = 1 << (irq - EXT_IRQ0);
							 | 
						||
| 
								 | 
							
									switch(irq) {
							 | 
						||
| 
								 | 
							
									case EXT_IRQ0:
							 | 
						||
| 
								 | 
							
									case EXT_IRQ1:
							 | 
						||
| 
								 | 
							
									case EXT_IRQ2:
							 | 
						||
| 
								 | 
							
									case EXT_IRQ3:
							 | 
						||
| 
								 | 
							
										*(volatile unsigned char *)IER &= ~bitmask;
							 | 
						||
| 
								 | 
							
										H8300_GPIO_FREE(H8300_GPIO_P8, bitmask);
							 | 
						||
| 
								 | 
							
										break ;
							 | 
						||
| 
								 | 
							
									case EXT_IRQ4:
							 | 
						||
| 
								 | 
							
									case EXT_IRQ5:
							 | 
						||
| 
								 | 
							
										*(volatile unsigned char *)IER &= ~bitmask;
							 | 
						||
| 
								 | 
							
										H8300_GPIO_FREE(H8300_GPIO_P9, bitmask);
							 | 
						||
| 
								 | 
							
										break;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |