1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * MPC85xx 8259 functions for DS Board Setup 4 * 5 * Author Xianghua Xiao (x.xiao@freescale.com) 6 * Roy Zang <tie-fei.zang@freescale.com> 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