History

genirq: Prevent [devm_]irq_alloc_desc from returning irq 0

Since commit a85a6c86c25b ("driver core: platform: Clarify that IRQ 0 is invalid"), having a linux-irq with number 0 will trigger a WARN() when calling platform_get_irq*() to retrieve that linux-irq. Since [devm_]irq_alloc_desc allocs a single irq and since irq 0 is not used on some systems, it can return 0, triggering that WARN(). This happens e.g. on Intel Bay Trail and Cherry Trail devices using the LPE audio engine for HDMI audio: 0 is an invalid IRQ number WARNING: CPU: 3 PID: 472 at drivers/base/platform.c:238 platform_get_irq_optional+0x108/0x180 Modules linked in: snd_hdmi_lpe_audio(+) ... Call Trace: platform_get_irq+0x17/0x30 hdmi_lpe_audio_probe+0x4a/0x6c0 [snd_hdmi_lpe_audio] ---[ end trace ceece38854223a0b ]--- Change the 'from' parameter passed to __[devm_]irq_alloc_descs() by the [devm_]irq_alloc_desc macros from 0 to 1, so that these macros will no longer return 0.

Hans de Goede committed 5 years ago

Commit 4c7bcb51 parent 4c457e81 file · +2 −2Browse files

Showing the changes to include/linux (1 of 1 file). Show all

Unified · Split

include/linux/irq.h+2−2
@@ -928,7 +928,7 @@ int __devm_irq_alloc_descs(struct device *dev, int irq, unsigned int from, · 927 unmodified lines
928 __irq_alloc_descs(irq, from, cnt, node, THIS_MODULE, NULL)928 __irq_alloc_descs(irq, from, cnt, node, THIS_MODULE, NULL)
929 929
930#define irq_alloc_desc(node) \930#define irq_alloc_desc(node) \
931 irq_alloc_descs(-1, 0, 1, node)931 irq_alloc_descs(-1, 1, 1, node)
932 932
933#define irq_alloc_desc_at(at, node) \933#define irq_alloc_desc_at(at, node) \
934 irq_alloc_descs(at, at, 1, node)934 irq_alloc_descs(at, at, 1, node)
@@ -943,7 +943,7 @@ int __devm_irq_alloc_descs(struct device *dev, int irq, unsigned int from, · 8 unmodified lines
943 __devm_irq_alloc_descs(dev, irq, from, cnt, node, THIS_MODULE, NULL)943 __devm_irq_alloc_descs(dev, irq, from, cnt, node, THIS_MODULE, NULL)
944 944
945#define devm_irq_alloc_desc(dev, node) \945#define devm_irq_alloc_desc(dev, node) \
946 devm_irq_alloc_descs(dev, -1, 0, 1, node)946 devm_irq_alloc_descs(dev, -1, 1, 1, node)
947 947
948#define devm_irq_alloc_desc_at(dev, at, node) \948#define devm_irq_alloc_desc_at(dev, at, node) \
949 devm_irq_alloc_descs(dev, at, at, 1, node)949 devm_irq_alloc_descs(dev, at, at, 1, node)