rk3036: remove mutex lock in irq service
authorljf <ljf@rock-chips.com>
Wed, 30 Jul 2014 11:55:49 +0000 (19:55 +0800)
committerljf <ljf@rock-chips.com>
Wed, 30 Jul 2014 11:55:49 +0000 (19:55 +0800)
arch/arm/mach-rockchip/vcodec_service.c

index 34f16367e6116e2b7521d98f3927cd71cec31d42..45e13034fd24f7a5a97f0bf0edf46174c9c19d02 100755 (executable)
@@ -366,6 +366,8 @@ typedef struct vpu_service_info {
 \r
        enum vcodec_device_id   dev_id;\r
 \r
+       u32                     reserved_mode;\r
+\r
        struct delayed_work     simulate_work;\r
 } vpu_service_info;\r
 \r
@@ -399,10 +401,11 @@ static const struct file_operations debug_vcodec_fops = {
 #define VPU_TIMEOUT_DELAY              2*HZ /* 2s */\r
 #define VPU_SIMULATE_DELAY             msecs_to_jiffies(15)\r
 \r
-static void vcodec_enter_mode(enum vcodec_device_id id)\r
+static void vcodec_enter_mode_nolock(enum vcodec_device_id id, u32 *reserved_mode)\r
 {\r
        if (soc_is_rk3036()) {\r
-               mutex_lock(&g_mode_mutex);\r
+               if (reserved_mode)\r
+                       *reserved_mode = readl_relaxed(RK_GRF_VIRT + RK3036_GRF_SOC_CON1);\r
 #define BIT_VCODEC_SEL         (1<<3)\r
                if (id == VCODEC_DEVICE_ID_HEVC) {\r
                        writel_relaxed(readl_relaxed(RK_GRF_VIRT + RK3036_GRF_SOC_CON1) | (BIT_VCODEC_SEL) | (BIT_VCODEC_SEL << 16), RK_GRF_VIRT + RK3036_GRF_SOC_CON1);\r
@@ -412,6 +415,18 @@ static void vcodec_enter_mode(enum vcodec_device_id id)
        }\r
 }\r
 \r
+static void vcodec_exit_mode_nolock(enum vcodec_device_id id, u32 reserved_mode)\r
+{\r
+       writel_relaxed(reserved_mode | (BIT_VCODEC_SEL << 16), RK_GRF_VIRT + RK3036_GRF_SOC_CON1);\r
+}\r
+\r
+static void vcodec_enter_mode(enum vcodec_device_id id)\r
+{\r
+       if (soc_is_rk3036())\r
+               mutex_lock(&g_mode_mutex);\r
+       vcodec_enter_mode_nolock(id, NULL);\r
+}\r
+\r
 static void vcodec_exit_mode(void)\r
 {\r
        if (soc_is_rk3036())\r
@@ -2005,7 +2020,7 @@ static irqreturn_t vdpu_irq(int irq, void *dev_id)
        u32 raw_status;\r
        u32 irq_status;\r
 \r
-       vcodec_enter_mode(pservice->dev_id);\r
+       vcodec_enter_mode_nolock(pservice->dev_id, &pservice->reserved_mode);\r
 \r
        irq_status = raw_status = readl(dev->hwregs + DEC_INTERRUPT_REGISTER);\r
 \r
@@ -2039,7 +2054,8 @@ static irqreturn_t vdpu_irq(int irq, void *dev_id)
        }\r
 \r
        pservice->irq_status = raw_status;\r
-       vcodec_exit_mode();\r
+\r
+       vcodec_exit_mode_nolock(pservice->dev_id, pservice->reserved_mode);\r
 \r
        return IRQ_WAKE_THREAD;\r
 }\r
@@ -2092,7 +2108,7 @@ static irqreturn_t vepu_irq(int irq, void *dev_id)
        vpu_device *dev = &pservice->enc_dev;\r
        u32 irq_status;\r
 \r
-       vcodec_enter_mode(pservice->dev_id);\r
+       vcodec_enter_mode_nolock(pservice->dev_id,  &pservice->reserved_mode);\r
        irq_status= readl(dev->hwregs + ENC_INTERRUPT_REGISTER);\r
 \r
        pr_debug("vepu_irq irq status %x\n", irq_status);\r
@@ -2110,7 +2126,8 @@ static irqreturn_t vepu_irq(int irq, void *dev_id)
        }\r
 \r
        pservice->irq_status = irq_status;\r
-       vcodec_exit_mode();\r
+\r
+       vcodec_exit_mode_nolock(pservice->dev_id, pservice->reserved_mode);\r
 \r
        return IRQ_WAKE_THREAD;\r
 }\r