fix rga pre scale white screen bug
authorzsq <zsq@rock-chips.com>
Mon, 9 Apr 2012 06:15:28 +0000 (22:15 -0800)
committerzsq <zsq@rock-chips.com>
Mon, 9 Apr 2012 06:15:28 +0000 (22:15 -0800)
drivers/video/rockchip/rga/RGA_API.c
drivers/video/rockchip/rga/rga.h
drivers/video/rockchip/rga/rga_drv.c

index ff74da8f7bbe91f7889f9193f9f6370a17a1d00c..9af4be6d408e753ad681f6bb1bd2169c7538a62e 100755 (executable)
@@ -165,6 +165,9 @@ int32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1)
     \r
     msg->dst.act_h = dah;\r
     msg->dst.vir_h = dah;\r
+\r
+    msg->dst.x_offset = 0;\r
+    msg->dst.y_offset = 0;\r
             \r
     msg->dst.yrgb_addr = (u32)rga_service.pre_scale_buf;\r
     msg->dst.uv_addr = msg->dst.yrgb_addr + stride * dah;\r
index 6a528c164b9d7a4cee334c7a3e19c05175894b72..1d0a9bb0fcab0f44efe65b0e27d3e12cee14250c 100755 (executable)
@@ -376,6 +376,7 @@ typedef struct rga_service_info {
     atomic_t            src_format_swt;\r
     int                 last_prc_src_format;\r
     atomic_t            rga_working;\r
+    bool                enable;\r
 \r
     struct mutex       mutex;  // mutex\r
 } rga_service_info;\r
index fb3c5ac6ff947a1badb71159b8c9238ec0d340a8..85ff2bcfb135ba9f82c89889ba09a88912843154 100755 (executable)
@@ -79,12 +79,8 @@ struct rga_drvdata {
        struct device dev;\r
        void *rga_base;\r
        int irq0;\r
-\r
-       struct clk *aclk_rga;\r
-       struct clk *hclk_rga;\r
        \r
        struct delayed_work power_off_work;\r
-       bool enable;                                                    //clk enable or disable\r
        void (*rga_irq_callback)(int rga_retval);   //callback function used by aync call\r
 };\r
 \r
@@ -92,6 +88,10 @@ struct rga_drvdata {
 static struct rga_drvdata *drvdata = NULL;\r
 rga_service_info rga_service;\r
 \r
+static struct clk *aclk_rga;\r
+static struct clk *hclk_rga;\r
+\r
+\r
 static int rga_blit_async(rga_session *session, struct rga_req *req);\r
 static void rga_del_running_list(void);\r
 \r
@@ -210,13 +210,14 @@ static void rga_power_on(void)
 {\r
        //printk("rga_power_on\n");\r
        //cancel_delayed_work_sync(&drvdata->power_off_work);\r
-       if (drvdata->enable)\r
+       if (rga_service.enable)\r
                return;\r
-   \r
-       clk_enable(drvdata->aclk_rga);\r
-       clk_enable(drvdata->hclk_rga);\r
 \r
-       drvdata->enable = true;\r
+    spin_lock_bh(&rga_service.lock);\r
+       clk_enable(aclk_rga);\r
+       clk_enable(hclk_rga);\r
+       rga_service.enable = true;\r
+    spin_unlock_bh(&rga_service.lock);\r
 }\r
 \r
 \r
@@ -225,7 +226,7 @@ static void rga_power_off(void)
     int total_running;\r
     \r
     printk("rga_power_off\n");\r
-       if(!drvdata->enable)\r
+       if(!rga_service.enable)\r
                return;\r
 \r
     total_running = atomic_read(&rga_service.total_running);\r
@@ -236,20 +237,16 @@ static void rga_power_off(void)
         rga_dump();\r
        }\r
     \r
-       clk_disable(drvdata->aclk_rga);\r
-       clk_disable(drvdata->hclk_rga);\r
+       clk_disable(aclk_rga);\r
+       clk_disable(hclk_rga);\r
 \r
-       drvdata->enable = false;\r
+       rga_service.enable = false;\r
 }\r
 \r
