Messages in this thread | | | Date | Mon, 30 Mar 2015 09:46:57 +0100 | From | Lee Jones <> | Subject | Re: [PATCH 05/11] mfd: flexcard: add interrupt support |
| |
On Wed, 25 Mar 2015, Holger Dengler wrote:
> From: Benedikt Spranger <b.spranger@linutronix.de> > > The Flexcard comprise an interrupt controller for the attached > tinys, timer, a Flexray related trigger and a second one for DMA. > Both controllers share a single IRQ line. > > Add an interrupt domain for the non-DMA interrupts. > > Signed-off-by: Holger Dengler <dengler@linutronix.de> > Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de> > cc: Samuel Ortiz <sameo@linux.intel.com> > cc: Lee Jones <lee.jones@linaro.org> > --- > drivers/mfd/Kconfig | 1 + > drivers/mfd/flexcard/Makefile | 2 +- > drivers/mfd/flexcard/core.c | 14 +++- > drivers/mfd/flexcard/flexcard.h | 2 + > drivers/mfd/flexcard/irq.c | 167 ++++++++++++++++++++++++++++++++++++++++ > drivers/mfd/flexcard/irq.h | 50 ++++++++++++ > include/linux/mfd/flexcard.h | 2 + > 7 files changed, 235 insertions(+), 3 deletions(-) > create mode 100644 drivers/mfd/flexcard/irq.c > create mode 100644 drivers/mfd/flexcard/irq.h
[...]
> diff --git a/drivers/mfd/flexcard/irq.h b/drivers/mfd/flexcard/irq.h > new file mode 100644 > index 0000000..b18fb5b > --- /dev/null > +++ b/drivers/mfd/flexcard/irq.h > @@ -0,0 +1,50 @@ > +#ifndef FLEXCARD_IRQ_H > +#define FLEXCARD_IRQ_H > + > +struct flexcard_irq_tab { > + u32 enable; > + u32 reset; > + u32 status; > +}; > + > +#define to_irq_tab(e, s) { \ > + .enable = (1 << e), \ > + .status = (1 << s), \ > +} > + > +#define to_irq_tab_ack(e, r, s) { \ > + .enable = (1 << e), \ > + .reset = (1 << r), \ > + .status = (1 << s), \ > +} > + > +/* > + * Interrupt Controller Register S-Box > + * unlike other irq controllers the FlexCard bits for enable, reset and status > + * looks more like a cryptographic S-box. Make a const table to have a more > + * easier access to this bits in the irqchip callback functions. > + * The table contains the registers for PMC2-cards. > + */ > +static const struct flexcard_irq_tab flexcard_irq_tab[] = { > + to_irq_tab_ack(28, 0, 28), /* TIMER */ > + to_irq_tab_ack(29, 1, 29), /* CC1CYS */ > + to_irq_tab_ack(30, 10, 21), /* CC2CYS */ > + to_irq_tab_ack(18, 2, 30), /* CC3CYS */ > + to_irq_tab_ack(19, 6, 25), /* CC4CYS */ > + to_irq_tab_ack(26, 4, 26), /* WAKE1A */ > + to_irq_tab_ack(27, 5, 27), /* WAKE1B */ > + to_irq_tab_ack(24, 8, 23), /* WAKE2A */ > + to_irq_tab_ack(25, 9, 22), /* WAKE2B */ > + to_irq_tab_ack(22, 12, 19), /* WAKE3A */ > + to_irq_tab_ack(23, 13, 18), /* WAKE3B */ > + to_irq_tab_ack(20, 14, 17), /* WAKE4A */ > + to_irq_tab_ack(21, 15, 16), /* WAKE4B */ > + to_irq_tab(15, 31), /* CC1T0 */ > + to_irq_tab(14, 3), /* CC2T0 */ > + to_irq_tab(16, 24), /* CC3T0 */ > + to_irq_tab(17, 20), /* CC4T0 */ > +}; > + > +#define NR_FLEXCARD_IRQ ARRAY_SIZE(flexcard_irq_tab)
Is everything in this header used over multiple source files, or only irq.c? If the latter, then please move them into irq.c.
> +#endif /* FLEXCARD_IRQ_H */ > diff --git a/include/linux/mfd/flexcard.h b/include/linux/mfd/flexcard.h > index 84e155c..f5b789f 100644 > --- a/include/linux/mfd/flexcard.h > +++ b/include/linux/mfd/flexcard.h > @@ -22,12 +22,14 @@ > #define FLEXCARD_MAX_NAME 16 > > struct flexcard_device { > + raw_spinlock_t irq_lock; > struct pci_dev *pdev; > struct fc_conf_bar __iomem *conf; > struct mfd_cell *cells; > struct resource *res; > struct miscdevice dev; > struct kref ref; > + struct irq_domain *irq_domain; > int cardnr; > char name[FLEXCARD_MAX_NAME]; > };
-- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
| |