From nobody Mon Dec 1 22:07:31 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 17F64332914 for ; Thu, 27 Nov 2025 12:46:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764247605; cv=none; b=S4kRGELA6SDXv+NQQ6Y/Fc+VquM7v1EbUVkvzfhwuNbSY8ctaT7r+5qO74ARYKeSI6cRC1a+kgzE0vpHstAQLnFHEAUJBJzKKSnQ1K9bplsHGHFtiDbXECxSCesVlMNETvQtQ4hIQyb9KtpJEUNa+Ds5CHjR3DTzmpdL5Dm2HoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764247605; c=relaxed/simple; bh=0ZZR9Iyjfya2K8NH4xP/NJkk24d0xMXRX0RIexl1SjM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gayPOa+kRVe2F3a3YsCwGY4rnOv8C6mRMuIZDMjzatzfBJThrxMt6o9G7c4DFpqf2HR6K5Xra6De1VYwi2raYbINmyFfBabjdcsK8wm35VPMtsHIz8zJXQaQNjDNXzH2jbmHv+ErV7i8GdzRKeYrxfoEWLGF6OvEGtWbpysaeAk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=RvbaIS/a; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Gy61j8XP; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="RvbaIS/a"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Gy61j8XP" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5ARA3gm8848717 for ; Thu, 27 Nov 2025 12:46:42 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= i4IBizWS4T0Bcf18jiu9N98sYYZFoogd/8z9WMrOpP8=; b=RvbaIS/alT3IKl5w hJ8aWP1n0TXKL/AUrqpv7SRytAjXDfgMXC/y6BVOPW4xH2AB6DLqIw4yLzlGnKyd rJCQbhi1o4TN0Cc/xxYGEZTAvg2JGz+70Gz5dRnatBLYmCj2sxBFtDyGljL0zkLa pmBDnmx0/0jIvS8EwjkmKjqBFCUrWNIsCoKBgSflisAEFLLtn4CjzwLxD3mlD1fv IoKWbs8CwrXfUk05UPoVV61MmxeK+yDEu9O854eYFM4PtWjRrGOJRGx2ulJ/2eJU BA1NxF5Rd6nCgdbobV81Qd1RifvLV78+i0abpwoCUgtP4NI2NOrt99ARQT5wsjOv THVEAQ== Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4apmjd8dq3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 27 Nov 2025 12:46:42 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2956a694b47so11871255ad.1 for ; Thu, 27 Nov 2025 04:46:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1764247600; x=1764852400; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=i4IBizWS4T0Bcf18jiu9N98sYYZFoogd/8z9WMrOpP8=; b=Gy61j8XPS77T5dILEKibDeOCKhQ/irxjaU3SRdyQ+zmHm4kJBJSxcq0HAZ98Mem1jV 9leI8oJuIFurt2xk+Az83IMf/9c/pvXOvDFWI+2WMIvWvAZpYd4uwXPO+587+C6QxORO m22pTqYx+dB9dIGpil8/Lp2HWAtATseLLE5lFoURz17BFk3ItcKwS1kweJIFuiTIiVY9 Dm8NXB7YHyUSRWEiiLFaTqtYV3KYEMOnJOnwuKwcxqzrJtwc5ZdaWCl/xLA0kl4VUGuR bw9YzvZ78OE+kYb9hupWLpUlxt1nMBoNCd4d025xBAaS6O6EvIza8HY0+cldZX/g8wS4 hIdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764247600; x=1764852400; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=i4IBizWS4T0Bcf18jiu9N98sYYZFoogd/8z9WMrOpP8=; b=bMlRbPVnjX+TQdZvs5mRSWRPlZXGhznGs5TFc0/3QrJrqGOVOeJD8KSzF3pVx+I7YE KuazW2yYN1EwbwwR8kcmhSzL2sK2EiECZkmP4IAMD0wno0GH8+F2iNDsZly1Q5OM9FyG zmfsORO/Q/KrpXmvWLLeU4J0wxLKAr5zliE2rz+x1S8Gjn6Dcw+k+fP9SanGr2d67Uqz tArECOCCaX1xoItck2PAi+GURStonn/mndFflwzo/eCD1CF/0YQ+nfjImGH+llEq1MlL oB6Bp0c4DPsaQdoNxob9auFjmwY2J4H8b+XCQHYEkGcch0JpbNHSgs7tZ6i1zOfcW4Mv LXfg== X-Forwarded-Encrypted: i=1; AJvYcCW0xPXSYIJPaqeh2m5twNeC63+kNIxF28TeZ9wdc7uq2tWIk0uzrEkmStgCSy6p+Imd5fLvp/Gog/T4JCQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyfoQKl/34OxXAeltqmCHYFsQBjhybTVn7jSt9Ec6QhAPpC5a6x kVyClbn2tRwz8N51+ECPHBQjdtVMdp0D14564dVwFey4zdeeYiHq5yxF3jtelRguBPtgLm5q07b 3d1Y4uQ+Ygp+ehztyNqQ2TfrbDbf36IWOyl+/9yZIQl6M54e+HJw1zlIP4awiSKseHuE= X-Gm-Gg: ASbGnct7A38qpN/RHecujO1GqF3WVThWJeZrliRyMrC0X3zGpAu2gw/QMJthzRevMe6 IyPN4KtEjbTZ1gGpRxY7E5XWyancsB08Nn36mreZ+XyTnKdLDYANIjEEOp/xQHMWBTZCA5vOwwA PdueUQoUlI0uiWgB7jiN60Xd5Pgn4uVdPRfGojdWDfSbPDjeVPyzCn3dwPzfxPgojJd40CiogF+ TT9eVLuiw3iyFU7m1pSOFuzQ8ps4+c1t9TS9wadAre7Yo6aj7WtxRCNe8usu63LDUH7bSnmS9Kh RaOCqKi4JoaOO4/lPdKTrROk0Q0edm3bIoe72MF8YCZzvwo57gBUwJlURfmUsvF5Ywvc+SQbxM6 W5cJ69lcEUBwMfn75nbZ6h0Di1/lXzQaK7jzV7kxiqSk3 X-Received: by 2002:a17:903:11c5:b0:295:ed6:4625 with SMTP id d9443c01a7336-29bab1c50ebmr124825155ad.47.1764247600340; Thu, 27 Nov 2025 04:46:40 -0800 (PST) X-Google-Smtp-Source: AGHT+IEc3yDJaJQbgjb86MURB7UPgck1TLqpQ1M7PnIsNsJjXOGIfHGQ3iljRYomVfUCpKRNgJzfhg== X-Received: by 2002:a17:903:11c5:b0:295:ed6:4625 with SMTP id d9443c01a7336-29bab1c50ebmr124824825ad.47.1764247599837; Thu, 27 Nov 2025 04:46:39 -0800 (PST) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d150b66c67sm1951332b3a.13.2025.11.27.04.46.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Nov 2025 04:46:39 -0800 (PST) From: Krishna Chaitanya Chundru Date: Thu, 27 Nov 2025 18:15:42 +0530 Subject: [PATCH v6 1/2] PM: sleep: wakeirq: Add support for dedicated shared wake IRQ setup Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251127-wakeirq_support-v6-1-60f581f94205@oss.qualcomm.com> References: <20251127-wakeirq_support-v6-0-60f581f94205@oss.qualcomm.com> In-Reply-To: <20251127-wakeirq_support-v6-0-60f581f94205@oss.qualcomm.com> To: "Rafael J. Wysocki" , Len Brown , Pavel Machek , Greg Kroah-Hartman , Danilo Krummrich , Bjorn Helgaas , Linus Walleij , Bartosz Golaszewski Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, linux-gpio@vger.kernel.org, quic_vbadigan@quicinc.com, quic_mrana@quicinc.com, sherry.sun@nxp.com, Krishna Chaitanya Chundru X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1764247587; l=4910; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=0ZZR9Iyjfya2K8NH4xP/NJkk24d0xMXRX0RIexl1SjM=; b=pw2b+cvs6r31OeQvIyJPQNPpIwO8ahz6omEAkVre9945ogrF+Da+mrNSLzF7dYoz9SdCYULHf A/1n+qv71UFCRH6TFQL7IoFPfLPxbju/15EV/eFTG2CuShZoDkjtGJp X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Proofpoint-GUID: yn3AM1jWyfCQ92RGuvq-KeMkmGHS7OJx X-Proofpoint-ORIG-GUID: yn3AM1jWyfCQ92RGuvq-KeMkmGHS7OJx X-Authority-Analysis: v=2.4 cv=OPcqHCaB c=1 sm=1 tr=0 ts=69284832 cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=GqrSgIjjxmp09zFQf4gA:9 a=0bXxn9q0MV6snEgNplNhOjQmxlI=:19 a=QEXdDO2ut3YA:10 a=1OuFwYUASf3TG4hYMiVC:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTI3MDA5NCBTYWx0ZWRfX5y/1yQVm9KsQ 9fM/tJUiU3cdYo7hIXcMqnMiUmogSkkMBfdnOCu64JxvqsAsdrqzCoBYjwcX+ql9OUkeWK7xCfs cgfuG+NhkNoQZ2ZapmbPnRfqtbW0lsjWyMaQOTn0yoeRO5a01ZoPdqiWpBELrAv9YgzH8jFBhM8 jLR24j9fPvyAbhQ0M9Ley90ST0ajF617gMoSn14JXFf8SKQZl79O0vML5La/+chp69/7avp/s+T i9D/k2roQqfNFGeWS9/oB1yDQ545T/+MBYbduLyB/d+Fy0U0SnswlN5xgJoYk7o6Sv9g0Zjwl3v n5f1EaVpja2pHzgVNvrGnR7qtMIO3MhotZCgZfbyJEkwaBlr7220E7Q7cSi0GZm/1XgyuWZQNYQ 71Wde2ec9OF5UAp1uXiq+HNEin1qpA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-25_02,2025-11-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 clxscore=1015 spamscore=0 malwarescore=0 phishscore=0 suspectscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511270094 Some devices require more flexibility when configuring their dedicated wake-up interrupts, such as support for IRQF_SHARED or other IRQ flags. This is particularly useful in PCIe systems where multiple endpoints (e.g., Wi-Fi and Bluetooth controllers) share a common WAKE# signal line which requests platform to re-establish power and reference clocks to the components. In such cases, drivers can use this new API dev_pm_set_dedicated_shared_wake_irq() to register a shared wake IRQ. Update the internal helper __dev_pm_set_dedicated_wake_irq() to accept an irq_flags argument. Modify the existing dev_pm_set_dedicated_wake_irq() and dev_pm_set_dedicated_wake_irq_reverse() to preserve current behavior. When IRQ regitsered with IRQF_SHARED we can't use IRQF_NO_AUTOEN flag, so after registering for irq, disable it explicitly. Signed-off-by: Krishna Chaitanya Chundru Acked-by: Rafael J. Wysocki (Intel) --- drivers/base/power/wakeirq.c | 39 ++++++++++++++++++++++++++++++++++----- include/linux/pm_wakeirq.h | 6 ++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/drivers/base/power/wakeirq.c b/drivers/base/power/wakeirq.c index 8aa28c08b2891f3af490175362cc1a759069bd50..df34a891d54bec8737a3ef174bd= fa469c19133c4 100644 --- a/drivers/base/power/wakeirq.c +++ b/drivers/base/power/wakeirq.c @@ -168,7 +168,8 @@ static irqreturn_t handle_threaded_wake_irq(int irq, vo= id *_wirq) return IRQ_HANDLED; } =20 -static int __dev_pm_set_dedicated_wake_irq(struct device *dev, int irq, un= signed int flag) +static int __dev_pm_set_dedicated_wake_irq(struct device *dev, int irq, un= signed int flag, + unsigned int irq_flags) { struct wake_irq *wirq; int err; @@ -197,8 +198,7 @@ static int __dev_pm_set_dedicated_wake_irq(struct devic= e *dev, int irq, unsigned * so we use a threaded irq. */ err =3D request_threaded_irq(irq, NULL, handle_threaded_wake_irq, - IRQF_ONESHOT | IRQF_NO_AUTOEN, - wirq->name, wirq); + IRQF_ONESHOT | irq_flags, wirq->name, wirq); if (err) goto err_free_name; =20 @@ -234,7 +234,7 @@ static int __dev_pm_set_dedicated_wake_irq(struct devic= e *dev, int irq, unsigned */ int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq) { - return __dev_pm_set_dedicated_wake_irq(dev, irq, 0); + return __dev_pm_set_dedicated_wake_irq(dev, irq, 0, IRQF_NO_AUTOEN); } EXPORT_SYMBOL_GPL(dev_pm_set_dedicated_wake_irq); =20 @@ -255,10 +255,39 @@ EXPORT_SYMBOL_GPL(dev_pm_set_dedicated_wake_irq); */ 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_REVER= SE); + return __dev_pm_set_dedicated_wake_irq(dev, irq, WAKE_IRQ_DEDICATED_REVER= SE, + IRQF_NO_AUTOEN); } EXPORT_SYMBOL_GPL(dev_pm_set_dedicated_wake_irq_reverse); =20 +/** + * dev_pm_set_dedicated_shared_wake_irq - Request a dedicated shared wake-= up interrupt + * with custom flags + * @dev: Device entry + * @irq: Device wake-up interrupt + * @flags: IRQ flags (e.g., IRQ_TYPE_EDGE_FALLING) + * + * This API sets up a threaded interrupt handler for a device that has + * a shared wake-up interrupt in addition to the device IO interrupt. It a= lso + * sets IRQ flags like IRQ_TYPE_EDGE_FALLING passed by the caller. + * + * Returns 0 on success or a negative error code on failure. + */ +int dev_pm_set_dedicated_shared_wake_irq(struct device *dev, int irq, unsi= gned long flags) +{ + struct wake_irq *wirq; + int ret; + + ret =3D __dev_pm_set_dedicated_wake_irq(dev, irq, 0, IRQF_SHARED | flags= ); + if (!ret) { + wirq =3D dev->power.wakeirq; + disable_irq_nosync(wirq->irq); + } + + return ret; +} +EXPORT_SYMBOL_GPL(dev_pm_set_dedicated_shared_wake_irq); + /** * dev_pm_enable_wake_irq_check - Checks and enables wake-up interrupt * @dev: Device diff --git a/include/linux/pm_wakeirq.h b/include/linux/pm_wakeirq.h index 25b63ed51b765c2c6919f259668a12675330835e..61f1e840745b56baa57db37563e= 450cb2d757a85 100644 --- a/include/linux/pm_wakeirq.h +++ b/include/linux/pm_wakeirq.h @@ -11,6 +11,7 @@ extern int dev_pm_set_dedicated_wake_irq(struct device *d= ev, int irq); extern int dev_pm_set_dedicated_wake_irq_reverse(struct device *dev, int i= rq); extern void dev_pm_clear_wake_irq(struct device *dev); extern int devm_pm_set_wake_irq(struct device *dev, int irq); +extern int dev_pm_set_dedicated_shared_wake_irq(struct device *dev, int ir= q, unsigned long flags); =20 #else /* !CONFIG_PM */ =20 @@ -38,5 +39,10 @@ static inline int devm_pm_set_wake_irq(struct device *de= v, int irq) return 0; } =20 +static inline int dev_pm_set_dedicated_shared_wake_irq(struct device *dev, + int irq, unsigned long flags) +{ + return 0; +} #endif /* CONFIG_PM */ #endif /* _LINUX_PM_WAKEIRQ_H */ --=20 2.34.1 From nobody Mon Dec 1 22:07:31 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 833ED3321B5 for ; Thu, 27 Nov 2025 12:46:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764247613; cv=none; b=Z9gJ1k7GEfTQSchWARtJHM8C2tqkbv7pyHpy5WXN3ssOYtZN7cq0ULjmWJCgKTUtUlZfAkAS3Y/NYs/c4WQGw+zg8lvKbto3Ld5UaQK5uHcX8KYj+XX15onm/q3FTibRYQNgYAee2gKZsFXi2UlH3O9NIJY6KZL3d5xzzyPSHWY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764247613; c=relaxed/simple; bh=QTar8G3HPjr2G/dTy3IURU1yuHkDZrUw3M3E2StJypg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MVOxxzHmSz3SpoH8CX5c3DCgkHRJeOcNkb8vSUVZpVx4otFr0ZAFtXtDsW3LsBfxLrqE0OrA/ry0xvJmRj9PKWykZ2MgA/oUCOXAwL3BT7e2FYpS/J/U6KcyyxOGMrUFRWslRmDJbTR3+5VZHsMmAojF3IysTVxvZQr+O2K1vtU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=PA52DHpT; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Z1K0Mu2w; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="PA52DHpT"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Z1K0Mu2w" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5ARAW3PO913934 for ; Thu, 27 Nov 2025 12:46:51 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= cwQfg0u/Zb1rZTRNN59FLrJZY791yGuBi1A4dc+9XkU=; b=PA52DHpTq6Swn/bW ZxZAquFVg1xxkLm4WrT8Yi7PKurQDBTCh71n/D9euShNGaWtFWD9K0FE7Gf9+yj/ f55RpgkWkwcYmQgLXi/AST3xAdqivQZn2TNFje1UDdgYMEj6Vq9ybmtCFzIUuHKF DxAN42/7bwUh8FS7DXdwH7CmzieNWMWL4Y8/1sL3UM+t/6m0y+gI/zsP1JFOAOnv jTp2Im7XSvzX4JFvL9x2vCIhnwWL4jV5WuBq/ZRkTiqRZ5EEilQEFdbZdz3Uyc01 PxYiNKcXGTRTQ19+81/SxVza3O1CXwgqji5ymrYBLYJ9Dl0+Eklp7qFJn/FJ0Rzv l6tCww== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4apmynr9v0-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 27 Nov 2025 12:46:50 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-ba265ee0e34so811054a12.2 for ; Thu, 27 Nov 2025 04:46:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1764247610; x=1764852410; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=cwQfg0u/Zb1rZTRNN59FLrJZY791yGuBi1A4dc+9XkU=; b=Z1K0Mu2wzLxtiA+mC6juE3ZTDRSjimMwZeUa7sKK8ustNTUg6+lmVkKjXaiav1tlZq pIOdM/UivJ4FE9uLIO0kWnZSCapz+W1v1cdg+SS9dnGtMmGH1WqpcfonP/sphq4Ee84q yybhHCZQnjft3grrYpw42bb3kzIEycgPtVg9SXx5kD1I/FyYWfN5CUNrhbaqvkySdq98 0xclgqKbhfNM0Ip2OdB2V7wFdUHBznVpY+tSZbQkxNWhJLbHXHSgPi74XDcBiqDyzLAo 275aTtDIfm1SXIRS+73SUS43Mjj1DoE6UivqhpsqMxNU4gNxDinB2q2s2eLmrk3WsWkp 1Qbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764247610; x=1764852410; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=cwQfg0u/Zb1rZTRNN59FLrJZY791yGuBi1A4dc+9XkU=; b=rqs61DGx3Tfc5shcjAmKyAlQ+z5m1DJxMPviYfBhCFyivj47rN6Y7N0CpHOsIDMouy Tgzva7Y+4Uv3Lt9q5vuun2luT8SqA/LU/3UcDWRXwPUqQHiax28QO5/KtEcn7UyQ7tGz MpuuJtJoXUNK1jeD6P2FjUB6H/L6kn5bKdyXnZz3iIY/ssbsj8+zbT/N/5rUE23MOOo2 yLZ61jeufBiTqc/XeCkLlADUVN1N/w6t2OSt2hrn9/2tGlLFRofH53yM7SU/nDCHL3D2 AYRuIAJQ3spEQ4fYXIsZUQ9rVp0g+znxguJ4vvNoBzugh7iFu/AA7/A2iISGozvuG2zl aD4w== X-Forwarded-Encrypted: i=1; AJvYcCU2EDE3gA3Z4Jz1OPjuMtGFOexg7JLRIsBFn/ZEFdGDf9q1C3l66djFhKvGtE6nSZ2DzhN+NIDwKmWbCYM=@vger.kernel.org X-Gm-Message-State: AOJu0YxPOn326jQbrhDFcd4nAiFy72lm/M66a6T8o61/aBnQpOZTUqgf E4lY4Nkhkbh+pSu5qKK/wEgo+cfriSurOhJbQeZoQ7iGJnHnNfPBmWLzTHtrzvc4gWbpTY3RQOa ewCJU+FDlKMi7X4BnDcQz7PV87Dks6HrNbvYNrxc9hNgWOffiiCpv8+J36NIvhLFR4Zk= X-Gm-Gg: ASbGncuKs/i76xrCx+hkdEzTwSEhMUZg82hkmVJn/UQkLEo+yUpH9rcykj+1Gx+04hy c0rKwz9U3/yR+WU2LBqOqiXtruTRh3rjhPLN0wbW62BZPN1Oud5oX0Z+u9LYNsmZBi0LLF1xffa tDe+SIalUP24MhCsw8AYKUoHOFHEX/2KpgDnRjqAU1h07ZOuUP0lz41lB7qWw5NdNJFjKu7IS5J 9Zyp2uPVJjZMmbVVpfBOJq6O88q/Xk/f/LwANMfqEznr3XhAXoBvzD61cEMyG2/vS9tDxZUaxqt uZMn7S7VgUmVIfovmUv0OQ+xgk/97QbmJ1tbBxMLnTOU/QEKwWmz3IwGMvtSKeUy4JeIES9pBHj X7VNFfJzALAqU1EVPTIOkcLroCRlC/3OwcGLtwTU4o2Fb X-Received: by 2002:a05:6a20:7486:b0:34f:4309:ed32 with SMTP id adf61e73a8af0-3637db477c4mr11987533637.23.1764247607624; Thu, 27 Nov 2025 04:46:47 -0800 (PST) X-Google-Smtp-Source: AGHT+IFq23Kd5+AoAouqonlt6W/WvAXwPbVEKY4p/WcYtWpXd/vjdhtrnVvt+JBi/XDEj5pPyFShxQ== X-Received: by 2002:a05:6a20:7486:b0:34f:4309:ed32 with SMTP id adf61e73a8af0-3637db477c4mr11987271637.23.1764247606308; Thu, 27 Nov 2025 04:46:46 -0800 (PST) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d150b66c67sm1951332b3a.13.2025.11.27.04.46.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Nov 2025 04:46:45 -0800 (PST) From: Krishna Chaitanya Chundru Date: Thu, 27 Nov 2025 18:15:43 +0530 Subject: [PATCH v6 2/2] PCI: Add support for PCIe WAKE# interrupt Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251127-wakeirq_support-v6-2-60f581f94205@oss.qualcomm.com> References: <20251127-wakeirq_support-v6-0-60f581f94205@oss.qualcomm.com> In-Reply-To: <20251127-wakeirq_support-v6-0-60f581f94205@oss.qualcomm.com> To: "Rafael J. Wysocki" , Len Brown , Pavel Machek , Greg Kroah-Hartman , Danilo Krummrich , Bjorn Helgaas , Linus Walleij , Bartosz Golaszewski Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, linux-gpio@vger.kernel.org, quic_vbadigan@quicinc.com, quic_mrana@quicinc.com, sherry.sun@nxp.com, Krishna Chaitanya Chundru X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1764247587; l=6954; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=QTar8G3HPjr2G/dTy3IURU1yuHkDZrUw3M3E2StJypg=; b=w5MlLSN1DG4j/i2NshPA5/Q6fEhjH2QktTkwS8fSDvBAeUV0M/i/iFtg7/ypUGeawDM9PsVub F544A/LclZFCYeh5P5ZdLBdVQ2DBnOyrev1SCIKa7YuxI5P11oFRPXc X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Proofpoint-ORIG-GUID: CAnO3RGjxuFgNcGXB5G6aQIFvHPhnt2Q X-Authority-Analysis: v=2.4 cv=QOplhwLL c=1 sm=1 tr=0 ts=6928483a cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=NEAV23lmAAAA:8 a=KKAkSRfTAAAA:8 a=MM5MBmnPbV1rJZqCYTkA:9 a=QEXdDO2ut3YA:10 a=x9snwWr2DeNwDh03kgHS:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTI3MDA5NCBTYWx0ZWRfX+PsUflJr2UCY 5PJ491j3ri3m7pvplJUUwcASZSZglPUAVIOQMHYS5tEkSShcYflK5MJj36p2uJukaBIS71jmazA DkCRJh67gQoRAeWxqeMpzE6SQNc14iYQmX1EXI2Xk03o5ocmbpudy7C1K9nVrNNcYJbOjxm8bHN 0/qsDCAuoEeN7BsYbPmzrheP9I+vDZV9oDbQgVoiRLHci+IqZdaMcryYHwvsDEh4VPpKzUWgCkm RtgRGHtVlu1gyThd1adljtkIWQeJ+DouvsABpWnl5eG+6lG1INQ1enDwOgtRWh1zss0jYcHMhRE YObppK8Dc4+oyAU9iqjqRNcA/qmdQpUZ0bmlfDwa2dugUagbyWfnY23QSpdra0alr+gN0FVDzL4 QJZsh3TQtx6ugL9bQ3Bh2nSkVvQShA== X-Proofpoint-GUID: CAnO3RGjxuFgNcGXB5G6aQIFvHPhnt2Q X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-25_02,2025-11-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 malwarescore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511270094 According to the PCIe specification 6, sec 5.3.3.2, there are two defined wakeup mechanisms: Beacon and WAKE# for the Link wakeup mechanisms to provide a means of signaling the platform to re-establish power and reference clocks to the components within its domain. Beacon is a hardware mechanism invisible to software (PCIe r7.0, sec 4.2.7.8.1). Adding WAKE# support in PCI framework. According to the PCIe specification, multiple WAKE# signals can exist in a system. In configurations involving a PCIe switch, each downstream port (DSP) of the switch may be connected to a separate WAKE# line, allowing each endpoint to signal WAKE# independently. From figure 5.4, WAKE# can also be terminated at the switch itself. To support this, the WAKE# should be described in the device tree node of the endpint/bridge. If all endpoints share a single WAKE# line, then WAKE# should be defined in the each node. To support legacy devicetree in direct attach case, driver will search in root port node for WAKE# if the driver doesn't find in the endpoint node. In pci_device_add(), PCI framework will search for the WAKE# in its node, If not found, it searches in its upstream port only if upstream port is root port to support legacy bindings. Once found, register for the wake IRQ in shared mode, as the WAKE# may be shared among multiple endpoints. When the IRQ is asserted, the handle_threaded_wake_irq() handler triggers a pm_runtime_resume(). The PM framework ensures that the parent device is resumed before the child i.e controller driver which can bring back device state to D0. WAKE# is added in dts schema and merged based on below links. Link: https://lore.kernel.org/all/20250515090517.3506772-1-krishna.chundru@= oss.qualcomm.com/ Link: https://github.com/devicetree-org/dt-schema/pull/170 Reviewed-by: Linus Walleij Signed-off-by: Krishna Chaitanya Chundru --- drivers/pci/of.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++= ++++ drivers/pci/pci.h | 6 ++++++ drivers/pci/probe.c | 2 ++ drivers/pci/remove.c | 1 + include/linux/pci.h | 2 ++ 5 files changed, 69 insertions(+) diff --git a/drivers/pci/of.c b/drivers/pci/of.c index 3579265f119845637e163d9051437c89662762f8..fc33405a7b1f001e17127743466= 3cc9dfe57c69b 100644 --- a/drivers/pci/of.c +++ b/drivers/pci/of.c @@ -7,6 +7,7 @@ #define pr_fmt(fmt) "PCI: OF: " fmt =20 #include +#include #include #include #include @@ -15,6 +16,7 @@ #include #include #include +#include #include "pci.h" =20 #ifdef CONFIG_PCI @@ -586,6 +588,62 @@ int of_irq_parse_and_map_pci(const struct pci_dev *dev= , u8 slot, u8 pin) return irq_create_of_mapping(&oirq); } EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci); + +static void pci_configure_wake_irq(struct pci_dev *pdev, struct gpio_desc = *wake) +{ + int ret, wake_irq; + + if (!wake) + return; + + wake_irq =3D gpiod_to_irq(wake); + if (wake_irq < 0) { + dev_err(&pdev->dev, "Failed to get wake irq: %d\n", wake_irq); + return; + } + + device_init_wakeup(&pdev->dev, true); + + ret =3D dev_pm_set_dedicated_shared_wake_irq(&pdev->dev, wake_irq, + IRQ_TYPE_EDGE_FALLING); + if (ret < 0) { + dev_err(&pdev->dev, "Failed to set wake IRQ: %d\n", ret); + device_init_wakeup(&pdev->dev, false); + } +} + +void pci_configure_of_wake_gpio(struct pci_dev *dev) +{ + struct device_node *dn =3D pci_device_to_OF_node(dev); + struct gpio_desc *gpio; + struct pci_dev *root; + + if (!dn) + return; + + gpio =3D fwnode_gpiod_get_index(of_fwnode_handle(dn), + "wake", 0, GPIOD_IN | GPIOD_FLAGS_BIT_NONEXCLUSIVE, NULL); + if (IS_ERR(gpio)) { + /* + * To support legacy devicetree, search in root port for WAKE# + * in direct attach case. + */ + root =3D pci_upstream_bridge(dev); + if (pci_is_root_bus(root->bus)) + pci_configure_wake_irq(dev, root->wake); + } else { + dev->wake =3D gpio; + pci_configure_wake_irq(dev, gpio); + } +} + +void pci_remove_of_wake_gpio(struct pci_dev *dev) +{ + dev_pm_clear_wake_irq(&dev->dev); + device_init_wakeup(&dev->dev, false); + gpiod_put(dev->wake); + dev->wake =3D NULL; +} #endif /* CONFIG_OF_IRQ */ =20 static int pci_parse_request_of_pci_ranges(struct device *dev, diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 4492b809094b5794bd94dfbc20102cb208c3fa2f..05cb240ecdb59f9833ca6dae235= 7fdbd012195d6 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -1056,6 +1056,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); =20 +void pci_configure_of_wake_gpio(struct pci_dev *dev); +void pci_remove_of_wake_gpio(struct pci_dev *dev); + int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *br= idge); bool of_pci_supply_present(struct device_node *np); int of_pci_get_equalization_presets(struct device *dev, @@ -1101,6 +1104,9 @@ static inline int devm_of_pci_bridge_init(struct devi= ce *dev, struct pci_host_br return 0; } =20 +static inline void pci_configure_of_wake_gpio(struct pci_dev *dev) { } +static inline void pci_remove_of_wake_gpio(struct pci_dev *dev) { } + static inline bool of_pci_supply_present(struct device_node *np) { return false; diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 0ce98e18b5a876afe72af35a9f4a44d598e8d500..f9b879c8e3f72a9845f60577335= 019aa2002dc23 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -2762,6 +2762,8 @@ void pci_device_add(struct pci_dev *dev, struct pci_b= us *bus) ret =3D device_add(&dev->dev); WARN_ON(ret < 0); =20 + pci_configure_of_wake_gpio(dev); + pci_npem_create(dev); =20 pci_doe_sysfs_init(dev); diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index ce5c25adef5518e5aec30c41de37ea66d682f3b0..26e9c1df51c76344a1d7f5cc7ed= d433780e73474 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c @@ -54,6 +54,7 @@ static void pci_destroy_dev(struct pci_dev *dev) if (pci_dev_test_and_set_removed(dev)) return; =20 + pci_remove_of_wake_gpio(dev); pci_doe_sysfs_teardown(dev); pci_npem_remove(dev); =20 diff --git a/include/linux/pci.h b/include/linux/pci.h index d1fdf81fbe1e427aecbc951fa3fdf65c20450b05..cd7b5eb82a430ead2f64d903a24= a5b06a1b7b17e 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -555,6 +555,8 @@ struct pci_dev { /* These methods index pci_reset_fn_methods[] */ u8 reset_methods[PCI_NUM_RESET_METHODS]; /* In priority order */ =20 + struct gpio_desc *wake; /* Holds WAKE# gpio */ + #ifdef CONFIG_PCIE_TPH u16 tph_cap; /* TPH capability offset */ u8 tph_mode; /* TPH mode */ --=20 2.34.1