fix rga driver crash bug
authorzsq <zsq@rock-chips.com>
Tue, 4 Mar 2014 13:06:53 +0000 (21:06 +0800)
committerzsq <zsq@rock-chips.com>
Tue, 4 Mar 2014 13:06:53 +0000 (21:06 +0800)
drivers/video/rockchip/rga/rga_drv.c
drivers/video/rockchip/rga2/rga2_drv.c

index 53f685b823d7257dae11646d4f22a5bdfb0af659..44b5bb80976758dd4a68531e998d20d2d60c2ce0 100755 (executable)
@@ -259,9 +259,9 @@ static void rga_power_on(void)
        if (rga_service.enable)\r
                return;\r
 \r
-       clk_enable(drvdata->aclk_rga);\r
-       clk_enable(drvdata->hclk_rga);\r
-       clk_enable(drvdata->pd_rga);\r
+       clk_prepare_enable(drvdata->aclk_rga);\r
+       clk_prepare_enable(drvdata->hclk_rga);\r
+       //clk_prepare_enable(drvdata->pd_rga);\r
        wake_lock(&drvdata->wake_lock);\r
        rga_service.enable = true;\r
 }\r
@@ -283,9 +283,9 @@ static void rga_power_off(void)
                rga_dump();\r
        }\r
 \r
-       clk_disable(drvdata->pd_rga);\r
-       clk_disable(drvdata->aclk_rga);\r
-       clk_disable(drvdata->hclk_rga);\r
+       //clk_disable_unprepare(drvdata->pd_rga);\r
+       clk_disable_unprepare(drvdata->aclk_rga);\r
+       clk_disable_unprepare(drvdata->hclk_rga);\r
        wake_unlock(&drvdata->wake_lock);\r
        rga_service.enable = false;\r
 }\r
@@ -1123,11 +1123,12 @@ static struct miscdevice rga_dev ={
 };\r
 \r
 \r
-\r
-static const struct of_device_id rockchip_rga_of_match[] = {\r
-       { .compatible = "rockchip,rga", .data = NULL, },\r
+#if defined(CONFIG_OF)\r
+static const struct of_device_id rockchip_rga_dt_ids[] = {\r
+       { .compatible = "rockchip,rga", },\r
        {},\r
 };\r
+#endif\r
 \r
 static int rga_drv_probe(struct platform_device *pdev)\r
 {\r
@@ -1136,10 +1137,6 @@ static int rga_drv_probe(struct platform_device *pdev)
     struct device_node *np = pdev->dev.of_node;\r
        int ret = 0;\r
 \r
-       INIT_LIST_HEAD(&rga_service.waiting);\r
-       INIT_LIST_HEAD(&rga_service.running);\r
-       INIT_LIST_HEAD(&rga_service.done);\r
-       INIT_LIST_HEAD(&rga_service.session);\r
        mutex_init(&rga_service.lock);\r
        mutex_init(&rga_service.mutex);\r
        atomic_set(&rga_service.total_running, 0);\r
@@ -1160,9 +1157,6 @@ static int rga_drv_probe(struct platform_device *pdev)
     data->aclk_rga = devm_clk_get(&pdev->dev, "aclk_rga");\r
     data->hclk_rga = devm_clk_get(&pdev->dev, "hclk_rga");\r
 \r
-    clk_prepare_enable(data->aclk_rga);\r
-    clk_prepare_enable(data->hclk_rga);\r
-\r
     /* map the registers */\r
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
        data->rga_base = devm_ioremap_resource(&pdev->dev, res);\r
@@ -1224,12 +1218,9 @@ static int rga_drv_remove(struct platform_device *pdev)
        free_irq(data->irq, &data->miscdev);\r
        iounmap((void __iomem *)(data->rga_base));\r
 \r
-    clk_disable_unprepare(data->aclk_rga);\r
-    clk_disable_unprepare(data->hclk_rga);\r
-\r
        //clk_put(data->pd_rga);\r
-       clk_put(data->aclk_rga);\r
-       clk_put(data->hclk_rga);\r
+       devm_clk_put(&pdev->dev, data->aclk_rga);\r
+       devm_clk_put(&pdev->dev, data->hclk_rga);\r
 \r
        //kfree(data);\r
        return 0;\r
@@ -1241,6 +1232,7 @@ static struct platform_driver rga_driver = {
        .driver         = {\r
                .owner  = THIS_MODULE,\r
                .name   = "rga",\r
+               .of_match_table = of_match_ptr(rockchip_rga_dt_ids),\r
        },\r
 };\r
 \r
@@ -1290,6 +1282,12 @@ static int __init rga_init(void)
         INIT_LIST_HEAD(&rga_session_global.waiting);\r
         INIT_LIST_HEAD(&rga_session_global.running);\r
         INIT_LIST_HEAD(&rga_session_global.list_session);\r
+\r
+        INIT_LIST_HEAD(&rga_service.waiting);\r
+           INIT_LIST_HEAD(&rga_service.running);\r
+           INIT_LIST_HEAD(&rga_service.done);\r
+           INIT_LIST_HEAD(&rga_service.session);\r
+\r
         init_waitqueue_head(&rga_session_global.wait);\r
         //mutex_lock(&rga_service.lock);\r
         list_add_tail(&rga_session_global.list_session, &rga_service.session);\r
@@ -1298,6 +1296,8 @@ static int __init rga_init(void)
         atomic_set(&rga_session_global.num_done, 0);\r
     }\r
 \r
+\r
+\r
     #if RGA_TEST_CASE\r
     rga_test_0();\r
     #endif\r
index c6a6046f309177339543a0853d0beb944d5bd90b..0f622fd70f20ba96ffb4735c2993670df3d3c715 100644 (file)
@@ -253,8 +253,8 @@ static void rga2_power_on(void)
                return;\r
 \r
     //clk_enable(rga2_drvdata->rga2);\r
-       clk_enable(rga2_drvdata->aclk_rga2);\r
-       clk_enable(rga2_drvdata->hclk_rga2);\r
+       clk_prepare_enable(rga2_drvdata->aclk_rga2);\r
+       clk_prepare_enable(rga2_drvdata->hclk_rga2);\r
        //clk_enable(rga2_drvdata->pd_rga2);\r
        wake_lock(&rga2_drvdata->wake_lock);\r
        rga2_service.enable = true;\r
@@ -279,8 +279,8 @@ static void rga2_power_off(void)
 \r
        //clk_disable(rga2_drvdata->pd_rga2);\r
     //clk_disable(rga2_drvdata->rga2);\r
-       clk_disable(rga2_drvdata->aclk_rga2);\r
-       clk_disable(rga2_drvdata->hclk_rga2);\r
+       clk_disable_unprepare(rga2_drvdata->aclk_rga2);\r
+       clk_disable_unprepare(rga2_drvdata->hclk_rga2);\r
        wake_unlock(&rga2_drvdata->wake_lock);\r
        rga2_service.enable = false;\r
 }\r
