Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/sh/boards/mach-se/7343/irq.c
15162 views
1
/*
2
* linux/arch/sh/boards/se/7343/irq.c
3
*
4
* Copyright (C) 2008 Yoshihiro Shimoda
5
*
6
* Based on linux/arch/sh/boards/se/7722/irq.c
7
* Copyright (C) 2007 Nobuhiro Iwamatsu
8
*
9
* This file is subject to the terms and conditions of the GNU General Public
10
* License. See the file "COPYING" in the main directory of this archive
11
* for more details.
12
*/
13
#include <linux/init.h>
14
#include <linux/irq.h>
15
#include <linux/interrupt.h>
16
#include <linux/io.h>
17
#include <mach-se/mach/se7343.h>
18
19
unsigned int se7343_fpga_irq[SE7343_FPGA_IRQ_NR] = { 0, };
20
21
static void disable_se7343_irq(struct irq_data *data)
22
{
23
unsigned int bit = (unsigned int)irq_data_get_irq_chip_data(data);
24
__raw_writew(__raw_readw(PA_CPLD_IMSK) | 1 << bit, PA_CPLD_IMSK);
25
}
26
27
static void enable_se7343_irq(struct irq_data *data)
28
{
29
unsigned int bit = (unsigned int)irq_data_get_irq_chip_data(data);
30
__raw_writew(__raw_readw(PA_CPLD_IMSK) & ~(1 << bit), PA_CPLD_IMSK);
31
}
32
33
static struct irq_chip se7343_irq_chip __read_mostly = {
34
.name = "SE7343-FPGA",
35
.irq_mask = disable_se7343_irq,
36
.irq_unmask = enable_se7343_irq,
37
};
38
39
static void se7343_irq_demux(unsigned int irq, struct irq_desc *desc)
40
{
41
unsigned short intv = __raw_readw(PA_CPLD_ST);
42
unsigned int ext_irq = 0;
43
44
intv &= (1 << SE7343_FPGA_IRQ_NR) - 1;
45
46
for (; intv; intv >>= 1, ext_irq++) {
47
if (!(intv & 1))
48
continue;
49
50
generic_handle_irq(se7343_fpga_irq[ext_irq]);
51
}
52
}
53
54
/*
55
* Initialize IRQ setting
56
*/
57
void __init init_7343se_IRQ(void)
58
{
59
int i, irq;
60
61
__raw_writew(0, PA_CPLD_IMSK); /* disable all irqs */
62
__raw_writew(0x2000, 0xb03fffec); /* mrshpc irq enable */
63
64
for (i = 0; i < SE7343_FPGA_IRQ_NR; i++) {
65
irq = create_irq();
66
if (irq < 0)
67
return;
68
se7343_fpga_irq[i] = irq;
69
70
irq_set_chip_and_handler_name(se7343_fpga_irq[i],
71
&se7343_irq_chip,
72
handle_level_irq,
73
"level");
74
75
irq_set_chip_data(se7343_fpga_irq[i], (void *)i);
76
}
77
78
irq_set_chained_handler(IRQ0_IRQ, se7343_irq_demux);
79
irq_set_irq_type(IRQ0_IRQ, IRQ_TYPE_LEVEL_LOW);
80
irq_set_chained_handler(IRQ1_IRQ, se7343_irq_demux);
81
irq_set_irq_type(IRQ1_IRQ, IRQ_TYPE_LEVEL_LOW);
82
irq_set_chained_handler(IRQ4_IRQ, se7343_irq_demux);
83
irq_set_irq_type(IRQ4_IRQ, IRQ_TYPE_LEVEL_LOW);
84
irq_set_chained_handler(IRQ5_IRQ, se7343_irq_demux);
85
irq_set_irq_type(IRQ5_IRQ, IRQ_TYPE_LEVEL_LOW);
86
}
87
88