mfd: Support dynamic allocation of IRQ range for wm831x
Use irq_allocate_desc() to get the IRQ range, which turns into a noop on non-sparse systems. Since all existing users are non-sparse there should be no compatibility issues. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
b9d03d999b
commit
5c05a8d1f0
|
@ -527,13 +527,22 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq)
|
|||
0xffff);
|
||||
}
|
||||
|
||||
if (!pdata || !pdata->irq_base) {
|
||||
dev_err(wm831x->dev,
|
||||
"No interrupt base specified, no interrupts\n");
|
||||
/* Try to dynamically allocate IRQs if no base is specified */
|
||||
if (!pdata || !pdata->irq_base)
|
||||
wm831x->irq_base = -1;
|
||||
else
|
||||
wm831x->irq_base = pdata->irq_base;
|
||||
|
||||
wm831x->irq_base = irq_alloc_descs(wm831x->irq_base, 0,
|
||||
WM831X_NUM_IRQS, 0);
|
||||
if (wm831x->irq_base < 0) {
|
||||
dev_warn(wm831x->dev, "Failed to allocate IRQs: %d\n",
|
||||
wm831x->irq_base);
|
||||
wm831x->irq_base = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (pdata->irq_cmos)
|
||||
if (pdata && pdata->irq_cmos)
|
||||
i = 0;
|
||||
else
|
||||
i = WM831X_IRQ_OD;
|
||||
|
@ -553,7 +562,6 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq)
|
|||
}
|
||||
|
||||
wm831x->irq = irq;
|
||||
wm831x->irq_base = pdata->irq_base;
|
||||
|
||||
/* Register them with genirq */
|
||||
for (cur_irq = wm831x->irq_base;
|
||||
|
|
|
@ -262,7 +262,7 @@ struct wm831x {
|
|||
|
||||
int irq; /* Our chip IRQ */
|
||||
struct mutex irq_lock;
|
||||
unsigned int irq_base;
|
||||
int irq_base;
|
||||
int irq_masks_cur[WM831X_NUM_IRQ_REGS]; /* Currently active value */
|
||||
int irq_masks_cache[WM831X_NUM_IRQ_REGS]; /* Cached hardware value */
|
||||
|
||||
|
|
Loading…
Reference in New Issue