1/* 2 * arch/arm/mach-ixp4xx/nslu2-power.c 3 * 4 * NSLU2 Power/Reset driver 5 * 6 * Copyright (C) 2005 Tower Technologies 7 * 8 * based on nslu2-io.c 9 * Copyright (C) 2004 Karen Spearel 10 * 11 * Author: Alessandro Zummo <a.zummo@towertech.it> 12 * Maintainers: http://www.nslu2-linux.org/ 13 * 14 * This program is free software; you can redistribute it and/or modify 15 * it under the terms of the GNU General Public License version 2 as 16 * published by the Free Software Foundation. 17 * 18 */ 19 20#include <linux/module.h> 21#include <linux/reboot.h> 22#include <linux/irq.h> 23#include <linux/interrupt.h> 24#include <linux/reboot.h> 25 26#include <asm/mach-types.h> 27 28static irqreturn_t nslu2_power_handler(int irq, void *dev_id) 29{ 30 /* Signal init to do the ctrlaltdel action, this will bypass init if 31 * it hasn't started and do a kernel_restart. 32 */ 33 ctrl_alt_del(); 34 35 return IRQ_HANDLED; 36} 37 38static irqreturn_t nslu2_reset_handler(int irq, void *dev_id) 39{ 40 /* This is the paper-clip reset, it shuts the machine down directly. 41 */ 42 machine_power_off(); 43 44 return IRQ_HANDLED; 45} 46 47static int __init nslu2_power_init(void) 48{ 49 if (!(machine_is_nslu2())) 50 return 0; 51 52 *IXP4XX_GPIO_GPISR = 0x20400000; /* read the 2 irqs to clr */ 53 54 set_irq_type(NSLU2_RB_IRQ, IRQT_LOW); 55 set_irq_type(NSLU2_PB_IRQ, IRQT_HIGH); 56 57 if (request_irq(NSLU2_RB_IRQ, &nslu2_reset_handler, 58 IRQF_DISABLED, "NSLU2 reset button", NULL) < 0) { 59 60 printk(KERN_DEBUG "Reset Button IRQ %d not available\n", 61 NSLU2_RB_IRQ); 62 63 return -EIO; 64 } 65 66 if (request_irq(NSLU2_PB_IRQ, &nslu2_power_handler, 67 IRQF_DISABLED, "NSLU2 power button", NULL) < 0) { 68 69 printk(KERN_DEBUG "Power Button IRQ %d not available\n", 70 NSLU2_PB_IRQ); 71 72 return -EIO; 73 } 74 75 return 0; 76} 77 78static void __exit nslu2_power_exit(void) 79{ 80 if (!(machine_is_nslu2())) 81 return; 82 83 free_irq(NSLU2_RB_IRQ, NULL); 84 free_irq(NSLU2_PB_IRQ, NULL); 85} 86 87module_init(nslu2_power_init); 88module_exit(nslu2_power_exit); 89 90MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); 91MODULE_DESCRIPTION("NSLU2 Power/Reset driver"); 92MODULE_LICENSE("GPL"); 93