struct delayed_work work;
struct hdmi *hdmi;
int event;
+ int sync;
void *data;
};
static int uboot_vic;
static void hdmi_work_queue(struct work_struct *work);
-struct delayed_work *hdmi_submit_work(struct hdmi *hdmi,
- int event, int delay, void *data)
+void hdmi_submit_work(struct hdmi *hdmi,
+ int event, int delay, int sync)
{
struct hdmi_delayed_work *work;
- DBG("%s event %04x delay %d\n", __func__, event, delay);
+ DBG("%s event %04x delay %d sync %d\n",
+ __func__, event, delay, sync);
work = kmalloc(sizeof(*work), GFP_ATOMIC);
INIT_DELAYED_WORK(&work->work, hdmi_work_queue);
work->hdmi = hdmi;
work->event = event;
- work->data = data;
+ work->data = NULL;
+ work->sync = sync;
queue_delayed_work(hdmi->workqueue,
&work->work,
msecs_to_jiffies(delay));
+ if (sync) {
+ flush_delayed_work(&work->work);
+ kfree(work);
+ }
} else {
pr_warn("HDMI: Cannot allocate memory to create work\n");
- return 0;
}
-
- return &work->work;
}
static void hdmi_send_uevent(struct hdmi *hdmi, int uevent)
#endif
hdmi_wq_set_audio(hdmi);
hdmi_wq_set_output(hdmi, hdmi->mute);
- hdmi_submit_work(hdmi, HDMI_ENABLE_HDCP, 100, NULL);
+ hdmi_submit_work(hdmi, HDMI_ENABLE_HDCP, 100, 0);
if (hdmi->ops->setcec)
hdmi->ops->setcec(hdmi);
}
}
kfree(hdmi_w->data);
- kfree(hdmi_w);
+ if (!hdmi_w->sync)
+ kfree(hdmi_w);
DBG("\nhdmi_work_queue() - exit evt= %x %d\n",
(event & 0xFF00) >> 8,
}*/
memcpy(&hdmi->audio, audio, sizeof(struct hdmi_audio));
if (hdmi->hotplug == HDMI_HPD_ACTIVED)
- hdmi_submit_work(hdmi, HDMI_SET_AUDIO, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_SET_AUDIO, 0, 0);
}
return 0;
}
hdmi = ref_info[i].hdmi;
if (mute)
- hdmi_submit_work(hdmi, HDMI_MUTE_AUDIO, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_MUTE_AUDIO, 0, 0);
else
- hdmi_submit_work(hdmi, HDMI_UNMUTE_AUDIO, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_UNMUTE_AUDIO, 0, 0);
}
}
struct hdmi *hdmi = device->priv_data;
if (enable == 0)
- hdmi_submit_work(hdmi, HDMI_DISABLE_CTL, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_DISABLE_CTL, 0, 0);
else
- hdmi_submit_work(hdmi, HDMI_ENABLE_CTL, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_ENABLE_CTL, 0, 0);
return 0;
}
if (vic && hdmi->vic != vic) {
hdmi->vic = vic;
if (hdmi->hotplug == HDMI_HPD_ACTIVED)
- hdmi_submit_work(hdmi, HDMI_SET_VIDEO, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_SET_VIDEO, 0, 0);
}
return 0;
}
if (hdmi->mode_3d != mode) {
hdmi->mode_3d = mode;
if (hdmi->hotplug == HDMI_HPD_ACTIVED)
- hdmi_submit_work(hdmi, HDMI_SET_3D, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_SET_3D, 0, 0);
}
return 0;
}
return -1;
}
if (hdmi->hotplug == HDMI_HPD_ACTIVED)
- hdmi_submit_work(hdmi, HDMI_SET_COLOR, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_SET_COLOR, 0, 0);
return 0;
}
struct hdmi *rockchip_hdmi_register(struct hdmi_property *property,
struct hdmi_ops *ops);
void rockchip_hdmi_unregister(struct hdmi *hdmi);
-struct delayed_work *hdmi_submit_work(struct hdmi *hdmi,
- int event, int delay, void *data);
+void hdmi_submit_work(struct hdmi *hdmi,
+ int event, int delay, int sync);
struct rk_display_device *hdmi_register_display_sysfs(struct hdmi *hdmi,
struct device *parent);
static void rockchip_hdmiv1_early_suspend(void)
{
struct hdmi *hdmi_drv = hdmi_dev->hdmi;
- struct delayed_work *delay_work;
dev_info(hdmi_drv->dev, "hdmi suspend\n");
- delay_work = hdmi_submit_work(hdmi_drv,
- HDMI_SUSPEND_CTL, 0, NULL);
- if (delay_work)
- flush_delayed_work(delay_work);
+ hdmi_submit_work(hdmi_drv,
+ HDMI_SUSPEND_CTL, 0, 1);
mutex_lock(&hdmi_drv->lock);
if (hdmi_dev->irq)
disable_irq(hdmi_dev->irq);
enable_irq(hdmi_dev->irq);
}
mutex_unlock(&hdmi_drv->lock);
- hdmi_submit_work(hdmi_drv, HDMI_RESUME_CTL, 0, NULL);
+ hdmi_submit_work(hdmi_drv, HDMI_RESUME_CTL, 0, 0);
}
static int rockchip_hdmiv1_fb_event_notify(struct notifier_block *self,
{
int ret;
struct resource *res;
- struct delayed_work *delay_work;
hdmi_dev = devm_kzalloc(&pdev->dev,
sizeof(struct hdmi_dev),
rockchip_hdmiv1_initial(hdmi_dev->hdmi);
rk_display_device_enable(hdmi_dev->hdmi->ddev);
- delay_work = hdmi_submit_work(hdmi_dev->hdmi,
- HDMI_HPD_CHANGE, 0, NULL);
- if (delay_work)
- flush_delayed_work(delay_work);
+ hdmi_submit_work(hdmi_dev->hdmi, HDMI_HPD_CHANGE, 0, 1);
#if defined(CONFIG_DEBUG_FS)
hdmi_dev->debugfs_dir = debugfs_create_dir("rockchip_hdmiv1", NULL);
hdmi_msk_reg(hdmi_dev, HDMI_STATUS,
m_MASK_INT_HOTPLUG, v_MASK_INT_HOTPLUG(1));
}
- hdmi_submit_work(hdmi_drv, HDMI_HPD_CHANGE, 10, NULL);
+ hdmi_submit_work(hdmi_drv, HDMI_HPD_CHANGE, 10, 0);
return 0;
}
if (interrupt)
hdmi_writel(hdmi_dev, HDMI_STATUS, interrupt);
if (interrupt & m_INT_HOTPLUG)
- hdmi_submit_work(hdmi_drv, HDMI_HPD_CHANGE, 20, NULL);
+ hdmi_submit_work(hdmi_drv, HDMI_HPD_CHANGE, 20, 0);
if (hdmi_drv->ops->hdcp_irq_cb)
hdmi_drv->ops->hdcp_irq_cb(0);
static void rockchip_hdmiv2_early_suspend(struct early_suspend *h)
{
struct hdmi *hdmi = hdmi_dev->hdmi;
- struct delay_work *delay_work;
struct pinctrl_state *gpio_state;
HDMIDBG("hdmi enter early suspend\n");
- delay_work = hdmi_submit_work(hdmi, HDMI_SUSPEND_CTL, 0, NULL);
- if (delay_work)
- flush_delayed_work_sync(delay_work);
+ hdmi_submit_work(hdmi, HDMI_SUSPEND_CTL, 0, 1);
/* iomux to gpio and pull down when suspend */
gpio_state = pinctrl_lookup_state(hdmi_dev->dev->pins->p, "gpio");
pinctrl_select_state(hdmi_dev->dev->pins->p, gpio_state);
hdmi_dev_initial(hdmi_dev);
if (hdmi->ops->hdcp_power_on_cb)
hdmi->ops->hdcp_power_on_cb();
- hdmi_submit_work(hdmi, HDMI_RESUME_CTL, 0, NULL);
+ hdmi_submit_work(hdmi, HDMI_RESUME_CTL, 0, 0);
}
#endif
struct fb_event *event = data;
int blank_mode = *((int *)event->data);
struct hdmi *hdmi = hdmi_dev->hdmi;
- struct delayed_work *delay_work;
struct pinctrl_state *gpio_state;
#ifdef CONFIG_PINCTRL
struct dev_pin_info *pins = hdmi_dev->dev->pins;
default:
HDMIDBG("suspend hdmi\n");
if (!hdmi->sleep) {
- delay_work =
- hdmi_submit_work(hdmi,
- HDMI_SUSPEND_CTL,
- 0, NULL);
- if (delay_work)
- flush_delayed_work(delay_work);
+ hdmi_submit_work(hdmi,
+ HDMI_SUSPEND_CTL,
+ 0, 1);
if (hdmi_dev->hdcp2_en)
hdmi_dev->hdcp2_en(0);
rockchip_hdmiv2_clk_disable(hdmi_dev);
if (hdmi_dev->hdcp2_en)
hdmi_dev->hdcp2_en(1);
hdmi_submit_work(hdmi, HDMI_RESUME_CTL,
- 0, NULL);
+ 0, 0);
}
break;
default:
if (hdcp_int & m_KSVSHA1_CALC_INT) {
pr_info("hdcp sink is a repeater\n");
- hdmi_submit_work(hdcp->hdmi, HDMI_HDCP_AUTH_2ND, 0, NULL);
+ hdmi_submit_work(hdcp->hdmi, HDMI_HDCP_AUTH_2ND, 0, 0);
}
if (hdcp_int & 0x40) {
pr_info("hdcp check failed\n");
rockchip_hdmiv2_hdcp_stop(hdmi_dev->hdmi);
- hdmi_submit_work(hdcp->hdmi, HDMI_ENABLE_HDCP, 0, NULL);
+ hdmi_submit_work(hdcp->hdmi, HDMI_ENABLE_HDCP, 0, 0);
}
}
if (hdcp->enable != enable) {
if (!hdcp->enable)
- hdmi_submit_work(hdcp->hdmi, HDMI_ENABLE_HDCP, 0, NULL);
+ hdmi_submit_work(hdcp->hdmi, HDMI_ENABLE_HDCP, 0, 0);
else
rockchip_hdmiv2_hdcp_stop(hdcp->hdmi);
hdcp->enable = enable;
hdmi_writel(hdmi_dev, IH_MUTE, 0x00);
hdmi_dev->enable = 1;
}
- hdmi_submit_work(hdmi, HDMI_HPD_CHANGE, 10, NULL);
+ hdmi_submit_work(hdmi, HDMI_HPD_CHANGE, 10, 0);
return 0;
}
hdmi_writel(hdmi_dev, PHY_POL0, phy_pol);
hdmi_writel(hdmi_dev, IH_PHY_STAT0, phy_int);
if ((phy_int & m_HPD) || ((phy_int & 0x3c) == 0x3c))
- hdmi_submit_work(hdmi, HDMI_HPD_CHANGE, 20, NULL);
+ hdmi_submit_work(hdmi, HDMI_HPD_CHANGE, 20, 0);
}
/* Audio error */