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; }
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; }