diff options
author | Andrzej Hajda <a.hajda@samsung.com> | 2014-08-28 11:07:32 +0200 |
---|---|---|
committer | Hyungwon Hwang <human.hwang@samsung.com> | 2014-09-16 16:47:28 +0900 |
commit | 5ae517257590abcd22c3f7338cb9cdc8b1e8607f (patch) | |
tree | 9151a75bcfb384d580dfb6e62bf0917598cbd40d | |
parent | 6695a8219f5f3238b09111a58fb31fc0ef7b002d (diff) | |
download | linux-3.10-5ae517257590abcd22c3f7338cb9cdc8b1e8607f.tar.gz linux-3.10-5ae517257590abcd22c3f7338cb9cdc8b1e8607f.tar.bz2 linux-3.10-5ae517257590abcd22c3f7338cb9cdc8b1e8607f.zip |
drm/exynos/ipp: clean memory nodes on command node cleaning
The nodes should be removed before removing command node.
Change-Id: Ib97b737c9578c912737827b666ab0d94395a5334
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_ipp.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.c b/drivers/gpu/drm/exynos/exynos_drm_ipp.c index cc2fed8608d..2ed5ec424df 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_ipp.c +++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.c @@ -668,13 +668,19 @@ static void ipp_clean_mem_nodes(struct drm_device *drm_dev, mutex_unlock(&c_node->mem_lock); } -static void ipp_clean_cmd_node(struct drm_exynos_ipp_cmd_node *c_node) +static void ipp_clean_cmd_node(struct drm_device *drm_dev, + struct drm_exynos_ipp_cmd_node *c_node) { + int i; + /* cancel works */ cancel_work_sync(&c_node->start_work->work); cancel_work_sync(&c_node->stop_work->work); cancel_work_sync(&c_node->event_work->work); + for_each_ipp_ops(i) + ipp_clean_mem_nodes(drm_dev, c_node, i); + /* delete list */ list_del(&c_node->list); @@ -1164,7 +1170,7 @@ int exynos_drm_ipp_cmd_ctrl(struct drm_device *drm_dev, void *data, c_node->state = IPP_STATE_STOP; ippdrv->dedicated = false; - ipp_clean_cmd_node(c_node); + ipp_clean_cmd_node(drm_dev, c_node); if (list_empty(&ippdrv->cmd_list)) pm_runtime_put_sync(ippdrv->dev); @@ -1808,7 +1814,7 @@ static void ipp_subdrv_close(struct drm_device *drm_dev, struct device *dev, } ippdrv->dedicated = false; - ipp_clean_cmd_node(c_node); + ipp_clean_cmd_node(drm_dev, c_node); if (list_empty(&ippdrv->cmd_list)) pm_runtime_put_sync(ippdrv->dev); } |