del warning info
authorzsq <zsq@rock-chips.com>
Wed, 2 May 2012 02:58:06 +0000 (10:58 +0800)
committerzsq <zsq@rock-chips.com>
Wed, 2 May 2012 02:58:06 +0000 (10:58 +0800)
drivers/video/rockchip/rga/rga.h
drivers/video/rockchip/rga/rga_drv.c

index 0a8e1d0abe6c4c59a39bcc2a9695581b2b68f4ef..3b58ea35322dd9abde88f424a8b67ae850f1978d 100755 (executable)
@@ -347,15 +347,15 @@ typedef struct rga_session {
     atomic_t        num_done;\r
 } rga_session;\r
 \r
-struct rga_reg {\r
+struct rga_reg {    \r
     rga_session                *session;\r
        struct list_head        session_link;           /* link to rga service session */\r
        struct list_head        status_link;            /* link to register set list */\r
        uint32_t  sys_reg[RGA_REG_CTRL_LEN];\r
     uint32_t  cmd_reg[RGA_REG_CMD_LEN];\r
     uint32_t *MMU_base;\r
-    atomic_t int_enable;\r
-    \r
+    //atomic_t int_enable;\r
+        \r
     struct rga_req req;\r
 };\r
 \r
index a04d7bfb4bade4027c791381b23b556504055b02..47c187a59df61356ed11ac540b8ebf9bc60a4abd 100755 (executable)
@@ -99,7 +99,7 @@ static void rga_try_set_reg(uint32_t num);
 \r
 \r
 /* Logging */\r
-#define RGA_DEBUG 1\r
+#define RGA_DEBUG 0\r
 #if RGA_DEBUG\r
 #define DBG(format, args...) printk(KERN_DEBUG "%s: " format, DRIVER_NAME, ## args)\r
 #define ERR(format, args...) printk(KERN_ERR "%s: " format, DRIVER_NAME, ## args)\r
@@ -155,8 +155,6 @@ static void rga_dump(void)
        running = atomic_read(&rga_service.total_running);\r
        printk("rga total_running %d\n", running);\r
 \r
-    return;\r
-\r
     /* Dump waiting list info */\r
     if (!list_empty(&rga_service.waiting))\r
     {        \r
@@ -191,8 +189,7 @@ static void rga_dump(void)
         }\r
         while(!list_empty(next));                            \r
     }\r
-    \r
-\r
+  \r
        list_for_each_entry_safe(session, session_tmp, &rga_service.session, list_session) \r
     {\r
                printk("session pid %d:\n", session->pid);\r
@@ -225,7 +222,7 @@ static void rga_power_on(void)
 }\r
 \r
 \r
