Blame view
arch/arm/mach-s3c2440/irq.c
2.93 KB
a21765a70 [ARM] 4157/2: S3C... |
1 |
/* linux/arch/arm/mach-s3c2440/irq.c |
7fcc113c3 [PATCH] ARM: 2829... |
2 |
* |
e02f86645 ARM: S3C: Update ... |
3 |
* Copyright (c) 2003-2004 Simtec Electronics |
7fcc113c3 [PATCH] ARM: 2829... |
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
* Ben Dooks <ben@simtec.co.uk> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * |
7fcc113c3 [PATCH] ARM: 2829... |
20 21 22 23 24 25 |
*/ #include <linux/init.h> #include <linux/module.h> #include <linux/interrupt.h> #include <linux/ioport.h> |
4a858cfc9 arm: convert sysd... |
26 |
#include <linux/device.h> |
fced80c73 [ARM] Convert asm... |
27 |
#include <linux/io.h> |
7fcc113c3 [PATCH] ARM: 2829... |
28 |
|
a09e64fbc [ARM] Move includ... |
29 |
#include <mach/hardware.h> |
7fcc113c3 [PATCH] ARM: 2829... |
30 |
#include <asm/irq.h> |
7fcc113c3 [PATCH] ARM: 2829... |
31 32 |
#include <asm/mach/irq.h> |
a09e64fbc [ARM] Move includ... |
33 34 |
#include <mach/regs-irq.h> #include <mach/regs-gpio.h> |
7fcc113c3 [PATCH] ARM: 2829... |
35 |
|
a2b7ba9ca [ARM] S3C24XX: Mo... |
36 37 38 |
#include <plat/cpu.h> #include <plat/pm.h> #include <plat/irq.h> |
7fcc113c3 [PATCH] ARM: 2829... |
39 40 41 42 |
/* WDT/AC97 */ static void s3c_irq_demux_wdtac97(unsigned int irq, |
10dd5ce28 [ARM] Remove comp... |
43 |
struct irq_desc *desc) |
7fcc113c3 [PATCH] ARM: 2829... |
44 45 |
{ unsigned int subsrc, submsk; |
7fcc113c3 [PATCH] ARM: 2829... |
46 47 48 49 50 51 52 53 54 55 56 57 58 |
/* read the current pending interrupts, and the mask * for what it is available */ subsrc = __raw_readl(S3C2410_SUBSRCPND); submsk = __raw_readl(S3C2410_INTSUBMSK); subsrc &= ~submsk; subsrc >>= 13; subsrc &= 3; if (subsrc != 0) { if (subsrc & 1) { |
d8aa0251f [ARM] 5298/1: Dro... |
59 |
generic_handle_irq(IRQ_S3C2440_WDT); |
7fcc113c3 [PATCH] ARM: 2829... |
60 61 |
} if (subsrc & 2) { |
d8aa0251f [ARM] 5298/1: Dro... |
62 |
generic_handle_irq(IRQ_S3C2440_AC97); |
7fcc113c3 [PATCH] ARM: 2829... |
63 64 65 66 67 68 69 70 |
} } } #define INTMSK_WDT (1UL << (IRQ_WDT - IRQ_EINT0)) static void |
57436c2db ARM: S3C24XX: irq... |
71 |
s3c_irq_wdtac97_mask(struct irq_data *data) |
7fcc113c3 [PATCH] ARM: 2829... |
72 |
{ |
57436c2db ARM: S3C24XX: irq... |
73 |
s3c_irqsub_mask(data->irq, INTMSK_WDT, 3 << 13); |
7fcc113c3 [PATCH] ARM: 2829... |
74 75 76 |
} static void |
57436c2db ARM: S3C24XX: irq... |
77 |
s3c_irq_wdtac97_unmask(struct irq_data *data) |
7fcc113c3 [PATCH] ARM: 2829... |
78 |
{ |
57436c2db ARM: S3C24XX: irq... |
79 |
s3c_irqsub_unmask(data->irq, INTMSK_WDT); |
7fcc113c3 [PATCH] ARM: 2829... |
80 81 82 |
} static void |
57436c2db ARM: S3C24XX: irq... |
83 |
s3c_irq_wdtac97_ack(struct irq_data *data) |
7fcc113c3 [PATCH] ARM: 2829... |
84 |
{ |
57436c2db ARM: S3C24XX: irq... |
85 |
s3c_irqsub_maskack(data->irq, INTMSK_WDT, 3 << 13); |
7fcc113c3 [PATCH] ARM: 2829... |
86 |
} |
10dd5ce28 [ARM] Remove comp... |
87 |
static struct irq_chip s3c_irq_wdtac97 = { |
57436c2db ARM: S3C24XX: irq... |
88 89 90 |
.irq_mask = s3c_irq_wdtac97_mask, .irq_unmask = s3c_irq_wdtac97_unmask, .irq_ack = s3c_irq_wdtac97_ack, |
7fcc113c3 [PATCH] ARM: 2829... |
91 |
}; |
4a858cfc9 arm: convert sysd... |
92 |
static int s3c2440_irq_add(struct device *dev) |
7fcc113c3 [PATCH] ARM: 2829... |
93 94 95 96 97 |
{ unsigned int irqno; printk("S3C2440: IRQ Support "); |
7fcc113c3 [PATCH] ARM: 2829... |
98 |
/* add new chained handler for wdt, ac7 */ |
f38c02f3b arm: Fold irq_set... |
99 100 |
irq_set_chip_and_handler(IRQ_WDT, &s3c_irq_level_chip, handle_level_irq); |
6845664a6 arm: Cleanup the ... |
101 |
irq_set_chained_handler(IRQ_WDT, s3c_irq_demux_wdtac97); |
7fcc113c3 [PATCH] ARM: 2829... |
102 103 |
for (irqno = IRQ_S3C2440_WDT; irqno <= IRQ_S3C2440_AC97; irqno++) { |
f38c02f3b arm: Fold irq_set... |
104 105 |
irq_set_chip_and_handler(irqno, &s3c_irq_wdtac97, handle_level_irq); |
7fcc113c3 [PATCH] ARM: 2829... |
106 107 |
set_irq_flags(irqno, IRQF_VALID); } |
7fcc113c3 [PATCH] ARM: 2829... |
108 109 |
return 0; } |
4a858cfc9 arm: convert sysd... |
110 111 112 113 |
static struct subsys_interface s3c2440_irq_interface = { .name = "s3c2440_irq", .subsys = &s3c2440_subsys, .add_dev = s3c2440_irq_add, |
7fcc113c3 [PATCH] ARM: 2829... |
114 |
}; |
96ce2385d [ARM] 3559/1: S3C... |
115 |
static int s3c2440_irq_init(void) |
7fcc113c3 [PATCH] ARM: 2829... |
116 |
{ |
4a858cfc9 arm: convert sysd... |
117 |
return subsys_interface_register(&s3c2440_irq_interface); |
7fcc113c3 [PATCH] ARM: 2829... |
118 |
} |
96ce2385d [ARM] 3559/1: S3C... |
119 |
arch_initcall(s3c2440_irq_init); |
7fcc113c3 [PATCH] ARM: 2829... |
120 |