forked from luck/tmp_suning_uos_patched
76496f8f2e
The on-board NMI switch is routed through and mangled by the FPGA prior to its delivery to the NMI pin, so add some glue for the various configuration options. The default is to unmask it and enable all input sources. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
84 lines
1.7 KiB
C
84 lines
1.7 KiB
C
/*
|
|
* SDK7786 FPGA NMI Support.
|
|
*
|
|
* Copyright (C) 2010 Paul Mundt
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*/
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/string.h>
|
|
#include <mach/fpga.h>
|
|
|
|
enum {
|
|
NMI_MODE_MANUAL,
|
|
NMI_MODE_AUX,
|
|
NMI_MODE_MASKED,
|
|
NMI_MODE_ANY,
|
|
NMI_MODE_UNKNOWN,
|
|
};
|
|
|
|
/*
|
|
* Default to the manual NMI switch.
|
|
*/
|
|
static unsigned int __initdata nmi_mode = NMI_MODE_ANY;
|
|
|
|
static int __init nmi_mode_setup(char *str)
|
|
{
|
|
if (!str)
|
|
return 0;
|
|
|
|
if (strcmp(str, "manual") == 0)
|
|
nmi_mode = NMI_MODE_MANUAL;
|
|
else if (strcmp(str, "aux") == 0)
|
|
nmi_mode = NMI_MODE_AUX;
|
|
else if (strcmp(str, "masked") == 0)
|
|
nmi_mode = NMI_MODE_MASKED;
|
|
else if (strcmp(str, "any") == 0)
|
|
nmi_mode = NMI_MODE_ANY;
|
|
else {
|
|
nmi_mode = NMI_MODE_UNKNOWN;
|
|
pr_warning("Unknown NMI mode %s\n", str);
|
|
}
|
|
|
|
printk("Set NMI mode to %d\n", nmi_mode);
|
|
return 0;
|
|
}
|
|
early_param("nmi_mode", nmi_mode_setup);
|
|
|
|
void __init sdk7786_nmi_init(void)
|
|
{
|
|
unsigned int source, mask, tmp;
|
|
|
|
switch (nmi_mode) {
|
|
case NMI_MODE_MANUAL:
|
|
source = NMISR_MAN_NMI;
|
|
mask = NMIMR_MAN_NMIM;
|
|
break;
|
|
case NMI_MODE_AUX:
|
|
source = NMISR_AUX_NMI;
|
|
mask = NMIMR_AUX_NMIM;
|
|
break;
|
|
case NMI_MODE_ANY:
|
|
source = NMISR_MAN_NMI | NMISR_AUX_NMI;
|
|
mask = NMIMR_MAN_NMIM | NMIMR_AUX_NMIM;
|
|
break;
|
|
case NMI_MODE_MASKED:
|
|
case NMI_MODE_UNKNOWN:
|
|
default:
|
|
source = mask = 0;
|
|
break;
|
|
}
|
|
|
|
/* Set the NMI source */
|
|
tmp = fpga_read_reg(NMISR);
|
|
tmp &= ~NMISR_MASK;
|
|
tmp |= source;
|
|
fpga_write_reg(tmp, NMISR);
|
|
|
|
/* And the IRQ masking */
|
|
fpga_write_reg(NMIMR_MASK ^ mask, NMIMR);
|
|
}
|