@@ -1007,10 +1007,6 @@ static int __devinit rga2_drv_probe(struct platform_device *pdev)
     struct device_node *np = pdev->dev.of_node;\r
        int ret = 0;\r
 \r
-       INIT_LIST_HEAD(&rga2_service.waiting);\r
-       INIT_LIST_HEAD(&rga2_service.running);\r
-       INIT_LIST_HEAD(&rga2_service.done);\r
-       INIT_LIST_HEAD(&rga2_service.session);\r
        mutex_init(&rga2_service.lock);\r
        mutex_init(&rga2_service.mutex);\r
        atomic_set(&rga2_service.total_running, 0);\r
@@ -1033,9 +1029,6 @@ static int __devinit rga2_drv_probe(struct platform_device *pdev)
        data->aclk_rga = devm_clk_get(&pdev->dev, "aclk_rga");\r
     data->hclk_rga = devm_clk_get(&pdev->dev, "hclk_rga");\r
 \r
-    clk_prepare_enable(data->aclk_rga);\r
-    clk_prepare_enable(data->hclk_rga);\r
-\r
        /* map the registers */\r
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
        data->rga_base = devm_ioremap_resource(&pdev->dev, res);\r
@@ -1096,14 +1089,10 @@ static int rga2_drv_remove(struct platform_device *pdev)
        free_irq(data->irq, &data->miscdev);\r
        iounmap((void __iomem *)(data->rga_base));\r
 \r
-    clk_disable_unprepare(data->aclk_rga);\r
-    clk_disable_unprepare(data->hclk_rga);\r
-\r
        //clk_put(data->pd_rga2);\r
     //clk_put(data->rga2);\r
-       clk_put(data->aclk_rga2);\r
-       clk_put(data->hclk_rga2);\r
-\r
+       devm_clk_put(&pdev->dev, data->aclk_rga2);\r
+       devm_clk_put(&pdev->dev, data->hclk_rga2);\r
 \r
        kfree(data);\r
        return 0;\r
@@ -1145,6 +1134,11 @@ static int __init rga2_init(void)
         INIT_LIST_HEAD(&rga2_session_global.waiting);\r
         INIT_LIST_HEAD(&rga2_session_global.running);\r
         INIT_LIST_HEAD(&rga2_session_global.list_session);\r
+\r
+        INIT_LIST_HEAD(&rga2_service.waiting);\r
+           INIT_LIST_HEAD(&rga2_service.running);\r
+           INIT_LIST_HEAD(&rga2_service.done);\r
+        INIT_LIST_HEAD(&rga2_service.session);\r
         init_waitqueue_head(&rga2_session_global.wait);\r
         //mutex_lock(&rga_service.lock);\r
         list_add_tail(&rga2_session_global.list_session, &rga2_service.session);\r