/* doesn't do a whole lot for user, but oh so cleverly written so kernel code can use it to re-up the watchdog, thereby saving the kernel from having to create and maintain a timer, just to tickle another timer, which is just so wrong.  */
irqreturn_t sbwdog_interrupt(int irq, void *addr)
/* doesn't do a whole lot for user, but oh so cleverly written so kernel code can use it to re-up the watchdog, thereby saving the kernel from having to create and maintain a timer, just to tickle another timer, which is just so wrong.  */
irqreturn_t sbwdog_interrupt(int irq, void *addr)
{
	unsigned long wd_init;
	char *wd_cfg_reg = (char *)addr;
	u8 cfg;
	cfg = __raw_readb(wd_cfg_reg);
	wd_init = __raw_readq(wd_cfg_reg - 8) & 0x7fffff;
	if (wd_cfg_reg == user_dog)
		printk(KERN_CRIT "%s in danger of initiating system reset "
			"in %ld.%01ld seconds\n",
			ident.identity,
			wd_init / 1000000, (wd_init / 100000) % 10);
	else
		cfg |= 1;
	__raw_writeb(cfg, wd_cfg_reg);
	return IRQ_HANDLED;
}