From f852cf58055c91e2fbeb7a442a6f12e5ad71e452 Mon Sep 17 00:00:00 2001 From: Andrei-Liviu Simion Date: Wed, 7 Jan 2015 12:18:54 -0800 Subject: [PATCH] dptx: Mask interrupts while they are being serviced. Signed-off-by: Andrei-Liviu Simion --- .../drivers/dptx/src/xdptx_intr.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/XilinxProcessorIPLib/drivers/dptx/src/xdptx_intr.c b/XilinxProcessorIPLib/drivers/dptx/src/xdptx_intr.c index 5b8b2198..6965b363 100644 --- a/XilinxProcessorIPLib/drivers/dptx/src/xdptx_intr.c +++ b/XilinxProcessorIPLib/drivers/dptx/src/xdptx_intr.c @@ -128,6 +128,7 @@ void XDptx_HpdInterruptHandler(XDptx *InstancePtr) u8 HpdEventDetected; u8 HpdPulseDetected; u32 HpdDuration; + u32 IntrMask; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); @@ -138,16 +139,28 @@ void XDptx_HpdInterruptHandler(XDptx *InstancePtr) XDPTX_INTERRUPT_STATUS); IntrStatus &= ~XDptx_ReadReg(InstancePtr->Config.BaseAddr, XDPTX_INTERRUPT_MASK); + IntrMask = XDptx_ReadReg(InstancePtr->Config.BaseAddr, + XDPTX_INTERRUPT_MASK); HpdEventDetected = IntrStatus & XDPTX_INTERRUPT_STATUS_HPD_EVENT_MASK; HpdPulseDetected = IntrStatus & XDPTX_INTERRUPT_STATUS_HPD_PULSE_DETECTED_MASK; if (HpdEventDetected) { + /* Mask interrupts while event handling is taking place. API + * will error out in case of a disconnection event anyway. */ + XDptx_WriteReg(InstancePtr->Config.BaseAddr, + XDPTX_INTERRUPT_MASK, IntrMask | + XDPTX_INTERRUPT_MASK_HPD_EVENT_MASK); + InstancePtr->HpdEventHandler(InstancePtr->HpdEventCallbackRef); } + else if (HpdPulseDetected && XDptx_IsConnected(InstancePtr)) { + /* Mask interrupts while event handling is taking place. */ + XDptx_WriteReg(InstancePtr->Config.BaseAddr, + XDPTX_INTERRUPT_MASK, IntrMask | + XDPTX_INTERRUPT_MASK_HPD_PULSE_DETECTED_MASK); - if (HpdPulseDetected) { /* The source device must debounce the incoming HPD signal by * sampling the value at an interval greater than 0.500 ms. An * HPD pulse should be of width 0.5 ms - 1.0 ms. */ @@ -158,4 +171,8 @@ void XDptx_HpdInterruptHandler(XDptx *InstancePtr) InstancePtr->HpdPulseCallbackRef); } } + + /* Unmask previously masked interrupts once handling is done. */ + XDptx_WriteReg(InstancePtr->Config.BaseAddr, XDPTX_INTERRUPT_MASK, + IntrMask); }