]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.19
authorSasha Levin <sashal@kernel.org>
Wed, 9 Aug 2023 01:44:29 +0000 (21:44 -0400)
committerSasha Levin <sashal@kernel.org>
Wed, 9 Aug 2023 01:44:29 +0000 (21:44 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.19/arm-dts-imx-add-usb-alias.patch [new file with mode: 0644]
queue-4.19/arm-dts-imx6sll-fixup-of-operating-points.patch [new file with mode: 0644]
queue-4.19/arm-dts-imx6sll-make-ssi-node-name-same-as-other-pla.patch [new file with mode: 0644]
queue-4.19/arm-dts-nxp-imx6sll-fix-wrong-property-name-in-usbph.patch [new file with mode: 0644]
queue-4.19/pm-sleep-wakeirq-fix-wake-irq-arming.patch [new file with mode: 0644]
queue-4.19/pm-wakeirq-support-enabling-wake-up-irq-after-runtim.patch [new file with mode: 0644]
queue-4.19/series

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 (file)
index 0000000..8807773
--- /dev/null
@@ -0,0 +1,127 @@
+From 08016f46826722d4d80a6a5db6762e9f7c1bcc2e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 1 Nov 2020 19:29:53 +0800
+Subject: ARM: dts: imx: add usb alias
+
+From: Peng Fan <peng.fan@nxp.com>
+
+[ Upstream commit 5c8b3b8a182cbc1ccdfcdeea9b25dd2c12a8148f ]
+
+Add usb alias for bootloader searching the controller in correct order.
+
+Signed-off-by: Peng Fan <peng.fan@nxp.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Stable-dep-of: ee70b908f77a ("ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <dt-bindings/reset/imx7-reset.h>
+ / {
++      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 (file)
index 0000000..3c9d087
--- /dev/null
@@ -0,0 +1,59 @@
+From 65718eecf60a3cb168e8c75d77682ee4514f7b9b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Sep 2021 11:14:37 +0200
+Subject: ARM: dts: imx6sll: fixup of operating points
+
+From: Andreas Kemnade <andreas@kemnade.info>
+
+[ Upstream commit 1875903019ea6e32e6e544c1631b119e4fd60b20 ]
+
+Make operating point definitions comply with binding
+specifications.
+
+Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Stable-dep-of: ee70b908f77a ("ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..87c196d
--- /dev/null
@@ -0,0 +1,60 @@
+From d0cb7257434fd7977a3759f70de01fa14d6c8cb0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jun 2020 18:44:50 +0800
+Subject: ARM: dts: imx6sll: Make ssi node name same as other platforms
+
+From: Shengjiu Wang <shengjiu.wang@nxp.com>
+
+[ 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 <shengjiu.wang@nxp.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Stable-dep-of: ee70b908f77a ("ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+@@ -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 = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
+@@ -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 = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
+-- 
+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 (file)
index 0000000..da86d71
--- /dev/null
@@ -0,0 +1,36 @@
+From 605360fba8fbc8821b1b9c16bd1a25caf44d6719 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jul 2023 10:28:33 +0800
+Subject: ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node
+
+From: Xu Yang <xu.yang_2@nxp.com>
+
+[ 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: <stable@vger.kernel.org>
+Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SLL_CLK_USBPHY2>;
+-                              phy-reg_3p0-supply = <&reg_3p0>;
++                              phy-3p0-supply = <&reg_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 (file)
index 0000000..58142f3
--- /dev/null
@@ -0,0 +1,95 @@
+From 9905d7db253f86cb349de0fa2689b25dce4e4fe3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 13 Jul 2023 16:57:39 +0200
+Subject: PM: sleep: wakeirq: fix wake irq arming
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+[ 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+ <stable@vger.kernel.org> # 4.16+
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Reviewed-by: Tony Lindgren <tony@atomide.com>
+Tested-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..877bd9a
--- /dev/null
@@ -0,0 +1,290 @@
+From 67bb3564a7da15c5473c8bedde669cd731abcab0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 Oct 2021 15:01:53 +0800
+Subject: PM / wakeirq: support enabling wake-up irq after runtime_suspend
+ called
+
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+
+[ 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 <rafael.j.wysocki@intel.com>
+Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Stable-dep-of: 8527beb12087 ("PM: sleep: wakeirq: fix wake irq arming")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+
index 2a93c7984515ac752f0fed67b7dcf4de67c094f6..cf91be2bf0019581e66bb9f127ae68608cdfab72 100644 (file)
@@ -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