diff -ruN linux-2.6.15.orig/arch/arm/mach-ixp4xx/ds101-power.c linux-2.6.15.new/arch/arm/mach-ixp4xx/ds101-power.c --- linux-2.6.15.orig/arch/arm/mach-ixp4xx/ds101-power.c 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.15.new/arch/arm/mach-ixp4xx/ds101-power.c 2006-02-10 23:54:40.000000000 +0100 @@ -0,0 +1,71 @@ +/* + * arch/arm/mach-ixp4xx/ds101-power.c + * + * DS101 Power/Reset driver + * + * Copyright (C) 2005 Tower Technologies + * + * based on ds101-io.c + * Copyright (C) 2004 Karen Spearel + * + * Author: Alessandro Zummo + * Author: OEyvind Repvik + * Maintainers: http://www.nslu2-linux.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include + +#include + +extern void ctrl_alt_del(void); + +static irqreturn_t ds101_reset_handler(int irq, void *dev_id, struct pt_regs *regs) +{ + /* Signal init to do the ctrlaltdel action, this will bypass init if + * it hasn't started and do a kernel_restart. + */ + ctrl_alt_del(); + + return IRQ_HANDLED; +} + +static int __init ds101_power_init(void) +{ + if (!(machine_is_ds101())) + return 0; + + set_irq_type(DS101_RB_IRQ, IRQT_LOW); + + if (request_irq(DS101_RB_IRQ, &ds101_reset_handler, + SA_INTERRUPT, "DS101 reset button", NULL) < 0) { + + printk(KERN_DEBUG "Reset Button IRQ %d not available\n", + DS101_RB_IRQ); + + return -EIO; + } + + return 0; +} + +static void __exit ds101_power_exit(void) +{ + if (!(machine_is_ds101())) + return; + + free_irq(DS101_RB_IRQ, NULL); +} + +module_init(ds101_power_init); +module_exit(ds101_power_exit); + +MODULE_AUTHOR("Alessandro Zummo "); +MODULE_DESCRIPTION("DS101 Power/Reset driver"); +MODULE_LICENSE("GPL");