|
@@ -1173,10 +1173,33 @@ static struct irq_domain_ops mpic_host_ops = {
|
|
|
.xlate = mpic_host_xlate,
|
|
|
};
|
|
|
|
|
|
+static u32 fsl_mpic_get_version(struct mpic *mpic)
|
|
|
+{
|
|
|
+ u32 brr1;
|
|
|
+
|
|
|
+ if (!(mpic->flags & MPIC_FSL))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ brr1 = _mpic_read(mpic->reg_type, &mpic->thiscpuregs,
|
|
|
+ MPIC_FSL_BRR1);
|
|
|
+
|
|
|
+ return brr1 & MPIC_FSL_BRR1_VER;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Exported functions
|
|
|
*/
|
|
|
|
|
|
+u32 fsl_mpic_primary_get_version(void)
|
|
|
+{
|
|
|
+ struct mpic *mpic = mpic_primary;
|
|
|
+
|
|
|
+ if (mpic)
|
|
|
+ return fsl_mpic_get_version(mpic);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
struct mpic * __init mpic_alloc(struct device_node *node,
|
|
|
phys_addr_t phys_addr,
|
|
|
unsigned int flags,
|
|
@@ -1323,7 +1346,6 @@ struct mpic * __init mpic_alloc(struct device_node *node,
|
|
|
mpic_map(mpic, mpic->paddr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), 0x1000);
|
|
|
|
|
|
if (mpic->flags & MPIC_FSL) {
|
|
|
- u32 brr1;
|
|
|
int ret;
|
|
|
|
|
|
/*
|
|
@@ -1334,9 +1356,7 @@ struct mpic * __init mpic_alloc(struct device_node *node,
|
|
|
mpic_map(mpic, mpic->paddr, &mpic->thiscpuregs,
|
|
|
MPIC_CPU_THISBASE, 0x1000);
|
|
|
|
|
|
- brr1 = _mpic_read(mpic->reg_type, &mpic->thiscpuregs,
|
|
|
- MPIC_FSL_BRR1);
|
|
|
- fsl_version = brr1 & MPIC_FSL_BRR1_VER;
|
|
|
+ fsl_version = fsl_mpic_get_version(mpic);
|
|
|
|
|
|
/* Error interrupt mask register (EIMR) is required for
|
|
|
* handling individual device error interrupts. EIMR
|
|
@@ -1526,9 +1546,7 @@ void __init mpic_init(struct mpic *mpic)
|
|
|
mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0xf);
|
|
|
|
|
|
if (mpic->flags & MPIC_FSL) {
|
|
|
- u32 brr1 = _mpic_read(mpic->reg_type, &mpic->thiscpuregs,
|
|
|
- MPIC_FSL_BRR1);
|
|
|
- u32 version = brr1 & MPIC_FSL_BRR1_VER;
|
|
|
+ u32 version = fsl_mpic_get_version(mpic);
|
|
|
|
|
|
/*
|
|
|
* Timer group B is present at the latest in MPIC 3.1 (e.g.
|