From nobody Mon Sep 28 16:22:28 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 B97834949F0; Wed, 19 Aug 2026 17:21:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787160121; cv=none; b=bqTa8hcQB7lVf/tZ+ILaOmL3ty7YXR/bShMA2RTUNAbqStOUWgAMGwOBtq+VKZkYQeS0/ZQYR2o23wek1L+Mwxla2VqE+kca9BkUyG9/yiBbCUnVUhS8emK5sVrGpodPJY8jVdrAs0BOYzqIRVp1wycOsE0IAm/7AX+VZ3G+jWg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787160121; c=relaxed/simple; bh=tEsD09kXEspOGCM1rxlg4XeDrW+d7jp9nn8X4j6sYsY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RowcH54ZY+zx1TCQMWKQz2wuAbMCvVXHiBoeoGSm08XhbxvI3W4WN02rkgkQYw+xI1ZIO+BCZv56H1PwUGU1pHwHDHutkGsoTwm74RGCi0tEU4U/j72mCxfAQDR35/S+vrdN1tt+0pLP/TVCwEnbpI8NDMz4cF6DiDv//eWeAi8= 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=bVJcekvw; arc=none smtp.client-ip=205.220.180.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="bVJcekvw" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67JF1tFL212430; Wed, 19 Aug 2026 17:21:10 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= 85OTsrxkL/kmvX8uAIMrFzn++PFMc1/cr3/U64dRb6s=; b=bVJcekvwX3Ok5mvi AEEnR3C71WbrJD6ic8TgpM32Ze+o093I9/TunI8SJbQH4P5ielKryoeu0yygEjgj p5w0ibDePUHx1/SMG/57tEysqIW6YcFeZzYOSnktA2BQJKXXhqGH9ONxuCh9e/Dr XHIN4xqzAm+W+HFKVd0nvoP3Q7+7IWZ2PiZVEMgpdAwCAZVt0KV7A3wkv1Zp/sIz j3vDc03ekjdz3A12jcLAymJ8aaSzCFdeeyjCk7qToqU2rHPGqONFlGGpYEMHYEPe s4vRsId/WJpErvy7OIYDkkptYqszLlF9gBFyGUUgL1hjoc1KJuZNoFkTli3zN+JM b0JNGQ== Received: from apblrppmta01.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com [103.229.18.19]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4g5es4gry4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 19 Aug 2026 17:21:09 +0000 (GMT) Received: from pps.filterd (APBLRPPMTA01.qualcomm.com [127.0.0.1]) by APBLRPPMTA01.qualcomm.com (8.18.1.7/8.18.1.7) with ESMTP id 67JHL6kS027977; Wed, 19 Aug 2026 17:21:06 GMT Received: from pps.reinject (localhost [127.0.0.1]) by APBLRPPMTA01.qualcomm.com (PPS) with ESMTP id 4g2h6kdd9m-1; Wed, 19 Aug 2026 17:21:06 +0000 (GMT) Received: from APBLRPPMTA01.qualcomm.com (APBLRPPMTA01.qualcomm.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 67JHL5e4027937; Wed, 19 Aug 2026 17:21:06 GMT Received: from hu-ffaruque-hyd.qualcomm.com (hu-ffaruque-hyd.qualcomm.com [10.147.245.31]) by APBLRPPMTA01.qualcomm.com (PPS) with ESMTP id 67JHL5jB027916; Wed, 19 Aug 2026 17:21:06 +0000 (GMT) From: Faruque Ansari Date: Wed, 19 Aug 2026 22:50:43 +0530 Subject: [PATCH v2 1/4] dt-bindings: power: reset: add PSCRR NVMEM recorder binding 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: <20260819-pscrr-provider-v2-1-9072383e0f4d@oss.qualcomm.com> References: <20260819-pscrr-provider-v2-0-9072383e0f4d@oss.qualcomm.com> In-Reply-To: <20260819-pscrr-provider-v2-0-9072383e0f4d@oss.qualcomm.com> To: Oleksij Rempel , Pengutronix Kernel Team , Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Wim Van Sebroeck , Guenter Roeck , Benson Leung , Tzung-Bi Shih , Srinivas Kandagatla , Daniel Lezcano Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-watchdog@vger.kernel.org, kernel@pengutronix.de, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , =?utf-8?q?S=C3=B8ren_Andersen?= , Guenter Roeck , Matti Vaittinen , Ahmad Fatoum , Andrew Morton , avaneesh.dwivedi@oss.qualcomm.com, Umang Chheda , Faruque Ansari X-Mailer: b4 0.15.2 X-QCInternal: smtphost X-QCInternal: smtphost X-Proofpoint-GUID: Gm1hxfWe71XXs4RgCPb6i0Fz448sxZsL X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE5MDEzNCBTYWx0ZWRfX+g1Kol+Q5IY8 DrngGRoOuCepG8QrRDd9LuigWTU/QsxKMfrLeJ2nfU8c+D7eVwpgeUU4VC42yE++qkHO15PcbiW 5e+3+Lo6HAsFbWC5tykkAKL3y/VG4NNNzMt6qTl3XBEPVoMCelsj8r2rvT/b6VSckrEu9iQRkKj AZqOhIL0CWgezA+XGw+XfGA8ioChMlheVEpEdFsWKMK9v8RoAKl9DPZl6gI2l6ve8ZCm1WDEQ8E bIY4su0aWLrs46JPnH3pzUe2YDU3SqJ7TtoW6XrRpzAQWzIo66hsM0DYxpgGZQkO0208vV7j5Pa +o3jRN2bvPP5tDlU8mwcU/+2M6jL5PtW9TgQ2xynvxFmu+blpddeB9ltsZfWdnGWiXymWs4o1RS C52MGXADFkdG0sxOWvm8SeiMTb3iBAvVGHe0EHwrA9MwZ/TeTcv73iaZvAyP82PD+evqrM1Qjvt d9egFwdXXjq9fJtXwfg== X-Proofpoint-Spam-Info: AW1haW4tMjYwODE5MDEzNCBTYWx0ZWRfXyP0lOZQV9ypF 8LqbrAvRse2q9tqTTi/EO+jRTg+ZMHWZq6LnGdGg6j9hh6nX0h5gz0czMJtJbWkrl1epeFkN3BT +hJ1nlfjzgwShxr7Ysc9Lr3evRhp0fo= X-Authority-Analysis: v=2.4 cv=CN8amxrD c=1 sm=1 tr=0 ts=6a85e605 cx=c_pps a=Ou0eQOY4+eZoSc0qltEV5Q==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=gEfo2CItAAAA:8 a=EUspDBNiAAAA:8 a=VwQbUJbxAAAA:8 a=NqF8ssCafXS4OwuzjXwA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-ORIG-GUID: Gm1hxfWe71XXs4RgCPb6i0Fz448sxZsL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-19_04,2026-08-19_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 bulkscore=0 clxscore=1011 spamscore=0 adultscore=0 suspectscore=0 malwarescore=0 lowpriorityscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608190134 Add binding for the PSCRR NVMEM recorder. Records the power state change reason into a small NVMEM cell, such as a PMIC SDAM byte or RTC scratch register =E2=80=94 so the cause survives a power cycle and can = be read back on the next boot. Signed-off-by: Faruque Ansari --- .../bindings/power/reset/pscrr-nvmem.yaml | 59 ++++++++++++++++++= ++++ MAINTAINERS | 1 + 2 files changed, 60 insertions(+) diff --git a/Documentation/devicetree/bindings/power/reset/pscrr-nvmem.yaml= b/Documentation/devicetree/bindings/power/reset/pscrr-nvmem.yaml new file mode 100644 index 000000000000..5334c923d644 --- /dev/null +++ b/Documentation/devicetree/bindings/power/reset/pscrr-nvmem.yaml @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/power/reset/pscrr-nvmem.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: NVMEM Power State Change Reason recorder + +maintainers: + - Faruque Ansari + - Oleksij Rempel + +description: + An NVMEM-backed recorder for Power State Change Reasons (PSCRR). Persists + the reboot or shutdown cause into a small NVMEM cell, such as an RTC + scratch register, a PMIC SDAM (Scratch Data Access Memory) byte, or an + EEPROM =E2=80=94 so the reason survives a power cycle and can be read ba= ck on the + next boot. The cell is referenced via the standard nvmem-cells consumer + binding. + +allOf: + - $ref: /schemas/nvmem/nvmem-consumer.yaml# + +properties: + compatible: + const: pscrr-nvmem + + nvmem-cells: + maxItems: 1 + + nvmem-cell-names: + items: + - const: pscr + +required: + - compatible + - nvmem-cells + - nvmem-cell-names + +unevaluatedProperties: false + +examples: + - | + nvmem-layout { + compatible =3D "fixed-layout"; + #address-cells =3D <1>; + #size-cells =3D <1>; + + reboot_reason_persist: reboot-reason-persist@49 { + reg =3D <0x49 0x1>; + }; + }; + + reboot-reason { + compatible =3D "pscrr-nvmem"; + nvmem-cells =3D <&reboot_reason_persist>; + nvmem-cell-names =3D "pscr"; + }; +... diff --git a/MAINTAINERS b/MAINTAINERS index 19b9f6605d98..f329cd9d0491 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -21693,6 +21693,7 @@ R: Pengutronix Kernel Team L: linux-pm@vger.kernel.org S: Maintained F: Documentation/ABI/testing/sysfs-kernel-pscrr +F: Documentation/devicetree/bindings/power/reset/pscrr-nvmem.yaml F: drivers/power/reset/pscrr/ F: include/linux/pscrr.h F: tools/testing/selftests/pscrr/ --=20 2.34.1 From nobody Mon Sep 28 16:22:28 2026 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 B1EE1490BF0; Wed, 19 Aug 2026 17:21:42 +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=1787160146; cv=none; b=KZvFUnlMl4k0ccH7DKH9GZAcrMtS5DOZtsOiT2aX+Ma1b5bbfxxrCBQ+N9huZWMbtlhj8qf07swMkj5400jqmmCZEExUL2WgP1gZKwjaVrpAmNixwlJW5TXvXpBkbP95vN4sergH6rJiMoWz35h3WcOnEk0tR5QYbz7OK1SnWQ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787160146; c=relaxed/simple; bh=rYb7DZgQfBqxfPpuD4UDQwovj6NApHGQ1oi2WDhbXwk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PZSsudk7f6vy3vSoIqMjmUNbGMqLpwaDfgnMPSCXLeCDNR5UMdQ91R6rz+apo4tadUE+ycVrsr3aGOrmTVPc6Zxl3YfdfUXK+Jvdxk+fi0yTOZWRNHjJGKYRX+3CN3KA0lrbps8F8JFKVQ1BItuM6lyWgT5VyA4aehK50+RxkuE= 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=ZiM31O/z; 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="ZiM31O/z" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67JF1DQS3869753; Wed, 19 Aug 2026 17:21:10 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= 8aYKwHBrHJ7ICON2PeaqhELeeDCIpfPPCZRWsY8FU8Q=; b=ZiM31O/zYODK04yl uQGCKKV38kApds9jnsXBOs2jefHewgD8pq4TroQ5Qj1ogbxUG/yJ+A5arze7eQj/ QHXdOdSTfFRtDetqdzgbGoR/b73zEjEwcMydnTxAGsZ7V4AEhydXDfyTXJMFDCN0 mYPdoRVF6li4yBR0tzxks8duARlfzPaIfYxci+1/qhFEI8Ud1MSnqvLKiirrqoUM Ws+3rF79BaOl2mVWsERJCmhLV/rKEzaY11Uqm7tQbjAS/RvIp01OUwrjWYRBxa9Y nW+k1yWdrAD0io1Fve1dfySXrg8bsrAZM+KD9xay0eBxDVXFSKTCJJZOV5UBwe5o MF1rPw== Received: from apblrppmta01.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com [103.229.18.19]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4g5ervgru5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 19 Aug 2026 17:21:10 +0000 (GMT) Received: from pps.filterd (APBLRPPMTA01.qualcomm.com [127.0.0.1]) by APBLRPPMTA01.qualcomm.com (8.18.1.7/8.18.1.7) with ESMTP id 67JHL6cK027988; Wed, 19 Aug 2026 17:21:06 GMT Received: from pps.reinject (localhost [127.0.0.1]) by APBLRPPMTA01.qualcomm.com (PPS) with ESMTP id 4g2h6kdd9s-1; Wed, 19 Aug 2026 17:21:06 +0000 (GMT) Received: from APBLRPPMTA01.qualcomm.com (APBLRPPMTA01.qualcomm.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 67JHL5e6027937; Wed, 19 Aug 2026 17:21:06 GMT Received: from hu-ffaruque-hyd.qualcomm.com (hu-ffaruque-hyd.qualcomm.com [10.147.245.31]) by APBLRPPMTA01.qualcomm.com (PPS) with ESMTP id 67JHL5jC027916; Wed, 19 Aug 2026 17:21:06 +0000 (GMT) From: Faruque Ansari Date: Wed, 19 Aug 2026 22:50:44 +0530 Subject: [PATCH v2 2/4] power: reset: add PSCRR NVMEM recorder 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: <20260819-pscrr-provider-v2-2-9072383e0f4d@oss.qualcomm.com> References: <20260819-pscrr-provider-v2-0-9072383e0f4d@oss.qualcomm.com> In-Reply-To: <20260819-pscrr-provider-v2-0-9072383e0f4d@oss.qualcomm.com> To: Oleksij Rempel , Pengutronix Kernel Team , Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Wim Van Sebroeck , Guenter Roeck , Benson Leung , Tzung-Bi Shih , Srinivas Kandagatla , Daniel Lezcano Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-watchdog@vger.kernel.org, kernel@pengutronix.de, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , =?utf-8?q?S=C3=B8ren_Andersen?= , Guenter Roeck , Matti Vaittinen , Ahmad Fatoum , Andrew Morton , avaneesh.dwivedi@oss.qualcomm.com, Umang Chheda , Faruque Ansari X-Mailer: b4 0.15.2 X-QCInternal: smtphost X-QCInternal: smtphost X-Proofpoint-GUID: RdCnegqbKrTNggyN9hoUDWuolx9lAmO4 X-Authority-Analysis: v=2.4 cv=VZ3H+lp9 c=1 sm=1 tr=0 ts=6a85e606 cx=c_pps a=Ou0eQOY4+eZoSc0qltEV5Q==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=HK-LrPc_DGzbyERBICQA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE5MDEzNCBTYWx0ZWRfX3CV+QklcOHL8 fi4fxik+zMT7sjDGxZDZAxmAiMhW+D8bKBkns8MoF4rPPMyNiW/Xf816+xAUM+vbLtYjYXUsxFQ io7AEgkojcPnjy7wAQaXMfkqs3evWjBEHilXGc5U2yhg1ZY8ZhhRJJl5eM8I1LC2Yg27dt6Kr1f FIr+rmi2mdoDEGTVmiUTXfCtWc9452pidHvheofpk3sF+nmvL0nW4woJfNyD5WfRrz9p+C8GUW+ O7isu2+hCplpxrRwfLa7BiF1phOFAGlY8jmNnNvYgmlr/DF6fCiCIbC2FM7kPorJ0iudQJJK1cJ POmaoxTDx+upRJhp0JKxXbl8QFNaWxyUcUUaZ0gxxTXuSPyvVFNpV6s+M4HVeo8W9INwsACX+Id Xt8QnwXSxV+vMIIPE89Ce892kzCVGVZJ4l68QqYHLcw/1DcnU7hVzZiaOWpG8HIJkJNzhiiuI/I sX9yFRdtcFxO0SL31Kw== X-Proofpoint-ORIG-GUID: RdCnegqbKrTNggyN9hoUDWuolx9lAmO4 X-Proofpoint-Spam-Info: AW1haW4tMjYwODE5MDEzNCBTYWx0ZWRfXwsWmohM5Ihjw Tf8xpFCAyimn9FJcpckqYeWfg9WxCyhWkNxas9pB//y+TSZCwHVWWxzC54SFljHqT2tNsYeH1Cb i98xMSciW5kpfRQLSv2p6vnspKlFQXk= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-19_04,2026-08-19_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 spamscore=0 adultscore=0 clxscore=1011 lowpriorityscore=0 phishscore=0 bulkscore=0 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608190134 Record the power state change reason into a small NVMEM cell (an RTC scratch register or EEPROM) and read it back on the next boot, so the cause survives a power cycle. The cell is a plain nvmem consumer reference and the reason value is stored directly. Co-developed-by: Oleksij Rempel Signed-off-by: Oleksij Rempel Signed-off-by: Faruque Ansari --- drivers/power/reset/pscrr/Kconfig | 14 +++ drivers/power/reset/pscrr/Makefile | 1 + drivers/power/reset/pscrr/pscrr-nvmem.c | 154 ++++++++++++++++++++++++++++= ++++ 3 files changed, 169 insertions(+) diff --git a/drivers/power/reset/pscrr/Kconfig b/drivers/power/reset/pscrr/= Kconfig index 72de82731b53..bfcf04b0c8f5 100644 --- a/drivers/power/reset/pscrr/Kconfig +++ b/drivers/power/reset/pscrr/Kconfig @@ -31,3 +31,17 @@ menuconfig PSCRR unless hardware provides the reset cause. =20 If unsure, say N. + +if PSCRR + +config PSCRR_NVMEM + tristate "PSCRR NVMEM recorder provider" + depends on NVMEM + help + PSCRR recorder that stores the power state change reason in a + small NVMEM cell (such as an RTC scratch register) and reads it + back on the next boot, so the cause survives a power cycle. + + If unsure, say N. + +endif # PSCRR diff --git a/drivers/power/reset/pscrr/Makefile b/drivers/power/reset/pscrr= /Makefile index e5530a858971..95c80c80c7da 100644 --- a/drivers/power/reset/pscrr/Makefile +++ b/drivers/power/reset/pscrr/Makefile @@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_PSCRR) +=3D pscrr.o +obj-$(CONFIG_PSCRR_NVMEM) +=3D pscrr-nvmem.o diff --git a/drivers/power/reset/pscrr/pscrr-nvmem.c b/drivers/power/reset/= pscrr/pscrr-nvmem.c new file mode 100644 index 000000000000..1c3145c0d058 --- /dev/null +++ b/drivers/power/reset/pscrr/pscrr-nvmem.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * pscrr-nvmem.c - NVMEM recorder provider for PSCRR + * + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * Copyright (C) 2025 Pengutronix, Oleksij Rempel + */ + +#include +#include +#include +#include +#include +#include + +struct pscrr_nvmem { + struct nvmem_cell *cell; + enum psc_reason reason; +}; + +static int pscrr_nvmem_cell_read(struct pscrr_nvmem *priv, u8 *out) +{ + size_t len; + void *buf; + + buf =3D nvmem_cell_read(priv->cell, &len); + if (IS_ERR(buf)) + return PTR_ERR(buf); + + *out =3D len ? *(u8 *)buf : 0; + kfree(buf); + + return 0; +} + +static int pscrr_nvmem_cell_write(struct pscrr_nvmem *priv, u8 val) +{ + int ret; + + /* nvmem_cell_write() returns the byte count on success, not 0. */ + ret =3D nvmem_cell_write(priv->cell, &val, sizeof(val)); + + return ret < 0 ? ret : 0; +} + +static int pscrr_nvmem_read_reasons(struct pscrr_provider *p, + unsigned long *reasons) +{ + struct pscrr_nvmem *priv =3D p->priv; + + /* + * Report the reason latched at probe (or overwritten by a later + * record); the cell itself was cleared at probe, so it is not read + * live here. + */ + set_bit(READ_ONCE(priv->reason), reasons); + + return 0; +} + +static int pscrr_nvmem_write_reason(struct pscrr_provider *p, + enum psc_reason reason) +{ + struct pscrr_nvmem *priv =3D p->priv; + int ret; + + if (reason >=3D PSCR_REASON_COUNT) + return -EINVAL; + + ret =3D pscrr_nvmem_cell_write(priv, reason); + if (ret) + return ret; + + WRITE_ONCE(priv->reason, reason); + + return 0; +} + +static const struct pscrr_provider_ops pscrr_nvmem_ops =3D { + .read_reasons =3D pscrr_nvmem_read_reasons, + .write_reason =3D pscrr_nvmem_write_reason, +}; + +static int pscrr_nvmem_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct pscrr_nvmem *priv; + size_t bytes, bits; + u8 val; + int ret; + + priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->cell =3D devm_nvmem_cell_get(dev, "pscr"); + if (IS_ERR(priv->cell)) + return dev_err_probe(dev, PTR_ERR(priv->cell), + "failed to get the pscr nvmem cell\n"); + + ret =3D nvmem_cell_get_size(priv->cell, &bytes, &bits); + if (ret) + return ret; + + /* The reason is a single byte; a bit cell still occupies one. */ + if ((bytes ?: DIV_ROUND_UP(bits, 8)) !=3D sizeof(val)) + return dev_err_probe(dev, -EINVAL, + "unsupported pscr nvmem cell size\n"); + + /* + * The cell survives resets, so at boot it still holds whatever the + * previous session recorded before it went down. Latch that as this + * boot's reason, then clear the cell back to PSCR_UNKNOWN: if this + * session is later cut short by an abrupt reset that never runs the + * recorder (watchdog power-cycle, sudden power loss), the next boot + * reads "unknown" instead of a stale reason left over from an earlier + * cycle. + */ + ret =3D pscrr_nvmem_cell_read(priv, &val); + if (ret) + return dev_err_probe(dev, ret, + "failed to read the pscr nvmem cell\n"); + + priv->reason =3D val < PSCR_REASON_COUNT ? val : PSCR_UNKNOWN; + + ret =3D pscrr_nvmem_cell_write(priv, PSCR_UNKNOWN); + if (ret) + return dev_err_probe(dev, ret, + "failed to clear the pscr nvmem cell\n"); + + return PTR_ERR_OR_ZERO(devm_pscrr_provider_register(dev, "nvmem", + &pscrr_nvmem_ops, NULL, + priv)); +} + +static const struct of_device_id pscrr_nvmem_of_match[] =3D { + { .compatible =3D "pscrr-nvmem" }, + { } +}; +MODULE_DEVICE_TABLE(of, pscrr_nvmem_of_match); + +static struct platform_driver pscrr_nvmem_driver =3D { + .probe =3D pscrr_nvmem_probe, + .driver =3D { + .name =3D "pscrr-nvmem", + .of_match_table =3D pscrr_nvmem_of_match, + }, +}; +module_platform_driver(pscrr_nvmem_driver); + +MODULE_AUTHOR("Oleksij Rempel "); +MODULE_AUTHOR("Faruque Ansari "); +MODULE_DESCRIPTION("NVMEM recorder provider for PSCRR"); +MODULE_LICENSE("GPL"); --=20 2.34.1 From nobody Mon Sep 28 16:22:28 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 BCD554A2E20; Wed, 19 Aug 2026 17:21:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787160108; cv=none; b=J8bjpvS8CGUbCPBBnqlOqSI9XWYNFgg+3xn+r6FEQS9h3JmR+l3oD9JmPjHQL4B2CyHkth9vUmjzNWNCt++lZo0OXKON+8W27MK4usiHCN9I19PmXswObcbxUJk4/EztA60B/9Ys9SgUN/FZ2n1ujQqQynTklY+w4jm9sgjETmE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787160108; c=relaxed/simple; bh=NqJsIisW4ZWzUKnnepVXnP+dRrUOckssRKfcriXotLA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t2bOCd8QRgiVw35eII/dnRjfcjdDkQbpAihSGJPJ20K/jSDFsrPCo1uFwXUk4NA02bhblhWAjt6AZCpDHqQyTNbJ9hZKOgb212YTG2vK3YSOP8i8NuXHqxrRq2LzjV9cbsA6gMiFUo2r+rgGteaxHAHQXqgn2Hio5Fvq7TCST4s= 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=oV1WVvFR; arc=none smtp.client-ip=205.220.180.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="oV1WVvFR" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67JF1iLh537155; Wed, 19 Aug 2026 17:21:11 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= MFNW5D83mbINc3PMBmmkg1hwMrPPrHy8ooL+syO4Cqk=; b=oV1WVvFR9Rvul421 XUGqdYVuQ0S0RKZmkhtzKcHQPcrygT3mJRN+V86fwyNSRqZu3sRUeCG+MOANyJ9K PS04R4WDT2VLgX8O5VqMeT0Br2hYUllAqVnr53KUVyscSVsqOtWuBhXZR4ZF1hEH NxV69mrUKSY5iFpxjfIxxNzB4zMougtbCfAVWzylH9j0xLa3z3QL6EHxpZxq4KWF 8mrpkCjG76CUQvfPn1t2UVX6lsM9R+Zk+bxzsFCMiCRBN5cmseJNSqmLdOMV2Ahx VDGlXpMrbBlgebEQYqYUKTKjx4DdnamoX30FKCghmPojmF2eDF9m6m9DmeKcWXjx AlXcxA== Received: from apblrppmta01.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com [103.229.18.19]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4g5es58rap-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 19 Aug 2026 17:21:10 +0000 (GMT) Received: from pps.filterd (APBLRPPMTA01.qualcomm.com [127.0.0.1]) by APBLRPPMTA01.qualcomm.com (8.18.1.7/8.18.1.7) with ESMTP id 67JHL7Jt028021; Wed, 19 Aug 2026 17:21:07 GMT Received: from pps.reinject (localhost [127.0.0.1]) by APBLRPPMTA01.qualcomm.com (PPS) with ESMTP id 4g2h6kddah-1; Wed, 19 Aug 2026 17:21:07 +0000 (GMT) Received: from APBLRPPMTA01.qualcomm.com (APBLRPPMTA01.qualcomm.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 67JHL5e8027937; Wed, 19 Aug 2026 17:21:07 GMT Received: from hu-ffaruque-hyd.qualcomm.com (hu-ffaruque-hyd.qualcomm.com [10.147.245.31]) by APBLRPPMTA01.qualcomm.com (PPS) with ESMTP id 67JHL5jD027916; Wed, 19 Aug 2026 17:21:07 +0000 (GMT) From: Faruque Ansari Date: Wed, 19 Aug 2026 22:50:45 +0530 Subject: [PATCH v2 3/4] nvmem: provide consumer access to cell size metrics 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: <20260819-pscrr-provider-v2-3-9072383e0f4d@oss.qualcomm.com> References: <20260819-pscrr-provider-v2-0-9072383e0f4d@oss.qualcomm.com> In-Reply-To: <20260819-pscrr-provider-v2-0-9072383e0f4d@oss.qualcomm.com> To: Oleksij Rempel , Pengutronix Kernel Team , Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Wim Van Sebroeck , Guenter Roeck , Benson Leung , Tzung-Bi Shih , Srinivas Kandagatla , Daniel Lezcano Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-watchdog@vger.kernel.org, kernel@pengutronix.de, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , =?utf-8?q?S=C3=B8ren_Andersen?= , Guenter Roeck , Matti Vaittinen , Ahmad Fatoum , Andrew Morton , avaneesh.dwivedi@oss.qualcomm.com, Umang Chheda , Faruque Ansari , Sebastian Reichel X-Mailer: b4 0.15.2 X-QCInternal: smtphost X-QCInternal: smtphost X-Proofpoint-ORIG-GUID: kVwZqaQhyhB6qQJGucHafrQfj3nZ2vXB X-Proofpoint-GUID: kVwZqaQhyhB6qQJGucHafrQfj3nZ2vXB X-Proofpoint-Spam-Info: AW1haW4tMjYwODE5MDEzNCBTYWx0ZWRfX4/ZWPRjWvpyS NJZWDrkIhhILuk9WT1X6QcKSAMLqPCjYcUkUi5eXIC/Z5+i6U6WVt6fKX4jxgQBqp4lyDNKf3qP XN5YyEF3Aq4PaVoDZDEDRF2gwl+AsWY= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE5MDEzNCBTYWx0ZWRfX7aOWn+x9n1Fd 28AuedgMBuFf4o5I50ScLybGkOM4xB93OmrZ0f0Zq9I5OUIqY1/k6b7336r0zNtGyKS3WFSRFKd l+OW6ulHIFdr4rvJNZCbbv0909sD8l13lleWiEJdZiIk2pR9hcIY5YIlfyHo85zA0nk9VS0SKM5 yZGhH+dlIh9hHCW8rjvfCWzGBG+WBIXCszighxp/HGDfJ8mGNhORWUocet4ruK2ncsrzhfH3o4X behl0IPxxRlBiUOT+ZDObMEs63n6kFVQDZ1xLekUx+UmpjNVZGmF8YTH5FOOgMu921TeziQEbnN kByziPXGiNMcdBXOBJsO07uU+ozpNtGhB1pB1qa9XygQ/sQ6UA2NCyy2UOpavkF5tNTCU7QqqML KImwTHBDoP5f92jy4tgYbZZW7+NAcqsMrn4EqayCEIbi7ktRb7itwPfro0BC8dlGhzOcaHYzgtb PLNOjMZ43gQEe86yCvg== X-Authority-Analysis: v=2.4 cv=Oc+oyBTY c=1 sm=1 tr=0 ts=6a85e607 cx=c_pps a=Ou0eQOY4+eZoSc0qltEV5Q==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=VwQbUJbxAAAA:8 a=QX4gbG5DAAAA:8 a=EUspDBNiAAAA:8 a=8iAkK7V-g8xI8jGQdaYA:9 a=QEXdDO2ut3YA:10 a=AbAUZ8qAyYyZVLSsDulk:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-19_04,2026-08-19_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 priorityscore=1501 phishscore=0 malwarescore=0 spamscore=0 suspectscore=0 clxscore=1011 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608190134 Add nvmem_cell_get_size() to let a consumer query a cell's size before reading or writing it. Without this, a consumer that assumes a fixed cell size can pass nvmem_cell_write() a buffer larger than the cell, which fails with an incorrect-size error instead of succeeding with the cell's actual capacity. Co-developed-by: Oleksij Rempel Signed-off-by: Oleksij Rempel Reviewed-by: Sebastian Reichel Link: https://lore.kernel.org/lkml/dixmyhyj6b66vyizfotpqw6yzaavi2o2mauloa5x= 6zn3qgk5ub@huoal5ucdd44/ Signed-off-by: Faruque Ansari --- drivers/nvmem/core.c | 29 +++++++++++++++++++++++++++++ include/linux/nvmem-consumer.h | 7 +++++++ 2 files changed, 36 insertions(+) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index 0556d140170a..49afcff4c72c 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -1790,6 +1790,35 @@ int nvmem_cell_write(struct nvmem_cell *cell, void *= buf, size_t len) =20 EXPORT_SYMBOL_GPL(nvmem_cell_write); =20 +/** + * nvmem_cell_get_size() - Retrieve the storage size of an NVMEM cell. + * @cell: Pointer to the NVMEM cell structure. + * @bytes: Optional pointer to store the cell size in bytes (can be NULL). + * @bits: Optional pointer to store the cell size in bits (can be NULL). + * + * This function allows consumers to retrieve the size of a specific NVMEM + * cell before performing read/write operations. It is useful for validati= ng + * buffer sizes to prevent mismatched writes. + * + * Return: 0 on success or negative on failure. + */ +int nvmem_cell_get_size(struct nvmem_cell *cell, size_t *bytes, size_t *bi= ts) +{ + struct nvmem_cell_entry *entry =3D cell->entry; + + if (!entry->nvmem) + return -EINVAL; + + if (bytes) + *bytes =3D entry->bytes; + + if (bits) + *bits =3D entry->nbits; + + return 0; +} +EXPORT_SYMBOL_GPL(nvmem_cell_get_size); + static int nvmem_cell_read_common(struct device *dev, const char *cell_id, void *val, size_t count) { diff --git a/include/linux/nvmem-consumer.h b/include/linux/nvmem-consumer.h index 34c0e58dfa26..bcb0e17e415d 100644 --- a/include/linux/nvmem-consumer.h +++ b/include/linux/nvmem-consumer.h @@ -56,6 +56,7 @@ void nvmem_cell_put(struct nvmem_cell *cell); void devm_nvmem_cell_put(struct device *dev, struct nvmem_cell *cell); void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len); int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len); +int nvmem_cell_get_size(struct nvmem_cell *cell, size_t *bytes, size_t *bi= ts); int nvmem_cell_read_u8(struct device *dev, const char *cell_id, u8 *val); int nvmem_cell_read_u16(struct device *dev, const char *cell_id, u16 *val); int nvmem_cell_read_u32(struct device *dev, const char *cell_id, u32 *val); @@ -128,6 +129,12 @@ static inline int nvmem_cell_write(struct nvmem_cell *= cell, return -EOPNOTSUPP; } =20 +static inline int nvmem_cell_get_size(struct nvmem_cell *cell, size_t *byt= es, + size_t *bits) +{ + return -EOPNOTSUPP; +} + static inline int nvmem_cell_read_u8(struct device *dev, const char *cell_id, u8 *val) { --=20 2.34.1 From nobody Mon Sep 28 16:22:28 2026 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 7932A368D5E; Wed, 19 Aug 2026 17:21:44 +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=1787160108; cv=none; b=aqRDUPGlo22az4uFFBl0fw9BrGeYGc9wrOhog4M6ogV2K9znXDOnjHrQfDq4edUgumUl4U3TkIkqa7ZrhRTfy5hlTU6Ud8levKRFK2ia1XQ360fmKxtmsWst7ZGIQD4Jk2snIId6NKZGDbEPEkStwGgZ/VFePp3AgAE7XJK9mk0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787160108; c=relaxed/simple; bh=HQR1jd9XVDt9kP59NBL51DuihrYV2Qt4CCZsAKiqYxk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ALd1EFRm7NMdlg+dwwb+WbIDabQBdOxOoMYIXgCqma8fVzBXvySj76xW3hMTBT3bQ0XxvMdPKHp/jJud8mLrPj1ezQuEiueOnodT1W1eYHjYPXKbpOVi5KJ75Mc8AW7/JX2qNz+hdCOnhdQ5Qa2ke3dppfXpQSjiz/hqQmZGosM= 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=KENZB9UB; 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="KENZB9UB" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67JEbLME067602; Wed, 19 Aug 2026 17:21:12 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= Rb6dE5y6kbaCv/EunSzpHBECJxErNwXCc8DBOXliMHw=; b=KENZB9UBysLloCWi QiSZOF7EHKFJDh7BY+0G+VArKmk73KNg5CwOnoBdoPkAxKKOGZhU/cnXR+Ap/Iak bi6YJb9jyVemn4rhK9mrdUuse547PnBPficZUqWVodBgTC1OacIPK3AAGGmv7tRM idGnRhvCL8OUyvGTyfJSKKi3Mj8CnVwoljtiRHzGsOcebFQk+uEXPIkugfIcZ3aG 9jOAu/fvjh0wI50akLRyJt0tBULYwvYowngZ7tBqQL6EG4LF4o8a4jocYkx1bwpz 65PrH+B1rn00kp/zTVLExujnCF1c+adegyPWa1YjQg3Exf27IiUGiyr8u5yxCL0c dSYr0g== Received: from apblrppmta01.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com [103.229.18.19]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4g5e5d0xvg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 19 Aug 2026 17:21:11 +0000 (GMT) Received: from pps.filterd (APBLRPPMTA01.qualcomm.com [127.0.0.1]) by APBLRPPMTA01.qualcomm.com (8.18.1.7/8.18.1.7) with ESMTP id 67JHL6cL027988; Wed, 19 Aug 2026 17:21:08 GMT Received: from pps.reinject (localhost [127.0.0.1]) by APBLRPPMTA01.qualcomm.com (PPS) with ESMTP id 4g2h6kddba-1; Wed, 19 Aug 2026 17:21:08 +0000 (GMT) Received: from APBLRPPMTA01.qualcomm.com (APBLRPPMTA01.qualcomm.com [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.1.12) with ESMTP id 67JHL5eA027937; Wed, 19 Aug 2026 17:21:08 GMT Received: from hu-ffaruque-hyd.qualcomm.com (hu-ffaruque-hyd.qualcomm.com [10.147.245.31]) by APBLRPPMTA01.qualcomm.com (PPS) with ESMTP id 67JHL5jE027916; Wed, 19 Aug 2026 17:21:08 +0000 (GMT) From: Faruque Ansari Date: Wed, 19 Aug 2026 22:50:46 +0530 Subject: [PATCH v2 4/4] arm64: dts: qcom: lemans: Add PSCRR NVMEM recorder node 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: <20260819-pscrr-provider-v2-4-9072383e0f4d@oss.qualcomm.com> References: <20260819-pscrr-provider-v2-0-9072383e0f4d@oss.qualcomm.com> In-Reply-To: <20260819-pscrr-provider-v2-0-9072383e0f4d@oss.qualcomm.com> To: Oleksij Rempel , Pengutronix Kernel Team , Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Wim Van Sebroeck , Guenter Roeck , Benson Leung , Tzung-Bi Shih , Srinivas Kandagatla , Daniel Lezcano Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-watchdog@vger.kernel.org, kernel@pengutronix.de, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , =?utf-8?q?S=C3=B8ren_Andersen?= , Guenter Roeck , Matti Vaittinen , Ahmad Fatoum , Andrew Morton , avaneesh.dwivedi@oss.qualcomm.com, Umang Chheda , Faruque Ansari X-Mailer: b4 0.15.2 X-QCInternal: smtphost X-QCInternal: smtphost X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE5MDEzNCBTYWx0ZWRfX2FzD1BZDLCPS mEdtSF7rUT812VUbz/UEFOG1MAeCgjAQfq/3OjTX1sfXK/FdClRaHkfEyO2Fgjr+EhJATPnLhF8 RJ1sBUwBJUMAVCZnAXuLkf9Kp31ceJu2WAgb2YGOPoe1SXvSK8vwxrWx6ob4IZ0AuP46xQ0NEQc atvBtb+96EMtfXo2J+rR0UskO5Tf/jp+bVyDgGX8q9tfpX0r/zet6CZ+qi+IziSGeEDErQpcz5e PBrpceGUDi3ASP0fa3aRCm5+nFTxBxUVu31kxmfxNft1euDsOuXBPUMsmkcgaJbVXX0+mTUYqpU 5QQ7KzQgSPfGWnFS901eCA2+c79IUlo5a35BLAQhQgzhSvQoifK+tGRKaP1/foBBDtyss/KuxWd o7vhW9yWnDr1unNxyurPXYeZI9CdamdLV58g6j/NqOezewVAhIfU33MQpcKxajd3H7oq2CA2Xu1 SDcKbMy6HFHnX9BJ/kQ== X-Authority-Analysis: v=2.4 cv=cuOrVV4i c=1 sm=1 tr=0 ts=6a85e608 cx=c_pps a=Ou0eQOY4+eZoSc0qltEV5Q==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=MOLsqODhR6HaTkgyW3wA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: DL34dKFa6OPFRv_qfuSZonI8p5ICq6X5 X-Proofpoint-GUID: DL34dKFa6OPFRv_qfuSZonI8p5ICq6X5 X-Proofpoint-Spam-Info: AW1haW4tMjYwODE5MDEzNCBTYWx0ZWRfXzWBgWSLihqAm N1C0hyKYxUak2VL6ewP2gSS/lwp0kYxJifQkKoM+LrxZTcz78bb5IQBkcZ1ImsasGZD0WGAkeer hw0NQQ1sZOZnSdJM24xnSQBa8JaFJy8= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-19_04,2026-08-19_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 impostorscore=0 malwarescore=0 suspectscore=0 phishscore=0 clxscore=1015 lowpriorityscore=0 adultscore=0 spamscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608190134 Add a one-byte NVMEM cell node in the SDAM to persist the power state change reason across resets, and wire it to a pscrr-nvmem recorder consumer node so the reason is recorded before shutdown/reboot and read back on the next boot. Signed-off-by: Faruque Ansari Reviewed-by: Abel Vesa --- arch/arm64/boot/dts/qcom/lemans-pmics.dtsi | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/lemans-pmics.dtsi b/arch/arm64/boot/d= ts/qcom/lemans-pmics.dtsi index 500f715931aa..96db3f57969f 100644 --- a/arch/arm64/boot/dts/qcom/lemans-pmics.dtsi +++ b/arch/arm64/boot/dts/qcom/lemans-pmics.dtsi @@ -97,6 +97,12 @@ reboot-mode { mode-recovery =3D <0x01>; mode-bootloader =3D <0x02>; }; + + reboot-reason { + compatible =3D "pscrr-nvmem"; + nvmem-cells =3D <&reboot_reason_persist>; + nvmem-cell-names =3D "pscr"; + }; }; =20 &spmi_bus { @@ -186,6 +192,16 @@ reboot_reason: reboot-reason@48 { reg =3D <0x48 0x1>; bits =3D <1 7>; }; + + nvmem-layout { + compatible =3D "fixed-layout"; + #address-cells =3D <1>; + #size-cells =3D <1>; + + reboot_reason_persist: reboot-reason-persist@49 { + reg =3D <0x49 0x1>; + }; + }; }; }; =20 --=20 2.34.1