MLK-13905: ARM: imx: pm-rpmsg: fix kernel warning while resume back
authorRobin Gong <yibin.gong@nxp.com>
Fri, 10 Feb 2017 09:23:38 +0000 (17:23 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:10:41 +0000 (15:10 -0500)
On i.mx7ulp, kernel need notify m4 side power mode message before enter VLLS
and resume back, but pm_qos_remove_request will enable local irq that cause
the below kernel warning since kernel assum local irq disalbed in syscore_resume.
In this case, just ignore touch pm_qos_* since cpu0 never enter idle at that
suspend time.

WARNING: CPU: 0 PID: 629 at drivers/base/syscore.c:99 syscore_resume+0xcc/0xec()
Interrupts enabled before system core resume.
Modules linked in:
CPU: 0 PID: 629 Comm: sh Not tainted 4.1.33-02249-g69520ab-dirty #259
Hardware name: Freescale i.MX7ULP (Device Tree)
[<80015ddc>] (unwind_backtrace) from [<8001274c>] (show_stack+0x10/0x14)
[<8001274c>] (show_stack) from [<807c97f0>] (dump_stack+0x88/0x9c)
[<807c97f0>] (dump_stack) from [<800386e4>] (warn_slowpath_common+0x84/0xb4)
[<800386e4>] (warn_slowpath_common) from [<80038744>] (warn_slowpath_fmt+0x30/0x40)
[<80038744>] (warn_slowpath_fmt) from [<8038d3d0>] (syscore_resume+0xcc/0xec)
[<8038d3d0>] (syscore_resume) from [<8006c1c4>] (suspend_devices_and_enter+0x3c4/0x500)
[<8006c1c4>] (suspend_devices_and_enter) from [<8006c580>] (pm_suspend+0x280/0x2fc

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
arch/arm/mach-imx/pm-rpmsg.c

index 6307902..746bb99 100644 (file)
@@ -61,7 +61,7 @@ struct pm_rpmsg_data {
 } __attribute__ ((packed));
 
 static int pm_send_message(struct pm_rpmsg_data *msg,
-                       struct pm_rpmsg_info *info)
+                       struct pm_rpmsg_info *info, bool susp)
 {
        int err;
 
@@ -70,14 +70,15 @@ static int pm_send_message(struct pm_rpmsg_data *msg,
                        "rpmsg channel not ready, m4 image ready?\n");
                return -EINVAL;
        }
-
-       pm_qos_add_request(&info->pm_qos_req,
-               PM_QOS_CPU_DMA_LATENCY, 0);
+       if (!susp)
+               pm_qos_add_request(&info->pm_qos_req,
+                       PM_QOS_CPU_DMA_LATENCY, 0);
 
        err = rpmsg_send(info->rpdev->ept, (void *)msg,
                            sizeof(struct pm_rpmsg_data));
 
-       pm_qos_remove_request(&info->pm_qos_req);
+       if (!susp)
+               pm_qos_remove_request(&info->pm_qos_req);
 
        return err;
 }
@@ -93,7 +94,7 @@ void pm_vlls_notify_m4(bool enter)
        msg.header.cmd = PM_RPMSG_MODE;
        msg.data = enter ? PM_RPMSG_VLLS : PM_RPMSG_RUN;
 
-       pm_send_message(&msg, &pm_rpmsg);
+       pm_send_message(&msg, &pm_rpmsg, true);
 }
 
 void pm_shutdown_notify_m4(void)
@@ -107,7 +108,7 @@ void pm_shutdown_notify_m4(void)
        msg.header.cmd = PM_RPMSG_MODE;
        msg.data = PM_RPMSG_SHUTDOWN;
 
-       pm_send_message(&msg, &pm_rpmsg);
+       pm_send_message(&msg, &pm_rpmsg, false);
 
 }
 
@@ -122,7 +123,7 @@ static void pm_heart_beat_work_handler(struct work_struct *work)
        msg.header.cmd = PM_RPMSG_HEART_BEAT;
        msg.data = 0;
 
-       pm_send_message(&msg, &pm_rpmsg);
+       pm_send_message(&msg, &pm_rpmsg, false);
 
        schedule_delayed_work(&heart_beat_work,
                msecs_to_jiffies(30000));