1*92189c90SPali Rohár // SPDX-License-Identifier: GPL-2.0-or-later 2*92189c90SPali Rohár /* 3*92189c90SPali Rohár * MPC85xx 8259 functions for DS Board Setup 4*92189c90SPali Rohár * 5*92189c90SPali Rohár * Author Xianghua Xiao (x.xiao@freescale.com) 6*92189c90SPali Rohár * Roy Zang <tie-fei.zang@freescale.com> 7*92189c90SPali Rohár * - Add PCI/PCI Express support 8*92189c90SPali Rohár * Copyright 2007 Freescale Semiconductor Inc. 9*92189c90SPali Rohár */ 10*92189c90SPali Rohár 11*92189c90SPali Rohár #include <linux/stddef.h> 12*92189c90SPali Rohár #include <linux/kernel.h> 13*92189c90SPali Rohár #include <linux/interrupt.h> 14*92189c90SPali Rohár #include <linux/of_irq.h> 15*92189c90SPali Rohár #include <linux/of_platform.h> 16*92189c90SPali Rohár 17*92189c90SPali Rohár #include <asm/mpic.h> 18*92189c90SPali Rohár #include <asm/i8259.h> 19*92189c90SPali Rohár 20*92189c90SPali Rohár #include "mpc85xx.h" 21*92189c90SPali Rohár mpc85xx_8259_cascade(struct irq_desc * desc)22*92189c90SPali Rohárstatic void mpc85xx_8259_cascade(struct irq_desc *desc) 23*92189c90SPali Rohár { 24*92189c90SPali Rohár struct irq_chip *chip = irq_desc_get_chip(desc); 25*92189c90SPali Rohár unsigned int cascade_irq = i8259_irq(); 26*92189c90SPali Rohár 27*92189c90SPali Rohár if (cascade_irq) 28*92189c90SPali Rohár generic_handle_irq(cascade_irq); 29*92189c90SPali Rohár 30*92189c90SPali Rohár chip->irq_eoi(&desc->irq_data); 31*92189c90SPali Rohár } 32*92189c90SPali Rohár mpc85xx_8259_init(void)33*92189c90SPali Rohárvoid __init mpc85xx_8259_init(void) 34*92189c90SPali Rohár { 35*92189c90SPali Rohár struct device_node *np; 36*92189c90SPali Rohár struct device_node *cascade_node = NULL; 37*92189c90SPali Rohár int cascade_irq; 38*92189c90SPali Rohár 39*92189c90SPali Rohár /* Initialize the i8259 controller */ 40*92189c90SPali Rohár for_each_node_by_type(np, "interrupt-controller") { 41*92189c90SPali Rohár if (of_device_is_compatible(np, "chrp,iic")) { 42*92189c90SPali Rohár cascade_node = np; 43*92189c90SPali Rohár break; 44*92189c90SPali Rohár } 45*92189c90SPali Rohár } 46*92189c90SPali Rohár 47*92189c90SPali Rohár if (cascade_node == NULL) { 48*92189c90SPali Rohár pr_debug("i8259: Could not find i8259 PIC\n"); 49*92189c90SPali Rohár return; 50*92189c90SPali Rohár } 51*92189c90SPali Rohár 52*92189c90SPali Rohár cascade_irq = irq_of_parse_and_map(cascade_node, 0); 53*92189c90SPali Rohár if (!cascade_irq) { 54*92189c90SPali Rohár pr_err("i8259: Failed to map cascade interrupt\n"); 55*92189c90SPali Rohár return; 56*92189c90SPali Rohár } 57*92189c90SPali Rohár 58*92189c90SPali Rohár pr_debug("i8259: cascade mapped to irq %d\n", cascade_irq); 59*92189c90SPali Rohár 60*92189c90SPali Rohár i8259_init(cascade_node, 0); 61*92189c90SPali Rohár of_node_put(cascade_node); 62*92189c90SPali Rohár 63*92189c90SPali Rohár irq_set_chained_handler(cascade_irq, mpc85xx_8259_cascade); 64*92189c90SPali Rohár } 65