summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrzej Hajda <a.hajda@samsung.com>2014-08-28 11:07:32 +0200
committerHyungwon Hwang <human.hwang@samsung.com>2014-09-16 16:47:28 +0900
commit5ae517257590abcd22c3f7338cb9cdc8b1e8607f (patch)
tree9151a75bcfb384d580dfb6e62bf0917598cbd40d
parent6695a8219f5f3238b09111a58fb31fc0ef7b002d (diff)
downloadlinux-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.c12
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);
}