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:
Linus Torvalds
2026-02-10 13:22:50 -08:00
18 changed files with 26 additions and 73 deletions

View File

@@ -459,8 +459,8 @@ int __init ve_spc_init(void __iomem *baseaddr, u32 a15_clusid, int irq)
readl_relaxed(info->baseaddr + PWC_STATUS); readl_relaxed(info->baseaddr + PWC_STATUS);
ret = request_irq(irq, ve_spc_irq_handler, IRQF_TRIGGER_HIGH ret = request_irq(irq, ve_spc_irq_handler, IRQF_TRIGGER_HIGH,
| IRQF_ONESHOT, "vexpress-spc", info); "vexpress-spc", info);
if (ret) { if (ret) {
pr_err(SPCLOG "IRQ %d request failed\n", irq); pr_err(SPCLOG "IRQ %d request failed\n", irq);
kfree(info); kfree(info);

View File

@@ -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) 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]; 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, err = devm_request_threaded_irq(&data->pdev->dev,
msix_entry->vector, msix_entry->vector,
btintel_pcie_msix_isr, NULL,
btintel_pcie_irq_msix_handler, btintel_pcie_irq_msix_handler,
IRQF_SHARED, IRQF_ONESHOT | IRQF_SHARED,
KBUILD_MODNAME, KBUILD_MODNAME,
msix_entry); msix_entry);
if (err) { if (err) {

View File

@@ -380,17 +380,6 @@ int dprc_scan_container(struct fsl_mc_device *mc_bus_dev,
} }
EXPORT_SYMBOL_GPL(dprc_scan_container); 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 * 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, error = devm_request_threaded_irq(&mc_dev->dev,
irq->virq, irq->virq,
dprc_irq0_handler, NULL,
dprc_irq0_handler_thread, dprc_irq0_handler_thread,
IRQF_NO_SUSPEND | IRQF_ONESHOT, IRQF_NO_SUSPEND | IRQF_ONESHOT,
dev_name(&mc_dev->dev), dev_name(&mc_dev->dev),

View File

@@ -749,8 +749,7 @@ static int tpm_cr50_i2c_probe(struct i2c_client *client)
if (client->irq > 0) { if (client->irq > 0) {
rc = devm_request_irq(dev, client->irq, tpm_cr50_i2c_int_handler, rc = devm_request_irq(dev, client->irq, tpm_cr50_i2c_int_handler,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT | IRQF_TRIGGER_FALLING | IRQF_NO_AUTOEN,
IRQF_NO_AUTOEN,
dev->driver->name, chip); dev->driver->name, chip);
if (rc < 0) { if (rc < 0) {
dev_err(dev, "Failed to probe IRQ %d\n", client->irq); dev_err(dev, "Failed to probe IRQ %d\n", client->irq);

View File

@@ -287,7 +287,7 @@ int cr50_spi_probe(struct spi_device *spi)
if (spi->irq > 0) { if (spi->irq > 0) {
ret = devm_request_irq(&spi->dev, spi->irq, ret = devm_request_irq(&spi->dev, spi->irq,
cr50_spi_irq_handler, cr50_spi_irq_handler,
IRQF_TRIGGER_RISING | IRQF_ONESHOT, IRQF_TRIGGER_RISING,
"cr50_spi", cr50_phy); "cr50_spi", cr50_phy);
if (ret < 0) { if (ret < 0) {
if (ret == -EPROBE_DEFER) if (ret == -EPROBE_DEFER)

View File

@@ -1563,8 +1563,7 @@ static int altr_portb_setup(struct altr_edac_device_dev *device)
goto err_release_group_1; goto err_release_group_1;
} }
rc = devm_request_irq(&altdev->ddev, altdev->sb_irq, rc = devm_request_irq(&altdev->ddev, altdev->sb_irq,
prv->ecc_irq_handler, prv->ecc_irq_handler, IRQF_TRIGGER_HIGH,
IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
ecc_name, altdev); ecc_name, altdev);
if (rc) { if (rc) {
edac_printk(KERN_ERR, EDAC_DEVICE, "PortB SBERR IRQ error\n"); 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; goto err_release_group_1;
} }
rc = devm_request_irq(&altdev->ddev, altdev->db_irq, rc = devm_request_irq(&altdev->ddev, altdev->db_irq,
prv->ecc_irq_handler, prv->ecc_irq_handler, IRQF_TRIGGER_HIGH,
IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
ecc_name, altdev); ecc_name, altdev);
if (rc) { if (rc) {
edac_printk(KERN_ERR, EDAC_DEVICE, "PortB DBERR IRQ error\n"); 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; goto err_release_group1;
} }
rc = devm_request_irq(edac->dev, altdev->sb_irq, prv->ecc_irq_handler, rc = devm_request_irq(edac->dev, altdev->sb_irq, prv->ecc_irq_handler,
IRQF_ONESHOT | IRQF_TRIGGER_HIGH, IRQF_TRIGGER_HIGH, ecc_name, altdev);
ecc_name, altdev);
if (rc) { if (rc) {
edac_printk(KERN_ERR, EDAC_DEVICE, "No SBERR IRQ resource\n"); edac_printk(KERN_ERR, EDAC_DEVICE, "No SBERR IRQ resource\n");
goto err_release_group1; goto err_release_group1;
@@ -1993,7 +1990,7 @@ static int altr_edac_a10_device_add(struct altr_arria10_edac *edac,
goto err_release_group1; goto err_release_group1;
} }
rc = devm_request_irq(edac->dev, altdev->db_irq, prv->ecc_irq_handler, rc = devm_request_irq(edac->dev, altdev->db_irq, prv->ecc_irq_handler,
IRQF_ONESHOT | IRQF_TRIGGER_HIGH, IRQF_TRIGGER_HIGH,
ecc_name, altdev); ecc_name, altdev);
if (rc) { if (rc) {
edac_printk(KERN_ERR, EDAC_DEVICE, "No DBERR IRQ resource\n"); edac_printk(KERN_ERR, EDAC_DEVICE, "No DBERR IRQ resource\n");

View File

@@ -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_evtlog(int irq, void *data);
irqreturn_t amd_iommu_int_thread_pprlog(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_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, void amd_iommu_restart_log(struct amd_iommu *iommu, const char *evt_type,
u8 cntrl_intr, u8 cntrl_log, u8 cntrl_intr, u8 cntrl_log,
u32 status_run_mask, u32 status_overflow_mask); u32 status_run_mask, u32 status_overflow_mask);

View File

@@ -2356,12 +2356,8 @@ static int iommu_setup_msi(struct amd_iommu *iommu)
if (r) if (r)
return r; return r;
r = request_threaded_irq(iommu->dev->irq, r = request_threaded_irq(iommu->dev->irq, NULL, amd_iommu_int_thread,
amd_iommu_int_handler, IRQF_ONESHOT, "AMD-Vi", iommu);
amd_iommu_int_thread,
0, "AMD-Vi",
iommu);
if (r) { if (r) {
pci_disable_msi(iommu->dev); pci_disable_msi(iommu->dev);
return r; return r;
@@ -2535,8 +2531,8 @@ static int __iommu_setup_intcapxt(struct amd_iommu *iommu, const char *devname,
return irq; return irq;
} }
ret = request_threaded_irq(irq, amd_iommu_int_handler, ret = request_threaded_irq(irq, NULL, thread_fn, IRQF_ONESHOT, devname,
thread_fn, 0, devname, iommu); iommu);
if (ret) { if (ret) {
irq_domain_free_irqs(irq, 1); irq_domain_free_irqs(irq, 1);
irq_domain_remove(domain); irq_domain_remove(domain);

View File

@@ -1151,11 +1151,6 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
irqreturn_t amd_iommu_int_handler(int irq, void *data)
{
return IRQ_WAKE_THREAD;
}
/**************************************************************************** /****************************************************************************
* *
* IOMMU command queuing functions * IOMMU command queuing functions

View File

@@ -1173,14 +1173,6 @@ static int flexrm_debugfs_stats_show(struct seq_file *file, void *offset)
/* ====== FlexRM interrupt handler ===== */ /* ====== 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) static irqreturn_t flexrm_irq_thread(int irq, void *dev_id)
{ {
flexrm_process_completions(dev_id); flexrm_process_completions(dev_id);
@@ -1271,10 +1263,8 @@ static int flexrm_startup(struct mbox_chan *chan)
ret = -ENODEV; ret = -ENODEV;
goto fail_free_cmpl_memory; goto fail_free_cmpl_memory;
} }
ret = request_threaded_irq(ring->irq, ret = request_threaded_irq(ring->irq, NULL, flexrm_irq_thread,
flexrm_irq_event, IRQF_ONESHOT, dev_name(ring->mbox->dev), ring);
flexrm_irq_thread,
0, dev_name(ring->mbox->dev), ring);
if (ret) { if (ret) {
dev_err(ring->mbox->dev, dev_err(ring->mbox->dev,
"failed to request ring%d IRQ\n", ring->num); "failed to request ring%d IRQ\n", ring->num);

View File

@@ -115,7 +115,7 @@ static int probe_trigger(struct iio_dev *indio_dev, int irq)
if (!st->trig) if (!st->trig)
return -ENOMEM; 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); "mgb4-trigger", st->trig);
if (ret) if (ret)
goto error_free_trig; goto error_free_trig;

View File

@@ -206,8 +206,8 @@ static int int0002_probe(struct platform_device *pdev)
* FIXME: augment this if we managed to pull handling of shared * FIXME: augment this if we managed to pull handling of shared
* IRQs into gpiolib. * IRQs into gpiolib.
*/ */
ret = devm_request_irq(dev, irq, int0002_irq, ret = devm_request_irq(dev, irq, int0002_irq, IRQF_SHARED, "INT0002",
IRQF_ONESHOT | IRQF_SHARED, "INT0002", chip); chip);
if (ret) { if (ret) {
dev_err(dev, "Error requesting IRQ %d: %d\n", irq, ret); dev_err(dev, "Error requesting IRQ %d: %d\n", irq, ret);
return ret; return ret;

View File

@@ -369,7 +369,7 @@ static int aml_rtc_probe(struct platform_device *pdev)
return PTR_ERR(rtc->rtc_dev); return PTR_ERR(rtc->rtc_dev);
ret = devm_request_irq(dev, rtc->irq, aml_rtc_handler, ret = devm_request_irq(dev, rtc->irq, aml_rtc_handler,
IRQF_ONESHOT, "aml-rtc alarm", rtc); 0, "aml-rtc alarm", rtc);
if (ret) { if (ret) {
dev_err_probe(dev, ret, "IRQ%d request failed, ret = %d\n", dev_err_probe(dev, ret, "IRQ%d request failed, ret = %d\n",
rtc->irq, ret); rtc->irq, ret);

View File

@@ -415,12 +415,6 @@ efct_intr_thread(int irq, void *handle)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static irqreturn_t
efct_intr_msix(int irq, void *handle)
{
return IRQ_WAKE_THREAD;
}
static int static int
efct_setup_msix(struct efct *efct, u32 num_intrs) 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; intr_ctx->index = i;
rc = request_threaded_irq(pci_irq_vector(efct->pci, 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); EFCT_DRIVER_NAME, intr_ctx);
if (rc) { if (rc) {
dev_err(&efct->pci->dev, dev_err(&efct->pci->dev,

View File

@@ -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 */ /* Disable the irq and let cpufreq enable it when ready to handle the interrupt */
irq_set_status_flags(lmh_data->irq, IRQ_NOAUTOEN); irq_set_status_flags(lmh_data->irq, IRQ_NOAUTOEN);
ret = devm_request_irq(dev, lmh_data->irq, lmh_handle_irq, 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); "lmh-irq", lmh_data);
if (ret) { if (ret) {
dev_err(dev, "Error %d registering irq %x\n", ret, lmh_data->irq); dev_err(dev, "Error %d registering irq %x\n", ret, lmh_data->irq);

View File

@@ -1756,8 +1756,7 @@ static int fusb302_probe(struct i2c_client *client)
} }
ret = request_irq(chip->gpio_int_n_irq, fusb302_irq_intn, ret = request_irq(chip->gpio_int_n_irq, fusb302_irq_intn,
IRQF_ONESHOT | IRQF_TRIGGER_LOW, IRQF_TRIGGER_LOW, "fsc_interrupt_int_n", chip);
"fsc_interrupt_int_n", chip);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "cannot request IRQ for GPIO Int_N, ret=%d", ret); dev_err(dev, "cannot request IRQ for GPIO Int_N, ret=%d", ret);
goto tcpm_unregister_port; goto tcpm_unregister_port;

View File

@@ -228,7 +228,7 @@ static inline int __must_check
devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler, devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,
unsigned long irqflags, const char *devname, void *dev_id) 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); devname, dev_id);
} }

View File

@@ -667,7 +667,7 @@ static inline int wm8350_register_irq(struct wm8350 *wm8350, int irq,
return -ENODEV; return -ENODEV;
return request_threaded_irq(irq + wm8350->irq_base, NULL, 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) static inline void wm8350_free_irq(struct wm8350 *wm8350, int irq, void *data)