mirror of https://gitee.com/openkylin/linux.git
drm/rockchip: Nuke pending event handling in preclose
This is now handled by the core, drivers can totally ignore lifetime issues of drm events. Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com> Cc: Mark yao <mark.yao@rock-chips.com> Tested-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1465388359-8070-11-git-send-email-daniel.vetter@ffwll.ch
This commit is contained in:
parent
893b6cad4d
commit
7442148e51
|
@ -263,27 +263,6 @@ static void rockchip_drm_unbind(struct device *dev)
|
||||||
dev_set_drvdata(dev, NULL);
|
dev_set_drvdata(dev, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rockchip_drm_crtc_cancel_pending_vblank(struct drm_crtc *crtc,
|
|
||||||
struct drm_file *file_priv)
|
|
||||||
{
|
|
||||||
struct rockchip_drm_private *priv = crtc->dev->dev_private;
|
|
||||||
int pipe = drm_crtc_index(crtc);
|
|
||||||
|
|
||||||
if (pipe < ROCKCHIP_MAX_CRTC &&
|
|
||||||
priv->crtc_funcs[pipe] &&
|
|
||||||
priv->crtc_funcs[pipe]->cancel_pending_vblank)
|
|
||||||
priv->crtc_funcs[pipe]->cancel_pending_vblank(crtc, file_priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rockchip_drm_preclose(struct drm_device *dev,
|
|
||||||
struct drm_file *file_priv)
|
|
||||||
{
|
|
||||||
struct drm_crtc *crtc;
|
|
||||||
|
|
||||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
|
||||||
rockchip_drm_crtc_cancel_pending_vblank(crtc, file_priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rockchip_drm_lastclose(struct drm_device *dev)
|
void rockchip_drm_lastclose(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct rockchip_drm_private *priv = dev->dev_private;
|
struct rockchip_drm_private *priv = dev->dev_private;
|
||||||
|
@ -307,7 +286,6 @@ static const struct file_operations rockchip_drm_driver_fops = {
|
||||||
static struct drm_driver rockchip_drm_driver = {
|
static struct drm_driver rockchip_drm_driver = {
|
||||||
.driver_features = DRIVER_MODESET | DRIVER_GEM |
|
.driver_features = DRIVER_MODESET | DRIVER_GEM |
|
||||||
DRIVER_PRIME | DRIVER_ATOMIC,
|
DRIVER_PRIME | DRIVER_ATOMIC,
|
||||||
.preclose = rockchip_drm_preclose,
|
|
||||||
.lastclose = rockchip_drm_lastclose,
|
.lastclose = rockchip_drm_lastclose,
|
||||||
.get_vblank_counter = drm_vblank_no_hw_counter,
|
.get_vblank_counter = drm_vblank_no_hw_counter,
|
||||||
.enable_vblank = rockchip_drm_crtc_enable_vblank,
|
.enable_vblank = rockchip_drm_crtc_enable_vblank,
|
||||||
|
|
|
@ -40,7 +40,6 @@ struct rockchip_crtc_funcs {
|
||||||
int (*enable_vblank)(struct drm_crtc *crtc);
|
int (*enable_vblank)(struct drm_crtc *crtc);
|
||||||
void (*disable_vblank)(struct drm_crtc *crtc);
|
void (*disable_vblank)(struct drm_crtc *crtc);
|
||||||
void (*wait_for_update)(struct drm_crtc *crtc);
|
void (*wait_for_update)(struct drm_crtc *crtc);
|
||||||
void (*cancel_pending_vblank)(struct drm_crtc *crtc, struct drm_file *file_priv);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rockchip_crtc_state {
|
struct rockchip_crtc_state {
|
||||||
|
|
|
@ -894,30 +894,10 @@ static void vop_crtc_wait_for_update(struct drm_crtc *crtc)
|
||||||
WARN_ON(!wait_for_completion_timeout(&vop->wait_update_complete, 100));
|
WARN_ON(!wait_for_completion_timeout(&vop->wait_update_complete, 100));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vop_crtc_cancel_pending_vblank(struct drm_crtc *crtc,
|
|
||||||
struct drm_file *file_priv)
|
|
||||||
{
|
|
||||||
struct drm_device *drm = crtc->dev;
|
|
||||||
struct vop *vop = to_vop(crtc);
|
|
||||||
struct drm_pending_vblank_event *e;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&drm->event_lock, flags);
|
|
||||||
e = vop->event;
|
|
||||||
if (e && e->base.file_priv == file_priv) {
|
|
||||||
vop->event = NULL;
|
|
||||||
|
|
||||||
kfree(&e->base);
|
|
||||||
file_priv->event_space += sizeof(e->event);
|
|
||||||
}
|
|
||||||
spin_unlock_irqrestore(&drm->event_lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct rockchip_crtc_funcs private_crtc_funcs = {
|
static const struct rockchip_crtc_funcs private_crtc_funcs = {
|
||||||
.enable_vblank = vop_crtc_enable_vblank,
|
.enable_vblank = vop_crtc_enable_vblank,
|
||||||
.disable_vblank = vop_crtc_disable_vblank,
|
.disable_vblank = vop_crtc_disable_vblank,
|
||||||
.wait_for_update = vop_crtc_wait_for_update,
|
.wait_for_update = vop_crtc_wait_for_update,
|
||||||
.cancel_pending_vblank = vop_crtc_cancel_pending_vblank,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
|
static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||||
|
|
Loading…
Reference in New Issue