diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_ipp.c')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_ipp.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.c b/drivers/gpu/drm/exynos/exynos_drm_ipp.c index 49eebe948ed2..0bda96454a02 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_ipp.c +++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include "exynos_drm_iommu.h" | 27 | #include "exynos_drm_iommu.h" |
28 | 28 | ||
29 | /* | 29 | /* |
30 | * IPP is stand for Image Post Processing and | 30 | * IPP stands for Image Post Processing and |
31 | * supports image scaler/rotator and input/output DMA operations. | 31 | * supports image scaler/rotator and input/output DMA operations. |
32 | * using FIMC, GSC, Rotator, so on. | 32 | * using FIMC, GSC, Rotator, so on. |
33 | * IPP is integration device driver of same attribute h/w | 33 | * IPP is integration device driver of same attribute h/w |
@@ -1292,7 +1292,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv, | |||
1292 | DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id); | 1292 | DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id); |
1293 | 1293 | ||
1294 | /* store command info in ippdrv */ | 1294 | /* store command info in ippdrv */ |
1295 | ippdrv->cmd = c_node; | 1295 | ippdrv->c_node = c_node; |
1296 | 1296 | ||
1297 | if (!ipp_check_mem_list(c_node)) { | 1297 | if (!ipp_check_mem_list(c_node)) { |
1298 | DRM_DEBUG_KMS("%s:empty memory.\n", __func__); | 1298 | DRM_DEBUG_KMS("%s:empty memory.\n", __func__); |
@@ -1303,7 +1303,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv, | |||
1303 | ret = ipp_set_property(ippdrv, property); | 1303 | ret = ipp_set_property(ippdrv, property); |
1304 | if (ret) { | 1304 | if (ret) { |
1305 | DRM_ERROR("failed to set property.\n"); | 1305 | DRM_ERROR("failed to set property.\n"); |
1306 | ippdrv->cmd = NULL; | 1306 | ippdrv->c_node = NULL; |
1307 | return ret; | 1307 | return ret; |
1308 | } | 1308 | } |
1309 | 1309 | ||
@@ -1487,11 +1487,6 @@ void ipp_sched_cmd(struct work_struct *work) | |||
1487 | mutex_lock(&c_node->cmd_lock); | 1487 | mutex_lock(&c_node->cmd_lock); |
1488 | 1488 | ||
1489 | property = &c_node->property; | 1489 | property = &c_node->property; |
1490 | if (!property) { | ||
1491 | DRM_ERROR("failed to get property:prop_id[%d]\n", | ||
1492 | c_node->property.prop_id); | ||
1493 | goto err_unlock; | ||
1494 | } | ||
1495 | 1490 | ||
1496 | switch (cmd_work->ctrl) { | 1491 | switch (cmd_work->ctrl) { |
1497 | case IPP_CTRL_PLAY: | 1492 | case IPP_CTRL_PLAY: |
@@ -1704,7 +1699,7 @@ void ipp_sched_event(struct work_struct *work) | |||
1704 | return; | 1699 | return; |
1705 | } | 1700 | } |
1706 | 1701 | ||
1707 | c_node = ippdrv->cmd; | 1702 | c_node = ippdrv->c_node; |
1708 | if (!c_node) { | 1703 | if (!c_node) { |
1709 | DRM_ERROR("failed to get command node.\n"); | 1704 | DRM_ERROR("failed to get command node.\n"); |
1710 | return; | 1705 | return; |
@@ -1888,14 +1883,14 @@ err_clear: | |||
1888 | return; | 1883 | return; |
1889 | } | 1884 | } |
1890 | 1885 | ||
1891 | static int __devinit ipp_probe(struct platform_device *pdev) | 1886 | static int ipp_probe(struct platform_device *pdev) |
1892 | { | 1887 | { |
1893 | struct device *dev = &pdev->dev; | 1888 | struct device *dev = &pdev->dev; |
1894 | struct ipp_context *ctx; | 1889 | struct ipp_context *ctx; |
1895 | struct exynos_drm_subdrv *subdrv; | 1890 | struct exynos_drm_subdrv *subdrv; |
1896 | int ret; | 1891 | int ret; |
1897 | 1892 | ||
1898 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | 1893 | ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); |
1899 | if (!ctx) | 1894 | if (!ctx) |
1900 | return -ENOMEM; | 1895 | return -ENOMEM; |
1901 | 1896 | ||
@@ -1916,8 +1911,7 @@ static int __devinit ipp_probe(struct platform_device *pdev) | |||
1916 | ctx->event_workq = create_singlethread_workqueue("ipp_event"); | 1911 | ctx->event_workq = create_singlethread_workqueue("ipp_event"); |
1917 | if (!ctx->event_workq) { | 1912 | if (!ctx->event_workq) { |
1918 | dev_err(dev, "failed to create event workqueue\n"); | 1913 | dev_err(dev, "failed to create event workqueue\n"); |
1919 | ret = -EINVAL; | 1914 | return -EINVAL; |
1920 | goto err_clear; | ||
1921 | } | 1915 | } |
1922 | 1916 | ||
1923 | /* | 1917 | /* |
@@ -1958,12 +1952,10 @@ err_cmd_workq: | |||
1958 | destroy_workqueue(ctx->cmd_workq); | 1952 | destroy_workqueue(ctx->cmd_workq); |
1959 | err_event_workq: | 1953 | err_event_workq: |
1960 | destroy_workqueue(ctx->event_workq); | 1954 | destroy_workqueue(ctx->event_workq); |
1961 | err_clear: | ||
1962 | kfree(ctx); | ||
1963 | return ret; | 1955 | return ret; |
1964 | } | 1956 | } |
1965 | 1957 | ||
1966 | static int __devexit ipp_remove(struct platform_device *pdev) | 1958 | static int ipp_remove(struct platform_device *pdev) |
1967 | { | 1959 | { |
1968 | struct ipp_context *ctx = platform_get_drvdata(pdev); | 1960 | struct ipp_context *ctx = platform_get_drvdata(pdev); |
1969 | 1961 | ||
@@ -1985,8 +1977,6 @@ static int __devexit ipp_remove(struct platform_device *pdev) | |||
1985 | destroy_workqueue(ctx->cmd_workq); | 1977 | destroy_workqueue(ctx->cmd_workq); |
1986 | destroy_workqueue(ctx->event_workq); | 1978 | destroy_workqueue(ctx->event_workq); |
1987 | 1979 | ||
1988 | kfree(ctx); | ||
1989 | |||
1990 | return 0; | 1980 | return 0; |
1991 | } | 1981 | } |
1992 | 1982 | ||
@@ -2050,7 +2040,7 @@ static const struct dev_pm_ops ipp_pm_ops = { | |||
2050 | 2040 | ||
2051 | struct platform_driver ipp_driver = { | 2041 | struct platform_driver ipp_driver = { |
2052 | .probe = ipp_probe, | 2042 | .probe = ipp_probe, |
2053 | .remove = __devexit_p(ipp_remove), | 2043 | .remove = ipp_remove, |
2054 | .driver = { | 2044 | .driver = { |
2055 | .name = "exynos-drm-ipp", | 2045 | .name = "exynos-drm-ipp", |
2056 | .owner = THIS_MODULE, | 2046 | .owner = THIS_MODULE, |