mfd wm8350: allocate irq descs dynamically
Subsystems (2)
PATCH 1/1 mfd wm8350: allocate irq descs dynamically
This allows boards to leave the irq_base field unitialized and prevents them having to reserve irqs in the platform.
--- drivers/mfd/wm8350-irq.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-)
As this seems to be the first user of irq_alloc_descs outside the core I added Thomas to cc to check if this is the correct usage of this function.
Unfortunately I have no hardware to test this. I created this patch since one of the wm8350 users is the mx31ads board which prevents me from getting rid of the irq ifdeffery in i.MX land, so it would be nice if someone could give it a test run.
drivers/mfd/wm8350-irq.c +13 -3
@@ -479,8 +479,8 @@ int wm8350_irq_init(struct wm8350 *wm8350, int irq,return 0 ; } -if (!pdata || !pdata->irq_base) { -dev_warn (wm8350->dev,"No interrupt support, no IRQ base\n" ); +if (!pdata) { +dev_warn (wm8350->dev,"No interrupt support, no platform data\n" );return 0 ; }
@@ -500,7 +500,17 @@ int wm8350_irq_init(struct wm8350 *wm8350, int irq,mutex_init (&wm8350->irq_lock); wm8350->chip_irq = irq; - wm8350->irq_base = pdata->irq_base; + +if (!pdata->irq_base) { + wm8350->irq_base =irq_alloc_descs (-1 ,0 ,ARRAY_SIZE (wm8350_irqs),0 ); +if (wm8350->irq_base <0 ) { +dev_warn (wm8350->dev,"Allocating irqs failed with %d\n" , + wm8350->irq_base); +return 0 ; + } + }else { + wm8350->irq_base = pdata->irq_base; + }if (pdata->irq_high) { flags |=IRQF_TRIGGER_HIGH ;
Signature · 7 lines
1.7.4.1 -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
drivers/mfd/wm8350-irq.c int wm8350_irq_init(struct wm8350 *wm8350, int irq, · line 483
Quoted 4 lines · Sascha Hauer
drivers/mfd/wm8350-irq.c +2
-2-if (!pdata || !pdata->irq_base) { -dev_warn (wm8350->dev,"No interrupt support, no IRQ base\n" ); +if (!pdata) { +dev_warn (wm8350->dev,"No interrupt support, no platform data\n" );
This isn't terribly good, the only reason we're checking pdata here is because we can't dereference it to look up irq_base if it's not there.
drivers/mfd/wm8350-irq.c int wm8350_irq_init(struct wm8350 *wm8350, int irq, · line 506
Quoted 3 lines · Sascha Hauer
drivers/mfd/wm8350-irq.c +3
-0+if (!pdata->irq_base) { + wm8350->irq_base =irq_alloc_descs (-1 ,0 ,ARRAY_SIZE (wm8350_irqs),0 ); +if (wm8350->irq_base <0 ) {
One other thing - it doesn't seem to be 100% desirable to making the allocation of the IRQ descriptors depend on not specifying a base - for many situations we're likely to want to know what the numbers we end up with are (eg, for passing to another device) but if we don't call irq_alloc_decs() the platform still has to arrange for the descriptors to be there in advance. It feels like the code should always use irq_alloc_descs(), though obviously that's not going to work right now.