-\r
-\r
-\r
 static int rga_flush(rga_session *session, unsigned long arg)\r
 {      \r
     int ret = 0;\r
     int ret_timeout;\r
-\r
     \r
     #if RGA_TEST_FLUSH_TIME\r
     ktime_t start;\r
@@ -257,9 +254,7 @@ static int rga_flush(rga_session *session, unsigned long arg)
     start = ktime_get();\r
     #endif\r
 \r
-    ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
-\r
-    \r
+    ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);    \r
     \r
        if (unlikely(ret_timeout < 0)) {\r
                pr_err("flush pid %d wait task ret %d\n", session->pid, ret);                    \r
@@ -306,13 +301,15 @@ static int rga_check_param(const struct rga_req *req)
 {\r
        /*RGA can support up to 8192*8192 resolution in RGB format,but we limit the image size to 8191*8191 here*/\r
        //check src width and height\r
-       if (unlikely((req->src.act_w <= 0) || (req->src.act_w > 8191) || (req->src.act_h <= 0) || (req->src.act_h > 8191))) {\r
+       if (unlikely((req->src.act_w <= 0) || (req->src.act_w > 8191) || (req->src.act_h <= 0) || (req->src.act_h > 8191))) \r
+    {\r
                ERR("invalid source resolution act_w = %d, act_h = %d\n", req->src.act_w, req->src.act_h);\r
                return  -EINVAL;\r
        }\r
 \r
        //check dst width and height\r
-       if (unlikely((req->dst.act_w <= 0) || (req->dst.act_w > 2048) || (req->dst.act_h <= 0) || (req->dst.act_h > 2048))) {\r
+       if (unlikely((req->dst.act_w <= 0) || (req->dst.act_w > 2048) || (req->dst.act_h <= 0) || (req->dst.act_h > 2048))) \r
+    {\r
                ERR("invalid destination resolution act_w = %d, act_h = %d\n", req->dst.act_w, req->dst.act_h);\r
                return  -EINVAL;\r
        }\r
@@ -585,7 +582,7 @@ static void rga_try_set_reg(uint32_t num)
 }\r
 \r
 \r
-#if RGA_TEST  \r
+#if 1//RGA_TEST  \r
 static void print_info(struct rga_req *req)\r
 {      \r
     printk("src.yrgb_addr = %.8x, src.uv_addr = %.8x, src.v_addr = %.8x\n", \r
@@ -658,18 +655,18 @@ static int rga_blit(rga_session *session, struct rga_req *req)
             if(NULL == req2) {\r
                 return -EFAULT;            \r
             }\r
-\r
+            \r
             ret = RGA_gen_two_pro(req, req2);            \r
             if(ret == -EINVAL) {\r
                 break;\r
-            }            \r
+            }\r
 \r
             ret = rga_check_param(req);\r
                if(ret == -EINVAL) {\r
                 printk("req 1 argument is inval\n");\r
                 break;\r
                }\r
-                                             \r
+                                                         \r
             ret = rga_check_param(req2);\r
                if(ret == -EINVAL) {\r
                 printk("req 2 argument is inval\n");\r
@@ -933,23 +930,23 @@ static int rga_suspend(struct platform_device *pdev, pm_message_t state)
 {\r
        uint32_t enable;\r
     \r
-    enable = drvdata->enable;    \r
-       //rga_power_off(NULL);    \r
-    drvdata->enable = enable;\r
+    enable = rga_service.enable;    \r
+       rga_power_off();    \r
+    rga_service.enable = enable;\r
 \r
        return 0;\r
 }\r
 \r
 static int rga_resume(struct platform_device *pdev)\r
 {    \r
-    //rga_power_on();    \r
+    rga_power_on();    \r
        return 0;\r
 }\r
 \r
 static void rga_shutdown(struct platform_device *pdev)\r
 {\r
        pr_cont("shutdown...");     \r
-       //rga_power_off();    \r
+       rga_power_off();    \r
     pr_cont("done\n");\r
 }\r
 \r
@@ -983,7 +980,7 @@ static int __devinit rga_drv_probe(struct platform_device *pdev)
     atomic_set(&rga_service.total_running, 0);\r
     atomic_set(&rga_service.src_format_swt, 0);\r
     rga_service.last_prc_src_format = 1; /* default is yuv first*/\r
-    data->enable = 0;\r
+    rga_service.enable = false;\r
           \r
        if(NULL == data)\r
        {\r
@@ -991,23 +988,23 @@ static int __devinit rga_drv_probe(struct platform_device *pdev)
                return  -ENOMEM;\r
        }\r
        \r
-       data->aclk_rga = clk_get(NULL, "aclk_rga");    \r
-       if (IS_ERR(data->aclk_rga))\r
+       aclk_rga = clk_get(NULL, "aclk_rga");    \r
+       if (IS_ERR(aclk_rga))\r
        {\r
                ERR("failed to find rga axi clock source.\n");\r
                ret = -ENOENT;\r
                goto err_clock;\r
        }\r
 \r
-       data->hclk_rga = clk_get(NULL, "hclk_rga");\r
-       if (IS_ERR(data->hclk_rga))\r
+       hclk_rga = clk_get(NULL, "hclk_rga");\r
+       if (IS_ERR(hclk_rga))\r
        {\r
                ERR("failed to find rga ahb clock source.\n");\r
                ret = -ENOENT;\r
                goto err_clock;\r
        }\r
 \r
-    //rga_power_on();\r
+    rga_power_on();\r
     \r
        /* map the memory */\r
     if (!request_mem_region(RK30_RGA_PHYS, RK30_RGA_SIZE, "rga_io")) \r
@@ -1042,7 +1039,7 @@ static int __devinit rga_drv_probe(struct platform_device *pdev)
        }\r
 \r
        mutex_init(&rga_service.mutex);\r
-       data->enable = false;\r
+       rga_service.enable = false;\r
        INIT_DELAYED_WORK(&data->power_off_work, rga_power_off);\r
        data->rga_irq_callback = NULL;\r
        \r
@@ -1056,7 +1053,7 @@ static int __devinit rga_drv_probe(struct platform_device *pdev)
                goto err_misc_register;\r
        }\r
 \r
-    //rga_power_off();\r
+    rga_power_off();\r
     \r
        DBG("RGA Driver loaded succesfully\n");\r
 \r
@@ -1082,12 +1079,12 @@ static int rga_drv_remove(struct platform_device *pdev)
        free_irq(data->irq0, &data->miscdev);\r
     iounmap((void __iomem *)(data->rga_base));            \r
 \r
-    if(data->aclk_rga) {\r
-               clk_put(data->aclk_rga);\r
+    if(aclk_rga) {\r
+               clk_put(aclk_rga);\r
        }\r
        \r
-       if(data->hclk_rga) {\r
-               clk_put(data->hclk_rga);\r
+       if(hclk_rga) {\r
+               clk_put(hclk_rga);\r
        }\r
 \r
     kfree(data);\r