* [PATCH 0/2] PCI: Add support for PCIe wake interrupt
@ 2025-04-01 4:42 Krishna Chaitanya Chundru
2025-04-01 4:42 ` [PATCH 1/2] arm64: dts: qcom: sc7280: Add wake GPIO Krishna Chaitanya Chundru
2025-04-01 4:42 ` [PATCH 2/2] PCI: Add support for PCIe wake interrupt Krishna Chaitanya Chundru
0 siblings, 2 replies; 6+ messages in thread
From: Krishna Chaitanya Chundru @ 2025-04-01 4:42 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, cros-qcom-dts-watchers, Bjorn Helgaas
Cc: linux-arm-msm, devicetree, linux-kernel, linux-pci, quic_vbadigan,
quic_mrana, Krishna Chaitanya Chundru
PCIe wake interrupt is needed for bringing back PCIe device state from
D3cold to D0.
This is pending from long time, there was two attempts done previously to
add wake support[1], [2]. Those series tried to add support for legacy
interrupts along with wake. Legacy interrupts are already available in
the latest kernel and we can ignore them. For the wake IRQ the series is
trying to use interrupts property define in the device tree.
This series is using gpio property instead of interrupts, from
gpio desc driver will allocate the dedicate IRQ and initiate the wake
IRQ from the port bus driver instead of pcie framwework as adding in the
pcie framework will be applicable to the endpoint devices also. As the
port bus driver is for bridges, portbus driver is correct place to invoke
them.
Add two new functions, of_pci_setup_wake_irq() and of_pci_teardown_wake_irq(),
to manage wake interrupts for PCI devices using the Device Tree.
The series depend on the following series:
https://lore.kernel.org/linux-arm-msm/20250322-perst-v1-3-e5e4da74a204@oss.qualcomm.com/T/
[1]: https://lore.kernel.org/all/b2b91240-95fe-145d-502c-d52225497a34@nvidia.com/T/
[2]: https://lore.kernel.org/all/20171226023646.17722-1-jeffy.chen@rock-chips.com/
Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
---
Krishna Chaitanya Chundru (2):
arm64: dts: qcom: sc7280: Add wake GPIO
PCI: Add support for PCIe wake interrupt
arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts | 1 +
arch/arm64/boot/dts/qcom/sc7280-herobrine.dtsi | 1 +
arch/arm64/boot/dts/qcom/sc7280-idp.dtsi | 1 +
drivers/pci/of.c | 60 ++++++++++++++++++++++++++
drivers/pci/pci.h | 6 +++
drivers/pci/pcie/portdrv.c | 6 +++
6 files changed, 75 insertions(+)
---
base-commit: 88d324e69ea9f3ae1c1905ea75d717c08bdb8e15
change-id: 20250329-wake_irq_support-79772fc8cd44
prerequisite-change-id: 20250101-perst-cb885b5a6129:v1
prerequisite-patch-id: 3cff2ef415ec12c8ddb7ce7193035ce546081243
prerequisite-patch-id: 820dbf5dc092c32c8394fbc33f9fe6b8da6e6eab
prerequisite-patch-id: 7f87f54386a87b39ca346b53d3c34ff0d0cb7911
Best regards,
--
Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] arm64: dts: qcom: sc7280: Add wake GPIO
2025-04-01 4:42 [PATCH 0/2] PCI: Add support for PCIe wake interrupt Krishna Chaitanya Chundru
@ 2025-04-01 4:42 ` Krishna Chaitanya Chundru
2025-04-01 4:42 ` [PATCH 2/2] PCI: Add support for PCIe wake interrupt Krishna Chaitanya Chundru
1 sibling, 0 replies; 6+ messages in thread
From: Krishna Chaitanya Chundru @ 2025-04-01 4:42 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, cros-qcom-dts-watchers, Bjorn Helgaas
Cc: linux-arm-msm, devicetree, linux-kernel, linux-pci, quic_vbadigan,
quic_mrana, Krishna Chaitanya Chundru
Add wake gpio which is needed to bring PCIe device state from D3cold to D0.
Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts | 1 +
arch/arm64/boot/dts/qcom/sc7280-herobrine.dtsi | 1 +
arch/arm64/boot/dts/qcom/sc7280-idp.dtsi | 1 +
3 files changed, 3 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts b/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
index f54db6345b7af6f77bde496d4a07b857bf9d5f6e..ebfe2c5347be02ea730039e61401633fa49479d2 100644
--- a/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
+++ b/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
@@ -711,6 +711,7 @@ &mdss_edp_phy {
&pcieport1 {
reset-gpios = <&tlmm 2 GPIO_ACTIVE_LOW>;
+ wake-gpios = <&tlmm 3 GPIO_ACTIVE_LOW>;
};
&pcie1 {
diff --git a/arch/arm64/boot/dts/qcom/sc7280-herobrine.dtsi b/arch/arm64/boot/dts/qcom/sc7280-herobrine.dtsi
index 60b3cf50ea1d61dd5e8b573b5f1c6faa1c291eee..d435db860625d52842bf8e92d6223f67343121db 100644
--- a/arch/arm64/boot/dts/qcom/sc7280-herobrine.dtsi
+++ b/arch/arm64/boot/dts/qcom/sc7280-herobrine.dtsi
@@ -477,6 +477,7 @@ &pcie1 {
&pcieport1 {
reset-gpios = <&tlmm 2 GPIO_ACTIVE_LOW>;
+ wake-gpios = <&tlmm 3 GPIO_ACTIVE_LOW>;
};
&pm8350c_pwm {
diff --git a/arch/arm64/boot/dts/qcom/sc7280-idp.dtsi b/arch/arm64/boot/dts/qcom/sc7280-idp.dtsi
index 19910670fc3a74628e6def6b8faf2fa17991d576..e107ae0d62460d0d0909c7351c17b0b15f99a235 100644
--- a/arch/arm64/boot/dts/qcom/sc7280-idp.dtsi
+++ b/arch/arm64/boot/dts/qcom/sc7280-idp.dtsi
@@ -416,6 +416,7 @@ &lpass_va_macro {
&pcieport1 {
reset-gpios = <&tlmm 2 GPIO_ACTIVE_LOW>;
+ wake-gpios = <&tlmm 3 GPIO_ACTIVE_LOW>;
};
&pcie1 {
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] PCI: Add support for PCIe wake interrupt
2025-04-01 4:42 [PATCH 0/2] PCI: Add support for PCIe wake interrupt Krishna Chaitanya Chundru
2025-04-01 4:42 ` [PATCH 1/2] arm64: dts: qcom: sc7280: Add wake GPIO Krishna Chaitanya Chundru
@ 2025-04-01 4:42 ` Krishna Chaitanya Chundru
2025-04-01 7:01 ` Lukas Wunner
2025-04-01 10:16 ` Krishna Chaitanya Chundru
1 sibling, 2 replies; 6+ messages in thread
From: Krishna Chaitanya Chundru @ 2025-04-01 4:42 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, cros-qcom-dts-watchers, Bjorn Helgaas
Cc: linux-arm-msm, devicetree, linux-kernel, linux-pci, quic_vbadigan,
quic_mrana, Krishna Chaitanya Chundru
PCIe wake interrupt is needed for bringing back PCIe device state
from D3cold to D0.
Implement new functions, of_pci_setup_wake_irq() and
of_pci_teardown_wake_irq(), to manage wake interrupts for PCI devices
using the Device Tree.
From the port bus driver call these functions to enable wake support
for bridges.
Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
---
drivers/pci/of.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++
drivers/pci/pci.h | 6 +++++
drivers/pci/pcie/portdrv.c | 6 +++++
3 files changed, 72 insertions(+)
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 7a806f5c0d201bc322d4a53d6ac47cab2cd28c55..abb0ba001edf604170aaa118f7fdc1a1709c171f 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -7,6 +7,7 @@
#define pr_fmt(fmt) "PCI: OF: " fmt
#include <linux/cleanup.h>
+#include <linux/gpio/consumer.h>
#include <linux/irqdomain.h>
#include <linux/kernel.h>
#include <linux/pci.h>
@@ -15,6 +16,7 @@
#include <linux/of_address.h>
#include <linux/of_pci.h>
#include <linux/platform_device.h>
+#include <linux/pm_wakeirq.h>
#include "pci.h"
#ifdef CONFIG_PCI
@@ -851,3 +853,61 @@ u32 of_pci_get_slot_power_limit(struct device_node *node,
return slot_power_limit_mw;
}
EXPORT_SYMBOL_GPL(of_pci_get_slot_power_limit);
+
+/**
+ * of_pci_setup_wake_irq - Set up wake interrupt for PCI device
+ * @pdev: The PCI device structure
+ *
+ * This function sets up the wake interrupt for a PCI device by getting the
+ * corresponding GPIO pin from the device tree, and configuring it as a
+ * dedicated wake interrupt.
+ *
+ * Return: 0 if the wake gpio is not available or successfully parsed else
+ * errno otherwise.
+ */
+int of_pci_setup_wake_irq(struct pci_dev *pdev)
+{
+ struct gpio_desc *wake;
+ struct device_node *dn;
+ int ret, wake_irq;
+
+ dn = pci_device_to_OF_node(pdev);
+ if (!dn)
+ return 0;
+
+ wake = devm_fwnode_gpiod_get(&pdev->dev, of_fwnode_handle(dn),
+ "wake", GPIOD_IN, NULL);
+ if (IS_ERR(wake)) {
+ dev_warn(&pdev->dev, "Cannot get wake GPIO\n");
+ return 0;
+ }
+
+ wake_irq = gpiod_to_irq(wake);
+ device_init_wakeup(&pdev->dev, true);
+
+ ret = dev_pm_set_dedicated_wake_irq(&pdev->dev, wake_irq);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "Failed to set wake IRQ: %d\n", ret);
+ device_init_wakeup(&pdev->dev, false);
+ return ret;
+ }
+ irq_set_irq_type(wake_irq, IRQ_TYPE_EDGE_FALLING);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(of_pci_setup_wake_irq);
+
+/**
+ * of_pci_teardown_wake_irq - Teardown wake interrupt setup for PCI device
+ *
+ * @pdev: The PCI device structure
+ *
+ * This function tears down the wake interrupt setup for a PCI device,
+ * clearing the dedicated wake interrupt and disabling device wake-up.
+ */
+void of_pci_teardown_wake_irq(struct pci_dev *pdev)
+{
+ dev_pm_clear_wake_irq(&pdev->dev);
+ device_init_wakeup(&pdev->dev, false);
+}
+EXPORT_SYMBOL_GPL(of_pci_teardown_wake_irq);
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 01e51db8d285af54673db3ea526ceda073c94ec9..6e3d90db4b2505dd3885b482d4c5eafa033714e7 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -820,6 +820,9 @@ void pci_release_of_node(struct pci_dev *dev);
void pci_set_bus_of_node(struct pci_bus *bus);
void pci_release_bus_of_node(struct pci_bus *bus);
+int of_pci_setup_wake_irq(struct pci_dev *pdev);
+void of_pci_teardown_wake_irq(struct pci_dev *pdev);
+
int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge);
bool of_pci_supply_present(struct device_node *np);
@@ -863,6 +866,9 @@ static inline int devm_of_pci_bridge_init(struct device *dev, struct pci_host_br
return 0;
}
+static int of_pci_setup_wake_irq(struct pci_dev *pdev) { return 0; }
+static void of_pci_teardown_wake_irq(struct pci_dev *pdev) { }
+
static inline bool of_pci_supply_present(struct device_node *np)
{
return false;
diff --git a/drivers/pci/pcie/portdrv.c b/drivers/pci/pcie/portdrv.c
index 02e73099bad0532466fa10f549cc3c5013aa1bbb..fe1da757e9eca0f82ae0d8043c0e4547ac9c30b6 100644
--- a/drivers/pci/pcie/portdrv.c
+++ b/drivers/pci/pcie/portdrv.c
@@ -695,6 +695,10 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
if (type == PCI_EXP_TYPE_RC_EC)
pcie_link_rcec(dev);
+ status = of_pci_setup_wake_irq(dev);
+ if (status)
+ return status;
+
status = pcie_port_device_register(dev);
if (status)
return status;
@@ -728,6 +732,8 @@ static void pcie_portdrv_remove(struct pci_dev *dev)
pm_runtime_dont_use_autosuspend(&dev->dev);
}
+ of_pci_teardown_wake_irq(dev);
+
pcie_port_device_remove(dev);
pci_disable_device(dev);
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] PCI: Add support for PCIe wake interrupt
2025-04-01 4:42 ` [PATCH 2/2] PCI: Add support for PCIe wake interrupt Krishna Chaitanya Chundru
@ 2025-04-01 7:01 ` Lukas Wunner
2025-04-01 7:17 ` Krishna Chaitanya Chundru
2025-04-01 10:16 ` Krishna Chaitanya Chundru
1 sibling, 1 reply; 6+ messages in thread
From: Lukas Wunner @ 2025-04-01 7:01 UTC (permalink / raw)
To: Krishna Chaitanya Chundru
Cc: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, cros-qcom-dts-watchers, Bjorn Helgaas,
linux-arm-msm, devicetree, linux-kernel, linux-pci, quic_vbadigan,
quic_mrana
On Tue, Apr 01, 2025 at 10:12:44AM +0530, Krishna Chaitanya Chundru wrote:
> PCIe wake interrupt is needed for bringing back PCIe device state
> from D3cold to D0.
>
> Implement new functions, of_pci_setup_wake_irq() and
> of_pci_teardown_wake_irq(), to manage wake interrupts for PCI devices
> using the Device Tree.
>
> From the port bus driver call these functions to enable wake support
> for bridges.
[...]
> --- a/drivers/pci/pcie/portdrv.c
> +++ b/drivers/pci/pcie/portdrv.c
> @@ -695,6 +695,10 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
> if (type == PCI_EXP_TYPE_RC_EC)
> pcie_link_rcec(dev);
>
> + status = of_pci_setup_wake_irq(dev);
> + if (status)
> + return status;
> +
> status = pcie_port_device_register(dev);
> if (status)
> return status;
> @@ -728,6 +732,8 @@ static void pcie_portdrv_remove(struct pci_dev *dev)
> pm_runtime_dont_use_autosuspend(&dev->dev);
> }
>
> + of_pci_teardown_wake_irq(dev);
> +
> pcie_port_device_remove(dev);
>
> pci_disable_device(dev);
Why doesn't the teardown order mirror the probe order, i.e. why is
of_pci_teardown_wake_irq() called *before* pcie_port_device_remove()
instead of after?
(pcie_port_device_remove() is the opposite of pcie_port_device_register().)
Also, why is it safe to bail out of probe on failure of
of_pci_setup_wake_irq() without unwinding whatever pcie_link_rcec()
has done? I think this needs either an explanation or reordering.
Thanks,
Lukas
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] PCI: Add support for PCIe wake interrupt
2025-04-01 7:01 ` Lukas Wunner
@ 2025-04-01 7:17 ` Krishna Chaitanya Chundru
0 siblings, 0 replies; 6+ messages in thread
From: Krishna Chaitanya Chundru @ 2025-04-01 7:17 UTC (permalink / raw)
To: Lukas Wunner
Cc: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, cros-qcom-dts-watchers, Bjorn Helgaas,
linux-arm-msm, devicetree, linux-kernel, linux-pci, quic_vbadigan,
quic_mrana
On 4/1/2025 12:31 PM, Lukas Wunner wrote:
> On Tue, Apr 01, 2025 at 10:12:44AM +0530, Krishna Chaitanya Chundru wrote:
>> PCIe wake interrupt is needed for bringing back PCIe device state
>> from D3cold to D0.
>>
>> Implement new functions, of_pci_setup_wake_irq() and
>> of_pci_teardown_wake_irq(), to manage wake interrupts for PCI devices
>> using the Device Tree.
>>
>> From the port bus driver call these functions to enable wake support
>> for bridges.
> [...]
>> --- a/drivers/pci/pcie/portdrv.c
>> +++ b/drivers/pci/pcie/portdrv.c
>> @@ -695,6 +695,10 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
>> if (type == PCI_EXP_TYPE_RC_EC)
>> pcie_link_rcec(dev);
>>
>> + status = of_pci_setup_wake_irq(dev);
>> + if (status)
>> + return status;
>> +
>> status = pcie_port_device_register(dev);
>> if (status)
>> return status;
>> @@ -728,6 +732,8 @@ static void pcie_portdrv_remove(struct pci_dev *dev)
>> pm_runtime_dont_use_autosuspend(&dev->dev);
>> }
>>
>> + of_pci_teardown_wake_irq(dev);
>> +
>> pcie_port_device_remove(dev);
>>
>> pci_disable_device(dev);
>
> Why doesn't the teardown order mirror the probe order, i.e. why is
> of_pci_teardown_wake_irq() called *before* pcie_port_device_remove()
> instead of after?
>
ack, in the next patch I will move teardown after
pcie_port_device_remove()
> (pcie_port_device_remove() is the opposite of pcie_port_device_register().)
>
> Also, why is it safe to bail out of probe on failure of
> of_pci_setup_wake_irq() without unwinding whatever pcie_link_rcec()
> has done? I think this needs either an explanation or reordering.
>
if there is a failure in port_device_register also we are not unwinding
so I taught it is already taken care. Looks like it is not.
In the next patch I will move of_pci_setup_wake_irq() above
pcie_link_rcec() to avoid all this.
- Krishna Chaitanya.
> Thanks,
>
> Lukas
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] PCI: Add support for PCIe wake interrupt
2025-04-01 4:42 ` [PATCH 2/2] PCI: Add support for PCIe wake interrupt Krishna Chaitanya Chundru
2025-04-01 7:01 ` Lukas Wunner
@ 2025-04-01 10:16 ` Krishna Chaitanya Chundru
1 sibling, 0 replies; 6+ messages in thread
From: Krishna Chaitanya Chundru @ 2025-04-01 10:16 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, cros-qcom-dts-watchers, Bjorn Helgaas
Cc: linux-arm-msm, devicetree, linux-kernel, linux-pci, quic_vbadigan,
quic_mrana
On 4/1/2025 10:12 AM, Krishna Chaitanya Chundru wrote:
> PCIe wake interrupt is needed for bringing back PCIe device state
> from D3cold to D0.
>
> Implement new functions, of_pci_setup_wake_irq() and
> of_pci_teardown_wake_irq(), to manage wake interrupts for PCI devices
> using the Device Tree.
>
> From the port bus driver call these functions to enable wake support
> for bridges.
>
> Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
> ---
> drivers/pci/of.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++
> drivers/pci/pci.h | 6 +++++
> drivers/pci/pcie/portdrv.c | 6 +++++
> 3 files changed, 72 insertions(+)
>
> diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> index 7a806f5c0d201bc322d4a53d6ac47cab2cd28c55..abb0ba001edf604170aaa118f7fdc1a1709c171f 100644
> --- a/drivers/pci/of.c
> +++ b/drivers/pci/of.c
> @@ -7,6 +7,7 @@
> #define pr_fmt(fmt) "PCI: OF: " fmt
>
> #include <linux/cleanup.h>
> +#include <linux/gpio/consumer.h>
> #include <linux/irqdomain.h>
> #include <linux/kernel.h>
> #include <linux/pci.h>
> @@ -15,6 +16,7 @@
> #include <linux/of_address.h>
> #include <linux/of_pci.h>
> #include <linux/platform_device.h>
> +#include <linux/pm_wakeirq.h>
> #include "pci.h"
>
> #ifdef CONFIG_PCI
> @@ -851,3 +853,61 @@ u32 of_pci_get_slot_power_limit(struct device_node *node,
> return slot_power_limit_mw;
> }
> EXPORT_SYMBOL_GPL(of_pci_get_slot_power_limit);
> +
> +/**
> + * of_pci_setup_wake_irq - Set up wake interrupt for PCI device
> + * @pdev: The PCI device structure
> + *
> + * This function sets up the wake interrupt for a PCI device by getting the
> + * corresponding GPIO pin from the device tree, and configuring it as a
> + * dedicated wake interrupt.
> + *
> + * Return: 0 if the wake gpio is not available or successfully parsed else
> + * errno otherwise.
> + */
> +int of_pci_setup_wake_irq(struct pci_dev *pdev)
> +{
> + struct gpio_desc *wake;
> + struct device_node *dn;
> + int ret, wake_irq;
> +
> + dn = pci_device_to_OF_node(pdev);
> + if (!dn)
> + return 0;
> +
> + wake = devm_fwnode_gpiod_get(&pdev->dev, of_fwnode_handle(dn),
> + "wake", GPIOD_IN, NULL);
> + if (IS_ERR(wake)) {
> + dev_warn(&pdev->dev, "Cannot get wake GPIO\n");
> + return 0;
> + }
> +
> + wake_irq = gpiod_to_irq(wake);
> + device_init_wakeup(&pdev->dev, true);
> +
> + ret = dev_pm_set_dedicated_wake_irq(&pdev->dev, wake_irq);
> + if (ret < 0) {
> + dev_err(&pdev->dev, "Failed to set wake IRQ: %d\n", ret);
> + device_init_wakeup(&pdev->dev, false);
> + return ret;
> + }
> + irq_set_irq_type(wake_irq, IRQ_TYPE_EDGE_FALLING);
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(of_pci_setup_wake_irq);
> +
> +/**
> + * of_pci_teardown_wake_irq - Teardown wake interrupt setup for PCI device
> + *
> + * @pdev: The PCI device structure
> + *
> + * This function tears down the wake interrupt setup for a PCI device,
> + * clearing the dedicated wake interrupt and disabling device wake-up.
> + */
> +void of_pci_teardown_wake_irq(struct pci_dev *pdev)
> +{
> + dev_pm_clear_wake_irq(&pdev->dev);
> + device_init_wakeup(&pdev->dev, false);
> +}
> +EXPORT_SYMBOL_GPL(of_pci_teardown_wake_irq);
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index 01e51db8d285af54673db3ea526ceda073c94ec9..6e3d90db4b2505dd3885b482d4c5eafa033714e7 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -820,6 +820,9 @@ void pci_release_of_node(struct pci_dev *dev);
> void pci_set_bus_of_node(struct pci_bus *bus);
> void pci_release_bus_of_node(struct pci_bus *bus);
>
> +int of_pci_setup_wake_irq(struct pci_dev *pdev);
> +void of_pci_teardown_wake_irq(struct pci_dev *pdev);
> +
> int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge);
> bool of_pci_supply_present(struct device_node *np);
>
> @@ -863,6 +866,9 @@ static inline int devm_of_pci_bridge_init(struct device *dev, struct pci_host_br
> return 0;
> }
>
> +static int of_pci_setup_wake_irq(struct pci_dev *pdev) { return 0; }
> +static void of_pci_teardown_wake_irq(struct pci_dev *pdev) { }
> +
> static inline bool of_pci_supply_present(struct device_node *np)
> {
> return false;
> diff --git a/drivers/pci/pcie/portdrv.c b/drivers/pci/pcie/portdrv.c
> index 02e73099bad0532466fa10f549cc3c5013aa1bbb..fe1da757e9eca0f82ae0d8043c0e4547ac9c30b6 100644
> --- a/drivers/pci/pcie/portdrv.c
> +++ b/drivers/pci/pcie/portdrv.c
> @@ -695,6 +695,10 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
> if (type == PCI_EXP_TYPE_RC_EC)
> pcie_link_rcec(dev);
>
> + status = of_pci_setup_wake_irq(dev);
> + if (status)
> + return status;
> +
> status = pcie_port_device_register(dev);
> if (status)
> return status;
> @@ -728,6 +732,8 @@ static void pcie_portdrv_remove(struct pci_dev *dev)
> pm_runtime_dont_use_autosuspend(&dev->dev);
> }
>
> + of_pci_teardown_wake_irq(dev);
> +
> pcie_port_device_remove(dev);
>
> pci_disable_device(dev);
>
we need to teardown the wake irq in shutdown also, I will add it in the
next patch.
- Krishna Chaitanya.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-04-01 10:16 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-01 4:42 [PATCH 0/2] PCI: Add support for PCIe wake interrupt Krishna Chaitanya Chundru
2025-04-01 4:42 ` [PATCH 1/2] arm64: dts: qcom: sc7280: Add wake GPIO Krishna Chaitanya Chundru
2025-04-01 4:42 ` [PATCH 2/2] PCI: Add support for PCIe wake interrupt Krishna Chaitanya Chundru
2025-04-01 7:01 ` Lukas Wunner
2025-04-01 7:17 ` Krishna Chaitanya Chundru
2025-04-01 10:16 ` Krishna Chaitanya Chundru
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).