diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c index 869f188b02eb..55b953c64556 100644 --- a/drivers/spi/spi-pxa2xx-pci.c +++ b/drivers/spi/spi-pxa2xx-pci.c @@ -259,6 +259,9 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev, pci_set_drvdata(dev, pdev); + pr_info("pxa2xx-pci dev '%s' (%u): probed\n", + __clk_get_name(ssp->clk), ssp->irq); + return 0; } @@ -269,6 +272,9 @@ static void pxa2xx_spi_pci_remove(struct pci_dev *dev) spi_pdata = dev_get_platdata(&pdev->dev); + pr_info("pxa2xx-pci dev '%s' (%u): removing\n", + __clk_get_name(spi_pdata->ssp.clk), spi_pdata->ssp.irq); + platform_device_unregister(pdev); clk_unregister(spi_pdata->ssp.clk); } diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index 612cc49db28f..e2ec0b7bf765 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "spi-pxa2xx.h" @@ -706,6 +707,7 @@ static irqreturn_t ssp_int(int irq, void *dev_id) u32 sccr1_reg; u32 mask = drv_data->mask_sr; u32 status; + irqreturn_t ret; /* * The IRQ might be shared with other peripherals so we must first @@ -713,6 +715,10 @@ static irqreturn_t ssp_int(int irq, void *dev_id) * the IRQ was not for us (we shouldn't be RPM suspended when the * interrupt is enabled). */ + if (pm_runtime_suspended(&drv_data->pdev->dev)) + pr_info("pxa2xx dev '%s' (%u): suspended, not handling irq %u\n", + __clk_get_name(drv_data->ssp->clk), drv_data->ssp->irq, + irq); if (pm_runtime_suspended(&drv_data->pdev->dev)) return IRQ_NONE; @@ -723,6 +729,10 @@ static irqreturn_t ssp_int(int irq, void *dev_id) * powered off. */ status = pxa2xx_spi_read(drv_data, SSSR); + if (status == ~0) + pr_info("pxa2xx dev '%s' (%u): status ~0, not handling irq %u\n", + __clk_get_name(drv_data->ssp->clk), drv_data->ssp->irq, + irq); if (status == ~0) return IRQ_NONE; @@ -736,6 +746,10 @@ static irqreturn_t ssp_int(int irq, void *dev_id) if (!(sccr1_reg & SSCR1_TINTE)) mask &= ~SSSR_TINT; + if (!(status & mask)) + pr_info("pxa2xx dev '%s' (%u): status/mask %u/%u, not handling irq %u\n", + __clk_get_name(drv_data->ssp->clk), drv_data->ssp->irq, + status, mask, irq); if (!(status & mask)) return IRQ_NONE; @@ -743,12 +757,21 @@ static irqreturn_t ssp_int(int irq, void *dev_id) pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg); if (!drv_data->master->cur_msg) { + pr_info("pxa2xx dev '%s' (%u): bad message state, handled irq %u\n", + __clk_get_name(drv_data->ssp->clk), drv_data->ssp->irq, + irq); handle_bad_msg(drv_data); /* Never fail */ return IRQ_HANDLED; } - return drv_data->transfer_handler(drv_data); + ret = drv_data->transfer_handler(drv_data); + pr_info("pxa2xx dev '%s' (%u): transfer-handler '%s' status for irq %u is %d\n", + __clk_get_name(drv_data->ssp->clk), drv_data->ssp->irq, + drv_data->transfer_handler == interrupt_transfer ? + "interrupt_transfer" : "pxa2xx_spi_dma_transfer", + irq, ret); + return ret; } /* @@ -1503,6 +1526,9 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev) pdata->num_chipselect = 1; pdata->enable_dma = true; + pr_info("pxa2xx dev '%s' (%u): got irq from platform\n", + __clk_get_name(ssp->clk), ssp->irq); + return pdata; } @@ -1619,6 +1645,8 @@ static int pxa2xx_spi_probe(struct platform_device *pdev) dev_err(&pdev->dev, "cannot get IRQ %d\n", ssp->irq); goto out_error_master_alloc; } + pr_info("pxa2xx dev '%s' (%u): configured irq\n", + __clk_get_name(ssp->clk), ssp->irq); /* Setup DMA if requested */ if (platform_info->enable_dma) { @@ -1760,6 +1788,9 @@ static int pxa2xx_spi_remove(struct platform_device *pdev) pm_runtime_get_sync(&pdev->dev); + pr_info("pxa2xx dev '%s' (%u): removing\n", + __clk_get_name(ssp->clk), ssp->irq); + /* Disable the SSP at the peripheral and SOC level */ pxa2xx_spi_write(drv_data, SSCR0, 0); clk_disable_unprepare(ssp->clk); diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index d867d6ddafdd..7fad68f41901 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c @@ -131,8 +131,11 @@ static int misrouted_irq(int irq) if (i == irq) /* Already tried */ continue; - if (try_one_irq(desc, false)) + if (try_one_irq(desc, false)) { ok = 1; + printk(KERN_INFO "misrouted irq %u handled by '%s'\n", + desc->irq_data.irq, desc->irq_data.chip->name); + } } out: atomic_dec(&irq_poll_active);