rk29-ipp:fix the timeout bug caused by the driver
authorchenli <chenli@rock-chips.com>
Mon, 19 Sep 2011 10:02:56 +0000 (18:02 +0800)
committerchenli <chenli@rock-chips.com>
Mon, 19 Sep 2011 10:02:56 +0000 (18:02 +0800)
1.Ensure the input value of the registers are written to the memory
2.If the interrupt has come but the wait queue has not been wake up,we consider that the result is correct

drivers/staging/rk29/ipp/rk29-ipp.c

index 05e8c652e8636a93befd960b56fb46dd6745fb72..455b4da9c272d70ae91426645be30a51d1197df8 100755 (executable)
@@ -139,6 +139,7 @@ struct ipp_context
 static inline void ipp_write( uint32_t b, uint32_t r)\r
 {\r
        __raw_writel(b, drvdata->ipp_base + r);\r
+       dsb();\r
 }\r
 \r
 static inline uint32_t ipp_read( uint32_t r)\r
@@ -884,10 +885,10 @@ int ipp_blit(const struct rk29_ipp_req *req)
 \r
 \r
        /* Start the operation */\r
-       ipp_write(8, IPP_INT);//                \r
-       dsb();\r
+       ipp_write(8, IPP_INT);          \r
+\r
        ipp_write(1, IPP_PROCESS_ST);\r
-       \r
+       dmac_clean_range(drvdata->ipp_base,drvdata->ipp_base+0x54);\r
 #ifdef IPP_TEST\r
        hw_start = ktime_get(); \r
 #endif \r
@@ -967,41 +968,35 @@ int ipp_blit_sync(const struct rk29_ipp_req *req)
 #endif                         \r
                if (wait_ret <= 0)\r
                {\r
-                       printk("%s wait_ret=%d,wait_event_timeout \n",__FUNCTION__,wait_ret);\r
-       \r
-#ifdef IPP_TEST\r
-                       //print all register's value\r
-                       printk("wait_ret: %d\n", wait_ret);\r
-                       printk("wq_condition: %d\n", wq_condition);\r
-                       printk("IPP_CONFIG: %x\n",ipp_read(IPP_CONFIG));\r
-                       printk("IPP_SRC_IMG_INFO: %x\n",ipp_read(IPP_SRC_IMG_INFO));\r
-                       printk("IPP_DST_IMG_INFO: %x\n",ipp_read(IPP_DST_IMG_INFO));\r
-                       printk("IPP_IMG_VIR: %x\n",ipp_read(IPP_IMG_VIR));\r
-                       printk("IPP_INT: %x\n",ipp_read(IPP_INT));\r
-                       printk("IPP_SRC0_Y_MST: %x\n",ipp_read(IPP_SRC0_Y_MST));\r
-                       printk("IPP_SRC0_CBR_MST: %x\n",ipp_read(IPP_SRC0_CBR_MST));\r
-                       printk("IPP_SRC1_Y_MST: %x\n",ipp_read(IPP_SRC1_Y_MST));\r
-                       printk("IPP_SRC1_CBR_MST: %x\n",ipp_read(IPP_SRC1_CBR_MST));\r
-                       printk("IPP_DST0_Y_MST: %x\n",ipp_read(IPP_DST0_Y_MST));\r
-                       printk("IPP_DST0_CBR_MST: %x\n",ipp_read(IPP_DST0_CBR_MST));\r
-                       printk("IPP_DST1_Y_MST: %x\n",ipp_read(IPP_DST1_Y_MST));\r
-                       printk("IPP_DST1_CBR_MST: %x\n",ipp_read(IPP_DST1_CBR_MST));\r
-                       printk("IPP_PRE_SCL_PARA: %x\n",ipp_read(IPP_PRE_SCL_PARA));\r
-                       printk("IPP_POST_SCL_PARA: %x\n",ipp_read(IPP_POST_SCL_PARA));\r
-                       printk("IPP_SWAP_CTRL: %x\n",ipp_read(IPP_SWAP_CTRL));\r
-                       printk("IPP_PRE_IMG_INFO: %x\n",ipp_read(IPP_PRE_IMG_INFO));\r
-                       printk("IPP_AXI_ID: %x\n",ipp_read(IPP_AXI_ID));\r
-                       printk("IPP_SRESET: %x\n",ipp_read(IPP_SRESET));\r
-                       printk("IPP_PROCESS_ST: %x\n",ipp_read(IPP_PROCESS_ST));\r
-       \r
-                       while(1)\r
+                       printk("%s wait_ret=%d,wq_condition =%d,wait_event_timeout! \n",__FUNCTION__,wait_ret,wq_condition);\r
+\r
+                       if(wq_condition==0)\r
                        {\r
-       \r
+                               //print all register's value\r
+                               printk("IPP_CONFIG: %x\n",ipp_read(IPP_CONFIG));\r
+                               printk("IPP_SRC_IMG_INFO: %x\n",ipp_read(IPP_SRC_IMG_INFO));\r
+                               printk("IPP_DST_IMG_INFO: %x\n",ipp_read(IPP_DST_IMG_INFO));\r
+                               printk("IPP_IMG_VIR: %x\n",ipp_read(IPP_IMG_VIR));\r
+                               printk("IPP_INT: %x\n",ipp_read(IPP_INT));\r
+                               printk("IPP_SRC0_Y_MST: %x\n",ipp_read(IPP_SRC0_Y_MST));\r
+                               printk("IPP_SRC0_CBR_MST: %x\n",ipp_read(IPP_SRC0_CBR_MST));\r
+                               printk("IPP_SRC1_Y_MST: %x\n",ipp_read(IPP_SRC1_Y_MST));\r
+                               printk("IPP_SRC1_CBR_MST: %x\n",ipp_read(IPP_SRC1_CBR_MST));\r
+                               printk("IPP_DST0_Y_MST: %x\n",ipp_read(IPP_DST0_Y_MST));\r
+                               printk("IPP_DST0_CBR_MST: %x\n",ipp_read(IPP_DST0_CBR_MST));\r
+                               printk("IPP_DST1_Y_MST: %x\n",ipp_read(IPP_DST1_Y_MST));\r
+                               printk("IPP_DST1_CBR_MST: %x\n",ipp_read(IPP_DST1_CBR_MST));\r
+                               printk("IPP_PRE_SCL_PARA: %x\n",ipp_read(IPP_PRE_SCL_PARA));\r
+                               printk("IPP_POST_SCL_PARA: %x\n",ipp_read(IPP_POST_SCL_PARA));\r
+                               printk("IPP_SWAP_CTRL: %x\n",ipp_read(IPP_SWAP_CTRL));\r
+                               printk("IPP_PRE_IMG_INFO: %x\n",ipp_read(IPP_PRE_IMG_INFO));\r
+                               printk("IPP_AXI_ID: %x\n",ipp_read(IPP_AXI_ID));\r
+                               printk("IPP_SRESET: %x\n",ipp_read(IPP_SRESET));\r
+                               printk("IPP_PROCESS_ST: %x\n",ipp_read(IPP_PROCESS_ST));\r
+               \r
+                               ipp_soft_reset();\r
+                               drvdata->ipp_result = -EAGAIN;\r
                        }\r
-#endif\r
-                       \r
-                       ipp_soft_reset();\r
-                       drvdata->ipp_result = -EAGAIN;\r
                }\r
 \r
                ipp_power_off(NULL);\r