Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/powerpc/platforms/85xx/mpc85xx_8259.c
26481 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* MPC85xx 8259 functions for DS Board Setup
4
*
5
* Author Xianghua Xiao ([email protected])
6
* Roy Zang <[email protected]>
7
* - Add PCI/PCI Express support
8
* Copyright 2007 Freescale Semiconductor Inc.
9
*/
10
11
#include <linux/stddef.h>
12
#include <linux/kernel.h>
13
#include <linux/interrupt.h>
14
#include <linux/of_irq.h>
15
#include <linux/of_platform.h>
16
17
#include <asm/mpic.h>
18
#include <asm/i8259.h>
19
20
#include "mpc85xx.h"
21
22
static void mpc85xx_8259_cascade(struct irq_desc *desc)
23
{
24
struct irq_chip *chip = irq_desc_get_chip(desc);
25
unsigned int cascade_irq = i8259_irq();
26
27
if (cascade_irq)
28
generic_handle_irq(cascade_irq);
29
30
chip->irq_eoi(&desc->irq_data);
31
}
32
33
void __init mpc85xx_8259_init(void)
34
{
35
struct device_node *np;
36
struct device_node *cascade_node = NULL;
37
int cascade_irq;
38
39
/* Initialize the i8259 controller */
40
for_each_node_by_type(np, "interrupt-controller") {
41
if (of_device_is_compatible(np, "chrp,iic")) {
42
cascade_node = np;
43
break;
44
}
45
}
46
47
if (cascade_node == NULL) {
48
pr_debug("i8259: Could not find i8259 PIC\n");
49
return;
50
}
51
52
cascade_irq = irq_of_parse_and_map(cascade_node, 0);
53
if (!cascade_irq) {
54
pr_err("i8259: Failed to map cascade interrupt\n");
55
return;
56
}
57
58
pr_debug("i8259: cascade mapped to irq %d\n", cascade_irq);
59
60
i8259_init(cascade_node, 0);
61
of_node_put(cascade_node);
62
63
irq_set_chained_handler(cascade_irq, mpc85xx_8259_cascade);
64
}
65
66