| From 73beb63d290f961c299526852884846b0d868840 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Mon, 2 Dec 2013 12:20:36 +0100 |
| Subject: mfd: rtsx_pcr: Disable interrupts before cancelling delayed works |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit 73beb63d290f961c299526852884846b0d868840 upstream. |
| |
| This fixes a kernel panic when resuming from suspend to RAM. |
| Without this fix an interrupt hits after the delayed work is canceled |
| and thus requeues it. So we end up freeing an armed timer. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Samuel Ortiz <sameo@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mfd/rtsx_pcr.c | 10 ++++++++-- |
| 1 file changed, 8 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/mfd/rtsx_pcr.c |
| +++ b/drivers/mfd/rtsx_pcr.c |
| @@ -1195,8 +1195,14 @@ static void rtsx_pci_remove(struct pci_d |
| |
| pcr->remove_pci = true; |
| |
| - cancel_delayed_work(&pcr->carddet_work); |
| - cancel_delayed_work(&pcr->idle_work); |
| + /* Disable interrupts at the pcr level */ |
| + spin_lock_irq(&pcr->lock); |
| + rtsx_pci_writel(pcr, RTSX_BIER, 0); |
| + pcr->bier = 0; |
| + spin_unlock_irq(&pcr->lock); |
| + |
| + cancel_delayed_work_sync(&pcr->carddet_work); |
| + cancel_delayed_work_sync(&pcr->idle_work); |
| |
| mfd_remove_devices(&pcidev->dev); |
| |