On Mar 24, 2011, at 4:43 PM, Scott Wood wrote: > Signed-off-by: Scott Wood <scottw...@freescale.com> > --- > arch/powerpc/include/asm/mpic.h | 2 ++ > arch/powerpc/sysdev/mpic.c | 37 ++++++++++++++++++++++++++++++++++++- > 2 files changed, 38 insertions(+), 1 deletions(-)
Ben, Did you plan on review and pull this in or expect me to? - k > > diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h > index 7005ee0..25a0cb3 100644 > --- a/arch/powerpc/include/asm/mpic.h > +++ b/arch/powerpc/include/asm/mpic.h > @@ -371,6 +371,8 @@ struct mpic > * NOTE: This flag trumps MPIC_WANTS_RESET. > */ > #define MPIC_NO_RESET 0x00004000 > +/* Freescale MPIC (compatible includes "fsl,mpic") */ > +#define MPIC_FSL 0x00008000 > > /* MPIC HW modification ID */ > #define MPIC_REGSET_MASK 0xf0000000 > diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c > index 0f7c671..69f96ec 100644 > --- a/arch/powerpc/sysdev/mpic.c > +++ b/arch/powerpc/sysdev/mpic.c > @@ -6,6 +6,7 @@ > * with various broken implementations of this HW. > * > * Copyright (C) 2004 Benjamin Herrenschmidt, IBM Corp. > + * Copyright 2010-2011 Freescale Semiconductor, Inc. > * > * This file is subject to the terms and conditions of the GNU General Public > * License. See the file COPYING in the main directory of this archive > @@ -1030,6 +1031,7 @@ static int mpic_host_xlate(struct irq_host *h, struct > device_node *ct, > irq_hw_number_t *out_hwirq, unsigned int *out_flags) > > { > + struct mpic *mpic = h->host_data; > static unsigned char map_mpic_senses[4] = { > IRQ_TYPE_EDGE_RISING, > IRQ_TYPE_LEVEL_LOW, > @@ -1038,7 +1040,38 @@ static int mpic_host_xlate(struct irq_host *h, struct > device_node *ct, > }; > > *out_hwirq = intspec[0]; > - if (intsize > 1) { > + if (intsize >= 4 && (mpic->flags & MPIC_FSL)) { > + /* > + * Freescale MPIC with extended intspec: > + * First two cells are as usual. Third specifies > + * an "interrupt type". Fourth is type-specific data. > + * > + * See Documentation/devicetree/bindings/powerpc/fsl/mpic.txt > + */ > + switch (intspec[2]) { > + case 0: > + case 1: /* no EISR/EIMR support for now, treat as shared IRQ */ > + break; > + case 2: > + if (intspec[0] >= ARRAY_SIZE(mpic->ipi_vecs)) > + return -EINVAL; > + > + *out_hwirq = mpic->ipi_vecs[intspec[0]]; > + break; > + case 3: > + if (intspec[0] >= ARRAY_SIZE(mpic->timer_vecs)) > + return -EINVAL; > + > + *out_hwirq = mpic->timer_vecs[intspec[0]]; > + break; > + default: > + pr_debug("%s: unknown irq type %u\n", > + __func__, intspec[2]); > + return -EINVAL; > + } > + > + *out_flags = map_mpic_senses[intspec[1] & 3]; > + } else if (intsize > 1) { > u32 mask = 0x3; > > /* Apple invented a new race of encoding on machines with > @@ -1137,6 +1170,8 @@ struct mpic * __init mpic_alloc(struct device_node > *node, > /* Check for "big-endian" in device-tree */ > if (node && of_get_property(node, "big-endian", NULL) != NULL) > mpic->flags |= MPIC_BIG_ENDIAN; > + if (node && of_device_is_compatible(node, "fsl,mpic")) > + mpic->flags |= MPIC_FSL; > > /* Look for protected sources */ > if (node) { > -- > 1.7.1 > _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev