mfd: Allocate wm835x irq descs dynamically
This allows boards to leave the irq_base field unitialized and prevents them having to reserve irqs in the platform. pdata can be optional for irq support now. Without pdata the driver allocates some free irq range. With pdata and irq_base > 0 the driver allocates exactly the specified irq. Without pdata the irq defaults to IRQF_TRIGGER_LOW. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
Родитель
e69b6de181
Коммит
d1738aef38
|
@ -473,17 +473,13 @@ int wm8350_irq_init(struct wm8350 *wm8350, int irq,
|
|||
{
|
||||
int ret, cur_irq, i;
|
||||
int flags = IRQF_ONESHOT;
|
||||
int irq_base = -1;
|
||||
|
||||
if (!irq) {
|
||||
dev_warn(wm8350->dev, "No interrupt support, no core IRQ\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!pdata || !pdata->irq_base) {
|
||||
dev_warn(wm8350->dev, "No interrupt support, no IRQ base\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Mask top level interrupts */
|
||||
wm8350_reg_write(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK, 0xFFFF);
|
||||
|
||||
|
@ -502,7 +498,17 @@ int wm8350_irq_init(struct wm8350 *wm8350, int irq,
|
|||
wm8350->chip_irq = irq;
|
||||
wm8350->irq_base = pdata->irq_base;
|
||||
|
||||
if (pdata->irq_high) {
|
||||
if (pdata && pdata->irq_base > 0)
|
||||
irq_base = pdata->irq_base;
|
||||
|
||||
wm8350->irq_base = irq_alloc_descs(irq_base, 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;
|
||||
}
|
||||
|
||||
if (pdata && pdata->irq_high) {
|
||||
flags |= IRQF_TRIGGER_HIGH;
|
||||
|
||||
wm8350_set_bits(wm8350, WM8350_SYSTEM_CONTROL_1,
|
||||
|
|
Загрузка…
Ссылка в новой задаче