/* * Routines to support the NETtel software reset button. */ void reset_button(int irq, void *dev_id, struct pt_regs *regs) { static int inbutton = 0; /* * IRQ7 is not maskable by the CPU core. It is possible * that switch bounce may get us back here before we have * really serviced the interrupt. */ if (inbutton) return; inbutton = 1; /* Disable interrupt at SIM - best we can do... */ mcf_setimr(mcf_getimr() | MCFSIM_IMR_EINT7); #ifdef CONFIG_LEDMAN ledman_signalreset(); #endif /* Don't leave here 'till button is no longer pushed! */ for (;;) { if ((mcf_getipr() & MCFSIM_IMR_EINT7) == 0) break; } #ifndef CONFIG_LEDMAN HARD_RESET_NOW(); /* Should never get here... */ #endif inbutton = 0; /* Interrupt service done, enable it again */ mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT7); }
/* * Routines to support the NETtel software reset button. */ void reset_button(int irq, void *dev_id, struct pt_regs *regs) { volatile unsigned long *icrp, *isrp; static int inbutton = 0; /* * IRQ7 is not maskable by the CPU core. It is possible * that switch bounce mey get us back here before we have * really serviced the interrupt. */ if (inbutton) return; inbutton = 1; /* Disable interrupt at SIM - best we can do... */ icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1); *icrp = (*icrp & 0x07777777) | 0x80000000; #ifdef CONFIG_LEDMAN ledman_signalreset(); #endif /* Don't leave here 'till button is no longer pushed! */ isrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ISR); for (;;) { if (*isrp & 0x80000000) break; } #ifndef CONFIG_LEDMAN HARD_RESET_NOW(); /* Should never get here... */ #endif inbutton = 0; /* Interrupt service done, acknowledge it */ icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1); *icrp = (*icrp & 0x07777777) | 0xf0000000; }