irqreturn_t acc_con_interrupt(int irq, void *ptr)
{
	struct acc_con_info *acc = ptr;
	int cur_state;

	ACC_CONDEV_DBG("");

	/* check the flag MHL or keyboard */
	cur_state = gpio_get_value(acc->pdata->accessory_irq_gpio);
	if (cur_state == 1) {
		if (acc->current_dock == DOCK_NONE) {
			return;
		}

		ACC_CONDEV_DBG("[30PIN] dock station detached!!!");
		switch_set_state(&acc->dock_switch, UEVENT_DOCK_NONE);
#ifdef CONFIG_SEC_KEYBOARD_DOCK
		check_keyboard_dock(false);
#endif
#ifdef CONFIG_MHL_SII9234
		/*call MHL deinit */
		if (acc->mhl_pwr_state) {
			MHD_HW_Off();
#if defined(CONFIG_MACH_SAMSUNG_P5) || (CONFIG_MACH_SAMSUNG_P5WIFI)
			hpd_force_low();
#endif
			acc->mhl_pwr_state = false;
		}
		/*TVout_LDO_ctrl(false); */
#endif
		acc_dock_check(acc, false);
		set_irq_type(irq,
			IRQF_TRIGGER_LOW | IRQF_ONESHOT);
	} else if (0 == cur_state) {

#ifdef CONFIG_SEC_KEYBOARD_DOCK
		if (check_keyboard_dock(true)) {
			acc->current_dock = DOCK_KEYBOARD;
			ACC_CONDEV_DBG("[30PIN] keyboard dock station attached!!!");
			switch_set_state(&acc->dock_switch, UEVENT_DOCK_KEYBOARD);
		}
		else
#endif
		{
#ifdef CONFIG_MHL_SII9234
			ACC_CONDEV_DBG("[30PIN] desktop dock station attached!!!");
			switch_set_state(&acc->dock_switch, UEVENT_DOCK_DESK);
			acc->current_dock = DOCK_DESK;
#endif
			if(acc->pdata->acc_power) {
				ACC_CONDEV_DBG("[30PIN] otg 5v up!!!");
				acc->pdata->acc_power(2, true);
			} else
				printk(KERN_ERR"[30PIN][ERROR] acc_power is null !!!");
		}
		if (!acc->mhl_pwr_state) {
			sii9234_tpi_init();
			acc->mhl_pwr_state = true;
		}
		acc_dock_check(acc, true);
		set_irq_type(irq,
			IRQF_TRIGGER_HIGH | IRQF_ONESHOT);
	}

	return IRQ_HANDLED;
}
Пример #2
0
irqreturn_t acc_con_interrupt(int irq, void *ptr)
{
	struct acc_con_info *acc = ptr;
	int cur_state;

	ACC_CONDEV_DBG("");

	/* check the flag MHL or keyboard */
	cur_state = gpio_get_value(acc->pdata->accessory_irq_gpio);
	if (cur_state == 1) {
		if (acc->current_dock == DOCK_NONE) {
			return IRQ_HANDLED;
		}
		irq_set_irq_type(irq,
			IRQF_TRIGGER_LOW | IRQF_ONESHOT);

		ACC_CONDEV_DBG("[30PIN] dock station detached!!!");

		switch_set_state(&acc->dock_switch, UEVENT_DOCK_NONE);
#ifdef CONFIG_SEC_KEYBOARD_DOCK
		if (acc->pdata->check_keyboard)
			acc->pdata->check_keyboard(false);
#endif
#ifndef CONFIG_MACH_SAMSUNG_P3
#ifdef CONFIG_MHL_SII9234
		/*call MHL deinit */
		if (acc->mhl_pwr_state) {
			MHD_HW_Off();
#if defined(CONFIG_MACH_SAMSUNG_P5) || defined(CONFIG_MACH_SAMSUNG_P5WIFI)
			hpd_force_low();
#endif
			acc->mhl_pwr_state = false;
			wake_unlock(&acc->mhl_wake_lock);
		}
#endif
#endif
		/*TVout_LDO_ctrl(false); */
		acc_dock_check(acc, false);

	} else if (0 == cur_state) {
		irq_set_irq_type(irq,
			IRQF_TRIGGER_HIGH | IRQF_ONESHOT);

#ifdef CONFIG_SEC_KEYBOARD_DOCK
		if (acc->pdata->check_keyboard &&
			acc->pdata->check_keyboard(true)) {
			acc->current_dock = DOCK_KEYBOARD;
			ACC_CONDEV_DBG("[30PIN] keyboard dock is attached");
			switch_set_state(&acc->dock_switch,
				UEVENT_DOCK_KEYBOARD);
		} else
#endif
		{
			ACC_CONDEV_DBG("[30PIN] desktop dock station attached!!!");
			switch_set_state(&acc->dock_switch, UEVENT_DOCK_DESK);
			acc->current_dock = DOCK_DESK;
#ifndef CONFIG_MACH_SAMSUNG_P3
#ifdef CONFIG_MHL_SII9234
			mutex_lock(&acc->lock);
			if (!acc->mhl_pwr_state) {
#ifdef	__SAMSUNG_HDMI_FLAG_WORKAROUND__
				tegra_dc_set_hdmi_flag(1);
#endif
				sii9234_tpi_init();
				acc->mhl_pwr_state = true;
				wake_lock(&acc->mhl_wake_lock);
			}
			mutex_unlock(&acc->lock);
#endif
#endif
		}
		acc_dock_check(acc, true);
	}

	return IRQ_HANDLED;
}