mirror of https://github.com/torvalds/linux.git
A series of treewide cleanups to ensure interrupt request consistency.
- Add the missing IRQF_COND_ONESHOT flag to devm_request_irq()
This is inconsistent vs. request_irq() and causes the same issues which
where addressed with the introduction of this flag
- Cleanup IRQF_ONESHOT and IRQF_NO_THREAD usage
Quite some drivers have inconsistent interrupt request flags related to
interrupt threading namely IRQF_ONESHOT and IRQF_NO_THREAD. This leads to
warnings and/or malfunction when forced interrupt threading is enabled.
- Remove stub primary (hard interrupt) handlers
A bunch of drivers implement a stub primary (hard interrupt) handler which
just returns IRQ_WAKE_THREAD. The same functionality is provided by the
core code when the primary handler argument of request_thread_irq() is set
to NULL.
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmmJs8MQHHRnbHhAa2Vy
bmVsLm9yZwAKCRCmGPVMDXSYoTbvEACH4OegGofKri7aecUPNcpRdQDHBoueikni
Rio/vydFJ/H2hto4xlSPC4C84onxuFqY9lJgo/tCQTCrO0t+ZQ4ZGqnlQKzLJzmv
vcVzNgGsxDZ0p1wJO0rBpTRxJN8yTXi8VVv5e6OPuihjLhdXGesyYtk1zosR3nOS
CF/w8r9jVMzsSMPvtEMr5AwXD9ZTziUqyhQv94fYlpsbyD4TPXnUxhVkdUFFHHo3
ROzWPFw1Ykh6wpdRPEpupcCf1d2Pq0TIAU86y3Sbf2msuXiTouHf+lH1uTd3EsLN
6qUIqRYjwWE8HTieh+3YcH415wrIsUsWJb8YDi0DpqhPbja3IXP5ACHqEWaaNHRA
MaBE2Gc02se4ChXMWncYR3cdzyAAwAeKLUahpLNc+7U4cHOm1w2g60yy4I0v2krh
V0vfEN88WQ8DgrM0VvDLST6ZinSz4ia+R0qYWywl6eIW4RVNtuBi6wrN5PtzSEtz
jZ3LqnRLGmNfKwS/taHBCAme7NIJSNa1L0ao/icnW5XVQz/d2EHVcUsLHecHZSMx
l9tr/g3t85tsFW1eIKfF8T1a5DrbCEP4afceQk9KexAfAkP7el53M1E1yQDk/kW8
so0CwZtbDJ136RQdBIQqx49QrUEOvtrgNDRQxPFBUrWEHcvjqbUuFclp9hpLheOj
8YnzkVe0Rg==
=vrmm
-----END PGP SIGNATURE-----
Merge tag 'irq-cleanups-2026-02-09' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq cleanups from Thomas Gleixner:
"A series of treewide cleanups to ensure interrupt request consistency.
- Add the missing IRQF_COND_ONESHOT flag to devm_request_irq()
This is inconsistent vs request_irq() and causes the same issues
which where addressed with the introduction of this flag
- Cleanup IRQF_ONESHOT and IRQF_NO_THREAD usage
Quite some drivers have inconsistent interrupt request flags
related to interrupt threading namely IRQF_ONESHOT and
IRQF_NO_THREAD. This leads to warnings and/or malfunction when
forced interrupt threading is enabled.
- Remove stub primary (hard interrupt) handlers
A bunch of drivers implement a stub primary (hard interrupt)
handler which just returns IRQ_WAKE_THREAD. The same functionality
is provided by the core code when the primary handler argument of
request_thread_irq() is set to NULL"
* tag 'irq-cleanups-2026-02-09' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
media: pci: mg4b: Use IRQF_NO_THREAD
mfd: wm8350-core: Use IRQF_ONESHOT
thermal/qcom/lmh: Replace IRQF_ONESHOT with IRQF_NO_THREAD
rtc: amlogic-a4: Remove IRQF_ONESHOT
usb: typec: fusb302: Remove IRQF_ONESHOT
EDAC/altera: Remove IRQF_ONESHOT
char: tpm: cr50: Remove IRQF_ONESHOT
ARM: versatile: Remove IRQF_ONESHOT
scsi: efct: Use IRQF_ONESHOT and default primary handler
Bluetooth: btintel_pcie: Use IRQF_ONESHOT and default primary handler
bus: fsl-mc: Use default primary handler
mailbox: bcm-ferxrm-mailbox: Use default primary handler
iommu/amd: Use core's primary handler and set IRQF_ONESHOT
platform/x86: int0002: Remove IRQF_ONESHOT from request_irq()
genirq: Set IRQF_COND_ONESHOT in devm_request_irq().
This commit is contained in:
commit
4e21e585b6
|
|
@ -459,8 +459,8 @@ int __init ve_spc_init(void __iomem *baseaddr, u32 a15_clusid, int irq)
|
|||
|
||||
readl_relaxed(info->baseaddr + PWC_STATUS);
|
||||
|
||||
ret = request_irq(irq, ve_spc_irq_handler, IRQF_TRIGGER_HIGH
|
||||
| IRQF_ONESHOT, "vexpress-spc", info);
|
||||
ret = request_irq(irq, ve_spc_irq_handler, IRQF_TRIGGER_HIGH,
|
||||
"vexpress-spc", info);
|
||||
if (ret) {
|
||||
pr_err(SPCLOG "IRQ %d request failed\n", irq);
|
||||
kfree(info);
|
||||
|
|
|
|||
|
|
@ -1431,11 +1431,6 @@ static void btintel_pcie_msix_rx_handle(struct btintel_pcie_data *data)
|
|||
}
|
||||
}
|
||||
|
||||
static irqreturn_t btintel_pcie_msix_isr(int irq, void *data)
|
||||
{
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
static inline bool btintel_pcie_is_rxq_empty(struct btintel_pcie_data *data)
|
||||
{
|
||||
return data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM] == data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM];
|
||||
|
|
@ -1537,9 +1532,9 @@ static int btintel_pcie_setup_irq(struct btintel_pcie_data *data)
|
|||
|
||||
err = devm_request_threaded_irq(&data->pdev->dev,
|
||||
msix_entry->vector,
|
||||
btintel_pcie_msix_isr,
|
||||
NULL,
|
||||
btintel_pcie_irq_msix_handler,
|
||||
IRQF_SHARED,
|
||||
IRQF_ONESHOT | IRQF_SHARED,
|
||||
KBUILD_MODNAME,
|
||||
msix_entry);
|
||||
if (err) {
|
||||
|
|
|
|||
|
|
@ -380,17 +380,6 @@ int dprc_scan_container(struct fsl_mc_device *mc_bus_dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(dprc_scan_container);
|
||||
|
||||
/**
|
||||
* dprc_irq0_handler - Regular ISR for DPRC interrupt 0
|
||||
*
|
||||
* @irq_num: IRQ number of the interrupt being handled
|
||||
* @arg: Pointer to device structure
|
||||
*/
|
||||
static irqreturn_t dprc_irq0_handler(int irq_num, void *arg)
|
||||
{
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
/**
|
||||
* dprc_irq0_handler_thread - Handler thread function for DPRC interrupt 0
|
||||
*
|
||||
|
|
@ -527,7 +516,7 @@ static int register_dprc_irq_handler(struct fsl_mc_device *mc_dev)
|
|||
*/
|
||||
error = devm_request_threaded_irq(&mc_dev->dev,
|
||||
irq->virq,
|
||||
dprc_irq0_handler,
|
||||
NULL,
|
||||
dprc_irq0_handler_thread,
|
||||
IRQF_NO_SUSPEND | IRQF_ONESHOT,
|
||||
dev_name(&mc_dev->dev),
|
||||
|
|
|
|||
|
|
@ -749,8 +749,7 @@ static int tpm_cr50_i2c_probe(struct i2c_client *client)
|
|||
|
||||
if (client->irq > 0) {
|
||||
rc = devm_request_irq(dev, client->irq, tpm_cr50_i2c_int_handler,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT |
|
||||
IRQF_NO_AUTOEN,
|
||||
IRQF_TRIGGER_FALLING | IRQF_NO_AUTOEN,
|
||||
dev->driver->name, chip);
|
||||
if (rc < 0) {
|
||||
dev_err(dev, "Failed to probe IRQ %d\n", client->irq);
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ int cr50_spi_probe(struct spi_device *spi)
|
|||
if (spi->irq > 0) {
|
||||
ret = devm_request_irq(&spi->dev, spi->irq,
|
||||
cr50_spi_irq_handler,
|
||||
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
IRQF_TRIGGER_RISING,
|
||||
"cr50_spi", cr50_phy);
|
||||
if (ret < 0) {
|
||||
if (ret == -EPROBE_DEFER)
|
||||
|
|
|
|||
|
|
@ -1563,8 +1563,7 @@ static int altr_portb_setup(struct altr_edac_device_dev *device)
|
|||
goto err_release_group_1;
|
||||
}
|
||||
rc = devm_request_irq(&altdev->ddev, altdev->sb_irq,
|
||||
prv->ecc_irq_handler,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
|
||||
prv->ecc_irq_handler, IRQF_TRIGGER_HIGH,
|
||||
ecc_name, altdev);
|
||||
if (rc) {
|
||||
edac_printk(KERN_ERR, EDAC_DEVICE, "PortB SBERR IRQ error\n");
|
||||
|
|
@ -1587,8 +1586,7 @@ static int altr_portb_setup(struct altr_edac_device_dev *device)
|
|||
goto err_release_group_1;
|
||||
}
|
||||
rc = devm_request_irq(&altdev->ddev, altdev->db_irq,
|
||||
prv->ecc_irq_handler,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
|
||||
prv->ecc_irq_handler, IRQF_TRIGGER_HIGH,
|
||||
ecc_name, altdev);
|
||||
if (rc) {
|
||||
edac_printk(KERN_ERR, EDAC_DEVICE, "PortB DBERR IRQ error\n");
|
||||
|
|
@ -1970,8 +1968,7 @@ static int altr_edac_a10_device_add(struct altr_arria10_edac *edac,
|
|||
goto err_release_group1;
|
||||
}
|
||||
rc = devm_request_irq(edac->dev, altdev->sb_irq, prv->ecc_irq_handler,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
|
||||
ecc_name, altdev);
|
||||
IRQF_TRIGGER_HIGH, ecc_name, altdev);
|
||||
if (rc) {
|
||||
edac_printk(KERN_ERR, EDAC_DEVICE, "No SBERR IRQ resource\n");
|
||||
goto err_release_group1;
|
||||
|
|
@ -1993,7 +1990,7 @@ static int altr_edac_a10_device_add(struct altr_arria10_edac *edac,
|
|||
goto err_release_group1;
|
||||
}
|
||||
rc = devm_request_irq(edac->dev, altdev->db_irq, prv->ecc_irq_handler,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
|
||||
IRQF_TRIGGER_HIGH,
|
||||
ecc_name, altdev);
|
||||
if (rc) {
|
||||
edac_printk(KERN_ERR, EDAC_DEVICE, "No DBERR IRQ resource\n");
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data);
|
|||
irqreturn_t amd_iommu_int_thread_evtlog(int irq, void *data);
|
||||
irqreturn_t amd_iommu_int_thread_pprlog(int irq, void *data);
|
||||
irqreturn_t amd_iommu_int_thread_galog(int irq, void *data);
|
||||
irqreturn_t amd_iommu_int_handler(int irq, void *data);
|
||||
void amd_iommu_restart_log(struct amd_iommu *iommu, const char *evt_type,
|
||||
u8 cntrl_intr, u8 cntrl_log,
|
||||
u32 status_run_mask, u32 status_overflow_mask);
|
||||
|
|
|
|||
|
|
@ -2356,12 +2356,8 @@ static int iommu_setup_msi(struct amd_iommu *iommu)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
r = request_threaded_irq(iommu->dev->irq,
|
||||
amd_iommu_int_handler,
|
||||
amd_iommu_int_thread,
|
||||
0, "AMD-Vi",
|
||||
iommu);
|
||||
|
||||
r = request_threaded_irq(iommu->dev->irq, NULL, amd_iommu_int_thread,
|
||||
IRQF_ONESHOT, "AMD-Vi", iommu);
|
||||
if (r) {
|
||||
pci_disable_msi(iommu->dev);
|
||||
return r;
|
||||
|
|
@ -2535,8 +2531,8 @@ static int __iommu_setup_intcapxt(struct amd_iommu *iommu, const char *devname,
|
|||
return irq;
|
||||
}
|
||||
|
||||
ret = request_threaded_irq(irq, amd_iommu_int_handler,
|
||||
thread_fn, 0, devname, iommu);
|
||||
ret = request_threaded_irq(irq, NULL, thread_fn, IRQF_ONESHOT, devname,
|
||||
iommu);
|
||||
if (ret) {
|
||||
irq_domain_free_irqs(irq, 1);
|
||||
irq_domain_remove(domain);
|
||||
|
|
|
|||
|
|
@ -1151,11 +1151,6 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
irqreturn_t amd_iommu_int_handler(int irq, void *data)
|
||||
{
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* IOMMU command queuing functions
|
||||
|
|
|
|||
|
|
@ -1173,14 +1173,6 @@ static int flexrm_debugfs_stats_show(struct seq_file *file, void *offset)
|
|||
|
||||
/* ====== FlexRM interrupt handler ===== */
|
||||
|
||||
static irqreturn_t flexrm_irq_event(int irq, void *dev_id)
|
||||
{
|
||||
/* We only have MSI for completions so just wakeup IRQ thread */
|
||||
/* Ring related errors will be informed via completion descriptors */
|
||||
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
static irqreturn_t flexrm_irq_thread(int irq, void *dev_id)
|
||||
{
|
||||
flexrm_process_completions(dev_id);
|
||||
|
|
@ -1271,10 +1263,8 @@ static int flexrm_startup(struct mbox_chan *chan)
|
|||
ret = -ENODEV;
|
||||
goto fail_free_cmpl_memory;
|
||||
}
|
||||
ret = request_threaded_irq(ring->irq,
|
||||
flexrm_irq_event,
|
||||
flexrm_irq_thread,
|
||||
0, dev_name(ring->mbox->dev), ring);
|
||||
ret = request_threaded_irq(ring->irq, NULL, flexrm_irq_thread,
|
||||
IRQF_ONESHOT, dev_name(ring->mbox->dev), ring);
|
||||
if (ret) {
|
||||
dev_err(ring->mbox->dev,
|
||||
"failed to request ring%d IRQ\n", ring->num);
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ static int probe_trigger(struct iio_dev *indio_dev, int irq)
|
|||
if (!st->trig)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = request_irq(irq, &iio_trigger_generic_data_rdy_poll, 0,
|
||||
ret = request_irq(irq, &iio_trigger_generic_data_rdy_poll, IRQF_NO_THREAD,
|
||||
"mgb4-trigger", st->trig);
|
||||
if (ret)
|
||||
goto error_free_trig;
|
||||
|
|
|
|||
|
|
@ -206,8 +206,8 @@ static int int0002_probe(struct platform_device *pdev)
|
|||
* FIXME: augment this if we managed to pull handling of shared
|
||||
* IRQs into gpiolib.
|
||||
*/
|
||||
ret = devm_request_irq(dev, irq, int0002_irq,
|
||||
IRQF_ONESHOT | IRQF_SHARED, "INT0002", chip);
|
||||
ret = devm_request_irq(dev, irq, int0002_irq, IRQF_SHARED, "INT0002",
|
||||
chip);
|
||||
if (ret) {
|
||||
dev_err(dev, "Error requesting IRQ %d: %d\n", irq, ret);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -369,7 +369,7 @@ static int aml_rtc_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(rtc->rtc_dev);
|
||||
|
||||
ret = devm_request_irq(dev, rtc->irq, aml_rtc_handler,
|
||||
IRQF_ONESHOT, "aml-rtc alarm", rtc);
|
||||
0, "aml-rtc alarm", rtc);
|
||||
if (ret) {
|
||||
dev_err_probe(dev, ret, "IRQ%d request failed, ret = %d\n",
|
||||
rtc->irq, ret);
|
||||
|
|
|
|||
|
|
@ -415,12 +415,6 @@ efct_intr_thread(int irq, void *handle)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
efct_intr_msix(int irq, void *handle)
|
||||
{
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
static int
|
||||
efct_setup_msix(struct efct *efct, u32 num_intrs)
|
||||
{
|
||||
|
|
@ -450,7 +444,7 @@ efct_setup_msix(struct efct *efct, u32 num_intrs)
|
|||
intr_ctx->index = i;
|
||||
|
||||
rc = request_threaded_irq(pci_irq_vector(efct->pci, i),
|
||||
efct_intr_msix, efct_intr_thread, 0,
|
||||
NULL, efct_intr_thread, IRQF_ONESHOT,
|
||||
EFCT_DRIVER_NAME, intr_ctx);
|
||||
if (rc) {
|
||||
dev_err(&efct->pci->dev,
|
||||
|
|
|
|||
|
|
@ -220,7 +220,7 @@ static int lmh_probe(struct platform_device *pdev)
|
|||
/* Disable the irq and let cpufreq enable it when ready to handle the interrupt */
|
||||
irq_set_status_flags(lmh_data->irq, IRQ_NOAUTOEN);
|
||||
ret = devm_request_irq(dev, lmh_data->irq, lmh_handle_irq,
|
||||
IRQF_ONESHOT | IRQF_NO_SUSPEND,
|
||||
IRQF_NO_THREAD | IRQF_NO_SUSPEND,
|
||||
"lmh-irq", lmh_data);
|
||||
if (ret) {
|
||||
dev_err(dev, "Error %d registering irq %x\n", ret, lmh_data->irq);
|
||||
|
|
|
|||
|
|
@ -1756,8 +1756,7 @@ static int fusb302_probe(struct i2c_client *client)
|
|||
}
|
||||
|
||||
ret = request_irq(chip->gpio_int_n_irq, fusb302_irq_intn,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_LOW,
|
||||
"fsc_interrupt_int_n", chip);
|
||||
IRQF_TRIGGER_LOW, "fsc_interrupt_int_n", chip);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "cannot request IRQ for GPIO Int_N, ret=%d", ret);
|
||||
goto tcpm_unregister_port;
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ static inline int __must_check
|
|||
devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,
|
||||
unsigned long irqflags, const char *devname, void *dev_id)
|
||||
{
|
||||
return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags,
|
||||
return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags | IRQF_COND_ONESHOT,
|
||||
devname, dev_id);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -667,7 +667,7 @@ static inline int wm8350_register_irq(struct wm8350 *wm8350, int irq,
|
|||
return -ENODEV;
|
||||
|
||||
return request_threaded_irq(irq + wm8350->irq_base, NULL,
|
||||
handler, flags, name, data);
|
||||
handler, flags | IRQF_ONESHOT, name, data);
|
||||
}
|
||||
|
||||
static inline void wm8350_free_irq(struct wm8350 *wm8350, int irq, void *data)
|
||||
|
|
|
|||
Loading…
Reference in New Issue