int s5p_hpd_set_hdmiint(void) { /* EINT -> HDMI */ HPDIFPRINTK("\n"); set_irq_type(hpd_struct.irq_n, IRQ_TYPE_NONE); if (last_hpd_state) s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_UNPLUG, 0); else s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_PLUG, 0); atomic_set(&hdmi_status, HDMI_ON); hpd_struct.int_src_hdmi_hpd(); s5p_hdmi_reg_hpd_gen(); if (s5p_hdmi_reg_get_hpd_status()) s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_UNPLUG, 1); else s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_PLUG, 1); return 0; }
int s5p_hpd_set_eint(void) { HPDIFPRINTK("\n"); /* HDMI -> EINT */ atomic_set(&hdmi_status, HDMI_OFF); s5p_hdmi_reg_intc_clear_pending(HDMI_IRQ_HPD_PLUG); s5p_hdmi_reg_intc_clear_pending(HDMI_IRQ_HPD_UNPLUG); s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_PLUG, 0); s5p_hdmi_reg_intc_enable(HDMI_IRQ_HPD_UNPLUG, 0); hpd_struct.int_src_ext_hpd(); return 0; }
static irqreturn_t s5p_hpd_irq_default_handler(int irq, void *dev_id) { u8 flag; 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); if (flag & (1 << HDMI_IRQ_HPD_PLUG)) HPDIFPRINTK("HPD_HI\n"); else if (flag & (1 << HDMI_IRQ_HPD_UNPLUG)) HPDIFPRINTK("HPD_LO\n"); else HPDIFPRINTK("UNKNOWN EVENT\n"); return IRQ_HANDLED; }
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))) { 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)) { 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); //s5p_hdcp_encrypt_stop(true); HPDIFPRINTK("HPD_HI\n"); } else if (flag & (1 << HDMI_IRQ_HPD_UNPLUG)) { //s5p_hdcp_encrypt_stop(false); 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; wake_up_interruptible(&hpd_struct.waitq); HPDIFPRINTK("HPD_LO\n"); } schedule_work(&hpd_work); out: return IRQ_HANDLED; }
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; }