void MHD_HW_Off(void)
{
#ifdef	CONFIG_SAMSUNG_WORKAROUND_HPD_GLANCE
    mhl_hpd_handler(false);
#endif
    SII9234_HW_Off(SII9234_i2c_client);
}
Exemplo n.º 2
0
u8 mhl_onoff_ex(bool onoff)
{
    struct sii9234_data *sii9234 = dev_get_drvdata(sii9244_mhldev);

    if (!sii9234 || !sii9234->pdata) {
        pr_info("mhl_onoff_ex: getting resource is failed\n");
        return 2;
    }

    if (sii9234->pdata->power_state == onoff) {
        pr_info("mhl_onoff_ex: mhl already %s\n", onoff ? "on" : "off");
        return 2;
    }

    sii9234->pdata->power_state = onoff; /*save power state*/

    if (onoff) {
        if (sii9234->pdata->hw_onoff)
            sii9234->pdata->hw_onoff(1);

        if (sii9234->pdata->hw_reset)
            sii9234->pdata->hw_reset();

        mutex_lock(&sii9234->lock);
        sii9234_30pin_init_for_9290(sii9234);
        /*turn on hdm corei*/
        mhl_hpd_handler(true);
        mutex_unlock(&sii9234->lock);

    } else {

        mutex_lock(&sii9234->lock);
        /*turn off hdmi core*/
        mhl_hpd_handler(false);
        sii9234_power_down(sii9234);
        mutex_unlock(&sii9234->lock);

        if (sii9234->pdata->hw_onoff)
            sii9234->pdata->hw_onoff(0);
    }

    return sii9234->rgnd;
}
Exemplo n.º 3
0
void FSA9480_MhlSwitchSel(bool sw) 
{
	struct i2c_client *client = local_usbsw->client;
	//struct power_supply *mhl_power_supply = power_supply_get_by_name("battery");
	//	union power_supply_propval value;
    printk("[FSA] mutex_lock\n");
	//mutex_lock(&FSA9480_MhlSwitchSel_lock);//avoid race condtion between mhl and hpd
	if(sw)
	{
               sii9234_cfg_power(1);
		if (gv_intr2&0x1) //cts: fix for 3355
		{
			mhl_vbus = true;
			mhl_power_supply=1;
			local_pdata->charger_cb(FSA9480_ATTACHED);
			gv_intr2=0;
			printk("vbus_power is detected\n");
		}

		SiI9234_init();
	}
	
	else
	{
		if (tegra_dc_hdmi_hpd())
		{
			printk("[FSA] Turn off hdmi\n");
			mhl_hpd_handler(false);
		}
                      if(mhl_power_supply==1)
			{
				mhl_power_supply=0;
				local_pdata->charger_cb(FSA9480_DETACHED);
                       	}
		mhl_vbus = false;
		sii9234_cfg_power(0);	//Turn Off power to SiI9234
	}

	/********************FSA-MHL-FSA Switching start***************************/
	DisableFSA9480Interrupts();
	{
		//gpio_set_value_cansleep(GPIO_MHL_SEL, sw);
		sii9234_switch_onoff(sw);
		
		i2c_smbus_read_byte_data(client, FSA9480_REG_INT1);
	}
	EnableFSA9480Interrupts();
	/******************FSA-MHL-FSA Switching End*******************************/
	//mutex_unlock(&FSA9480_MhlSwitchSel_lock);

    printk("[FSA] mutex_unlock\n");
}
Exemplo n.º 4
0
static int s5p_hpd_irq_eint(int irq)
{

	HPDIFPRINTK("\n");

	if (hpd_struct.read_gpio()) {
		HPDIFPRINTK("gpio is high\n");
		irq_set_irq_type(hpd_struct.irq_n, IRQ_TYPE_LEVEL_LOW);
		if (atomic_read(&hpd_struct.state) == HPD_HI)
			return IRQ_HANDLED;

		atomic_set(&hpd_struct.state, HPD_HI);
		atomic_set(&poll_state, 1);

		last_hpd_state = HPD_HI;
		wake_up_interruptible(&hpd_struct.waitq);
	} else {
		HPDIFPRINTK("gpio is low\n");
		irq_set_irq_type(hpd_struct.irq_n, IRQ_TYPE_LEVEL_HIGH);
		if (atomic_read(&hpd_struct.state) == HPD_LO)
			return IRQ_HANDLED;

		atomic_set(&hpd_struct.state, HPD_LO);
		atomic_set(&poll_state, 1);

		last_hpd_state = HPD_LO;
#ifdef	CONFIG_SAMSUNG_WORKAROUND_HPD_GLANCE
		if (is_mhl_power_state_on != NULL)
			if (!is_mhl_power_state_on())
				mhl_hpd_handler(false);
#endif

#ifdef CONFIG_HDMI_CONTROLLED_BY_EXT_IC
		schedule_delayed_work(&ext_ic_control_dwork ,
				msecs_to_jiffies(1000));
#endif
		wake_up_interruptible(&hpd_struct.waitq);
	}
	schedule_work(&hpd_work);

	HPDIFPRINTK("%s\n", atomic_read(&hpd_struct.state) == HPD_HI ?
		    "HPD HI" : "HPD LO");

	return IRQ_HANDLED;
}
void sii9234_tpi_init(void)
{
    MHD_HW_Reset();

    pr_info("[HDMI]9234 init ++\n");

    sii9234_register_init();

    /* start tpi */
    WriteByteTPI(TPI_ENABLE, 0x00);	/* Write "0" to 72:C7 to
					   start HW TPI mode */

    /* enable interrupts */
    WriteIndexedRegister(INDEXED_PAGE_0, 0x78, 0x01);

    /* mhd rx connected */
    WriteIndexedRegister(INDEXED_PAGE_0,
                         0xA0, 0x10); /* TX termination enable */
    WriteByteCBUS(0x07, DDC_XLTN_TIMEOUT_MAX_VAL |
                  0x0E);	/* Increase DDC translation layer timer (burst mode) */
    WriteByteCBUS(0x47, 0x03);
    WriteByteCBUS(0x21, 0x01); /* Heartbeat Disable  */

    /* enable mhd tx */
    ReadModifyWriteTPI(TPI_SYSTEM_CONTROL_DATA_REG,
                       TMDS_OUTPUT_CONTROL_MASK, TMDS_OUTPUT_CONTROL_ACTIVE);

    /* set mhd power active mode */
    ReadModifyWriteTPI(TPI_DEVICE_POWER_STATE_CTRL_REG,
                       TX_POWER_STATE_MASK, 0x00);

    mhd_tx_fifo_stable();		/*fifo clear*/
#ifdef	CONFIG_SAMSUNG_WORKAROUND_HPD_GLANCE
    mhl_hpd_handler(true);
#endif
    pr_info("[HDMI]9234 init --\n");
}
Exemplo n.º 6
0
static int s5p_hpd_irq_hdmi(int irq)
{
	u8 flag;
	int ret = IRQ_HANDLED;
	HPDIFPRINTK("\n");

	/* read flag register */
	flag = s5p_hdmi_reg_intc_status();

	if (s5p_hdmi_reg_get_hpd_status())
		s5p_hdmi_reg_intc_clear_pending(HDMI_IRQ_HPD_PLUG);
	else
		s5p_hdmi_reg_intc_clear_pending(HDMI_IRQ_HPD_UNPLUG);

	s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_UNPLUG, 0);
	s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_PLUG, 0);

	/* is this our interrupt? */
	if (!(flag & (1 << HDMI_IRQ_HPD_PLUG | 1 << HDMI_IRQ_HPD_UNPLUG))) {
		printk(KERN_WARNING "%s() flag is wrong : 0x%x\n",
		       __func__, flag);
		ret = IRQ_NONE;

		goto out;
	}

	if (flag == (1 << HDMI_IRQ_HPD_PLUG | 1 << HDMI_IRQ_HPD_UNPLUG)) {
		HPDIFPRINTK("HPD_HI && HPD_LO\n");

		if (last_hpd_state == HPD_HI && s5p_hdmi_reg_get_hpd_status())
			flag = 1 << HDMI_IRQ_HPD_UNPLUG;
		else
			flag = 1 << HDMI_IRQ_HPD_PLUG;
	}

	if (flag & (1 << HDMI_IRQ_HPD_PLUG)) {
		HPDIFPRINTK("HPD_HI\n");

		s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_UNPLUG, 1);
		if (atomic_read(&hpd_struct.state) == HPD_HI)
			return IRQ_HANDLED;

		atomic_set(&hpd_struct.state, HPD_HI);
		atomic_set(&poll_state, 1);

		last_hpd_state = HPD_HI;
		wake_up_interruptible(&hpd_struct.waitq);

	} else if (flag & (1 << HDMI_IRQ_HPD_UNPLUG)) {
		HPDIFPRINTK("HPD_LO\n");

		s5p_hdcp_stop();

		s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_PLUG, 1);
		if (atomic_read(&hpd_struct.state) == HPD_LO)
			return IRQ_HANDLED;

		atomic_set(&hpd_struct.state, HPD_LO);
		atomic_set(&poll_state, 1);

		last_hpd_state = HPD_LO;
#ifdef	CONFIG_SAMSUNG_WORKAROUND_HPD_GLANCE
		if (is_mhl_power_state_on != NULL)
			if (!is_mhl_power_state_on())
				mhl_hpd_handler(false);
#endif
#ifdef CONFIG_HDMI_CONTROLLED_BY_EXT_IC
		schedule_delayed_work(&ext_ic_control_dwork ,
				msecs_to_jiffies(1000));
#endif

		wake_up_interruptible(&hpd_struct.waitq);
	}

	schedule_work(&hpd_work);

 out:
	return IRQ_HANDLED;
}