Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mips/dec/ioasic-irq.c
10817 views
1
/*
2
* DEC I/O ASIC interrupts.
3
*
4
* Copyright (c) 2002, 2003 Maciej W. Rozycki
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version
9
* 2 of the License, or (at your option) any later version.
10
*/
11
12
#include <linux/init.h>
13
#include <linux/irq.h>
14
#include <linux/types.h>
15
16
#include <asm/dec/ioasic.h>
17
#include <asm/dec/ioasic_addrs.h>
18
#include <asm/dec/ioasic_ints.h>
19
20
static int ioasic_irq_base;
21
22
static void unmask_ioasic_irq(struct irq_data *d)
23
{
24
u32 simr;
25
26
simr = ioasic_read(IO_REG_SIMR);
27
simr |= (1 << (d->irq - ioasic_irq_base));
28
ioasic_write(IO_REG_SIMR, simr);
29
}
30
31
static void mask_ioasic_irq(struct irq_data *d)
32
{
33
u32 simr;
34
35
simr = ioasic_read(IO_REG_SIMR);
36
simr &= ~(1 << (d->irq - ioasic_irq_base));
37
ioasic_write(IO_REG_SIMR, simr);
38
}
39
40
static void ack_ioasic_irq(struct irq_data *d)
41
{
42
mask_ioasic_irq(d);
43
fast_iob();
44
}
45
46
static struct irq_chip ioasic_irq_type = {
47
.name = "IO-ASIC",
48
.irq_ack = ack_ioasic_irq,
49
.irq_mask = mask_ioasic_irq,
50
.irq_mask_ack = ack_ioasic_irq,
51
.irq_unmask = unmask_ioasic_irq,
52
};
53
54
static struct irq_chip ioasic_dma_irq_type = {
55
.name = "IO-ASIC-DMA",
56
.irq_ack = ack_ioasic_irq,
57
.irq_mask = mask_ioasic_irq,
58
.irq_mask_ack = ack_ioasic_irq,
59
.irq_unmask = unmask_ioasic_irq,
60
};
61
62
void __init init_ioasic_irqs(int base)
63
{
64
int i;
65
66
/* Mask interrupts. */
67
ioasic_write(IO_REG_SIMR, 0);
68
fast_iob();
69
70
for (i = base; i < base + IO_INR_DMA; i++)
71
irq_set_chip_and_handler(i, &ioasic_irq_type,
72
handle_level_irq);
73
for (; i < base + IO_IRQ_LINES; i++)
74
irq_set_chip(i, &ioasic_dma_irq_type);
75
76
ioasic_irq_base = base;
77
}
78
79