From fb193b6e13222d0cbd3b96b3aa2c4c557cdb56d7 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Tue, 8 Aug 2023 21:44:29 -0400 Subject: [PATCH] Fixes for 4.19 Signed-off-by: Sasha Levin --- queue-4.19/arm-dts-imx-add-usb-alias.patch | 127 ++++++++ ...ts-imx6sll-fixup-of-operating-points.patch | 59 ++++ ...make-ssi-node-name-same-as-other-pla.patch | 60 ++++ ...sll-fix-wrong-property-name-in-usbph.patch | 36 +++ ...pm-sleep-wakeirq-fix-wake-irq-arming.patch | 95 ++++++ ...rt-enabling-wake-up-irq-after-runtim.patch | 290 ++++++++++++++++++ queue-4.19/series | 6 + 7 files changed, 673 insertions(+) create mode 100644 queue-4.19/arm-dts-imx-add-usb-alias.patch create mode 100644 queue-4.19/arm-dts-imx6sll-fixup-of-operating-points.patch create mode 100644 queue-4.19/arm-dts-imx6sll-make-ssi-node-name-same-as-other-pla.patch create mode 100644 queue-4.19/arm-dts-nxp-imx6sll-fix-wrong-property-name-in-usbph.patch create mode 100644 queue-4.19/pm-sleep-wakeirq-fix-wake-irq-arming.patch create mode 100644 queue-4.19/pm-wakeirq-support-enabling-wake-up-irq-after-runtim.patch diff --git a/queue-4.19/arm-dts-imx-add-usb-alias.patch b/queue-4.19/arm-dts-imx-add-usb-alias.patch new file mode 100644 index 00000000000..88077731b5b --- /dev/null +++ b/queue-4.19/arm-dts-imx-add-usb-alias.patch @@ -0,0 +1,127 @@ +From 08016f46826722d4d80a6a5db6762e9f7c1bcc2e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 1 Nov 2020 19:29:53 +0800 +Subject: ARM: dts: imx: add usb alias + +From: Peng Fan + +[ Upstream commit 5c8b3b8a182cbc1ccdfcdeea9b25dd2c12a8148f ] + +Add usb alias for bootloader searching the controller in correct order. + +Signed-off-by: Peng Fan +Signed-off-by: Shawn Guo +Stable-dep-of: ee70b908f77a ("ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node") +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6qdl.dtsi | 4 ++++ + arch/arm/boot/dts/imx6sl.dtsi | 3 +++ + arch/arm/boot/dts/imx6sll.dtsi | 2 ++ + arch/arm/boot/dts/imx6sx.dtsi | 3 +++ + arch/arm/boot/dts/imx6ul.dtsi | 2 ++ + arch/arm/boot/dts/imx7d.dtsi | 6 ++++++ + arch/arm/boot/dts/imx7s.dtsi | 2 ++ + 7 files changed, 22 insertions(+) + +diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi +index d91cc532d0e2c..fcd7e4dc949a1 100644 +--- a/arch/arm/boot/dts/imx6qdl.dtsi ++++ b/arch/arm/boot/dts/imx6qdl.dtsi +@@ -46,6 +46,10 @@ aliases { + spi1 = &ecspi2; + spi2 = &ecspi3; + spi3 = &ecspi4; ++ usb0 = &usbotg; ++ usb1 = &usbh1; ++ usb2 = &usbh2; ++ usb3 = &usbh3; + usbphy0 = &usbphy1; + usbphy1 = &usbphy2; + }; +diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi +index afde0ed6d71af..b00f791471c66 100644 +--- a/arch/arm/boot/dts/imx6sl.dtsi ++++ b/arch/arm/boot/dts/imx6sl.dtsi +@@ -32,6 +32,9 @@ aliases { + spi1 = &ecspi2; + spi2 = &ecspi3; + spi3 = &ecspi4; ++ usb0 = &usbotg1; ++ usb1 = &usbotg2; ++ usb2 = &usbh; + usbphy0 = &usbphy1; + usbphy1 = &usbphy2; + }; +diff --git a/arch/arm/boot/dts/imx6sll.dtsi b/arch/arm/boot/dts/imx6sll.dtsi +index 8197767de69d7..b519ab87c4596 100644 +--- a/arch/arm/boot/dts/imx6sll.dtsi ++++ b/arch/arm/boot/dts/imx6sll.dtsi +@@ -36,6 +36,8 @@ aliases { + spi1 = &ecspi2; + spi3 = &ecspi3; + spi4 = &ecspi4; ++ usb0 = &usbotg1; ++ usb1 = &usbotg2; + usbphy0 = &usbphy1; + usbphy1 = &usbphy2; + }; +diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi +index b9ab1118be30b..a0c0e631ebbe6 100644 +--- a/arch/arm/boot/dts/imx6sx.dtsi ++++ b/arch/arm/boot/dts/imx6sx.dtsi +@@ -49,6 +49,9 @@ aliases { + spi2 = &ecspi3; + spi3 = &ecspi4; + spi4 = &ecspi5; ++ usb0 = &usbotg1; ++ usb1 = &usbotg2; ++ usb2 = &usbh; + usbphy0 = &usbphy1; + usbphy1 = &usbphy2; + }; +diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi +index 334638ff50750..dcb187995f760 100644 +--- a/arch/arm/boot/dts/imx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul.dtsi +@@ -47,6 +47,8 @@ aliases { + spi1 = &ecspi2; + spi2 = &ecspi3; + spi3 = &ecspi4; ++ usb0 = &usbotg1; ++ usb1 = &usbotg2; + usbphy0 = &usbphy1; + usbphy1 = &usbphy2; + }; +diff --git a/arch/arm/boot/dts/imx7d.dtsi b/arch/arm/boot/dts/imx7d.dtsi +index 7234e8330a576..34904f7eeb133 100644 +--- a/arch/arm/boot/dts/imx7d.dtsi ++++ b/arch/arm/boot/dts/imx7d.dtsi +@@ -7,6 +7,12 @@ + #include + + / { ++ aliases { ++ usb0 = &usbotg1; ++ usb1 = &usbotg2; ++ usb2 = &usbh; ++ }; ++ + cpus { + cpu0: cpu@0 { + clock-frequency = <996000000>; +diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi +index 7eaf96b425bed..8a6d698e253d2 100644 +--- a/arch/arm/boot/dts/imx7s.dtsi ++++ b/arch/arm/boot/dts/imx7s.dtsi +@@ -46,6 +46,8 @@ aliases { + spi1 = &ecspi2; + spi2 = &ecspi3; + spi3 = &ecspi4; ++ usb0 = &usbotg1; ++ usb1 = &usbh; + }; + + cpus { +-- +2.40.1 + diff --git a/queue-4.19/arm-dts-imx6sll-fixup-of-operating-points.patch b/queue-4.19/arm-dts-imx6sll-fixup-of-operating-points.patch new file mode 100644 index 00000000000..3c9d087944c --- /dev/null +++ b/queue-4.19/arm-dts-imx6sll-fixup-of-operating-points.patch @@ -0,0 +1,59 @@ +From 65718eecf60a3cb168e8c75d77682ee4514f7b9b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Sep 2021 11:14:37 +0200 +Subject: ARM: dts: imx6sll: fixup of operating points + +From: Andreas Kemnade + +[ Upstream commit 1875903019ea6e32e6e544c1631b119e4fd60b20 ] + +Make operating point definitions comply with binding +specifications. + +Signed-off-by: Andreas Kemnade +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Shawn Guo +Stable-dep-of: ee70b908f77a ("ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node") +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6sll.dtsi | 22 ++++++++++------------ + 1 file changed, 10 insertions(+), 12 deletions(-) + +diff --git a/arch/arm/boot/dts/imx6sll.dtsi b/arch/arm/boot/dts/imx6sll.dtsi +index b519ab87c4596..164836fe63cc2 100644 +--- a/arch/arm/boot/dts/imx6sll.dtsi ++++ b/arch/arm/boot/dts/imx6sll.dtsi +@@ -51,20 +51,18 @@ cpu0: cpu@0 { + device_type = "cpu"; + reg = <0>; + next-level-cache = <&L2>; +- operating-points = < ++ operating-points = + /* kHz uV */ +- 996000 1275000 +- 792000 1175000 +- 396000 1075000 +- 198000 975000 +- >; +- fsl,soc-operating-points = < ++ <996000 1275000>, ++ <792000 1175000>, ++ <396000 1075000>, ++ <198000 975000>; ++ fsl,soc-operating-points = + /* ARM kHz SOC-PU uV */ +- 996000 1175000 +- 792000 1175000 +- 396000 1175000 +- 198000 1175000 +- >; ++ <996000 1175000>, ++ <792000 1175000>, ++ <396000 1175000>, ++ <198000 1175000>; + clock-latency = <61036>; /* two CLK32 periods */ + clocks = <&clks IMX6SLL_CLK_ARM>, + <&clks IMX6SLL_CLK_PLL2_PFD2>, +-- +2.40.1 + diff --git a/queue-4.19/arm-dts-imx6sll-make-ssi-node-name-same-as-other-pla.patch b/queue-4.19/arm-dts-imx6sll-make-ssi-node-name-same-as-other-pla.patch new file mode 100644 index 00000000000..87c196d93e0 --- /dev/null +++ b/queue-4.19/arm-dts-imx6sll-make-ssi-node-name-same-as-other-pla.patch @@ -0,0 +1,60 @@ +From d0cb7257434fd7977a3759f70de01fa14d6c8cb0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jun 2020 18:44:50 +0800 +Subject: ARM: dts: imx6sll: Make ssi node name same as other platforms + +From: Shengjiu Wang + +[ Upstream commit 5da1b522cf7dc51f7fde2cca8d90406b0291c503 ] + +In imx6sll.dtsi, the ssi node name is different with other +platforms (imx6qdl, imx6sl, imx6sx), but the +sound/soc/fsl/fsl-asoc-card.c machine driver needs to check +ssi node name for audmux configuration, then different ssi +node name causes issue on imx6sll platform. + +So we change ssi node name to make all platforms have same +name. + +Signed-off-by: Shengjiu Wang +Signed-off-by: Shawn Guo +Stable-dep-of: ee70b908f77a ("ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node") +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6sll.dtsi | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/boot/dts/imx6sll.dtsi b/arch/arm/boot/dts/imx6sll.dtsi +index d7d092a5522a3..8197767de69d7 100644 +--- a/arch/arm/boot/dts/imx6sll.dtsi ++++ b/arch/arm/boot/dts/imx6sll.dtsi +@@ -271,7 +271,7 @@ uart2: serial@2024000 { + status = "disabled"; + }; + +- ssi1: ssi-controller@2028000 { ++ ssi1: ssi@2028000 { + compatible = "fsl,imx6sl-ssi", "fsl,imx51-ssi"; + reg = <0x02028000 0x4000>; + interrupts = ; +@@ -284,7 +284,7 @@ ssi1: ssi-controller@2028000 { + status = "disabled"; + }; + +- ssi2: ssi-controller@202c000 { ++ ssi2: ssi@202c000 { + compatible = "fsl,imx6sl-ssi", "fsl,imx51-ssi"; + reg = <0x0202c000 0x4000>; + interrupts = ; +@@ -297,7 +297,7 @@ ssi2: ssi-controller@202c000 { + status = "disabled"; + }; + +- ssi3: ssi-controller@2030000 { ++ ssi3: ssi@2030000 { + compatible = "fsl,imx6sl-ssi", "fsl,imx51-ssi"; + reg = <0x02030000 0x4000>; + interrupts = ; +-- +2.40.1 + diff --git a/queue-4.19/arm-dts-nxp-imx6sll-fix-wrong-property-name-in-usbph.patch b/queue-4.19/arm-dts-nxp-imx6sll-fix-wrong-property-name-in-usbph.patch new file mode 100644 index 00000000000..da86d71d346 --- /dev/null +++ b/queue-4.19/arm-dts-nxp-imx6sll-fix-wrong-property-name-in-usbph.patch @@ -0,0 +1,36 @@ +From 605360fba8fbc8821b1b9c16bd1a25caf44d6719 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 17 Jul 2023 10:28:33 +0800 +Subject: ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node + +From: Xu Yang + +[ Upstream commit ee70b908f77a9d8f689dea986f09e6d7dc481934 ] + +Property name "phy-3p0-supply" is used instead of "phy-reg_3p0-supply". + +Fixes: 9f30b6b1a957 ("ARM: dts: imx: Add basic dtsi file for imx6sll") +cc: +Signed-off-by: Xu Yang +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6sll.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6sll.dtsi b/arch/arm/boot/dts/imx6sll.dtsi +index 164836fe63cc2..9f0c82d79a361 100644 +--- a/arch/arm/boot/dts/imx6sll.dtsi ++++ b/arch/arm/boot/dts/imx6sll.dtsi +@@ -518,7 +518,7 @@ usbphy2: usb-phy@20ca000 { + reg = <0x020ca000 0x1000>; + interrupts = ; + clocks = <&clks IMX6SLL_CLK_USBPHY2>; +- phy-reg_3p0-supply = <®_3p0>; ++ phy-3p0-supply = <®_3p0>; + fsl,anatop = <&anatop>; + }; + +-- +2.40.1 + diff --git a/queue-4.19/pm-sleep-wakeirq-fix-wake-irq-arming.patch b/queue-4.19/pm-sleep-wakeirq-fix-wake-irq-arming.patch new file mode 100644 index 00000000000..58142f3c3b4 --- /dev/null +++ b/queue-4.19/pm-sleep-wakeirq-fix-wake-irq-arming.patch @@ -0,0 +1,95 @@ +From 9905d7db253f86cb349de0fa2689b25dce4e4fe3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 13 Jul 2023 16:57:39 +0200 +Subject: PM: sleep: wakeirq: fix wake irq arming + +From: Johan Hovold + +[ Upstream commit 8527beb12087238d4387607597b4020bc393c4b4 ] + +The decision whether to enable a wake irq during suspend can not be done +based on the runtime PM state directly as a driver may use wake irqs +without implementing runtime PM. Such drivers specifically leave the +state set to the default 'suspended' and the wake irq is thus never +enabled at suspend. + +Add a new wake irq flag to track whether a dedicated wake irq has been +enabled at runtime suspend and therefore must not be enabled at system +suspend. + +Note that pm_runtime_enabled() can not be used as runtime PM is always +disabled during late suspend. + +Fixes: 69728051f5bf ("PM / wakeirq: Fix unbalanced IRQ enable for wakeirq") +Cc: 4.16+ # 4.16+ +Signed-off-by: Johan Hovold +Reviewed-by: Tony Lindgren +Tested-by: Tony Lindgren +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/base/power/power.h | 1 + + drivers/base/power/wakeirq.c | 12 ++++++++---- + 2 files changed, 9 insertions(+), 4 deletions(-) + +diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h +index 55f32bd390007..3f9934bd6137d 100644 +--- a/drivers/base/power/power.h ++++ b/drivers/base/power/power.h +@@ -28,6 +28,7 @@ extern void pm_runtime_remove(struct device *dev); + #define WAKE_IRQ_DEDICATED_MASK (WAKE_IRQ_DEDICATED_ALLOCATED | \ + WAKE_IRQ_DEDICATED_MANAGED | \ + WAKE_IRQ_DEDICATED_REVERSE) ++#define WAKE_IRQ_DEDICATED_ENABLED BIT(3) + + struct wake_irq { + struct device *dev; +diff --git a/drivers/base/power/wakeirq.c b/drivers/base/power/wakeirq.c +index fa69e4ce47527..e7ba514999163 100644 +--- a/drivers/base/power/wakeirq.c ++++ b/drivers/base/power/wakeirq.c +@@ -328,8 +328,10 @@ void dev_pm_enable_wake_irq_check(struct device *dev, + return; + + enable: +- if (!can_change_status || !(wirq->status & WAKE_IRQ_DEDICATED_REVERSE)) ++ if (!can_change_status || !(wirq->status & WAKE_IRQ_DEDICATED_REVERSE)) { + enable_irq(wirq->irq); ++ wirq->status |= WAKE_IRQ_DEDICATED_ENABLED; ++ } + } + + /** +@@ -350,8 +352,10 @@ void dev_pm_disable_wake_irq_check(struct device *dev, bool cond_disable) + if (cond_disable && (wirq->status & WAKE_IRQ_DEDICATED_REVERSE)) + return; + +- if (wirq->status & WAKE_IRQ_DEDICATED_MANAGED) ++ if (wirq->status & WAKE_IRQ_DEDICATED_MANAGED) { ++ wirq->status &= ~WAKE_IRQ_DEDICATED_ENABLED; + disable_irq_nosync(wirq->irq); ++ } + } + + /** +@@ -390,7 +394,7 @@ void dev_pm_arm_wake_irq(struct wake_irq *wirq) + + if (device_may_wakeup(wirq->dev)) { + if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED && +- !pm_runtime_status_suspended(wirq->dev)) ++ !(wirq->status & WAKE_IRQ_DEDICATED_ENABLED)) + enable_irq(wirq->irq); + + enable_irq_wake(wirq->irq); +@@ -413,7 +417,7 @@ void dev_pm_disarm_wake_irq(struct wake_irq *wirq) + disable_irq_wake(wirq->irq); + + if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED && +- !pm_runtime_status_suspended(wirq->dev)) ++ !(wirq->status & WAKE_IRQ_DEDICATED_ENABLED)) + disable_irq_nosync(wirq->irq); + } + } +-- +2.40.1 + diff --git a/queue-4.19/pm-wakeirq-support-enabling-wake-up-irq-after-runtim.patch b/queue-4.19/pm-wakeirq-support-enabling-wake-up-irq-after-runtim.patch new file mode 100644 index 00000000000..877bd9a5d47 --- /dev/null +++ b/queue-4.19/pm-wakeirq-support-enabling-wake-up-irq-after-runtim.patch @@ -0,0 +1,290 @@ +From 67bb3564a7da15c5473c8bedde669cd731abcab0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Oct 2021 15:01:53 +0800 +Subject: PM / wakeirq: support enabling wake-up irq after runtime_suspend + called + +From: Chunfeng Yun + +[ Upstream commit 259714100d98b50bf04d36a21bf50ca8b829fc11 ] + +When the dedicated wake IRQ is level trigger, and it uses the +device's low-power status as the wakeup source, that means if the +device is not in low-power state, the wake IRQ will be triggered +if enabled; For this case, need enable the wake IRQ after running +the device's ->runtime_suspend() which make it enter low-power state. + +e.g. +Assume the wake IRQ is a low level trigger type, and the wakeup +signal comes from the low-power status of the device. +The wakeup signal is low level at running time (0), and becomes +high level when the device enters low-power state (runtime_suspend +(1) is called), a wakeup event at (2) make the device exit low-power +state, then the wakeup signal also becomes low level. + + ------------------ + | ^ ^| +---------------- | | -------------- + |<---(0)--->|<--(1)--| (3) (2) (4) + +if enable the wake IRQ before running runtime_suspend during (0), +a wake IRQ will arise, it causes resume immediately; +it works if enable wake IRQ ( e.g. at (3) or (4)) after running +->runtime_suspend(). + +This patch introduces a new status WAKE_IRQ_DEDICATED_REVERSE to +optionally support enabling wake IRQ after running ->runtime_suspend(). + +Suggested-by: Rafael J. Wysocki +Signed-off-by: Chunfeng Yun +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 8527beb12087 ("PM: sleep: wakeirq: fix wake irq arming") +Signed-off-by: Sasha Levin +--- + drivers/base/power/power.h | 7 ++- + drivers/base/power/runtime.c | 6 ++- + drivers/base/power/wakeirq.c | 101 +++++++++++++++++++++++++++-------- + include/linux/pm_wakeirq.h | 9 +++- + 4 files changed, 96 insertions(+), 27 deletions(-) + +diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h +index c511def48b486..55f32bd390007 100644 +--- a/drivers/base/power/power.h ++++ b/drivers/base/power/power.h +@@ -24,8 +24,10 @@ extern void pm_runtime_remove(struct device *dev); + + #define WAKE_IRQ_DEDICATED_ALLOCATED BIT(0) + #define WAKE_IRQ_DEDICATED_MANAGED BIT(1) ++#define WAKE_IRQ_DEDICATED_REVERSE BIT(2) + #define WAKE_IRQ_DEDICATED_MASK (WAKE_IRQ_DEDICATED_ALLOCATED | \ +- WAKE_IRQ_DEDICATED_MANAGED) ++ WAKE_IRQ_DEDICATED_MANAGED | \ ++ WAKE_IRQ_DEDICATED_REVERSE) + + struct wake_irq { + struct device *dev; +@@ -38,7 +40,8 @@ extern void dev_pm_arm_wake_irq(struct wake_irq *wirq); + extern void dev_pm_disarm_wake_irq(struct wake_irq *wirq); + extern void dev_pm_enable_wake_irq_check(struct device *dev, + bool can_change_status); +-extern void dev_pm_disable_wake_irq_check(struct device *dev); ++extern void dev_pm_disable_wake_irq_check(struct device *dev, bool cond_disable); ++extern void dev_pm_enable_wake_irq_complete(struct device *dev); + + #ifdef CONFIG_PM_SLEEP + +diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c +index 911bb8a4bf6df..ab0898c33880a 100644 +--- a/drivers/base/power/runtime.c ++++ b/drivers/base/power/runtime.c +@@ -606,6 +606,8 @@ static int rpm_suspend(struct device *dev, int rpmflags) + if (retval) + goto fail; + ++ dev_pm_enable_wake_irq_complete(dev); ++ + no_callback: + __update_runtime_status(dev, RPM_SUSPENDED); + pm_runtime_deactivate_timer(dev); +@@ -640,7 +642,7 @@ static int rpm_suspend(struct device *dev, int rpmflags) + return retval; + + fail: +- dev_pm_disable_wake_irq_check(dev); ++ dev_pm_disable_wake_irq_check(dev, true); + __update_runtime_status(dev, RPM_ACTIVE); + dev->power.deferred_resume = false; + wake_up_all(&dev->power.wait_queue); +@@ -823,7 +825,7 @@ static int rpm_resume(struct device *dev, int rpmflags) + + callback = RPM_GET_CALLBACK(dev, runtime_resume); + +- dev_pm_disable_wake_irq_check(dev); ++ dev_pm_disable_wake_irq_check(dev, false); + retval = rpm_callback(callback, dev); + if (retval) { + __update_runtime_status(dev, RPM_SUSPENDED); +diff --git a/drivers/base/power/wakeirq.c b/drivers/base/power/wakeirq.c +index b8fa5c0f2d132..fa69e4ce47527 100644 +--- a/drivers/base/power/wakeirq.c ++++ b/drivers/base/power/wakeirq.c +@@ -156,24 +156,7 @@ static irqreturn_t handle_threaded_wake_irq(int irq, void *_wirq) + return IRQ_HANDLED; + } + +-/** +- * dev_pm_set_dedicated_wake_irq - Request a dedicated wake-up interrupt +- * @dev: Device entry +- * @irq: Device wake-up interrupt +- * +- * Unless your hardware has separate wake-up interrupts in addition +- * to the device IO interrupts, you don't need this. +- * +- * Sets up a threaded interrupt handler for a device that has +- * a dedicated wake-up interrupt in addition to the device IO +- * interrupt. +- * +- * The interrupt starts disabled, and needs to be managed for +- * the device by the bus code or the device driver using +- * dev_pm_enable_wake_irq() and dev_pm_disable_wake_irq() +- * functions. +- */ +-int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq) ++static int __dev_pm_set_dedicated_wake_irq(struct device *dev, int irq, unsigned int flag) + { + struct wake_irq *wirq; + int err; +@@ -211,7 +194,7 @@ int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq) + if (err) + goto err_free_irq; + +- wirq->status = WAKE_IRQ_DEDICATED_ALLOCATED; ++ wirq->status = WAKE_IRQ_DEDICATED_ALLOCATED | flag; + + return err; + +@@ -224,8 +207,57 @@ int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq) + + return err; + } ++ ++ ++/** ++ * dev_pm_set_dedicated_wake_irq - Request a dedicated wake-up interrupt ++ * @dev: Device entry ++ * @irq: Device wake-up interrupt ++ * ++ * Unless your hardware has separate wake-up interrupts in addition ++ * to the device IO interrupts, you don't need this. ++ * ++ * Sets up a threaded interrupt handler for a device that has ++ * a dedicated wake-up interrupt in addition to the device IO ++ * interrupt. ++ * ++ * The interrupt starts disabled, and needs to be managed for ++ * the device by the bus code or the device driver using ++ * dev_pm_enable_wake_irq*() and dev_pm_disable_wake_irq*() ++ * functions. ++ */ ++int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq) ++{ ++ return __dev_pm_set_dedicated_wake_irq(dev, irq, 0); ++} + EXPORT_SYMBOL_GPL(dev_pm_set_dedicated_wake_irq); + ++/** ++ * dev_pm_set_dedicated_wake_irq_reverse - Request a dedicated wake-up interrupt ++ * with reverse enable ordering ++ * @dev: Device entry ++ * @irq: Device wake-up interrupt ++ * ++ * Unless your hardware has separate wake-up interrupts in addition ++ * to the device IO interrupts, you don't need this. ++ * ++ * Sets up a threaded interrupt handler for a device that has a dedicated ++ * wake-up interrupt in addition to the device IO interrupt. It sets ++ * the status of WAKE_IRQ_DEDICATED_REVERSE to tell rpm_suspend() ++ * to enable dedicated wake-up interrupt after running the runtime suspend ++ * callback for @dev. ++ * ++ * The interrupt starts disabled, and needs to be managed for ++ * the device by the bus code or the device driver using ++ * dev_pm_enable_wake_irq*() and dev_pm_disable_wake_irq*() ++ * functions. ++ */ ++int dev_pm_set_dedicated_wake_irq_reverse(struct device *dev, int irq) ++{ ++ return __dev_pm_set_dedicated_wake_irq(dev, irq, WAKE_IRQ_DEDICATED_REVERSE); ++} ++EXPORT_SYMBOL_GPL(dev_pm_set_dedicated_wake_irq_reverse); ++ + /** + * dev_pm_enable_wake_irq - Enable device wake-up interrupt + * @dev: Device +@@ -296,27 +328,54 @@ void dev_pm_enable_wake_irq_check(struct device *dev, + return; + + enable: +- enable_irq(wirq->irq); ++ if (!can_change_status || !(wirq->status & WAKE_IRQ_DEDICATED_REVERSE)) ++ enable_irq(wirq->irq); + } + + /** + * dev_pm_disable_wake_irq_check - Checks and disables wake-up interrupt + * @dev: Device ++ * @cond_disable: if set, also check WAKE_IRQ_DEDICATED_REVERSE + * + * Disables wake-up interrupt conditionally based on status. + * Should be only called from rpm_suspend() and rpm_resume() path. + */ +-void dev_pm_disable_wake_irq_check(struct device *dev) ++void dev_pm_disable_wake_irq_check(struct device *dev, bool cond_disable) + { + struct wake_irq *wirq = dev->power.wakeirq; + + if (!wirq || !((wirq->status & WAKE_IRQ_DEDICATED_MASK))) + return; + ++ if (cond_disable && (wirq->status & WAKE_IRQ_DEDICATED_REVERSE)) ++ return; ++ + if (wirq->status & WAKE_IRQ_DEDICATED_MANAGED) + disable_irq_nosync(wirq->irq); + } + ++/** ++ * dev_pm_enable_wake_irq_complete - enable wake IRQ not enabled before ++ * @dev: Device using the wake IRQ ++ * ++ * Enable wake IRQ conditionally based on status, mainly used if want to ++ * enable wake IRQ after running ->runtime_suspend() which depends on ++ * WAKE_IRQ_DEDICATED_REVERSE. ++ * ++ * Should be only called from rpm_suspend() path. ++ */ ++void dev_pm_enable_wake_irq_complete(struct device *dev) ++{ ++ struct wake_irq *wirq = dev->power.wakeirq; ++ ++ if (!wirq || !(wirq->status & WAKE_IRQ_DEDICATED_MASK)) ++ return; ++ ++ if (wirq->status & WAKE_IRQ_DEDICATED_MANAGED && ++ wirq->status & WAKE_IRQ_DEDICATED_REVERSE) ++ enable_irq(wirq->irq); ++} ++ + /** + * dev_pm_arm_wake_irq - Arm device wake-up + * @wirq: Device wake-up interrupt +diff --git a/include/linux/pm_wakeirq.h b/include/linux/pm_wakeirq.h +index cd5b62db90845..e63a63aa47a37 100644 +--- a/include/linux/pm_wakeirq.h ++++ b/include/linux/pm_wakeirq.h +@@ -17,8 +17,8 @@ + #ifdef CONFIG_PM + + extern int dev_pm_set_wake_irq(struct device *dev, int irq); +-extern int dev_pm_set_dedicated_wake_irq(struct device *dev, +- int irq); ++extern int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq); ++extern int dev_pm_set_dedicated_wake_irq_reverse(struct device *dev, int irq); + extern void dev_pm_clear_wake_irq(struct device *dev); + extern void dev_pm_enable_wake_irq(struct device *dev); + extern void dev_pm_disable_wake_irq(struct device *dev); +@@ -35,6 +35,11 @@ static inline int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq) + return 0; + } + ++static inline int dev_pm_set_dedicated_wake_irq_reverse(struct device *dev, int irq) ++{ ++ return 0; ++} ++ + static inline void dev_pm_clear_wake_irq(struct device *dev) + { + } +-- +2.40.1 + diff --git a/queue-4.19/series b/queue-4.19/series index 2a93c798451..cf91be2bf00 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -313,3 +313,9 @@ test_firmware-fix-a-memory-leak-with-reqs-buffer.patch test_firmware-return-enomem-instead-of-enospc-on-failed-memory-allocation.patch mtd-rawnand-omap_elm-fix-incorrect-type-in-assignmen.patch powerpc-mm-altmap-fix-altmap-boundary-check.patch +pm-wakeirq-support-enabling-wake-up-irq-after-runtim.patch +pm-sleep-wakeirq-fix-wake-irq-arming.patch +arm-dts-imx6sll-make-ssi-node-name-same-as-other-pla.patch +arm-dts-imx-add-usb-alias.patch +arm-dts-imx6sll-fixup-of-operating-points.patch +arm-dts-nxp-imx6sll-fix-wrong-property-name-in-usbph.patch -- 2.47.3