diff --git a/arch/arm/boot/dts/amlogic/meson-s4.dtsi b/arch/arm/boot/dts/amlogic/meson-s4.dtsi index 5ba3a69ed..485bc9b42 100644 --- a/arch/arm/boot/dts/amlogic/meson-s4.dtsi +++ b/arch/arm/boot/dts/amlogic/meson-s4.dtsi @@ -182,6 +182,7 @@ status = "okay"; device_name = "aml_pm"; extend_resume_reason; + clear_suspend_reason = <9>; /* Clear netflix wakeup reason */ reg = <0xfe010288 0x4>, /*SYSCTRL_STATUS_REG2*/ <0xfe0102dc 0x4>; /*SYSCTRL_STICKY_REG7*/ }; diff --git a/arch/arm/boot/dts/amlogic/meson-s4d.dtsi b/arch/arm/boot/dts/amlogic/meson-s4d.dtsi index 4b838eb3d..6e70a85cb 100644 --- a/arch/arm/boot/dts/amlogic/meson-s4d.dtsi +++ b/arch/arm/boot/dts/amlogic/meson-s4d.dtsi @@ -203,6 +203,7 @@ status = "okay"; device_name = "aml_pm"; extend_resume_reason; + clear_suspend_reason = <9>; /* Clear netflix wakeup reason */ reg = <0xfe010288 0x4>, /*SYSCTRL_STATUS_REG2*/ <0xfe0102dc 0x4>; /*SYSCTRL_STICKY_REG7*/ }; diff --git a/arch/arm/boot/dts/amlogic/meson-sc2.dtsi b/arch/arm/boot/dts/amlogic/meson-sc2.dtsi index 510c4f4c0..223f96c47 100644 --- a/arch/arm/boot/dts/amlogic/meson-sc2.dtsi +++ b/arch/arm/boot/dts/amlogic/meson-sc2.dtsi @@ -144,6 +144,7 @@ status = "okay"; device_name = "aml_pm"; extend_resume_reason; + clear_suspend_reason = <9>; /* Clear netflix wakeup reason */ reg = <0xfe010288 0x4>, /*SYSCTRL_STATUS_REG2*/ <0xfe0102dc 0x4>; /*SYSCTRL_STICKY_REG7*/ }; diff --git a/arch/arm64/boot/dts/amlogic/meson-s4.dtsi b/arch/arm64/boot/dts/amlogic/meson-s4.dtsi index 6c79cb3a8..159f5decc 100644 --- a/arch/arm64/boot/dts/amlogic/meson-s4.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-s4.dtsi @@ -183,6 +183,7 @@ status = "okay"; device_name = "aml_pm"; extend_resume_reason; + clear_suspend_reason = <9>; /* Clear netflix wakeup reason */ reg = <0x0 0xfe010288 0x0 0x4>, /*SYSCTRL_STATUS_REG2*/ <0x0 0xfe0102dc 0x0 0x4>; /*SYSCTRL_STICKY_REG7*/ }; diff --git a/arch/arm64/boot/dts/amlogic/meson-s4d.dtsi b/arch/arm64/boot/dts/amlogic/meson-s4d.dtsi index f48e9fd8c..a189f0910 100644 --- a/arch/arm64/boot/dts/amlogic/meson-s4d.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-s4d.dtsi @@ -203,6 +203,7 @@ status = "okay"; device_name = "aml_pm"; extend_resume_reason; + clear_suspend_reason = <9>; /* Clear netflix wakeup reason */ reg = <0x0 0xfe010288 0x0 0x4>, /*SYSCTRL_STATUS_REG2*/ <0x0 0xfe0102dc 0x0 0x4>; /*SYSCTRL_STICKY_REG7*/ }; diff --git a/arch/arm64/boot/dts/amlogic/meson-sc2.dtsi b/arch/arm64/boot/dts/amlogic/meson-sc2.dtsi index 3b02c75ed..b79cab996 100644 --- a/arch/arm64/boot/dts/amlogic/meson-sc2.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-sc2.dtsi @@ -144,6 +144,7 @@ status = "okay"; device_name = "aml_pm"; extend_resume_reason; + clear_suspend_reason = <9>; /* Clear netflix wakeup reason */ reg = <0x0 0xfe010288 0x0 0x4>, /*SYSCTRL_STATUS_REG2*/ <0x0 0xfe0102dc 0x0 0x4>; /*SYSCTRL_STICKY_REG7*/ }; diff --git a/drivers/pm/gx_pm.c b/drivers/pm/gx_pm.c index dae5a6b6c..758a882bc 100644 --- a/drivers/pm/gx_pm.c +++ b/drivers/pm/gx_pm.c @@ -386,6 +386,7 @@ static void __iomem *exit_reg; static suspend_state_t pm_state; static unsigned int resume_reason; static unsigned int suspend_reason; +static unsigned int clear_suspend_reason; static bool is_extd_resume_reason; /* @@ -586,6 +587,20 @@ int gx_pm_syscore_suspend(void) return 0; } +/*clear wakeup reason*/ +void gx_pm_syscore_shutdown(void) +{ + u32 val; + + if (exit_reg && is_extd_resume_reason && + clear_suspend_reason) { + val = readl_relaxed(exit_reg); + if ((val & 0x7f) == clear_suspend_reason) + val &= ~clear_suspend_reason; + writel_relaxed(val, exit_reg); + } +} + void gx_pm_syscore_resume(void) { sys_time_out = 0; @@ -595,6 +610,7 @@ void gx_pm_syscore_resume(void) static struct syscore_ops gx_pm_syscore_ops = { .suspend = gx_pm_syscore_suspend, .resume = gx_pm_syscore_resume, + .shutdown = gx_pm_syscore_shutdown, }; static int __init gx_pm_init_ops(void) @@ -618,6 +634,14 @@ static int meson_pm_probe(struct platform_device *pdev) else is_extd_resume_reason = false; + if (of_property_read_u32(pdev->dev.of_node, "clear_suspend_reason", + &clear_suspend_reason)) { + dev_info(&pdev->dev, "clear_suspend_reason not found, using default\n"); + clear_suspend_reason = 0; + } else { + dev_info(&pdev->dev, "clear_suspend_reason found: 0x%x\n", clear_suspend_reason); + } + debug_reg = of_iomap(pdev->dev.of_node, 0); if (!debug_reg) return -ENOMEM;