// returns true if video format is detected, false otherwise
bool_t VMD_DetectVideoResolution(void)
{
    bool_t format_detected = true;
    sync_info_type sync_info;
    uint8_t vid_idx;

    if (vmd_data.bReadyforVMD)
    {
        vid_idx = detect_video_resolution(&sync_info);
        vmd_data.video_index = vid_idx;

#if defined(__KERNEL__)
        gDriverContext.input_video_mode = vid_idx;
        VMD_VideoStableNotify(vid_idx);
#endif
        if(SI_VIDEO_MODE_NON_STD == vid_idx)
        {
            format_detected = false;
        }
        else if(SI_VIDEO_MODE_PC_OTHER == vid_idx)
        {
            DEBUG_PRINT(MSG_STAT, "RX: PC resolution\n");
        }
        else if(vid_idx & SI_VIDEO_MODE_3D_RESOLUTION_MASK)
        {
            print_3D_resolution();
        }
        else if(vid_idx >= NMB_OF_CEA861_VIDEO_MODES)
        {
            print_hdmi_vic_resolution();
        }
        else
        {
            // CEA-861D resolutions
            print_861_resolution();
        }

        if(format_detected)
        {
            vmd_data.pix_freq = sync_info.PixelFreq;
            save_sync_info(&sync_info);
        }
        else
        {
            VMD_ResetTimingData();
        }
    } else
    {
        // Video is not stable, no need to dectect resolution
        return false;
    }

    return format_detected;
}
void SiiRxInterruptHandler(void)
{
    uint8_t interrupts[NMB_OF_RX_INTERRUPTS];

    //DEBUG_PRINT(MSG_STAT, ("RX Interrupt detected!\n"));
    // get interrupt requests
    SiiRegReadBlock(RX_A__INTR1, &interrupts[INT1], 4);
    SiiRegReadBlock(RX_A__INTR5, &interrupts[INT5], 2);
    SiiRegReadBlock(RX_A__INTR7, &interrupts[INT7], 2);

    // do not touch interrupts which are masked out
    interrupts[INT1] &= rx_isr.shadow_interrupt_mask[INT1];
    interrupts[INT2] &= rx_isr.shadow_interrupt_mask[INT2];
    interrupts[INT3] &= rx_isr.shadow_interrupt_mask[INT3];
    interrupts[INT4] &= rx_isr.shadow_interrupt_mask[INT4];
    interrupts[INT5] &= rx_isr.shadow_interrupt_mask[INT5];
    interrupts[INT6] &= rx_isr.shadow_interrupt_mask[INT6];
    interrupts[INT7] &= rx_isr.shadow_interrupt_mask[INT7];
    interrupts[INT8] &= rx_isr.shadow_interrupt_mask[INT8];

    // Cable plug-in / plug-out interrupts are handled elsewhere
    //interrupts[INT6] &= ~RX_M__INTR6__CABLE_UNPLUG;
    //interrupts[INT8] &= ~RX_M__INTR8__CABLE_IN;

    // clear interrupt requests
    SiiRegWriteBlock(RX_A__INTR1, &interrupts[INT1], 4);
    SiiRegWriteBlock(RX_A__INTR5, &interrupts[INT5], 2);
    SiiRegWriteBlock(RX_A__INTR7, &interrupts[INT7], 2);

    if(interrupts[INT1] & RX_M__INTR1__AUTH_DONE)
    {
        DEBUG_PRINT(MSG_STAT, ("RX: Authentication done!\n"));
        switch_hdcp_failure_check_with_v_sync_rate(OFF);
    }

    if(interrupts[INT2] & RX_M__INTR2__VID_CLK_CHANGED)
    {
        rx_isr.bVidStableChgEvent = true;
        DEBUG_PRINT(MSG_STAT, ("RX: video clock change\n"));
    }

    if(interrupts[INT2] & RX_M__INTR2__SCDT)
    {
        switch_hdcp_failure_check_with_v_sync_rate(OFF);
        SiiDrvRxMuteVideo(ON);
        rx_isr.bVidStableChgEvent = true;

        if(SiiDrvRxIsSyncDetected())
        {
		// SCDT detection for vdin utility.
		printk("sii9293 irq got SCDT!\n");

            rx_isr.bScdtState = true;
#if defined(__KERNEL__)
            SiiConnectionStateNotify(true);
#endif
        }
        else
        {
		// SCDT detection for vdin utility.
			printk("sii9293 irq lost SCDT!\n");
			sii_signal_notify(0);

            rx_isr.bScdtState = false;
            SiiDrvSoftwareReset(RX_M__SRST__SRST);
            VMD_ResetTimingData();
            DEBUG_PRINT(MSG_STAT, ("RX: IDLE!\n"));


        }

    }

    if(interrupts[INT2] & RX_M__INTR2__HDMI_MODE)
    {
        DEBUG_PRINT(MSG_STAT, ("RX: HDMI mode change!\n"));
        RxIsr_HdmiDviTransition();
    }

    if(interrupts[INT2] & RX_M__INTR2__VSYNC)
    {
        hdcp_error_handler(true);
    }

    if(interrupts[INT4] & RX_M__INTR4__HDCP)
    {
        hdcp_error_handler(false);
    }

    if((interrupts[INT5] & RX_M__INTR5__AUDIO_FS_CHANGED) || (interrupts[INT6] & RX_M__INTR6__CHST_READY))
    {
        // Note: RX_M__INTR6__CHST_READY interrupt may be disabled
        //DEBUG_PRINT(MSG_STAT, ("RX: New Audio Fs\n"));
        RxAudio_OnChannelStatusChange();
    }
    if(interrupts[INT4] & RX_M__INTR4__NO_AVI)
    {
        RxInfo_NoAviHandler();
        rx_isr.bVidStableChgEvent = true;
    }

    if(interrupts[INT3] & RX_M__INTR3__NEW_AVI_PACKET)
    {
        RxInfo_InterruptHandler(INFO_AVI);
        rx_isr.bVidStableChgEvent = true;
    }

    if(interrupts[INT7] & RX_M__INTR7__NO_VSI_PACKET)
    {
        // Clear also vsif_received flag (indicating any VSIF packet detection).
        // If there is any other VSIF packet, the flag will be set again shortly.
        RxInfo_NoVsiHandler();
    }

    if(interrupts[INT7] & RX_M__INTR7__NEW_VSI_PACKET)
    {
        RxInfo_InterruptHandler(INFO_VSI);
    }

    if(interrupts[INT3] & RX_M__INTR3__NEW_AUD_PACKET)
    {
        RxInfo_InterruptHandler(INFO_AUD);
    }

    if(interrupts[INT6] & RX_M__INTR6__NEW_ACP_PACKET)
    {
        RxInfo_InterruptHandler(INFO_AUD);
    }
    if (interrupts[INT6] & RX_M__INTR6__CABLE_UNPLUG)
    {
        if (SiiRegRead(RX_A__INTR6) & RX_M__INTR6__CABLE_UNPLUG)
        {
            rx_isr.bCableChgEvent = true;
            rx_isr.bCableState = false;
            rx_isr.shadow_interrupt_mask[INT6] &= ~RX_M__INTR6__CABLE_UNPLUG;       // Disable 5v plug-out interrup
            rx_isr.shadow_interrupt_mask[INT8] |= RX_M__INTR8__CABLE_IN;            // Enable 5v plug-in interrupt
            SiiRegWrite(RX_A__INTR6_MASK, rx_isr.shadow_interrupt_mask[INT6]);
            SiiRegWrite(RX_A__INTR8_MASK, rx_isr.shadow_interrupt_mask[INT8]);
            sii9293_cable_status_notify(0);

        }

    }
    if (interrupts[INT8] & RX_M__INTR8__CABLE_IN)
    {
        if (SiiRegRead(RX_A__INTR8) & RX_M__INTR8__CABLE_IN)
        {
            rx_isr.bCableChgEvent = true;
            rx_isr.bCableState = true;
            rx_isr.shadow_interrupt_mask[INT6] |= RX_M__INTR6__CABLE_UNPLUG;        // Enable 5v plug-out interrup
            rx_isr.shadow_interrupt_mask[INT8] &= ~RX_M__INTR8__CABLE_IN;           // Disable 5v plug-in interrupt
            SiiRegWrite(RX_A__INTR6_MASK, rx_isr.shadow_interrupt_mask[INT6]);
            SiiRegWrite(RX_A__INTR8_MASK, rx_isr.shadow_interrupt_mask[INT8]);
			sii9293_cable_status_notify(1);
        }
    }
}