/* * 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); }
int mcf_timerirqpending(int timer) { unsigned int imr = 0; switch (timer) { case 1: imr = MCFSIM_IMR_TIMER1; break; case 2: imr = MCFSIM_IMR_TIMER2; break; default: break; } return (mcf_getipr() & imr); }
unsigned long coldfire_timer_offset(void) { volatile unsigned short *timerp; unsigned long trr, tcn, offset; timerp = (volatile unsigned short *) (MCF_MBAR + MCFTIMER_BASE1); tcn = timerp[MCFTIMER_TCN]; trr = timerp[MCFTIMER_TRR]; /* * If we are still in the first half of the upcount and a * timer interupt is pending, then add on a ticks worth of time. */ offset = ((tcn * (1000000 / HZ)) / trr); if (((offset * 2) < (1000000 / HZ)) && (mcf_getipr() & MCFSIM_IMR_TIMER1)) offset += 1000000 / HZ; return offset; }
static __inline__ int mcf_isvector(void) { return(mcf_getipr() & MCFSIM_IMR_EINT7); }