Esempio n. 1
0
static int sii9244_power_init(struct sii9244_data *sii9244)
{
	int ret;

	/* Force the sii9244 into the D0 state. */
	ret = tpi_write_reg(sii9244, TPI_DPD_REG, 0x3F);
	if (ret < 0)
		return ret;

	/* Enable TxPLL Clock */
	ret = hdmi_rx_write_reg(sii9244, HDMI_RX_TMDS_CLK_EN_REG, 0x01);
	if (ret < 0)
		return ret;

	/* Enable Tx Clock Path & Equalizer*/
	ret = hdmi_rx_write_reg(sii9244, HDMI_RX_TMDS_CH_EN_REG, 0x15);
	if (ret < 0)
		return ret;

	/* Power Up TMDS*/
	ret = mhl_tx_write_reg(sii9244, 0x08, 0x35);
	if (ret < 0)
		return ret;

	return 0;
}
Esempio n. 2
0
static void sii9234_power_down(struct sii9234_data *sii9234)
{
    if (sii9234->pdata->vbus_present)
        sii9234->pdata->vbus_present(false);

    tpi_write_reg(sii9234, TPI_DPD_REG, 0);
    /*turn on&off hpd festure for only QCT HDMI*/
}
Esempio n. 3
0
static void sii9244_power_down(struct sii9244_data *sii9244)
{
	if (sii9244->claimed)
		sii9234_vbus_present(false);

	sii9244->state = STATE_DISCONNECTED;
	sii9244->claimed = false;

	tpi_write_reg(sii9244, TPI_DPD_REG, 0);

	sii9244_power(sii9244, 0);
	sii9244_enable(sii9244, 0);
}
Esempio n. 4
0
void hdcp_handler(u8 intr)
{
    u8 QueryData;
    u8 LinkStatus;
    u8 RegImage;
    u8 NewLinkProtectionLevel;

    IN_FUNCTION;

    if (false == hdmi.connected) {
        return;
    }

    logd("TPI_SYSTEM_CONTROL_DATA_REG(0x1A):0x%x\n", tpi_read_reg(TPI_SYSTEM_CONTROL_DATA_REG));

    if (hw_support_mhl()) {
        intr = tpi_read_reg(TPI_INTERRUPT_STATUS_REG);
    }
    logd("TPI_INTERRUPT_STATUS_REG:0x%x\n", intr);
    //Clear Interrupt Status.
    if (intr & (~(BIT2 | BIT3))) {
        tpi_write_reg(TPI_INTERRUPT_STATUS_REG, intr & (~(BIT2 | BIT3)));
    }

    if (!hdcp_para.hdcp_enable) {
        tpi_modify_reg(TPI_SYSTEM_CONTROL_DATA_REG, AV_MUTE_MASK, AV_MUTE_NORMAL);
        logd("hdcp is not enabled.\n");
        return;
    }

    if (!hdcp_para.tx_supports || !hdcp_para.askv_valid) {
        return;
    }

    if ((hdcp_para.link_protection_level == (EXTENDED_LINK_PROTECTION_NONE | LOCAL_LINK_PROTECTION_NONE))
        && (!hdcp_para.started)) {
        QueryData = tpi_read_reg(TPI_HDCP_QUERY_DATA_REG);
        logd("TPI_HDCP_QUERY_DATA_REG(0x29): 0x%x\n", QueryData);
        if (QueryData & PROTECTION_TYPE_MASK) {  // Is HDCP avaialable
            hdcp_on();
        }
    }

    // Check if Link Status has changed:
    if (intr & SECURITY_CHANGE_EVENT) {
        logi("HDCP -> ");

        LinkStatus  = tpi_read_reg(TPI_HDCP_QUERY_DATA_REG);
        LinkStatus &= LINK_STATUS_MASK;

        switch (LinkStatus)
        {
            case LINK_STATUS_NORMAL:
                logi("Link = Normal\n");
                break;

            case LINK_STATUS_LINK_LOST:
                logi("Link = Lost\n");
                restart_hdcp();
                break;

            case LINK_STATUS_RENEGOTIATION_REQ:
                logi("Link = Renegotiation Required\n");
                restart_hdcp();
                break;

            case LINK_STATUS_LINK_SUSPENDED:
                logi("Link = Suspended\n");
                tpi_modify_reg(TPI_SYSTEM_CONTROL_DATA_REG, LINK_INTEGRITY_MODE_MASK,
                    LINK_INTEGRITY_DYNAMIC);
                restart_hdcp();
                break;
        }
    }

    // Check if HDCP state has changed:
    if (intr & HDCP_CHANGE_EVENT) {
        RegImage = tpi_read_reg(TPI_HDCP_QUERY_DATA_REG);

        NewLinkProtectionLevel = RegImage & (EXTENDED_LINK_PROTECTION_MASK | LOCAL_LINK_PROTECTION_MASK);
        if (NewLinkProtectionLevel != hdcp_para.link_protection_level) {
            logi("HDCP -> ");

            hdcp_para.link_protection_level = NewLinkProtectionLevel;

            switch (hdcp_para.link_protection_level)
            {
                case (EXTENDED_LINK_PROTECTION_NONE | LOCAL_LINK_PROTECTION_NONE):
                    logi("Protection = None\n");
                    hdcp_para.hdcp_notify(HDCP_AUTH_FAILED);
                    break;

                case LOCAL_LINK_PROTECTION_SECURE:
                    hdcp_para.hdcp_notify(HDCP_AUTH_SUCCESS);
                    tpi_modify_reg(TPI_SYSTEM_CONTROL_DATA_REG, AV_MUTE_MASK, AV_MUTE_NORMAL);
                    logi("Protection = Local, Video Unmuted\n");
                    break;

                case (EXTENDED_LINK_PROTECTION_SECURE | LOCAL_LINK_PROTECTION_SECURE):
                    hdcp_para.hdcp_notify(HDCP_AUTH_SUCCESS);
                    logi("Protection = Extended\n");
                    tpi_modify_reg(TPI_SYSTEM_CONTROL_DATA_REG, AV_MUTE_MASK, AV_MUTE_NORMAL);
                    break;

                default:
                    hdcp_para.hdcp_notify(HDCP_AUTH_FAILED);
                    logi("Protection = Extended but not Local?\n");
                    break;
            }
        }
    }

    OUT_FUNCTION;
}
Esempio n. 5
0
static int sii9234_30pin_reg_init_for_9290(struct sii9234_data *sii9234)
{
    int ret = 0;
    u8 value;
    pr_info("[: %s]++\n", __func__);
    ret = tpi_write_reg(sii9234, 0x3D, 0x3F);
    if (ret < 0)
        return ret;

    ret = hdmi_rx_write_reg(sii9234, 0x11, 0x01);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x12, 0x15);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0x08, 0x35);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x00, 0x00);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x13, 0x60);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x14, 0xF0);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x4B, 0x06);
    if (ret < 0)
        return ret;

    /* Analog PLL Control */
    ret = hdmi_rx_write_reg(sii9234, 0x17, 0x07);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x1A, 0x20);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x22, 0xE0);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x23, 0xC0);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x24, 0xA0);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x25, 0x80);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x26, 0x60);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x27, 0x40);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x28, 0x20);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x29, 0x00);
    if (ret < 0)
        return ret;

    ret = hdmi_rx_write_reg(sii9234, 0x4D, 0x02);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x4C, 0xA0);
    if (ret < 0)
        return ret;

    ret = mhl_tx_write_reg(sii9234, 0x80, 0x34);
    if (ret < 0)
        return ret;

    ret = hdmi_rx_write_reg(sii9234, 0x31, 0x0B);
    if (ret < 0)
        return ret;
    ret = hdmi_rx_write_reg(sii9234, 0x45, 0x06);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0xA0, 0xD0);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0xA1, 0xFC);
    if (ret < 0)
        return ret;

    ret = mhl_tx_write_reg(sii9234, 0xA3 /*MHL_TX_MHLTX_CTL4_REG*/,
                           sii9234->pdata->swing_level);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0xA6, 0x00);
    if (ret < 0)
        return ret;

    ret = mhl_tx_write_reg(sii9234, 0x2B, 0x01);
    if (ret < 0)
        return ret;

    /* CBUS & Discovery */
    ret = mhl_tx_read_reg(sii9234, 0x90/*MHL_TX_DISC_CTRL1_REG*/, &value);
    if (ret < 0)
        return ret;
    value &= ~(1<<2);
    value |= (1<<3);
    ret = mhl_tx_write_reg(sii9234, 0x90 /*MHL_TX_DISC_CTRL1_REG*/, value);
    if (ret < 0)
        return ret;

    ret = mhl_tx_write_reg(sii9234, 0x91, 0xE5);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0x94, 0x66);
    if (ret < 0)
        return ret;

    ret = cbus_read_reg(sii9234, 0x31, &value);
    if (ret < 0)
        return ret;
    value |= 0x0C;
    if (ret < 0)
        return ret;
    ret = cbus_write_reg(sii9234, 0x31, value);
    if (ret < 0)
        return ret;

    ret = mhl_tx_write_reg(sii9234, 0xA5, 0x80);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0x95, 0x31);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0x96, 0x22);
    if (ret < 0)
        return ret;

    ret = mhl_tx_read_reg(sii9234, 0x95/*MHL_TX_DISC_CTRL6_REG*/, &value);
    if (ret < 0)
        return ret;
    value |= (1<<6);
    ret = mhl_tx_write_reg(sii9234,  0x95/*MHL_TX_DISC_CTRL6_REG*/, value);
    if (ret < 0)
        return ret;

    ret = mhl_tx_write_reg(sii9234, 0x92, 0x46);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0x93, 0xDC);
    if (ret < 0)
        return ret;
    /*0x79=MHL_TX_INT_CTRL_REG*/
    ret = mhl_tx_clear_reg(sii9234, 0x79, (1<<2) | (1<<1));
    if (ret < 0)
        return ret;

    mdelay(25);
    /*0x95=MHL_TX_DISC_CTRL6_REG*/
    ret = mhl_tx_clear_reg(sii9234,  0x95, (1<<6)/*USB_ID_OVR*/);
    if (ret < 0)
        return ret;

    ret = mhl_tx_write_reg(sii9234, 0x90, 0x27);
    if (ret < 0)
        return ret;

    ret = sii9234_cbus_init_for_9290(sii9234);
    if (ret < 0)
        return ret;

    ret = mhl_tx_write_reg(sii9234, 0x05, 0x4);
    if (ret < 0)
        return ret;
    ret = mhl_tx_write_reg(sii9234, 0x0D, 0x1C);
    pr_info("[MHD: %s]--\n", __func__);
    return ret;
}