Skip to content

Commit

Permalink
hdmirx: report source change on change in AVI infoframe
Browse files Browse the repository at this point in the history
Currently change in color format which is transmitted through
AVI infoframe is not notified to userspace. Notify now through
source change event.

Signed-off-by: Subhransu S. Prusty <subhransu.sekhar.prusty@xilinx.com>
  • Loading branch information
subhransu-xilinx authored and vishals-xlnx committed Oct 28, 2020
1 parent 28d51cf commit 23bb4aa
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
25 changes: 25 additions & 0 deletions hdmi/xilinx-hdmi-rx/xv_hdmirxss.c
Expand Up @@ -863,11 +863,13 @@ static void XV_HdmiRxSs_AuxCallback(void *CallbackRef)
XV_HdmiRxSs *HdmiRxSsPtr = (XV_HdmiRxSs *)CallbackRef;
XHdmiC_Aux *AuxPtr;
XHdmiC_AVI_InfoFrame *AviInfoFramePtr;
XHdmiC_AVI_InfoFrame *AviInfoFramePrevPtr;
XHdmiC_GeneralControlPacket *GeneralControlPacketPtr;
XHdmiC_AudioInfoFrame *AudioInfoFramePtr;
struct v4l2_hdr10_payload *DrmInfoFramePtr;

AviInfoFramePtr = XV_HdmiRxSs_GetAviInfoframe(HdmiRxSsPtr);
AviInfoFramePrevPtr = XV_HdmiRxSs_GetAviInfoframePrev(HdmiRxSsPtr);
GeneralControlPacketPtr = XV_HdmiRxSs_GetGCP(HdmiRxSsPtr);
AudioInfoFramePtr = XV_HdmiRxSs_GetAudioInfoframe(HdmiRxSsPtr);
DrmInfoFramePtr = XV_HdmiRxSs_GetDrmInfoframe(HdmiRxSsPtr);
Expand All @@ -877,10 +879,18 @@ static void XV_HdmiRxSs_AuxCallback(void *CallbackRef)
// Retrieve Vendor Specific Info Frame
XV_HdmiRxSs_RetrieveVSInfoframe(HdmiRxSsPtr);
} else if(AuxPtr->Header.Byte[0] == AUX_AVI_INFOFRAME_TYPE){

// Reset Avi InfoFrame
(void)memset((void *)AviInfoFramePtr, 0, sizeof(XHdmiC_AVI_InfoFrame));
// Parse Aux to retrieve Avi InfoFrame
XV_HdmiC_ParseAVIInfoFrame(AuxPtr, AviInfoFramePtr);
if (memcmp(AviInfoFramePrevPtr, AviInfoFramePtr,
sizeof(XHdmiC_AVI_InfoFrame))) {
memcpy(AviInfoFramePrevPtr, AviInfoFramePtr,
sizeof(XHdmiC_AVI_InfoFrame));
HdmiRxSsPtr->AVIInfoChanged = true;
}

HdmiRxSsPtr->HdmiRxPtr->Stream.Video.ColorFormatId =
XV_HdmiRx_GetAviColorSpace(HdmiRxSsPtr->HdmiRxPtr);
HdmiRxSsPtr->HdmiRxPtr->Stream.Vic =
Expand Down Expand Up @@ -1706,6 +1716,21 @@ XHdmiC_AVI_InfoFrame *XV_HdmiRxSs_GetAviInfoframe(XV_HdmiRxSs *InstancePtr)
return (&(InstancePtr->AVIInfoframe));
}

XHdmiC_AVI_InfoFrame *XV_HdmiRxSs_GetAviInfoframePrev(XV_HdmiRxSs *InstancePtr)
{
return (&(InstancePtr->AVIInfoframePrev));
}

/* Clear on read */
bool IsAVIInfoFrameChanged(XV_HdmiRxSs *InstancePtr) {
bool status = false;

status = InstancePtr->AVIInfoChanged;
InstancePtr->AVIInfoChanged = false;

return status;
}

/*****************************************************************************/
/**
*
Expand Down
4 changes: 4 additions & 0 deletions hdmi/xilinx-hdmi-rx/xv_hdmirxss.h
Expand Up @@ -446,6 +446,8 @@ typedef struct
u8 TMDSClockRatio; /**< HDMI RX TMDS clock ratio */

XHdmiC_AVI_InfoFrame AVIInfoframe; /**< AVI InfoFrame */
XHdmiC_AVI_InfoFrame AVIInfoframePrev; /**< AVI InfoFrame */
bool AVIInfoChanged;
XHdmiC_GeneralControlPacket GCP; /**< General Control Packet */
XHdmiC_AudioInfoFrame AudioInfoframe; /**< Audio InfoFrame */
XHdmiC_VSIF VSIF; /**< Vendor Specific InfoFrame */
Expand Down Expand Up @@ -510,6 +512,8 @@ void XV_HdmiRxSs_SetHpd(XV_HdmiRxSs *InstancePtr, u8 Value);
void XV_HdmiRxSs_ToggleHpd(XV_HdmiRxSs *InstancePtr);
XHdmiC_Aux *XV_HdmiRxSs_GetAuxiliary(XV_HdmiRxSs *InstancePtr);
XHdmiC_AVI_InfoFrame *XV_HdmiRxSs_GetAviInfoframe(XV_HdmiRxSs *InstancePtr);
XHdmiC_AVI_InfoFrame *XV_HdmiRxSs_GetAviInfoframePrev(XV_HdmiRxSs *InstancePtr);
bool IsAVIInfoFrameChanged(XV_HdmiRxSs *InstancePtr);
XHdmiC_AudioInfoFrame *XV_HdmiRxSs_GetAudioInfoframe(XV_HdmiRxSs *InstancePtr);
struct v4l2_hdr10_payload *XV_HdmiRxSs_GetDrmInfoframe(XV_HdmiRxSs *InstancePtr);
XHdmiC_VSIF *XV_HdmiRxSs_GetVSIF(XV_HdmiRxSs *InstancePtr);
Expand Down
11 changes: 11 additions & 0 deletions hdmi/xilinx-hdmirx.c
Expand Up @@ -1233,6 +1233,8 @@ static void RxAuxCallback(void *CallbackRef)
XV_HdmiRxSs *HdmiRxSsPtr = &xhdmi->xv_hdmirxss;
XHdmiC_Aux *AuxPtr;
XHdmiC_Aux AuxFifo;
bool AviInfoFrameChangeStatus = false;
unsigned long flags;

AuxPtr = XV_HdmiRxSs_GetAuxiliary(HdmiRxSsPtr);

Expand All @@ -1243,6 +1245,15 @@ static void RxAuxCallback(void *CallbackRef)
if (AuxPtr->Header.Byte[0] != AUX_GENERAL_CONTROL_PACKET_TYPE) {
memcpy(&AuxFifo, AuxPtr, sizeof(XHdmiC_Aux));
}

spin_lock_irqsave(&xhdmi->irq_lock, flags);
AviInfoFrameChangeStatus = IsAVIInfoFrameChanged(HdmiRxSsPtr);
spin_unlock_irqrestore(&xhdmi->irq_lock, flags);

if (AviInfoFrameChangeStatus &&
XV_HdmiRxSs_IsStreamUp(HdmiRxSsPtr)) {
RxStreamUpCallback(CallbackRef);
}
//ToDO: Insert registered ALSA driver callback
}

Expand Down

0 comments on commit 23bb4aa

Please sign in to comment.