irq.c revision f6737055c1c432a9628a9a731f9881ad8e0a9eee
1c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells/* 2c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * arch/arm/mach-lpc32xx/irq.c 3c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * 4c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * Author: Kevin Wells <kevin.wells@nxp.com> 5c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * 6c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * Copyright (C) 2010 NXP Semiconductors 7c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * 8c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * This program is free software; you can redistribute it and/or modify 9c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * it under the terms of the GNU General Public License as published by 10c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * the Free Software Foundation; either version 2 of the License, or 11c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * (at your option) any later version. 12c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * 13c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * This program is distributed in the hope that it will be useful, 14c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * but WITHOUT ANY WARRANTY; without even the implied warranty of 15c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * GNU General Public License for more details. 17c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells */ 18c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 19c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <linux/kernel.h> 20c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <linux/types.h> 21c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <linux/interrupt.h> 22c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <linux/irq.h> 23c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <linux/err.h> 24c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <linux/io.h> 25c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 26c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <mach/irqs.h> 27c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <mach/hardware.h> 28c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include <mach/platform.h> 29c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#include "common.h" 30c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 31c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells/* 32c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * Default value representing the Activation polarity of all internal 33c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * interrupt sources 34c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells */ 35c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#define MIC_APR_DEFAULT 0x3FF0EFE0 36c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#define SIC1_APR_DEFAULT 0xFBD27186 37c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#define SIC2_APR_DEFAULT 0x801810C0 38c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 39c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells/* 40c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * Default value representing the Activation Type of all internal 41c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * interrupt sources. All are level sensitive. 42c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells */ 43c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#define MIC_ATR_DEFAULT 0x00000000 44c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#define SIC1_ATR_DEFAULT 0x00026000 45c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells#define SIC2_ATR_DEFAULT 0x00000000 46c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 47c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstruct lpc32xx_event_group_regs { 48c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells void __iomem *enab_reg; 49c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells void __iomem *edge_reg; 50c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells void __iomem *maskstat_reg; 51c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells void __iomem *rawstat_reg; 52c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells}; 53c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 54c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic const struct lpc32xx_event_group_regs lpc32xx_event_int_regs = { 55c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .enab_reg = LPC32XX_CLKPWR_INT_ER, 56c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .edge_reg = LPC32XX_CLKPWR_INT_AP, 57c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .maskstat_reg = LPC32XX_CLKPWR_INT_SR, 58c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .rawstat_reg = LPC32XX_CLKPWR_INT_RS, 59c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells}; 60c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 61c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic const struct lpc32xx_event_group_regs lpc32xx_event_pin_regs = { 62c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .enab_reg = LPC32XX_CLKPWR_PIN_ER, 63c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .edge_reg = LPC32XX_CLKPWR_PIN_AP, 64c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .maskstat_reg = LPC32XX_CLKPWR_PIN_SR, 65c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .rawstat_reg = LPC32XX_CLKPWR_PIN_RS, 66c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells}; 67c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 68c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstruct lpc32xx_event_info { 69c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells const struct lpc32xx_event_group_regs *event_group; 70c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells u32 mask; 71c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells}; 72c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 73c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells/* 74c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * Maps an IRQ number to and event mask and register 75c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells */ 76c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic const struct lpc32xx_event_info lpc32xx_events[NR_IRQS] = { 77c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_08] = { 78c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 79c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_08_BIT, 80c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 81c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_09] = { 82c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 83c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_09_BIT, 84c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 85c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_19] = { 86c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 87c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_19_BIT, 88c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 89c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_07] = { 90c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 91c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_07_BIT, 92c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 93c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_00] = { 94c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 95c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_00_BIT, 96c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 97c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_01] = { 98c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 99c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_01_BIT, 100c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 101c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_02] = { 102c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 103c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_02_BIT, 104c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 105c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_03] = { 106c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 107c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_03_BIT, 108c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 109c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_04] = { 110c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 111c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_04_BIT, 112c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 113c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_05] = { 114c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 115c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_05_BIT, 116c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 117c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPI_06] = { 118c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_pin_regs, 119c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT, 120c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 121f6737055c1c432a9628a9a731f9881ad8e0a9eeeRoland Stigge [IRQ_LPC32XX_GPI_28] = { 122f6737055c1c432a9628a9a731f9881ad8e0a9eeeRoland Stigge .event_group = &lpc32xx_event_pin_regs, 123f6737055c1c432a9628a9a731f9881ad8e0a9eeeRoland Stigge .mask = LPC32XX_CLKPWR_EXTSRC_GPI_28_BIT, 124f6737055c1c432a9628a9a731f9881ad8e0a9eeeRoland Stigge }, 125c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPIO_00] = { 126c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 127c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT, 128c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 129c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPIO_01] = { 130c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 131c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_GPIO_01_BIT, 132c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 133c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPIO_02] = { 134c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 135c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_GPIO_02_BIT, 136c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 137c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPIO_03] = { 138c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 139c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_GPIO_03_BIT, 140c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 141c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPIO_04] = { 142c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 143c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_GPIO_04_BIT, 144c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 145c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_GPIO_05] = { 146c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 147c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_GPIO_05_BIT, 148c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 149c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_KEY] = { 150c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 151c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_KEY_BIT, 152c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 153c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_USB_OTG_ATX] = { 154c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 155c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_USBATXINT_BIT, 156c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 157c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_USB_HOST] = { 158c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 159c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_USB_BIT, 160c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 161c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_RTC] = { 162c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 163c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_RTC_BIT, 164c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 165c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_MSTIMER] = { 166c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 167c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT, 168c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 169c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_TS_AUX] = { 170c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 171c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_TS_AUX_BIT, 172c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 173c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_TS_P] = { 174c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 175c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_TS_P_BIT, 176c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 177c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells [IRQ_LPC32XX_TS_IRQ] = { 178c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .event_group = &lpc32xx_event_int_regs, 179c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells .mask = LPC32XX_CLKPWR_INTSRC_ADC_BIT, 180c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells }, 181c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells}; 182c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 183c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic void get_controller(unsigned int irq, unsigned int *base, 184c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned int *irqbit) 185c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 186c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells if (irq < 32) { 187c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells *base = LPC32XX_MIC_BASE; 188c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells *irqbit = 1 << irq; 189c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } else if (irq < 64) { 190c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells *base = LPC32XX_SIC1_BASE; 191c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells *irqbit = 1 << (irq - 32); 192c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } else { 193c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells *base = LPC32XX_SIC2_BASE; 194c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells *irqbit = 1 << (irq - 64); 195c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } 196c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 197c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 1985638538117ea81063b0611a7374c0d65133860ecLennert Buytenhekstatic void lpc32xx_mask_irq(struct irq_data *d) 199c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 200c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned int reg, ctrl, mask; 201c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 2025638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek get_controller(d->irq, &ctrl, &mask); 203c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 204c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg = __raw_readl(LPC32XX_INTC_MASK(ctrl)) & ~mask; 205c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(reg, LPC32XX_INTC_MASK(ctrl)); 206c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 207c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 2085638538117ea81063b0611a7374c0d65133860ecLennert Buytenhekstatic void lpc32xx_unmask_irq(struct irq_data *d) 209c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 210c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned int reg, ctrl, mask; 211c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 2125638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek get_controller(d->irq, &ctrl, &mask); 213c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 214c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg = __raw_readl(LPC32XX_INTC_MASK(ctrl)) | mask; 215c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(reg, LPC32XX_INTC_MASK(ctrl)); 216c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 217c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 2185638538117ea81063b0611a7374c0d65133860ecLennert Buytenhekstatic void lpc32xx_ack_irq(struct irq_data *d) 219c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 220c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned int ctrl, mask; 221c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 2225638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek get_controller(d->irq, &ctrl, &mask); 223c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 224c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(mask, LPC32XX_INTC_RAW_STAT(ctrl)); 225c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 226c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Also need to clear pending wake event */ 2275638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek if (lpc32xx_events[d->irq].mask != 0) 2285638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek __raw_writel(lpc32xx_events[d->irq].mask, 2295638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek lpc32xx_events[d->irq].event_group->rawstat_reg); 230c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 231c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 232c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic void __lpc32xx_set_irq_type(unsigned int irq, int use_high_level, 233c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells int use_edge) 234c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 235c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned int reg, ctrl, mask; 236c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 237c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells get_controller(irq, &ctrl, &mask); 238c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 239c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Activation level, high or low */ 240c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg = __raw_readl(LPC32XX_INTC_POLAR(ctrl)); 241c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells if (use_high_level) 242c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg |= mask; 243c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells else 244c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg &= ~mask; 245c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(reg, LPC32XX_INTC_POLAR(ctrl)); 246c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 247c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Activation type, edge or level */ 248c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg = __raw_readl(LPC32XX_INTC_ACT_TYPE(ctrl)); 249c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells if (use_edge) 250c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg |= mask; 251c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells else 252c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg &= ~mask; 253c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(reg, LPC32XX_INTC_ACT_TYPE(ctrl)); 254c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 255c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Use same polarity for the wake events */ 256c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells if (lpc32xx_events[irq].mask != 0) { 257c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg = __raw_readl(lpc32xx_events[irq].event_group->edge_reg); 258c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 259c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells if (use_high_level) 260c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg |= lpc32xx_events[irq].mask; 261c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells else 262c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells reg &= ~lpc32xx_events[irq].mask; 263c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 264c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(reg, lpc32xx_events[irq].event_group->edge_reg); 265c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } 266c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 267c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 2685638538117ea81063b0611a7374c0d65133860ecLennert Buytenhekstatic int lpc32xx_set_irq_type(struct irq_data *d, unsigned int type) 269c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 270c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells switch (type) { 271c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells case IRQ_TYPE_EDGE_RISING: 272c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Rising edge sensitive */ 2735638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek __lpc32xx_set_irq_type(d->irq, 1, 1); 274c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells break; 275c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 276c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells case IRQ_TYPE_EDGE_FALLING: 277c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Falling edge sensitive */ 2785638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek __lpc32xx_set_irq_type(d->irq, 0, 1); 279c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells break; 280c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 281c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells case IRQ_TYPE_LEVEL_LOW: 282c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Low level sensitive */ 2835638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek __lpc32xx_set_irq_type(d->irq, 0, 0); 284c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells break; 285c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 286c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells case IRQ_TYPE_LEVEL_HIGH: 287c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* High level sensitive */ 2885638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek __lpc32xx_set_irq_type(d->irq, 1, 0); 289c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells break; 290c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 291c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Other modes are not supported */ 292c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells default: 293c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells return -EINVAL; 294c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } 295c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 296c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Ok to use the level handler for all types */ 2976845664a6a7d443f03883db59d10749d38d98b8eThomas Gleixner irq_set_handler(d->irq, handle_level_irq); 298c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 299c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells return 0; 300c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 301c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 3025638538117ea81063b0611a7374c0d65133860ecLennert Buytenhekstatic int lpc32xx_irq_wake(struct irq_data *d, unsigned int state) 303c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 304c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned long eventreg; 305c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 3065638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek if (lpc32xx_events[d->irq].mask != 0) { 3075638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek eventreg = __raw_readl(lpc32xx_events[d->irq]. 308c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells event_group->enab_reg); 309c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 310c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells if (state) 3115638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek eventreg |= lpc32xx_events[d->irq].mask; 312c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells else 3135638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek eventreg &= ~lpc32xx_events[d->irq].mask; 314c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 315c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(eventreg, 3165638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek lpc32xx_events[d->irq].event_group->enab_reg); 317c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 318c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells return 0; 319c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } 320c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 321c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Clear event */ 3225638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek __raw_writel(lpc32xx_events[d->irq].mask, 3235638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek lpc32xx_events[d->irq].event_group->rawstat_reg); 324c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 325c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells return -ENODEV; 326c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 327c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 328c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic void __init lpc32xx_set_default_mappings(unsigned int apr, 329c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned int atr, unsigned int offset) 330c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 331c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned int i; 332c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 333c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Set activation levels for each interrupt */ 334c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells i = 0; 335c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells while (i < 32) { 336c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __lpc32xx_set_irq_type(offset + i, ((apr >> i) & 0x1), 337c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells ((atr >> i) & 0x1)); 338c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells i++; 339c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } 340c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 341c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 342c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic struct irq_chip lpc32xx_irq_chip = { 3435638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek .irq_ack = lpc32xx_ack_irq, 3445638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek .irq_mask = lpc32xx_mask_irq, 3455638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek .irq_unmask = lpc32xx_unmask_irq, 3465638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek .irq_set_type = lpc32xx_set_irq_type, 3475638538117ea81063b0611a7374c0d65133860ecLennert Buytenhek .irq_set_wake = lpc32xx_irq_wake 348c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells}; 349c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 350c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic void lpc32xx_sic1_handler(unsigned int irq, struct irq_desc *desc) 351c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 352c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned long ints = __raw_readl(LPC32XX_INTC_STAT(LPC32XX_SIC1_BASE)); 353c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 354c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells while (ints != 0) { 355c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells int irqno = fls(ints) - 1; 356c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 357c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells ints &= ~(1 << irqno); 358c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 359c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells generic_handle_irq(LPC32XX_SIC1_IRQ(irqno)); 360c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } 361c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 362c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 363c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsstatic void lpc32xx_sic2_handler(unsigned int irq, struct irq_desc *desc) 364c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 365c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned long ints = __raw_readl(LPC32XX_INTC_STAT(LPC32XX_SIC2_BASE)); 366c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 367c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells while (ints != 0) { 368c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells int irqno = fls(ints) - 1; 369c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 370c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells ints &= ~(1 << irqno); 371c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 372c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells generic_handle_irq(LPC32XX_SIC2_IRQ(irqno)); 373c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } 374c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 375c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 376c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wellsvoid __init lpc32xx_init_irq(void) 377c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells{ 378c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells unsigned int i; 379c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 380c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Setup MIC */ 381c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE)); 382c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_MIC_BASE)); 383c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_MIC_BASE)); 384c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 385c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Setup SIC1 */ 386c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE)); 387c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE)); 388c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE)); 389c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 390c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Setup SIC2 */ 391c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE)); 392c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE)); 393c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE)); 394c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 395c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Configure supported IRQ's */ 396c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells for (i = 0; i < NR_IRQS; i++) { 397f38c02f3b338651e145aac2889ba976baf6b28b3Thomas Gleixner irq_set_chip_and_handler(i, &lpc32xx_irq_chip, 398f38c02f3b338651e145aac2889ba976baf6b28b3Thomas Gleixner handle_level_irq); 399c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells set_irq_flags(i, IRQF_VALID); 400c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells } 401c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 402c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Set default mappings */ 403c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells lpc32xx_set_default_mappings(MIC_APR_DEFAULT, MIC_ATR_DEFAULT, 0); 404c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells lpc32xx_set_default_mappings(SIC1_APR_DEFAULT, SIC1_ATR_DEFAULT, 32); 405c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells lpc32xx_set_default_mappings(SIC2_APR_DEFAULT, SIC2_ATR_DEFAULT, 64); 406c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 407c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* mask all interrupts except SUBIRQ */ 408c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE)); 409c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE)); 410c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE)); 411c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 412c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* MIC SUBIRQx interrupts will route handling to the chain handlers */ 4136845664a6a7d443f03883db59d10749d38d98b8eThomas Gleixner irq_set_chained_handler(IRQ_LPC32XX_SUB1IRQ, lpc32xx_sic1_handler); 4146845664a6a7d443f03883db59d10749d38d98b8eThomas Gleixner irq_set_chained_handler(IRQ_LPC32XX_SUB2IRQ, lpc32xx_sic2_handler); 415c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 416c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Initially disable all wake events */ 417c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_CLKPWR_P01_ER); 418c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_CLKPWR_INT_ER); 419c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_CLKPWR_PIN_ER); 420c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 421c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* 422c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * Default wake activation polarities, all pin sources are low edge 423c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells * triggered 424c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells */ 425c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(LPC32XX_CLKPWR_INTSRC_TS_P_BIT | 426c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT | 427c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells LPC32XX_CLKPWR_INTSRC_RTC_BIT, 428c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells LPC32XX_CLKPWR_INT_AP); 429c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(0, LPC32XX_CLKPWR_PIN_AP); 430c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells 431c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells /* Clear latched wake event states */ 432c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(__raw_readl(LPC32XX_CLKPWR_PIN_RS), 433c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells LPC32XX_CLKPWR_PIN_RS); 434c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells __raw_writel(__raw_readl(LPC32XX_CLKPWR_INT_RS), 435c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells LPC32XX_CLKPWR_INT_RS); 436c4a0208fff6cba5c7e22166ad7209322eab16bb3Kevin Wells} 437