summaryrefslogtreecommitdiffstats
path: root/bsps
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-03-06 13:06:27 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-03-06 13:07:17 +0100
commitb82a4b4f5258d37d32aae19da11314e80318594a (patch)
treefd9e8f4e3248b6ddd7cdb4a890eb5a282a1e5d3a /bsps
parentbsp/atsam: Fix SPI CS change support (diff)
downloadrtems-b82a4b4f5258d37d32aae19da11314e80318594a.tar.bz2
bsp/atsam: Optimize XDMAD_Handler()
Load the channel interrupt mask only once.
Diffstat (limited to 'bsps')
-rw-r--r--bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c
index 0be891d2e9..444e2cf92e 100644
--- a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c
+++ b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c
@@ -307,10 +307,7 @@ static void XDMAD_Handler(void *arg)
{
sXdmad *pDmad;
Xdmac *pXdmac;
- sXdmadChannel *pCh;
- uint32_t xdmaChannelIntStatus, xdmaGlobaIntStatus, xdmaGlobalChStatus;
- uint8_t bExec;
- uint8_t _iChannel;
+ uint32_t xdmaGlobaIntStatus, xdmaGlobalChStatus;
pDmad = arg;
pXdmac = pDmad->pXdmacs;
@@ -318,17 +315,26 @@ static void XDMAD_Handler(void *arg)
xdmaGlobalChStatus = XDMAC_GetGlobalChStatus(pXdmac);
while (xdmaGlobaIntStatus != 0) {
- _iChannel = 31 - __builtin_clz(xdmaGlobaIntStatus);
- xdmaGlobaIntStatus &= ~(UINT32_C(1) << _iChannel);
+ uint8_t _iChannel;
+ sXdmadChannel *pCh;
+ uint8_t bExec;
+ _iChannel = 31 - __builtin_clz(xdmaGlobaIntStatus);
pCh = &pDmad->XdmaChannels[_iChannel];
bExec = 0;
+ xdmaGlobaIntStatus &= ~(UINT32_C(1) << _iChannel);
+
if ((xdmaGlobalChStatus & (XDMAC_GS_ST0 << _iChannel)) == 0) {
- xdmaChannelIntStatus = XDMAC_GetMaskChannelIsr(pXdmac, _iChannel);
+ uint32_t xdmaChannelIntMask;
+ uint32_t xdmaChannelIntStatus;
+
+ xdmaChannelIntMask = XDMAC_GetChannelItMask(pXdmac, _iChannel);
+ xdmaChannelIntStatus = XDMAC_GetChannelIsr(pXdmac, _iChannel);
+ xdmaChannelIntStatus &= xdmaChannelIntMask;
if (xdmaChannelIntStatus & XDMAC_CIS_BIS) {
- if ((XDMAC_GetChannelItMask(pXdmac, _iChannel) & XDMAC_CIM_LIM) == 0) {
+ if ((xdmaChannelIntMask & XDMAC_CIM_LIM) == 0) {
pCh->state = XDMAD_STATE_DONE;
bExec = 1;
}