Path: blob/master/arch/sh/boards/mach-sdk7786/nmi.c
15126 views
/*1* SDK7786 FPGA NMI Support.2*3* Copyright (C) 2010 Paul Mundt4*5* This file is subject to the terms and conditions of the GNU General Public6* License. See the file "COPYING" in the main directory of this archive7* for more details.8*/9#include <linux/init.h>10#include <linux/kernel.h>11#include <linux/string.h>12#include <mach/fpga.h>1314enum {15NMI_MODE_MANUAL,16NMI_MODE_AUX,17NMI_MODE_MASKED,18NMI_MODE_ANY,19NMI_MODE_UNKNOWN,20};2122/*23* Default to the manual NMI switch.24*/25static unsigned int __initdata nmi_mode = NMI_MODE_ANY;2627static int __init nmi_mode_setup(char *str)28{29if (!str)30return 0;3132if (strcmp(str, "manual") == 0)33nmi_mode = NMI_MODE_MANUAL;34else if (strcmp(str, "aux") == 0)35nmi_mode = NMI_MODE_AUX;36else if (strcmp(str, "masked") == 0)37nmi_mode = NMI_MODE_MASKED;38else if (strcmp(str, "any") == 0)39nmi_mode = NMI_MODE_ANY;40else {41nmi_mode = NMI_MODE_UNKNOWN;42pr_warning("Unknown NMI mode %s\n", str);43}4445printk("Set NMI mode to %d\n", nmi_mode);46return 0;47}48early_param("nmi_mode", nmi_mode_setup);4950void __init sdk7786_nmi_init(void)51{52unsigned int source, mask, tmp;5354switch (nmi_mode) {55case NMI_MODE_MANUAL:56source = NMISR_MAN_NMI;57mask = NMIMR_MAN_NMIM;58break;59case NMI_MODE_AUX:60source = NMISR_AUX_NMI;61mask = NMIMR_AUX_NMIM;62break;63case NMI_MODE_ANY:64source = NMISR_MAN_NMI | NMISR_AUX_NMI;65mask = NMIMR_MAN_NMIM | NMIMR_AUX_NMIM;66break;67case NMI_MODE_MASKED:68case NMI_MODE_UNKNOWN:69default:70source = mask = 0;71break;72}7374/* Set the NMI source */75tmp = fpga_read_reg(NMISR);76tmp &= ~NMISR_MASK;77tmp |= source;78fpga_write_reg(tmp, NMISR);7980/* And the IRQ masking */81fpga_write_reg(NMIMR_MASK ^ mask, NMIMR);82}838485