Mercurial > nand-ecoscentric
changeset 1070:9d0f5c9517dd
* include/var_intr.h (cyg_hal_interrupt_acknowledge): Don't
inadvertently clear other interrupts when acknowledging the
intended int. Reported by Mark Retallack.
| author | jlarmour |
|---|---|
| date | Tue, 24 Jun 2003 06:24:58 +0000 |
| parents | edfa7bed5cb2 |
| children | c27fc1b75136 |
| files | packages/hal/powerpc/mpc8xx/current/ChangeLog packages/hal/powerpc/mpc8xx/current/include/var_intr.h |
| diffstat | 2 files changed, 17 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/hal/powerpc/mpc8xx/current/ChangeLog +++ b/packages/hal/powerpc/mpc8xx/current/ChangeLog @@ -1,3 +1,9 @@ +2003-06-24 Jonathan Larmour <jifl@eCosCentric.com> + + * include/var_intr.h (cyg_hal_interrupt_acknowledge): Don't + inadvertently clear other interrupts when acknowledging the + intended int. Reported by Mark Retallack. + 2003-04-16 Gary Thomas <gary@mlbassoc.com> * src/var_misc.c (hal_variant_init): Errata setup for MPC852T
--- a/packages/hal/powerpc/mpc8xx/current/include/var_intr.h +++ b/packages/hal/powerpc/mpc8xx/current/include/var_intr.h @@ -12,6 +12,7 @@ // This file is part of eCos, the Embedded Configurable Operating System. // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. // Copyright (C) 2003 Gary Thomas +// Copyright (C) 2003 Jonathan Larmour <jifl@eCosCentric.com> // // eCos is free software; you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -430,8 +431,7 @@ cyg_hal_interrupt_acknowledge ( cyg_uint // When IRQx is configured as an edge interrupt it needs to be // cleared. Write to INTx and IRQ/level bits are ignore so // it's safe to do always. - HAL_READ_UINT32 (CYGARC_REG_IMM_SIPEND, sipend); - sipend |= (((cyg_uint32) CYGARC_REG_IMM_SIPEND_IRQ0) + sipend = (((cyg_uint32) CYGARC_REG_IMM_SIPEND_IRQ0) >> (vector - CYGNUM_HAL_INTERRUPT_SIU_IRQ0)); HAL_WRITE_UINT32 (CYGARC_REG_IMM_SIPEND, sipend); break; @@ -443,6 +443,8 @@ cyg_hal_interrupt_acknowledge ( cyg_uint HAL_READ_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); tbscr |= CYGARC_REG_IMM_TBSCR_REFA; + // take care not to accidently reset potential pending REFB + tbscr &= ~CYGARC_REG_IMM_TBSCR_REFB; HAL_WRITE_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); break; } @@ -453,6 +455,8 @@ cyg_hal_interrupt_acknowledge ( cyg_uint HAL_READ_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); tbscr |= CYGARC_REG_IMM_TBSCR_REFB; + // take care not to accidently reset potential pending REFA + tbscr &= ~CYGARC_REG_IMM_TBSCR_REFA; HAL_WRITE_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); break; } @@ -473,6 +477,8 @@ cyg_hal_interrupt_acknowledge ( cyg_uint HAL_READ_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); rtcsc |= CYGARC_REG_IMM_RTCSC_SEC; + // take care not to accidently reset potential pending RTCSC_ALR + rtcsc &= ~CYGARC_REG_IMM_RTCSC_ALR; HAL_WRITE_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); break; } @@ -483,6 +489,8 @@ cyg_hal_interrupt_acknowledge ( cyg_uint HAL_READ_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); rtcsc |= CYGARC_REG_IMM_RTCSC_ALR; + // take care not to accidently reset potential pending RTCSC_SEC + rtcsc &= ~CYGARC_REG_IMM_RTCSC_SEC; HAL_WRITE_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); break; } @@ -499,8 +507,7 @@ cyg_hal_interrupt_acknowledge ( cyg_uint // CPM interrupts cyg_uint32 cisr; - HAL_READ_UINT32 (CYGARC_REG_IMM_CISR, cisr); - cisr |= (((cyg_uint32) 0x80000000) + cisr = (((cyg_uint32) 0x80000000) >> (vector - CYGNUM_HAL_INTERRUPT_CPM_FIRST)); HAL_WRITE_UINT32 (CYGARC_REG_IMM_CISR, cisr); break;
