From patchwork Mon Dec 13 09:19:54 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Szafranek, Michael" X-Patchwork-Id: 405182 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oBD9JxEu013928 for ; Mon, 13 Dec 2010 09:19:59 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756341Ab0LMJT6 (ORCPT ); Mon, 13 Dec 2010 04:19:58 -0500 Received: from mail3.emtrion.de ([80.150.99.69]:39435 "EHLO mail3.emtrion.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753236Ab0LMJT6 convert rfc822-to-8bit (ORCPT ); Mon, 13 Dec 2010 04:19:58 -0500 Received: from BMK019S01.emtrion.local ([fe80::4a1:cedc:cab6:e9ce]) by BMK019S01.emtrion.local ([fe80::4a1:cedc:cab6:e9ce%10]) with mapi; Mon, 13 Dec 2010 10:19:56 +0100 From: "Szafranek, Michael" To: "linux-sh@vger.kernel.org" Date: Mon, 13 Dec 2010 10:19:54 +0100 Subject: sh: sh7723/7724 nmi: nmi stops DMA transfers Thread-Topic: sh: sh7723/7724 nmi: nmi stops DMA transfers Thread-Index: AcuapudwPmAvzcbbSJS8QKVAcn180Q== Message-ID: <95F51F4B902CAC40AF459205F6322F0187A9C8F819@BMK019S01.emtrion.local> Accept-Language: de-DE Content-Language: de-DE X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: de-DE x-tm-as-product-ver: SMEX-8.0.0.1307-6.500.1024-17826.005 x-tm-as-result: No--36.663500-8.000000-31 x-tm-as-user-approved-sender: No x-tm-as-user-blocked-sender: No MIME-Version: 1.0 Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Mon, 13 Dec 2010 09:19:59 +0000 (UTC) diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c index 0830c2a..67f24bc 100644 --- a/arch/sh/kernel/traps.c +++ b/arch/sh/kernel/traps.c @@ -8,6 +8,8 @@ #include #include #include +#include +#include #ifdef CONFIG_GENERIC_BUG static void handle_BUG(struct pt_regs *regs) @@ -95,11 +97,13 @@ BUILD_TRAP_HANDLER(bug) BUILD_TRAP_HANDLER(nmi) { + unsigned long dmaor; unsigned int cpu = smp_processor_id(); TRAP_HANDLER_DECL; nmi_enter(); nmi_count(cpu)++; + switch (notify_die(DIE_NMI, "NMI", regs, 0, vec & 0xff, SIGINT)) { case NOTIFY_OK: @@ -111,6 +115,22 @@ BUILD_TRAP_HANDLER(nmi) printk(KERN_ALERT "Got NMI, but nobody cared. Ignoring...\n"); break; } - + +/* every NMI usually stops all active DMA transfers. These lines simply reanimate the */ +/* DMA channels so that the transfers are resumed */ +#if defined(CONFIG_SH_HICO7723) || defined(CONFIG_SH_HICO7724) + dmaor = __raw_readw(SH_DMAC_BASE0 + DMAOR); + dmaor &= ~(DMAOR_NMIF | DMAOR_AE); // resetting NMI flag and address error flag + __raw_writew( dmaor, SH_DMAC_BASE0 + DMAOR ); + dmaor |= DMAOR_INIT; // restarting DMA + __raw_writew( dmaor, SH_DMAC_BASE0 + DMAOR ); + + dmaor = __raw_readw(SH_DMAC_BASE1 + DMAOR); + dmaor &= ~(DMAOR_NMIF | DMAOR_AE); // resetting NMI flag and address error flag + __raw_writew( dmaor, SH_DMAC_BASE1 + DMAOR ); + dmaor |= DMAOR_INIT; // restarting DMA + __raw_writew( dmaor, SH_DMAC_BASE1 + DMAOR ); +#endif + nmi_exit(); }