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