| From foo@baz Sat Jul 28 12:10:33 CEST 2018 |
| From: Dmitry Osipenko <digetx@gmail.com> |
| Date: Mon, 9 Apr 2018 22:28:27 +0300 |
| Subject: memory: tegra: Do not handle spurious interrupts |
| |
| From: Dmitry Osipenko <digetx@gmail.com> |
| |
| [ Upstream commit bf3fbdfbec947cdd04b2f2c4bce11534c8786eee ] |
| |
| The ISR reads interrupts-enable mask, but doesn't utilize it. Apply the |
| mask to the interrupt status and don't handle interrupts that MC driver |
| haven't asked for. Kernel would disable spurious MC IRQ and report the |
| error. This would happen only in a case of a very severe bug. |
| |
| Signed-off-by: Dmitry Osipenko <digetx@gmail.com> |
| Signed-off-by: Thierry Reding <treding@nvidia.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/memory/tegra/mc.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/memory/tegra/mc.c |
| +++ b/drivers/memory/tegra/mc.c |
| @@ -252,8 +252,11 @@ static irqreturn_t tegra_mc_irq(int irq, |
| unsigned int bit; |
| |
| /* mask all interrupts to avoid flooding */ |
| - status = mc_readl(mc, MC_INTSTATUS); |
| mask = mc_readl(mc, MC_INTMASK); |
| + status = mc_readl(mc, MC_INTSTATUS) & mask; |
| + |
| + if (!status) |
| + return IRQ_NONE; |
| |
| for_each_set_bit(bit, &status, 32) { |
| const char *error = status_names[bit] ?: "unknown"; |