2019-06-01 10:08:34 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2011-11-17 21:56:16 +04:00
/*
* Routines common to most mpc85xx - based boards .
*/
2013-09-26 07:40:04 -05:00
# include <linux/of_irq.h>
2011-11-17 21:56:16 +04:00
# include <linux/of_platform.h>
2015-11-20 17:13:59 +08:00
# include <asm/fsl_pm.h>
2015-11-30 10:48:57 +08:00
# include <soc/fsl/qe/qe.h>
2011-11-17 21:56:16 +04:00
# include <sysdev/cpm2_pic.h>
# include "mpc85xx.h"
2015-11-20 17:13:59 +08:00
const struct fsl_pm_ops * qoriq_pm_ops ;
2014-09-10 21:56:38 +02:00
static const struct of_device_id mpc85xx_common_ids [ ] __initconst = {
2011-11-17 21:56:17 +04:00
{ . type = " soc " , } ,
{ . compatible = " soc " , } ,
{ . compatible = " simple-bus " , } ,
{ . name = " cpm " , } ,
{ . name = " localbus " , } ,
{ . compatible = " gianfar " , } ,
{ . compatible = " fsl,qe " , } ,
{ . compatible = " fsl,cpm2 " , } ,
2011-11-24 01:00:10 -06:00
{ . compatible = " fsl,srio " , } ,
2011-11-30 10:19:17 -06:00
/* So that the DMA channel nodes can be probed individually: */
{ . compatible = " fsl,eloplus-dma " , } ,
/* For the PMC driver */
{ . compatible = " fsl,mpc8548-guts " , } ,
/* Probably unnecessary? */
{ . compatible = " gpio-leds " , } ,
2012-08-28 15:44:08 +08:00
/* For all PCI controllers */
{ . compatible = " fsl,mpc8540-pci " , } ,
{ . compatible = " fsl,mpc8548-pcie " , } ,
{ . compatible = " fsl,p1022-pcie " , } ,
{ . compatible = " fsl,p1010-pcie " , } ,
{ . compatible = " fsl,p1023-pcie " , } ,
{ . compatible = " fsl,p4080-pcie " , } ,
{ . compatible = " fsl,qoriq-pcie-v2.4 " , } ,
{ . compatible = " fsl,qoriq-pcie-v2.3 " , } ,
{ . compatible = " fsl,qoriq-pcie-v2.2 " , } ,
2015-02-18 16:04:45 +02:00
{ . compatible = " fsl,fman " , } ,
2011-11-17 21:56:17 +04:00
{ } ,
} ;
int __init mpc85xx_common_publish_devices ( void )
{
return of_platform_bus_probe ( NULL , mpc85xx_common_ids , NULL ) ;
}
2011-11-17 21:56:16 +04:00
# ifdef CONFIG_CPM2
2015-09-14 10:42:37 +02:00
static void cpm2_cascade ( struct irq_desc * desc )
2011-11-17 21:56:16 +04:00
{
struct irq_chip * chip = irq_desc_get_chip ( desc ) ;
int cascade_irq ;
while ( ( cascade_irq = cpm2_get_irq ( ) ) > = 0 )
generic_handle_irq ( cascade_irq ) ;
chip - > irq_eoi ( & desc - > irq_data ) ;
}
void __init mpc85xx_cpm2_pic_init ( void )
{
struct device_node * np ;
int irq ;
/* Setup CPM2 PIC */
np = of_find_compatible_node ( NULL , NULL , " fsl,cpm2-pic " ) ;
if ( np = = NULL ) {
printk ( KERN_ERR " PIC init: can not find fsl,cpm2-pic node \n " ) ;
return ;
}
irq = irq_of_parse_and_map ( np , 0 ) ;
2016-09-06 21:53:24 +10:00
if ( ! irq ) {
2011-11-17 21:56:16 +04:00
of_node_put ( np ) ;
printk ( KERN_ERR " PIC init: got no IRQ for cpm cascade \n " ) ;
return ;
}
cpm2_pic_init ( np ) ;
of_node_put ( np ) ;
irq_set_chained_handler ( irq , cpm2_cascade ) ;
}
# endif
2013-11-06 17:08:02 +08:00
# ifdef CONFIG_QUICC_ENGINE
2014-03-06 09:38:12 +08:00
void __init mpc85xx_qe_par_io_init ( void )
{
struct device_node * np ;
2013-11-06 17:08:02 +08:00
np = of_find_node_by_name ( NULL , " par_io " ) ;
if ( np ) {
struct device_node * ucc ;
par_io_init ( np ) ;
of_node_put ( np ) ;
for_each_node_by_name ( ucc , " ucc " )
par_io_of_config ( ucc ) ;
}
}
# endif