-static void rga_power_off(void)\r
+static void rga_power_off(struct work_struct *work)\r
 {\r
     int total_running;\r
 \r
@@ -242,9 +239,9 @@ static void rga_power_off(void)
 \r
     total_running = atomic_read(&rga_service.total_running);\r
        if (total_running) {\r
-               pr_alert("power off when %d task running!!\n", total_running);               \r
+               pr_err("power off when %d task running!!\n", total_running);               \r
                mdelay(50);\r
-               pr_alert("delay 50 ms for running task\n");        \r
+               pr_err("delay 50 ms for running task\n");        \r
         rga_dump();\r
        }\r
     \r
@@ -258,6 +255,7 @@ static int rga_flush(rga_session *session, unsigned long arg)
 {      \r
     int ret = 0;\r
     int ret_timeout;\r
+    unsigned long flag;\r
     \r
     #if RGA_TEST_FLUSH_TIME\r
     ktime_t start;\r
@@ -269,12 +267,16 @@ static int rga_flush(rga_session *session, unsigned long arg)
     \r
        if (unlikely(ret_timeout < 0)) {\r
                pr_err("flush pid %d wait task ret %d\n", session->pid, ret);                    \r
+        spin_lock_irqsave(&rga_service.lock, flag);\r
         rga_del_running_list();\r
+        spin_unlock_irqrestore(&rga_service.lock, flag);\r
         ret = -ETIMEDOUT;\r
        } else if (0 == ret_timeout) {\r
                pr_err("flush pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
         printk("bus  = %.8x\n", rga_read(RGA_INT));\r
+        spin_lock_irqsave(&rga_service.lock, flag);\r
         rga_del_running_list_timeout();\r
+        spin_unlock_irqrestore(&rga_service.lock, flag);\r
         rga_try_set_reg(1);\r
                ret = -ETIMEDOUT;\r
        }\r
@@ -364,11 +366,15 @@ static void rga_copy_reg(struct rga_reg *reg, uint32_t offset)
     uint32_t i;\r
     uint32_t *cmd_buf;\r
     uint32_t *reg_p;\r
+\r
+    if(atomic_read(&reg->session->task_running) != 0)\r
+    {\r
+        printk(KERN_ERR "task_running is no zero\n");\r
+    }\r
     \r
     atomic_add(1, &rga_service.cmd_num);\r
-       atomic_add(1, &reg->session->task_running);\r
-    atomic_add(1, &rga_service.total_running);\r
-    \r
+       atomic_add(1, &reg->session->task_running);    \r
+        \r
     cmd_buf = (uint32_t *)rga_service.cmd_buff + offset*28;\r
     reg_p = (uint32_t *)reg->cmd_reg;\r
 \r
@@ -654,8 +660,8 @@ static void rga_del_running_list(void)
         if(reg->MMU_base != NULL)\r
         {\r
             kfree(reg->MMU_base);\r
+            reg->MMU_base = NULL;\r
         }\r
-                \r
         atomic_sub(1, &reg->session->task_running);\r
            atomic_sub(1, &rga_service.total_running);\r
         \r
@@ -755,6 +761,7 @@ static int rga_blit(rga_session *session, struct rga_req *req)
     int num = 0; \r
     struct rga_reg *reg;\r
     struct rga_req *req2;\r
+    unsigned long flag;\r
 \r
     uint32_t saw, sah, daw, dah;\r
 \r
@@ -825,7 +832,12 @@ static int rga_blit(rga_session *session, struct rga_req *req)
             num = 1;       \r
         }        \r
 \r
-        atomic_set(&reg->int_enable, 1);        \r
+        //atomic_set(&reg->int_enable, 1);\r
+        \r
+        spin_lock_irqsave(&rga_service.lock, flag);\r
+        atomic_add(num, &rga_service.total_running);\r
+        spin_unlock_irqrestore(&rga_service.lock, flag);\r
+        \r
         rga_try_set_reg(num);\r
         \r
         return 0;         \r
@@ -858,6 +870,7 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
 {\r
     int ret = -1;\r
     int ret_timeout = 0;\r
+    unsigned long flag;\r
        \r
     #if RGA_TEST\r
     printk("*** rga_blit_sync proc ***\n");\r
@@ -875,13 +888,17 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
     if (unlikely(ret_timeout< 0)) \r
     {\r
                pr_err("sync pid %d wait task ret %d\n", session->pid, ret_timeout);        \r
+        spin_lock_irqsave(&rga_service.lock, flag);\r
         rga_del_running_list();\r
+        spin_unlock_irqrestore(&rga_service.lock, flag);\r
         ret = -ETIMEDOUT;\r
        } \r
     else if (0 == ret_timeout)\r
     {\r
                pr_err("sync pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
+        spin_lock_irqsave(&rga_service.lock, flag);\r
         rga_del_running_list_timeout();\r
+        spin_unlock_irqrestore(&rga_service.lock, flag);\r
         rga_try_set_reg(1);\r
                ret = -ETIMEDOUT;\r
        }\r
@@ -977,21 +994,24 @@ static int rga_open(struct inode *inode, struct file *file)
                return -ENOMEM;\r
        }\r
 \r
+    memset(session, 0x0, sizeof(rga_session));\r
+\r
        session->pid = current->pid;\r
+    //printk(KERN_DEBUG  "+");\r
+    \r
        INIT_LIST_HEAD(&session->waiting);\r
        INIT_LIST_HEAD(&session->running);\r
        INIT_LIST_HEAD(&session->list_session);\r
        init_waitqueue_head(&session->wait);\r
-    \r
-       spin_lock_irqsave(&rga_service.lock, flag);\r
-       list_add_tail(&session->list_session, &rga_service.session);\r
+    spin_lock_irqsave(&rga_service.lock, flag);\r
+       list_add_tail(&session->list_session, &rga_service.session); \r
     spin_unlock_irqrestore(&rga_service.lock, flag);\r
-    \r
        atomic_set(&session->task_running, 0);\r
     atomic_set(&session->num_done, 0);\r
+        \r
        file->private_data = (void *)session;\r
 \r
-    DBG("*** rga dev opened by pid %d *** \n", session->pid);    \r
+    //DBG("*** rga dev opened by pid %d *** \n", session->pid);    \r
        return nonseekable_open(inode, file);\r
     \r
 }\r
@@ -1003,12 +1023,12 @@ static int rga_release(struct inode *inode, struct file *file)
        rga_session *session = (rga_session *)file->private_data;\r
        if (NULL == session)\r
                return -EINVAL;\r
-    \r
+    //printk(KERN_DEBUG  "-");\r
        task_running = atomic_read(&session->task_running);\r
 \r
     if (task_running) \r
     {\r
-               pr_err("rga_service session %d still has %d task running when closing\n", session->pid, task_running);\r
+               pr_err("rga_service session %d still has %d task running when closing\n", session->pid, task_running);        \r
                msleep(100);\r
         /*ͬ²½*/        \r
        }\r
@@ -1020,30 +1040,18 @@ static int rga_release(struct inode *inode, struct file *file)
        kfree(session);\r
        spin_unlock_irqrestore(&rga_service.lock, flag);\r
 \r
-    DBG("*** rga dev close ***\n");\r
+    //DBG("*** rga dev close ***\n");\r
        return 0;\r
 }\r
 \r
 static irqreturn_t rga_irq(int irq,  void *dev_id)\r
 {\r
     unsigned long flag;\r
-    \r
-    #if RGA_TEST\r
-    printk("rga_irq is valid\n");\r
-    #endif      \r
-\r
-    #if 0//RGA_INFO_BUS_ERROR\r
-    if(rga_read(RGA_INT) & 0x1)\r
-    {\r
-        printk("bus Error interrupt is occur\n");\r
-        rga_soft_reset();\r
-    }\r
-    #endif\r
-\r
+        \r
     /*clear INT */\r
        rga_write(rga_read(RGA_INT) | (0x1<<6) | (0x1<<7) | (0x1<<4), RGA_INT);\r
 \r
-    spin_lock_irqsave(&rga_service.lock, flag);        \r
+    spin_lock_irqsave(&rga_service.lock, flag);\r
     rga_del_running_list();\r
            \r
     if(!list_empty(&rga_service.waiting))\r
@@ -1064,7 +1072,7 @@ static int rga_suspend(struct platform_device *pdev, pm_message_t state)
        uint32_t enable;\r
     \r
     enable = rga_service.enable;    \r
-       rga_power_off();\r
+       rga_power_off(NULL);\r
     rga_service.enable = enable;\r
 \r
        return 0;\r
@@ -1085,7 +1093,7 @@ static int rga_resume(struct platform_device *pdev)
 static void rga_shutdown(struct platform_device *pdev)\r
 {\r
        pr_cont("shutdown...");     \r
-       rga_power_off();    \r
+       rga_power_off(NULL);    \r
     pr_cont("done\n");\r
 }\r
 \r
@@ -1193,7 +1201,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(NULL);\r
     \r
        DBG("RGA Driver loaded succesfully\n");\r
 \r
@@ -1295,7 +1303,7 @@ static void __exit rga_exit(void)
 {\r
     uint32_t i;\r
 \r
-    rga_power_off();\r
+    rga_power_off(NULL);\r
 \r
     for(i=0; i<2048; i++)\r
     {\r