static void __maybe_unused rk616_irq_work_func(struct work_struct *work) { if((hdmi->suspend == 0) && (hdmi->enable == 1)) { rk616_hdmi_work(); } dev_info(hdmi->dev, "func: %s, enable_irq\n", __func__); enable_irq(hdmi->irq); }
static void rk616_delay_work_func(struct work_struct *work) { struct rk616_hdmi *rk616_hdmi; rk616_hdmi = container_of(hdmi, struct rk616_hdmi, g_hdmi); if(hdmi->suspend == 0) { if(hdmi->enable == 1) { //hdmi_irq(); rk616_hdmi_work(); } if (rk616_hdmi->rk616_drv && rk616_hdmi->rk616_drv->pdata->hdmi_irq == INVALID_GPIO) { queue_delayed_work(hdmi->workqueue, &rk616_hdmi->rk616_delay_work, 50); } } }
static irqreturn_t rk616_hdmi_irq(int irq, void *dev_id) { struct work_struct *rk616_irq_work_struct; struct rk616_hdmi *rk616_hdmi; rk616_hdmi = container_of(hdmi, struct rk616_hdmi, g_hdmi); if(rk616_hdmi->rk616_drv) { rk616_irq_work_struct = dev_id; disable_irq_nosync(hdmi->irq); queue_work(hdmi->workqueue, rk616_irq_work_struct); } else { /* 3028a hdmi */ if((hdmi->suspend == 0) && (hdmi->enable == 1)) { printk(KERN_INFO "line = %d, rk616_hdmi_irq irq triggered.\n", __LINE__); rk616_hdmi_work(); } } return IRQ_HANDLED; }
static void hdmi_early_resume(struct early_suspend *h) { struct rk616_hdmi *rk616_hdmi; rk616_hdmi = container_of(hdmi, struct rk616_hdmi, g_hdmi); hdmi_dbg(hdmi->dev, "hdmi exit early resume\n"); mutex_lock(&hdmi->enable_mutex); hdmi->suspend = 0; rk616_hdmi_initial(); if(hdmi->enable && hdmi->irq) { enable_irq(hdmi->irq); // hdmi_irq(); rk616_hdmi_work(); } if (rk616_hdmi->rk616_drv && rk616_hdmi->rk616_drv->pdata->hdmi_irq == INVALID_GPIO) queue_delayed_work(hdmi->workqueue, &rk616_hdmi->rk616_delay_work, 100); queue_delayed_work(hdmi->workqueue, &hdmi->delay_work, msecs_to_jiffies(10)); mutex_unlock(&hdmi->enable_mutex); return; }