18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Routines common to most mpc85xx-based boards. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/of_irq.h> 78c2ecf20Sopenharmony_ci#include <linux/of_platform.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <asm/fsl_pm.h> 108c2ecf20Sopenharmony_ci#include <soc/fsl/qe/qe.h> 118c2ecf20Sopenharmony_ci#include <sysdev/cpm2_pic.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "mpc85xx.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ciconst struct fsl_pm_ops *qoriq_pm_ops; 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistatic const struct of_device_id mpc85xx_common_ids[] __initconst = { 188c2ecf20Sopenharmony_ci { .type = "soc", }, 198c2ecf20Sopenharmony_ci { .compatible = "soc", }, 208c2ecf20Sopenharmony_ci { .compatible = "simple-bus", }, 218c2ecf20Sopenharmony_ci { .name = "cpm", }, 228c2ecf20Sopenharmony_ci { .name = "localbus", }, 238c2ecf20Sopenharmony_ci { .compatible = "gianfar", }, 248c2ecf20Sopenharmony_ci { .compatible = "fsl,qe", }, 258c2ecf20Sopenharmony_ci { .compatible = "fsl,cpm2", }, 268c2ecf20Sopenharmony_ci { .compatible = "fsl,srio", }, 278c2ecf20Sopenharmony_ci /* So that the DMA channel nodes can be probed individually: */ 288c2ecf20Sopenharmony_ci { .compatible = "fsl,eloplus-dma", }, 298c2ecf20Sopenharmony_ci /* For the PMC driver */ 308c2ecf20Sopenharmony_ci { .compatible = "fsl,mpc8548-guts", }, 318c2ecf20Sopenharmony_ci /* Probably unnecessary? */ 328c2ecf20Sopenharmony_ci { .compatible = "gpio-leds", }, 338c2ecf20Sopenharmony_ci /* For all PCI controllers */ 348c2ecf20Sopenharmony_ci { .compatible = "fsl,mpc8540-pci", }, 358c2ecf20Sopenharmony_ci { .compatible = "fsl,mpc8548-pcie", }, 368c2ecf20Sopenharmony_ci { .compatible = "fsl,p1022-pcie", }, 378c2ecf20Sopenharmony_ci { .compatible = "fsl,p1010-pcie", }, 388c2ecf20Sopenharmony_ci { .compatible = "fsl,p1023-pcie", }, 398c2ecf20Sopenharmony_ci { .compatible = "fsl,p4080-pcie", }, 408c2ecf20Sopenharmony_ci { .compatible = "fsl,qoriq-pcie-v2.4", }, 418c2ecf20Sopenharmony_ci { .compatible = "fsl,qoriq-pcie-v2.3", }, 428c2ecf20Sopenharmony_ci { .compatible = "fsl,qoriq-pcie-v2.2", }, 438c2ecf20Sopenharmony_ci { .compatible = "fsl,fman", }, 448c2ecf20Sopenharmony_ci {}, 458c2ecf20Sopenharmony_ci}; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ciint __init mpc85xx_common_publish_devices(void) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci return of_platform_bus_probe(NULL, mpc85xx_common_ids, NULL); 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ci#ifdef CONFIG_CPM2 528c2ecf20Sopenharmony_cistatic void cpm2_cascade(struct irq_desc *desc) 538c2ecf20Sopenharmony_ci{ 548c2ecf20Sopenharmony_ci struct irq_chip *chip = irq_desc_get_chip(desc); 558c2ecf20Sopenharmony_ci int cascade_irq; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci while ((cascade_irq = cpm2_get_irq()) >= 0) 588c2ecf20Sopenharmony_ci generic_handle_irq(cascade_irq); 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci chip->irq_eoi(&desc->irq_data); 618c2ecf20Sopenharmony_ci} 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_civoid __init mpc85xx_cpm2_pic_init(void) 658c2ecf20Sopenharmony_ci{ 668c2ecf20Sopenharmony_ci struct device_node *np; 678c2ecf20Sopenharmony_ci int irq; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci /* Setup CPM2 PIC */ 708c2ecf20Sopenharmony_ci np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic"); 718c2ecf20Sopenharmony_ci if (np == NULL) { 728c2ecf20Sopenharmony_ci printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n"); 738c2ecf20Sopenharmony_ci return; 748c2ecf20Sopenharmony_ci } 758c2ecf20Sopenharmony_ci irq = irq_of_parse_and_map(np, 0); 768c2ecf20Sopenharmony_ci if (!irq) { 778c2ecf20Sopenharmony_ci of_node_put(np); 788c2ecf20Sopenharmony_ci printk(KERN_ERR "PIC init: got no IRQ for cpm cascade\n"); 798c2ecf20Sopenharmony_ci return; 808c2ecf20Sopenharmony_ci } 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci cpm2_pic_init(np); 838c2ecf20Sopenharmony_ci of_node_put(np); 848c2ecf20Sopenharmony_ci irq_set_chained_handler(irq, cpm2_cascade); 858c2ecf20Sopenharmony_ci} 868c2ecf20Sopenharmony_ci#endif 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci#ifdef CONFIG_QUICC_ENGINE 898c2ecf20Sopenharmony_civoid __init mpc85xx_qe_par_io_init(void) 908c2ecf20Sopenharmony_ci{ 918c2ecf20Sopenharmony_ci struct device_node *np; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci np = of_find_node_by_name(NULL, "par_io"); 948c2ecf20Sopenharmony_ci if (np) { 958c2ecf20Sopenharmony_ci struct device_node *ucc; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci par_io_init(np); 988c2ecf20Sopenharmony_ci of_node_put(np); 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci for_each_node_by_name(ucc, "ucc") 1018c2ecf20Sopenharmony_ci par_io_of_config(ucc); 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci } 1048c2ecf20Sopenharmony_ci} 1058c2ecf20Sopenharmony_ci#endif 106