a7918f39bb
Patch from Alessandro Zummo This patch adds support for the LinkSys NSLU2 running with both big and little-endian kernels. The LinkSys NSLU2 is a cost engineered ARM, XScale 420 based system similar to the the Intel IXDP425 evaluation board. It uses the IXP4XX ARCH. While this patch applies independently of other patches the resultant kernel requires further patches to successfully use onboard devices, including the onboard flash. Since these patches are independent of this one they will be submitted separately. A defconfig is not included here because not all of the required drivers are actually in the kernel. We intend to provide one as soon as the patches will be incorporated in mainstream. This patch is the combined work of nslu2-linux.org Signed-off-by: John Bowler <jbowler@acm.org> Signed-off-by: Alessandro Zummo <a.zummo@towertech.it> Signed-off-by: Deepak Saxena <dsaxena@plexity.net> Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
93 lines
2.0 KiB
C
93 lines
2.0 KiB
C
/*
|
|
* arch/arm/mach-ixp4xx/nslu2-power.c
|
|
*
|
|
* NSLU2 Power/Reset driver
|
|
*
|
|
* Copyright (C) 2005 Tower Technologies
|
|
*
|
|
* based on nslu2-io.c
|
|
* Copyright (C) 2004 Karen Spearel
|
|
*
|
|
* Author: Alessandro Zummo <a.zummo@towertech.it>
|
|
* 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 <linux/module.h>
|
|
#include <linux/reboot.h>
|
|
#include <linux/interrupt.h>
|
|
|
|
#include <asm/mach-types.h>
|
|
|
|
extern void ctrl_alt_del(void);
|
|
|
|
static irqreturn_t nslu2_power_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 irqreturn_t nslu2_reset_handler(int irq, void *dev_id, struct pt_regs *regs)
|
|
{
|
|
/* This is the paper-clip reset, it shuts the machine down directly.
|
|
*/
|
|
machine_power_off();
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static int __init nslu2_power_init(void)
|
|
{
|
|
if (!(machine_is_nslu2()))
|
|
return 0;
|
|
|
|
*IXP4XX_GPIO_GPISR = 0x20400000; /* read the 2 irqs to clr */
|
|
|
|
set_irq_type(NSLU2_RB_IRQ, IRQT_LOW);
|
|
set_irq_type(NSLU2_PB_IRQ, IRQT_HIGH);
|
|
|
|
gpio_line_isr_clear(NSLU2_RB_GPIO);
|
|
gpio_line_isr_clear(NSLU2_PB_GPIO);
|
|
|
|
if (request_irq(NSLU2_RB_IRQ, &nslu2_reset_handler,
|
|
SA_INTERRUPT, "NSLU2 reset button", NULL) < 0) {
|
|
|
|
printk(KERN_DEBUG "Reset Button IRQ %d not available\n",
|
|
NSLU2_RB_IRQ);
|
|
|
|
return -EIO;
|
|
}
|
|
|
|
if (request_irq(NSLU2_PB_IRQ, &nslu2_power_handler,
|
|
SA_INTERRUPT, "NSLU2 power button", NULL) < 0) {
|
|
|
|
printk(KERN_DEBUG "Power Button IRQ %d not available\n",
|
|
NSLU2_PB_IRQ);
|
|
|
|
return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void __exit nslu2_power_exit(void)
|
|
{
|
|
free_irq(NSLU2_RB_IRQ, NULL);
|
|
free_irq(NSLU2_PB_IRQ, NULL);
|
|
}
|
|
|
|
module_init(nslu2_power_init);
|
|
module_exit(nslu2_power_exit);
|
|
|
|
MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
|
|
MODULE_DESCRIPTION("NSLU2 Power/Reset driver");
|
|
MODULE_LICENSE("GPL");
|