[PATCH v3 2/4] arm: bcm2835: convert to the irqchip infrastructure

Josh Cartwright josh.cartwright at ni.com
Tue Nov 6 12:54:23 EST 2012


On Tue, Nov 06, 2012 at 10:56:39AM -0600, Josh Cartwright wrote:
> On Sun, Oct 28, 2012 at 11:19:06PM +0100, Thomas Petazzoni wrote:
> > Register the irq controller driver in the main
> > drivers/irqchip/irqchip.c file, and make sure that the initialization
> > function of the driver sets handle_arch_irq() appropriately. This
> > requires a bit of movement in the driver since the
> > bcm2835_handle_irq() must move before the armctrl_of_init() function
> > to avoid a forward declaration.
> > 
> > On the arch/arm side, use irqchip_init() as the ->init_irq() callback,
> > and remove the definition of ->handle_irq() since this is now done by
> > the irq controller driver.
> > 
> > Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> > Acked-by: Stephen Warren <swarren at wwwdotorg.org>
> > Reviewed-by: Rob Herring <rob.herring at calxeda.com>
> > ---
> [..]
> > diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c
> > index dc670cc..62d1dad 100644
> > --- a/drivers/irqchip/irq-bcm2835.c
> > +++ b/drivers/irqchip/irq-bcm2835.c
> [..]
> > @@ -199,8 +197,8 @@ static void armctrl_handle_shortcut(int bank, struct pt_regs *regs,
> >  	handle_IRQ(irq_linear_revmap(intc.domain, irq), regs);
> >  }
> >  
> > -asmlinkage void __exception_irq_entry bcm2835_handle_irq(
> > -	struct pt_regs *regs)
> > +static asmlinkage void __exception_irq_entry
> > +bcm2835_handle_irq(struct pt_regs *regs)
> >  {
> >  	u32 stat, irq;
> >  
> > diff --git a/drivers/irqchip/irqchip.c b/drivers/irqchip/irqchip.c
> > index 410f99f..e2496e4 100644
> > --- a/drivers/irqchip/irqchip.c
> > +++ b/drivers/irqchip/irqchip.c
> > @@ -14,6 +14,12 @@
> >  #include "irqchip.h"
> >  
> >  static const struct of_device_id irqchip_of_match[] __initconst = {
> > +#ifdef CONFIG_ARCH_BCM2835
> > +	{
> > +		.compatible = "brcm,bcm2835-armctrl-ic",
> > +		.data = bcm2835_irqchip_init,
> > +	},
> > +#endif
> >  	{},
> >  };
> >  
> > diff --git a/drivers/irqchip/irqchip.h b/drivers/irqchip/irqchip.h
> > index 1e7a5c2..1075537 100644
> > --- a/drivers/irqchip/irqchip.h
> > +++ b/drivers/irqchip/irqchip.h
> > @@ -11,4 +11,6 @@
> >  #ifndef _IRQCHIP_H
> >  #define _IRQCHIP_H
> >  
> > +int bcm2835_irqchip_init(struct device_node *node, struct device_node *parent);
> > +
> >  #endif
> 
> Could it make sense here to kill the irqchip.h private export, and
> instead rely on the linker to stitch together the builtin irqchip's
> of_device_id tables?
> 
> Something like:
> 
> drivers/irqchip/irq-bcm2835.c:
> 
> 	static bcm2835_irqchip_init(struct device_node *node, struct device_node *parent)
> 	{
> 		/*...*/
> 	}
> 
> 	static const struct of_device_id bcm2835_match[] __initconst = {
> 		{ .compatible = "brcm,bcm2835-armctrl-ic", .data = bcm2835_irqchip_init, },
> 		{},
> 	};
> 	DECLARE_IRQCHIP(bcm2835, bcm2835_match);
> 
> where include/linux/irqchip.h:
> 
> 	#define DECLARE_IRQCHIP(name,ids) \
> 		static of_device_id * __irqchip_##name##_matches __used \
> 		__attribute__((__section__(".init.irqchip"))) = ids
> 
> drivers/irqchip/irqchip.c:
> 
> 	void irqchip_init(void)
> 	{
> 		extern of_device_id *__irqchip_matches_start[], *__irqchip_matches_end[];
> 		struct of_device_id **matchesp;
> 
> 		matchesp = __irqchip_matches_start;
> 		while (matchesp < __irqchip_matches_end)
> 			of_irq_init(*matchesp);

Hmm...more thinking leads me to believe that calling of_irq_init()
multiple times with an incomplete set of irqchip descriptions isn't
going to work.

Nevertheless, the idea could be extended such that a single of_device_id
table is generated (instead of an array of pointers to incomplete an
incomplete table).

  Josh
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20121106/752a3d30/attachment.sig>


More information about the linux-arm-kernel mailing list