add some lock when rga is open & irq funtion
authorzsq <zsq@rock-chips.com>
Thu, 26 Apr 2012 08:09:56 +0000 (16:09 +0800)
committerzsq <zsq@rock-chips.com>
Thu, 26 Apr 2012 08:09:56 +0000 (16:09 +0800)
drivers/video/rockchip/rga/rga_drv.c

index 3e98eb752577f2a1ee48e9bddc3e228995136918..68d6dee5bb76609c5aa95264f6cb5840b553b42e 100755 (executable)
@@ -306,7 +306,6 @@ static int rga_get_result(rga_session *session, unsigned long arg)
 }\r
 \r
 \r
-\r
 static int rga_check_param(const struct rga_req *req)\r
 {\r
        /*RGA can support up to 8192*8192 resolution in RGB format,but we limit the image size to 8191*8191 here*/\r
@@ -710,6 +709,33 @@ static void rga_del_running_list_timeout(void)
 }\r
 \r
 \r
+static rga_mem_addr_sel(struct rga_req *req)\r
+{\r
+    switch(req->src.format)\r
+    {\r
+        case RK_FORMAT_YCbCr_422_SP:\r
+            break;\r
+        case RK_FORMAT_YCbCr_422_P :\r
+            break;\r
+        case RK_FORMAT_YCbCr_420_SP :\r
+            break;\r
+        case RK_FORMAT_YCbCr_420_P :\r
+            break;\r
+\r
+        case RK_FORMAT_YCrCb_422_SP :\r
+            break;\r
+        case RK_FORMAT_YCrCb_422_P :\r
+            break;\r
+        case RK_FORMAT_YCrCb_420_SP :\r
+            break;\r
+        case RK_FORMAT_YCrCb_420_P :            \r
+            break;\r
+        default :\r
+            break;\r
+    }\r
+    \r
+}\r
+\r
 \r
 static int rga_blit(rga_session *session, struct rga_req *req)\r
 {\r
@@ -927,6 +953,7 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 \r
 static int rga_open(struct inode *inode, struct file *file)\r
 {\r
+    unsigned long flag;\r
     rga_session *session = (rga_session *)kmalloc(sizeof(rga_session), GFP_KERNEL);\r
        if (NULL == session) {\r
                pr_err("unable to allocate memory for rga_session.");\r
@@ -938,8 +965,11 @@ static int rga_open(struct inode *inode, struct file *file)
        INIT_LIST_HEAD(&session->running);\r
        INIT_LIST_HEAD(&session->list_session);\r
        init_waitqueue_head(&session->wait);\r
-       /* no need to protect */\r
+    \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
        file->private_data = (void *)session;\r
@@ -1001,12 +1031,16 @@ static irqreturn_t rga_irq(int irq,  void *dev_id)
 \r
     spin_lock_irqsave(&rga_service.lock, flag);        \r
     rga_del_running_list();\r
-    spin_unlock_irqrestore(&rga_service.lock, flag);\r
-       \r
+           \r
     if(!list_empty(&rga_service.waiting))\r
     {\r
+        spin_unlock_irqrestore(&rga_service.lock, flag);\r
         rga_try_set_reg(1);\r
     }\r
+    else\r
+    {\r
+        spin_unlock_irqrestore(&rga_service.lock, flag);\r
+    }\r
    \r
     /* add cmd to cmd buf */\r
     /*\r