Skip to contentSkip to conversation

mfd wm8350: allocate irq descs dynamically

PATCH In review Sascha Hauer 2 participants 3 messages May 19, 2011

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index ed4b22a..04408a5 100644
@@ -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 |
#1 lore raw

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.

#2 lore raw
In reply to Sascha Hauer

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.