From patchwork Fri Jan 19 13:25:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 189559 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp1004662dyb; Fri, 19 Jan 2024 05:27:49 -0800 (PST) X-Google-Smtp-Source: AGHT+IE5aQOpGMF2+dfs3gkeKnn452bVyJsXrjyAIdG4gT8dk9LZA7Z4LpUhO8lKxOl2OJlisj1+ X-Received: by 2002:aa7:8ecc:0:b0:6da:b57f:dc32 with SMTP id b12-20020aa78ecc000000b006dab57fdc32mr2120788pfr.21.1705670869057; Fri, 19 Jan 2024 05:27:49 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705670869; cv=pass; d=google.com; s=arc-20160816; b=NFL/rmRSXHTNAUe908i2mFEIM57eb4YaXIIqLxfEvw/ii/NnXtkOzdaE0RZ5odr3VW sAcgDED02WkgFvJM9COvyxB/2euEc9lhvK/ViGnS/f1laXfrg92vxNwBQ/z/PYxHANR3 D0W3/dbwE5NTt0lQO95JSmaY75aZDvVxpKrSdxwmQb4ZHbJyo89OZuz0kdmzSgqJjG4X GLuquHdyJJ6IyYFN9aj1EbNnzYMD+x56jD586SrBlgecxlXnWniYrrgE173Ii8xs9Ekq nmX8jsSwbLD+XkZLgfKSfYviY5VEZ/MyiiOE7+cN2StiJOxijkbUdYwsfOB9iX6AWUrO MRPg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=InHvgr21h03llMcgfIF7fiUIZSWBRWtcfuwNhwAmb1I=; fh=cTOyeHIiotxFveWD397Up69SLR8Dqpy9YboYIfW0A00=; b=wQQ2mrsODArznLclQxhjlXuRTsbu0xmo5K0oqhGPs6/6eydK3DM8dAy9rjiMrkM7WU mZP+PsNE60SRDqPdGcy7KM+1M6jUbyARX2juH6UPVwf/UVgOOUV0rkoQc1NWknN8+nAh 82ujOtotnYr+RWZoTGfjjyjZJom6sw+GwRlxVn4fyta6q2GxyoPZnCs2qQQ1k1o6GBta CAAsJQ3KyDqfsn+WNsgw/iV4q/pWo4pPyeQDGpPFVGAUbJZ34mwWwSlVfqgtdAfSF69V jydSiWi43eINY1vV6DiRAiUaZCxx7U5IUFhSgxXPYkB6zTQ5KqBMOa98Do/Rme0vEsJE 6hGw== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31194-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31194-ouuuleilei=gmail.com@vger.kernel.org" Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id w66-20020a626245000000b006d9cb270e65si5314252pfb.392.2024.01.19.05.27.48 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jan 2024 05:27:49 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-31194-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31194-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31194-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 1D74E2861AD for ; Fri, 19 Jan 2024 13:27:13 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A579E54BE7; Fri, 19 Jan 2024 13:25:43 +0000 (UTC) Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (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 5ED5352F84 for ; Fri, 19 Jan 2024 13:25:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670741; cv=none; b=R2hsy0npZf63+0FsS0IGrUWUvQikDc4nZK4RzFZnSbalQguqhqlvRiCDqoIIpp3T8GiSilx7us6zHVzCk8galCUgMLXLDZLhOGz9UE0ddky6Ef3M+DjsboK7aq/k5VDd6Aet7syG+38awALOkVJuNZ7U8MUuXxeIhJK3iU1NtoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670741; c=relaxed/simple; bh=yxObVGl9FlHXCDPkT1CCVeqiUamoD375a9LA8yEV5Ro=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=a9DLdsz6BhznjQXqXn9kmtFH5howJg3pW17jLbxLpn3bn4Nns41AOHgBt8oFDjL2ruvISzmk87IKkxetpz0mYkFtthMxr4n/zG/CeYWYu2scDmEK0SU7TL3q87rO9x47COUaA/A/M8TmOQsGCg/xmb7nSZHJpGLNkbaEM47jPgg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rQos7-00074F-C2; Fri, 19 Jan 2024 14:25:23 +0100 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rQos6-000viG-4z; Fri, 19 Jan 2024 14:25:22 +0100 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1rQos6-00F97h-0G; Fri, 19 Jan 2024 14:25:22 +0100 From: Oleksij Rempel To: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, =?utf-8?q?S=C3=B8ren_Andersen?= Subject: [RFC PATCH v1 1/7] dt-bindings: power: reset: add generic PSCR binding trackers Date: Fri, 19 Jan 2024 14:25:15 +0100 Message-Id: <20240119132521.3609945-2-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240119132521.3609945-1-o.rempel@pengutronix.de> References: <20240119132521.3609945-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788525537168422998 X-GMAIL-MSGID: 1788525537168422998 Add binding for Power State Change Reason (PSCR) subsystem Signed-off-by: Oleksij Rempel --- .../devicetree/bindings/power/reset/pscr.yaml | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Documentation/devicetree/bindings/power/reset/pscr.yaml diff --git a/Documentation/devicetree/bindings/power/reset/pscr.yaml b/Documentation/devicetree/bindings/power/reset/pscr.yaml new file mode 100644 index 000000000000..1ce973f3473c --- /dev/null +++ b/Documentation/devicetree/bindings/power/reset/pscr.yaml @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/power/state-change/pscr.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Power State Change Reason (PSCR) + +maintainers: + - Oleksij Rempel + +description: Binding for devices responsable to store reasons for power state + changes such as reboot and power-off. Reasons like unknown, under voltage, + and over temperature are captured for diagnostic or automatic recovery + purposes. + +properties: + $nodename: + pattern: "^pscr(@.*|-([0-9]|[1-9][0-9]+))?$" + + pscr-unknown: + $ref: /schemas/types.yaml#/definitions/uint32 + description: Value to indicate an unknown reason for the power state change. + + pscr-under-voltage: + $ref: /schemas/types.yaml#/definitions/uint32 + description: | + Value to indicate an under-voltage condition of a system critical + regulator as the reason for the power state change. + + pscr-over-current: + $ref: /schemas/types.yaml#/definitions/uint32 + description: | + Value to indicate an over-current condition of a system ctitical regulator + as the reason for the power state change. + + pscr-regulator-failure: + $ref: /schemas/types.yaml#/definitions/uint32 + description: | + Value to indicate an unknow, system ctitical regulator related failure + as the reason for the power state change. + + pscr-over-temperature: + $ref: /schemas/types.yaml#/definitions/uint32 + description: | + Value to indicate a system critical over-temperature condition as the + reason for the power state change. + +additionalProperties: true + +... From patchwork Fri Jan 19 13:25:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 189561 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp1004766dyb; Fri, 19 Jan 2024 05:28:02 -0800 (PST) X-Google-Smtp-Source: AGHT+IE4MYhlEgVLjiD6q3HjfEgycoOnWTyrNMm7uRxcS3Vmhgw4JmoS2V12qLOGle/HS+2P/fIW X-Received: by 2002:a05:6e02:13f4:b0:361:a1dd:1bab with SMTP id w20-20020a056e0213f400b00361a1dd1babmr2155030ilj.55.1705670882176; Fri, 19 Jan 2024 05:28:02 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705670882; cv=pass; d=google.com; s=arc-20160816; b=rq9P9d+vuyFWrJ0XvCQdZhltZFNl4tly33UGXWmnlHYBZc/ho0FkQlZX0ScUvy6ekk i+UIrVlgAFieDL9w0nkoxQnwzcLj17y3S/RueGUYro66qpMTSUOrVVc2Jw/paMlJoc8c L1DdZu0wCL1pTf+JnJP3r5uwcE6oWLCD4UGo/3+Nn9ETFIRedUmS8kTqx7fIrsQyVaUl yCKV3EqjPzmRww9kvPxwcFOl+dRlBLzQDHBrvwTCp2bvIUQXF9X37FKy8sn8u9bhMc8v 5Rp8DAAr1KLIDzEacvGM81ojAu8jiPnPVMVdWz9gsC6fmwyrnhc0LlHTUL/iywCiUjPT BS/A== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=vUXUi3VqPHRETMjI0HqYbLEQqyuBKVa9UKoRPdnC2WE=; fh=cTOyeHIiotxFveWD397Up69SLR8Dqpy9YboYIfW0A00=; b=0BFTFEWOvDVChkPMeeAhshsYiLbsOByFNJXT/P1IdWtN0V4oFlrQmQlEec/w7E7A7M YIo0a22S8t3zPua83FAbMK3eEsyYEREvP+Vs2r3YFRDG0ZohLuZ8eCy+xDwDOzFuFSE9 xToRIF/XemC25tnmYID4BqPR+iUrF4VjpbbdHOwwvBvjxeSDbAEAYn5iPjFviLtK7UcV PCanR7nfLnU5vIKsKFkzW9uYFywTUXX1xbW+OEwUWhDgOE1onokE2haK0fUEp07Ahn5T vCuMiI4TaOQZVeCvnOKltMuk7QHCwc9wzyxH5QvdblZezUCgmVOQBWbzX/Kju5I3faqn zK6g== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31198-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31198-ouuuleilei=gmail.com@vger.kernel.org" Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id w7-20020a63b747000000b005ce26be11cbsi3279693pgt.234.2024.01.19.05.28.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jan 2024 05:28:02 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-31198-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31198-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31198-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 0CF4BB22E42 for ; Fri, 19 Jan 2024 13:28:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5813752F69; Fri, 19 Jan 2024 13:25:47 +0000 (UTC) Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (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 707905465E for ; Fri, 19 Jan 2024 13:25:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670744; cv=none; b=o0sMMjeuVHfaxXnIbUw5mT6e2SjnooNmYv/k+s2KdkHybiNI+pxzv/oUswUHDug9mGZl3IQNFrW0NdIZRcvhXxZWAx5PHkWuX55rl4dgqrMIbZs2iPGTYXFfKTrCdQcKZlxk0OxcX3uT/rCkNH46E1jh6UCgwvJjp12xDqWErWg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670744; c=relaxed/simple; bh=3Glzu+0PbXiGnMMmOn9Xn/tWC6n+7I7VVFwZl4dJEDA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=t978xhXKTDgJorDjF+KvVnlGJVmtAkJeEHcMoUYqekE7xwEt/+CY9Zgk065b5Q5RHF7CIqcyxY3KHrqn71vslTSCD8iwFe+cFgURKh+wPJUibC43xvHQ1IE1lGiMV002dOUZC85x9yHV7Ot4zShD7M5Ci+3t4Erg97vXaXHg3/s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rQos7-00074G-C1; Fri, 19 Jan 2024 14:25:23 +0100 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rQos6-000viH-60; Fri, 19 Jan 2024 14:25:22 +0100 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1rQos6-00F97r-0M; Fri, 19 Jan 2024 14:25:22 +0100 From: Oleksij Rempel To: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, =?utf-8?q?S=C3=B8ren_Andersen?= Subject: [RFC PATCH v1 2/7] power: reset: Introduce PSCR Tracking Framework for Non-Volatile Storage Date: Fri, 19 Jan 2024 14:25:16 +0100 Message-Id: <20240119132521.3609945-3-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240119132521.3609945-1-o.rempel@pengutronix.de> References: <20240119132521.3609945-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788525550802114394 X-GMAIL-MSGID: 1788525550802114394 This commit introduces the Power State Change Reasons (PSCR) tracking framework into the kernel. The framework is vital for systems where PMICs or watchdogs cannot provide information on power state changes. It stores reasons for system shutdowns and reboots, like under-voltage or software-triggered events, in non-volatile hardware storage. This approach is essential for postmortem analysis in scenarios where traditional storage methods (block devices, RAM) are not feasible. The framework aids bootloaders and early-stage system components in recovery decision-making, although it does not cover resets caused by hardware issues like system freezes or watchdog timeouts. Signed-off-by: Oleksij Rempel --- drivers/power/reset/Kconfig | 19 +++ drivers/power/reset/Makefile | 1 + drivers/power/reset/pscr.c | 259 +++++++++++++++++++++++++++++++++++ include/linux/pscr.h | 40 ++++++ 4 files changed, 319 insertions(+) create mode 100644 drivers/power/reset/pscr.c create mode 100644 include/linux/pscr.h diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig index fece990af4a7..da76e84302b9 100644 --- a/drivers/power/reset/Kconfig +++ b/drivers/power/reset/Kconfig @@ -305,3 +305,22 @@ config POWER_MLXBF This driver supports reset or low power mode handling for Mellanox BlueField. endif + +menuconfig PSCR + bool "Power State Change Reasons (PSCR) Tracking Framework" + help + Enables the Power State Change Reasons (PSCR) tracking framework. + + This framework is designed to store reasons for system shutdowns or + reboots, like under voltage or software-triggered events, in non-volatile + hardware storage. It is particularly useful for postmortem analysis, where + traditional storage methods (like block devices or RAM) are not feasible + due to immediate power-down requirements or insufficient power to retain + data. + + This is useful for bootloaders or other early-stage system components to + make recovery decisions based on the last known system state. Note that it + does not cover hardware-induced resets like system freezes or watchdog + timeouts. + + If unsure, say N. diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile index a95d1bd275d1..d9d744302c68 100644 --- a/drivers/power/reset/Makefile +++ b/drivers/power/reset/Makefile @@ -31,6 +31,7 @@ obj-$(CONFIG_POWER_RESET_KEYSTONE) += keystone-reset.o obj-$(CONFIG_POWER_RESET_SYSCON) += syscon-reboot.o obj-$(CONFIG_POWER_RESET_SYSCON_POWEROFF) += syscon-poweroff.o obj-$(CONFIG_POWER_RESET_RMOBILE) += rmobile-reset.o +obj-$(CONFIG_PSCR) += pscr.o obj-$(CONFIG_REBOOT_MODE) += reboot-mode.o obj-$(CONFIG_SYSCON_REBOOT_MODE) += syscon-reboot-mode.o obj-$(CONFIG_POWER_RESET_SC27XX) += sc27xx-poweroff.o diff --git a/drivers/power/reset/pscr.c b/drivers/power/reset/pscr.c new file mode 100644 index 000000000000..7506ecbe1aad --- /dev/null +++ b/drivers/power/reset/pscr.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2016, Fuzhou Rockchip Electronics Co., Ltd +// Copyright (c) 2024 Pengutronix, Oleksij Rempel +/* + * Based on drivers/power/reset/reboot-mode.c + * Copyright (c) 2016, Fuzhou Rockchip Electronics Co., Ltd + */ + +#include +#include +#include +#include +#include +#include +#include + +#define PREFIX "pscr-" + +struct reason_info { + enum power_state_change_reason pscr; + u32 magic; + struct list_head list; +}; + +enum power_state_change_reason system_pscr; + +struct pscr_map { + const char *reason; + enum power_state_change_reason pscr; +}; + +struct pscr_map pscr_map_table[] = { + { "unknown", PSCR_UNKNOWN }, + { "under-voltage", PSCR_UNDER_VOLTAGE }, + { "over-current", PSCR_OVER_CURRENT }, + { "regulator-failure", PSCR_REGULATOR_FAILURE }, + { "over-temperature", PSCR_OVERTEMPERATURE }, +}; + +static int find_reason_by_string(const char *reason) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(pscr_map_table); i++) { + if (!strcmp(reason, pscr_map_table[i].reason)) + return pscr_map_table[i].pscr; + } + + return -ENOENT; +} + +/** + * set_power_state_change_reason() - Set the system's power state change reason + * @reason: The enum value representing the power state change reason + * + * This function sets the system's power state change reason based on the + * provided enum value. + */ +void set_power_state_change_reason(enum power_state_change_reason reason) +{ + system_pscr = reason; +} +EXPORT_SYMBOL_GPL(set_power_state_change_reason); + +static unsigned int get_pscr_magic(struct pscr_driver *pscr_drv, + const char *cmd) +{ + struct reason_info *info; + + list_for_each_entry(info, &pscr_drv->head, list) { + if (info->pscr == system_pscr) + return info->magic; + } + + return 0; +} + +static int pscr_notify(struct notifier_block *this, + unsigned long reason, void *cmd) +{ + struct pscr_driver *pscr_drv = container_of(this, struct pscr_driver, + reboot_notifier); + unsigned int magic; + + magic = get_pscr_magic(pscr_drv, cmd); + if (magic) + pscr_drv->write(pscr_drv, magic); + + return NOTIFY_DONE; +} + +/** + * pscr_process_property() - Process a power state change reason property + * @pscr_drv: Pointer to the pscr_driver structure + * @prop: Pointer to the property structure to be processed + * + * This function processes a device tree property representing a power state + * change reason and initializes the relevant data structures. + * + * Returns: 0 on success, -ENOMEM on memory allocation failure. + */ +static int pscr_process_property(struct pscr_driver *pscr_drv, + struct property *prop) +{ + struct device *dev = pscr_drv->dev; + size_t len = strlen(PREFIX); + struct reason_info *info; + int ret; + + if (strncmp(prop->name, PREFIX, len)) + return 0; + + info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + ret = of_property_read_u32(dev->of_node, prop->name, &info->magic); + if (ret) { + dev_err(dev, "Can't read magic number for %s: %pe\n", + prop->name, ERR_PTR(ret)); + devm_kfree(dev, info); + return 0; + } + + if (!info->magic) { + dev_err(dev, "%s with magic number == 0\n", prop->name); + devm_kfree(dev, info); + return 0; + } + + info->pscr = find_reason_by_string(prop->name + len); + if (info->pscr < 0) { + dev_err(dev, "unsupported reason name(%s): %pe\n", + prop->name, ERR_PTR(info->pscr)); + devm_kfree(dev, info); + return 0; + } + + if (info->magic > pscr_drv->max_magic) + pscr_drv->max_magic = info->magic; + + dev_dbg(dev, "registering reason = %s, magic = %d, pscr = %d\n", + prop->name, info->magic, info->pscr); + list_add_tail(&info->list, &pscr_drv->head); + + return 0; +} + +/* + * pscr_register() - Register the pscr driver and initialize power state change + * reasons + * @pscr_drv: Pointer to the pscr_driver structure + * + * This function registers the pscr driver and initializes power state change + * reasons based on device tree properties. + * + * Returns: 0 on success, -ENOMEM on memory allocation failure + */ +int pscr_register(struct pscr_driver *pscr_drv) +{ + struct device_node *np = pscr_drv->dev->of_node; + struct property *prop; + + INIT_LIST_HEAD(&pscr_drv->head); + + for_each_property_of_node(np, prop) { + int ret = pscr_process_property(pscr_drv, prop); + if (ret) + return ret; + } + + pscr_drv->reboot_notifier.notifier_call = pscr_notify; + register_reboot_notifier(&pscr_drv->reboot_notifier); + + return 0; +} +EXPORT_SYMBOL_GPL(pscr_register); + +/* + * pscr_unregister() - Unregister the pscr driver's reboot notifier + * @pscr_drv: Pointer to the pscr_driver structure + * + * This function unregisters the reboot notifier for the pscr driver. + */ +void pscr_unregister(struct pscr_driver *pscr_drv) +{ + unregister_reboot_notifier(&pscr_drv->reboot_notifier); +} +EXPORT_SYMBOL_GPL(pscr_unregister); + +static void devm_pscr_release(struct device *dev, void *res) +{ + pscr_unregister(*(struct pscr_driver **)res); +} + +/** + * devm_pscr_register - Register a device-managed PSCR driver + * @dev: Device to associate the PSCR driver with + * @pscr_drv: Pointer to the PSCR driver to be registered + * + * Registers a Power State Change Reason (PSCR) driver as a device-managed + * resource. + * + * Returns: 0 on successful registration or a negative error code on failure. + */ +int devm_pscr_register(struct device *dev, + struct pscr_driver *pscr_drv) +{ + struct pscr_driver **dr; + int rc; + + dr = devres_alloc(devm_pscr_release, sizeof(*dr), GFP_KERNEL); + if (!dr) + return -ENOMEM; + + rc = pscr_register(pscr_drv); + if (rc) { + devres_free(dr); + return rc; + } + + *dr = pscr_drv; + devres_add(dev, dr); + + return 0; +} +EXPORT_SYMBOL_GPL(devm_pscr_register); + +static int devm_pscr_match(struct device *dev, void *res, void *data) +{ + struct pscr_driver **p = res; + + if (WARN_ON(!p || !*p)) + return 0; + + return *p == data; +} + +/** + * devm_pscr_unregister - Unregister a managed PSCR driver + * @dev: Device associated with the PSCR driver + * @pscr_drv: Pointer to the PSCR driver to unregister + * + * Unregisters a device-managed Power State Change Reason (PSCR) driver. + * It handles the cleanup and release of resources associated with the PSCR + * driver which was previously registered. + */ +void devm_pscr_unregister(struct device *dev, + struct pscr_driver *pscr_drv) +{ + WARN_ON(devres_release(dev, + devm_pscr_release, + devm_pscr_match, pscr_drv)); +} +EXPORT_SYMBOL_GPL(devm_pscr_unregister); + +MODULE_AUTHOR("Oleksij Rempel "); +MODULE_DESCRIPTION("Power State Change Reason (PSCR) tracking framework"); +MODULE_LICENSE("GPL v2"); diff --git a/include/linux/pscr.h b/include/linux/pscr.h new file mode 100644 index 000000000000..bf66dd69d96d --- /dev/null +++ b/include/linux/pscr.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __PSCR_H__ +#define __PSCR_H__ + +enum power_state_change_reason { + PSCR_UNKNOWN, + PSCR_UNDER_VOLTAGE, + PSCR_OVER_CURRENT, + PSCR_REGULATOR_FAILURE, + PSCR_OVERTEMPERATURE, +}; + +struct pscr_driver { + struct device *dev; + struct list_head head; + int (*write)(struct pscr_driver *pscr_drv, u32 magic); + struct notifier_block reboot_notifier; + u32 max_magic; +}; + +int pscr_register(struct pscr_driver *pscr_drv); +void pscr_unregister(struct pscr_driver *pscr_drv); +int devm_pscr_register(struct device *dev, + struct pscr_driver *pscr_drv); +void devm_pscr_unregister(struct device *dev, + struct pscr_driver *pscr_drv); + + +#if IS_ENABLED(CONFIG_PSCR) + +void set_power_state_change_reason(enum power_state_change_reason reason); + +#else + +static inline void set_power_state_change_reason(enum power_state_change_reason reason) +{ +} +#endif + +#endif From patchwork Fri Jan 19 13:25:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 189555 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp1003862dyb; Fri, 19 Jan 2024 05:26:20 -0800 (PST) X-Google-Smtp-Source: AGHT+IF9hMJaz4q1uw7sKNAFfgDV9714JHaFFViapek0s0i5J5kTj/3hiXAzFx9Rjr0roDQ1sOiQ X-Received: by 2002:aa7:c60e:0:b0:559:f6dd:e8fb with SMTP id h14-20020aa7c60e000000b00559f6dde8fbmr1632252edq.55.1705670779818; Fri, 19 Jan 2024 05:26:19 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705670779; cv=pass; d=google.com; s=arc-20160816; b=gia4gnb5iAZJ2mN+uzgABelNO/vp15J9D1foigU3jvTk/rBwXmxxA4+cJyoh3R3qtF F73gwRmT0eLT1HA3hW3Jkbok+xmAuIKJXvXZGB6ELAAKQvvjPPkdws6CwRCqi9Oiqtw6 bFAAUU8aWZvawlJeZR7VEVVrwQUwg9p2xPq6r54qaevTnIchYYuPGZdDa+OVlN8G4G0w irHmplUCCk2h+FpvLuh5PcLqhOJVr39YjL7lU4BFlBtpnICoBt5pRjNYkqx7a4pJp/NX CsNfdSneIDw7AU73WMDZDfFr3bDuWtP4jdpBkWWPnPGEayKAhh4QtortxdyVB22l1psE mBpA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=fa8Ju0cruJtuCRFPpgMudoZS3lHBZqx75cTGVYEJ/hs=; fh=cTOyeHIiotxFveWD397Up69SLR8Dqpy9YboYIfW0A00=; b=sEXFrHDVZza3CErTL7XbGXoxESY7T9UcgxprUlPhWJAFzcmTjKxHBsxbueF4pJbpRS 4KiOCGEQp3XqOgXOYILeRpbeJqMraVGqKdlKt/oNQMDl3s7m+cejnhLiDBkqIltQCfBX +eFKKgvksILx3FTdv9T66DcfkaqoQJd4luthHvloEMNiwLjZ5MHEtCDrieGVztduqXpN 417GxHb7f+abcqxxC0HIHSsASjGBPIogw7hA0uLkUnsQmTpQ+AtklH21TL2tVM27t6tP LqSC75/PlcEegh+Mv5Sc768swiu2TKNAgETy5JIvlEwsyC0Hhy7wrU0YairiOHNRXsw3 yzkw== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31191-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31191-ouuuleilei=gmail.com@vger.kernel.org" Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id c33-20020a509fa4000000b0055a6bd4b97fsi359030edf.418.2024.01.19.05.26.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jan 2024 05:26:19 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-31191-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31191-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31191-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 1843F1F23F13 for ; Fri, 19 Jan 2024 13:26:12 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6E01B5381A; Fri, 19 Jan 2024 13:25:41 +0000 (UTC) Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (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 90760524A8 for ; Fri, 19 Jan 2024 13:25:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670739; cv=none; b=DThGHMWFi9SWB59cdbaVgrjGtgHC9cLm5lAjgz1mttTa22kSpI5JsES/UHj27qMpKsUFK3gp5NTC5E2OAFtEZMKDUTD1eZFvAn3H9gzACHo7co7TAyunnggKMgm8gjKsL4pK24hNG1SJSWizqxa0QqcfrXnxXFIrw+h5hhCdoDU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670739; c=relaxed/simple; bh=y/hGCVajOvX8o6Efi9UdqxsGrdX7qFeQ/WFMS56UPW4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=aKSlxai51oZojz9oewuurJd4iMd1NXMdS5lAwpfzEc82LHoFKI06L1UfYztl0MrLONluEicQruiUcxZDKWV446L1fHEdjMhMDKK/GJfvHNt2Y6/dFgq3h1/BTfzl+etSDT7bROTbtvBN3QDIpEnG8PLlkRuF1BfHHfPh62596Mk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rQos7-00074H-C1; Fri, 19 Jan 2024 14:25:23 +0100 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rQos6-000viI-6t; Fri, 19 Jan 2024 14:25:22 +0100 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1rQos6-00F981-0Q; Fri, 19 Jan 2024 14:25:22 +0100 From: Oleksij Rempel To: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, =?utf-8?q?S=C3=B8ren_Andersen?= Subject: [RFC PATCH v1 3/7] dt-bindings: power: reset: add bindings for NVMEM hardware storing PSCR Data Date: Fri, 19 Jan 2024 14:25:17 +0100 Message-Id: <20240119132521.3609945-4-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240119132521.3609945-1-o.rempel@pengutronix.de> References: <20240119132521.3609945-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788525443421774265 X-GMAIL-MSGID: 1788525443421774265 Add device tree bindings that describe hardware implementations of Non-Volatile Memory (NVMEM) used for storing Power State Change Reasons (PSCR). Signed-off-by: Oleksij Rempel --- .../bindings/power/reset/pscr-nvmem.yaml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Documentation/devicetree/bindings/power/reset/pscr-nvmem.yaml diff --git a/Documentation/devicetree/bindings/power/reset/pscr-nvmem.yaml b/Documentation/devicetree/bindings/power/reset/pscr-nvmem.yaml new file mode 100644 index 000000000000..0642b470af41 --- /dev/null +++ b/Documentation/devicetree/bindings/power/reset/pscr-nvmem.yaml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/power/state-change/pscr-nvmem.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Generic NVMEM Power State Change Reason storage + +maintainers: + - Oleksij Rempel + +description: This binding describes the Non-Volatile Memory (NVMEM) hardware + that stores Power State Change Reasons (PSCR). + +allOf: + - $ref: pse-controller.yaml# + +properties: + compatible: + const: pscr-nvmem + + nvmem-cells: + description: | + A phandle pointing to the nvmem-cells node where the power state change + reasons are stored. + maxItems: 1 + + nvmem-cell-names: + items: + - const: pscr + + pscr-unknown: + pscr-under-voltage: + pscr-over-current: + pscr-over-temperature: + +required: + - compatible + - nvmem-cells + - nvmem-cell-names + +additionalProperties: false + +examples: + - | + power-state-change-reason { + compatible = "pscr-nvmem"; + nvmem-cells = <&pscr_cell>; + nvmem-cell-names = "pscr"; + pscr-unknown = <1>; + pscr-under-voltage = <2>; + pscr-over-temperature = <3>; + }; +... From patchwork Fri Jan 19 13:25:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 189560 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp1004715dyb; Fri, 19 Jan 2024 05:27:55 -0800 (PST) X-Google-Smtp-Source: AGHT+IFgKeXkEc4EXSyQGjeKjNan7u/xfSEAYJFoEgkpl0wTRXEfzfDR5ssQfxbmKwA5idqxorlL X-Received: by 2002:a17:902:e54e:b0:1d7:2506:3ec0 with SMTP id n14-20020a170902e54e00b001d725063ec0mr535840plf.82.1705670875633; Fri, 19 Jan 2024 05:27:55 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705670875; cv=pass; d=google.com; s=arc-20160816; b=wbiRYntMMLKhJvLr5b5SvYed2xxru9X3aJ8Flu7fXELroHoCjsr92DCtSOC2cupSDA DwLX57E0R+S/vL7h7yRVlkSnO2fuitNxjWBJZyOuTGwq/6RfKg1dX1voeJqeLmvIE/pa wbpkn273r0hU4b645QcoqI3I7rqkYEIVVceFjXJOfNtSaxdRJlEyRP/1hyo0PdTTYTJj x03R7qchezAyLZ/+I6E9GgnvuKR+T5CPUwHJYIOUuwTg21OD01x4zttbyN822jDx3wWJ Rg1xlln3mcmBhuLLQ/pHzwMwATDzEHAlrYtBzQYDguh1osydZfFYgF87cw4uXK9IdWsi GqlQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=aQOHL9INizumnSzRcpfP7Bm6wQgyvN+k/JMwluUWIvM=; fh=cTOyeHIiotxFveWD397Up69SLR8Dqpy9YboYIfW0A00=; b=Gt1Lbm/xgpMZnVh8UOh2wciXzInPsL3840ww+GNLhokyAbNPo4a1yrU/Rk21JiATi6 B+ZhDT/o+g3O767/9nYTjJ9IQLDsvx6KMPENPWdWsFawbA0bMZWaaDjYp5udEZXZxR3e 374BgA4wpvXK4yVX4SgbY1iw/IXmMI8ED2WRGFwp+bkn3PPiwz0LTACd2qhzR+uDxlg0 fvX4gFk35l5+7s/jpjUc/adXG7KlOUTxJHlGhgf7+r6ULwZ4limsRDXryAjlcJIcO/im OBIBh15rfIvO+YMcNNn6ukffDAkxranCxzg/EFetBBqtZ2Br/iE/6L/Psr46wV3TyN5i t79w== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31195-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31195-ouuuleilei=gmail.com@vger.kernel.org" Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id b22-20020a170902d89600b001d717e644ecsi1865513plz.419.2024.01.19.05.27.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jan 2024 05:27:55 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-31195-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31195-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31195-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id C099F28626B for ; Fri, 19 Jan 2024 13:27:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E55F554BF7; Fri, 19 Jan 2024 13:25:43 +0000 (UTC) Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (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 A9A0C52F9E for ; Fri, 19 Jan 2024 13:25:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670742; cv=none; b=rlnNtT0chRH8QQ8sNTiOZ1CCNqaivX+eaBs556MnAJqPCRW3WV4Z4Xs0970pRBFGYvlFF5YokKXB85hd55eA120yAWxLw/BpEzr79pWKc0BeQCLFZqv1QfktiWyHQKbAiq7VYOPZ/ZunJWyf9HI5klov1h/6FM717MkYaQL0glM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670742; c=relaxed/simple; bh=XRisp6Vk9LcyDYqrO7hm1pl+pjDkrGL7bL4CcMKtXaY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=VdHJ/gfaY0sMMtMEmNEPY+9u8MBOIR3DhpRWxDdvG2DrWgpe5X8bIdTWi4Nt32Kexh8V815kQwjt1flHFDcNGMKtBi+Jm9+C1KM5Rz5H46L6Rugqkxh9vkYQR6KlCB81SEgp+DdarSPXtphQ0pxj90UcXae7K4KML3DHVaWIydY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rQos7-00074I-C2; Fri, 19 Jan 2024 14:25:23 +0100 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rQos6-000viM-7a; Fri, 19 Jan 2024 14:25:22 +0100 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1rQos6-00F98B-0X; Fri, 19 Jan 2024 14:25:22 +0100 From: Oleksij Rempel To: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, =?utf-8?q?S=C3=B8ren_Andersen?= Subject: [RFC PATCH v1 4/7] nvmem: provide consumer access to cell size metrics Date: Fri, 19 Jan 2024 14:25:18 +0100 Message-Id: <20240119132521.3609945-5-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240119132521.3609945-1-o.rempel@pengutronix.de> References: <20240119132521.3609945-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788525543660526981 X-GMAIL-MSGID: 1788525543660526981 Add nvmem_cell_get_size() function to provide access to cell size metrics. In some cases we may get cell size less as consumer would expect it. So, nvmem_cell_write() would fail with incorrect buffer size. Signed-off-by: Oleksij Rempel --- drivers/nvmem/core.c | 25 +++++++++++++++++++++++++ include/linux/nvmem-consumer.h | 7 +++++++ 2 files changed, 32 insertions(+) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index bf42b7e826db..6c5b785b804b 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -1753,6 +1753,31 @@ int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len) EXPORT_SYMBOL_GPL(nvmem_cell_write); +/** + * nvmem_cell_get_size() - Get the size of a given nvmem cell + * @cell: nvmem cell to be queried. + * @bytes: Pointer to store the size of the cell in bytes. Can be NULL. + * @bits: Pointer to store the size of the cell in bits. Can be NULL. + * + * Return: 0 on success or negative on failure. + */ +int nvmem_cell_get_size(struct nvmem_cell *cell, size_t *bytes, size_t *bits) +{ + struct nvmem_cell_entry *entry = cell->entry; + + if (!entry->nvmem) + return -EINVAL; + + if (bytes) + *bytes = entry->bytes; + + if (bits) + *bits = 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 6ec4b9743e25..a174b05514b4 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 *bits); 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); @@ -127,6 +128,12 @@ static inline int nvmem_cell_write(struct nvmem_cell *cell, return -EOPNOTSUPP; } +static inline int nvmem_cell_get_size(struct nvmem_cell *cell, size_t *bytes, + size_t *bits) +{ + return -EOPNOTSUPP; +} + static inline int nvmem_cell_read_u8(struct device *dev, const char *cell_id, u8 *val) { From patchwork Fri Jan 19 13:25:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 189556 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp1003871dyb; Fri, 19 Jan 2024 05:26:21 -0800 (PST) X-Google-Smtp-Source: AGHT+IE2yM8Vv61n4tG5daKkLaWgy9PDISenUSovWOdwSyXeMSpQpP5WvRBq3m2Zhv6iufmzg8f/ X-Received: by 2002:a05:6808:ec6:b0:3bd:97a8:4a02 with SMTP id q6-20020a0568080ec600b003bd97a84a02mr2252286oiv.50.1705670780959; Fri, 19 Jan 2024 05:26:20 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705670780; cv=pass; d=google.com; s=arc-20160816; b=YYvMs5rF7clf/GbAEjBEq2/4oowirvL9gc8pGcDd6EtJY1KlnxuXKnVq7+nXTL07u9 m0SK3yueYgmXX24m0Ax6inMGJYx+V5ufI1+9tlHs6dJQINGN7ZNrXN5QsYJT5nV9EhlA iOg5t6b5TgRfbt0H8cD+1cQzsn9TPzYCSD6Mm1kQR+WQxd4VKA/jcPag2XsoEevGRXYW 0DCQ1G5GU/uNh47AjDcj3a6Hf0vK0lSM8g3ifda2q942w8icncaqefNQu0NqQ6HqPRWz XIyM9+irX6Z/aBJDHVnKKNj2SWGO8zbwCtGzqdR4WEpS6jFm7sOtvrQElQWYQO6CSe9r 75dA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=Se6GNDzi9J59AEm9KMeMWkbnVSZLSILRXwv5xYwDc84=; fh=cTOyeHIiotxFveWD397Up69SLR8Dqpy9YboYIfW0A00=; b=IXqr4zDrMpo5lqpVHs+uISfYfH2TsX+3hgUHiZuUDAgbRCL+J3d0l6gvH2bb+JRmmw 3xki8VKuA39z87hjFk1mGDo0UWz2jhqXIqMUcMw4psJbsxwWtGXuIQca9aIIeTlil9vt Qm+FGcuVVfbO4dbOGsGDFuBNlmE9Qp+9hUul2crUXln1bglULsh+yozD2qWIHGMFkKNk WhL+TVRfj9Y5EFtXXcjbeUzwdyNUKDofLftB7E0vkTiSix9OLPeTKsqpoUOE+wmeor03 thYtGHTgr1l3R8RiBjTAE/BBWFHFWLCh94EUmPZvDfV3vf/zJhbErhbWqQ+RfFmHTHxX 2Clw== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31190-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31190-ouuuleilei=gmail.com@vger.kernel.org" Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id d8-20020a05622a15c800b00429e709ac37si10770308qty.478.2024.01.19.05.26.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jan 2024 05:26:20 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-31190-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31190-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31190-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id ACFD21C2324B for ; Fri, 19 Jan 2024 13:26:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CCFD353E1E; Fri, 19 Jan 2024 13:25:41 +0000 (UTC) Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (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 664831E48F for ; Fri, 19 Jan 2024 13:25:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670739; cv=none; b=YwBARdLhWucBHpeYZvSISkmvtLEUCIZpVLj/sFczdsWNlCtVIiIsgRbYlJclb2/uTINhQt0ryn4rGMDhe5FUWfE7UpiRHCpu5f0p5hBR4P9sZxCULZTjil1z3lalSL7PYkh61qPhHR3RmE7mutnM3gHKRVUQ1Rco7xQ3odfu/f4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670739; c=relaxed/simple; bh=C3KOqcCPboHE8CVljWUDfdheWimD/KSO18sHrtBids4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=gzZkw+WXm4Bnb4+pPKmELXXZy1ud0MPAaXlgv7jvjsPXDc16MIvXhaAkqoHrhw/z37C4q0/aHZzPz+pYstTZ6M/dhmYWoQScd64VL79bsV1P4kUt8jzOJQ2tflEc1xmgx8i835Vkv4Oa/dB+k3sinm82NUS15UhaFiLL6NECExs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rQos7-00074J-C2; Fri, 19 Jan 2024 14:25:23 +0100 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rQos6-000viN-8m; Fri, 19 Jan 2024 14:25:22 +0100 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1rQos6-00F98M-0b; Fri, 19 Jan 2024 14:25:22 +0100 From: Oleksij Rempel To: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, =?utf-8?q?S=C3=B8ren_Andersen?= Subject: [RFC PATCH v1 5/7] power: reset: add PSCR NVMEM Driver for Storing Power State Change Reasons Date: Fri, 19 Jan 2024 14:25:19 +0100 Message-Id: <20240119132521.3609945-6-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240119132521.3609945-1-o.rempel@pengutronix.de> References: <20240119132521.3609945-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788525445152552697 X-GMAIL-MSGID: 1788525445152552697 This driver utilizes the Power State Change Reasons (PSCR) framework to store specific power state change information, such as shutdown or reboot reasons, into a designated non-volatile memory (NVMEM) cell. Signed-off-by: Oleksij Rempel --- drivers/power/reset/Kconfig | 11 ++++ drivers/power/reset/Makefile | 1 + drivers/power/reset/pscr-nvmem.c | 100 +++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 drivers/power/reset/pscr-nvmem.c diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig index da76e84302b9..a110dff599af 100644 --- a/drivers/power/reset/Kconfig +++ b/drivers/power/reset/Kconfig @@ -324,3 +324,14 @@ menuconfig PSCR timeouts. If unsure, say N. + +if PSCR + +config PSCR_NVMEM + tristate "Generic NVMEM-based Power State Change Reason Tracking" + depends on OF + help + Enabling this option adds support for storing power state change + reasons in a NVMEM cell. + +endif diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile index d9d744302c68..e7985d81ac8a 100644 --- a/drivers/power/reset/Makefile +++ b/drivers/power/reset/Makefile @@ -32,6 +32,7 @@ obj-$(CONFIG_POWER_RESET_SYSCON) += syscon-reboot.o obj-$(CONFIG_POWER_RESET_SYSCON_POWEROFF) += syscon-poweroff.o obj-$(CONFIG_POWER_RESET_RMOBILE) += rmobile-reset.o obj-$(CONFIG_PSCR) += pscr.o +obj-$(CONFIG_PSCR_NVMEM) += pscr-nvmem.o obj-$(CONFIG_REBOOT_MODE) += reboot-mode.o obj-$(CONFIG_SYSCON_REBOOT_MODE) += syscon-reboot-mode.o obj-$(CONFIG_POWER_RESET_SC27XX) += sc27xx-poweroff.o diff --git a/drivers/power/reset/pscr-nvmem.c b/drivers/power/reset/pscr-nvmem.c new file mode 100644 index 000000000000..74048341b7d7 --- /dev/null +++ b/drivers/power/reset/pscr-nvmem.c @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) Vaisala Oyj. All rights reserved. +// Copyright (c) 2024 Pengutronix, Oleksij Rempel +/* + * Based on drivers/power/reset/nvmem-reboot-mode.c + * Copyright (c) Vaisala Oyj. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include +#include + +struct pscr_nvmem { + struct pscr_driver pscr_drv; + struct nvmem_cell *cell; + size_t max_magic_bytes; +}; + +static int pscr_nvmem_write(struct pscr_driver *pscr_drv, u32 magic) +{ + struct pscr_nvmem *priv = container_of(pscr_drv, struct pscr_nvmem, + pscr_drv); + size_t size = min(priv->max_magic_bytes, sizeof(magic)); + int ret; + + ret = nvmem_cell_write(priv->cell, &magic, size); + if (ret < 0) + dev_err(pscr_drv->dev, "update reason bits failed: %pe\n", + ERR_PTR(ret)); + + return ret; +} + +static int pscr_nvmem_probe(struct platform_device *pdev) +{ + const char *pscr = "pscr"; + struct pscr_nvmem *priv; + size_t bytes, bits, magic_bits; + int ret; + + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->pscr_drv.dev = &pdev->dev; + priv->pscr_drv.write = pscr_nvmem_write; + + priv->cell = devm_nvmem_cell_get(&pdev->dev, pscr); + if (IS_ERR(priv->cell)) + return dev_err_probe(&pdev->dev, PTR_ERR(priv->cell), + "failed to get the nvmem %s cell\n", pscr); + + ret = nvmem_cell_get_size(priv->cell, &bytes, &bits); + if (ret < 0) + return dev_err_probe(&pdev->dev, ret, "failed to get the nvmem %s size\n", + pscr); + + if (!bytes || bytes > sizeof(u32) || bits > 32) + return dev_err_probe(&pdev->dev, -EINVAL, "invalid nvmem %s size. bytes: %zu, bits: %zu\n", + pscr, bytes, bits); + + ret = devm_pscr_register(&pdev->dev, &priv->pscr_drv); + if (ret) + return dev_err_probe(&pdev->dev, ret, "failed to register pscr driver\n"); + + magic_bits = fls(priv->pscr_drv.max_magic); + priv->max_magic_bytes = DIV_ROUND_UP(magic_bits, 8); + + if (!bits) + bits = bytes * 8; + + if (magic_bits > bits) + return dev_err_probe(&pdev->dev, -EINVAL, "provided magic can't fit into nvmem %s. bytes: %zu, bits: %zu, magic_bits: %zu\n", + pscr, bytes, bits, magic_bits); + + return ret; +} + +static const struct of_device_id pscr_nvmem_of_match[] = { + { .compatible = "pscr-nvmem" }, + {} +}; +MODULE_DEVICE_TABLE(of, pscr_nvmem_of_match); + +static struct platform_driver pscr_nvmem_driver = { + .probe = pscr_nvmem_probe, + .driver = { + .name = "pscr-nvmem", + .of_match_table = pscr_nvmem_of_match, + }, +}; +module_platform_driver(pscr_nvmem_driver); + +MODULE_AUTHOR("Oleksij Rempel "); +MODULE_DESCRIPTION("NVMEM Driver for Power State Change Reason Tracking"); +MODULE_LICENSE("GPL v2"); From patchwork Fri Jan 19 13:25:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 189557 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp1004106dyb; Fri, 19 Jan 2024 05:26:52 -0800 (PST) X-Google-Smtp-Source: AGHT+IHVFoXSB+i2lgf/LbPLxOabgcuFkwcF5eb0w+0HDd7seNUflu3nbSsbHE5pHeEfzEZMcX7p X-Received: by 2002:ae9:f113:0:b0:783:25d4:621b with SMTP id k19-20020ae9f113000000b0078325d4621bmr1366326qkg.80.1705670812102; Fri, 19 Jan 2024 05:26:52 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705670812; cv=pass; d=google.com; s=arc-20160816; b=GVOzsjqgXKw59+uvZS/vuoI6ZozXnRgZMv3lIYwObDbC6s1Um95KgsSKM6X7tOK+YY 2koEh9EaYajPRokQ8OlezhaJl43ZI/VFZCaK4H+mQV3eQk1Q1FsphDeGK2XrS9KQWd5x 2bsFC9A9/i7jOPDXKY+b+L+6AT/KwxJJAQiJ10d3h9V8V+KMvbDMALtBYX/xi8mqBpdp nqs+Ip6x/hiXz603/C7QhPFFocqTL9+4Ppyi/RddUReEvm6C3Ax9P8nmZJz8aN/Eg8Sj 8PrJtSy5hIxkRXt3mtqVxSFEUwQttQEQQTcDy4Lqloceoe9a/tzwaNPKQoos/C6QAtW1 ZdVA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=R7XvhcHcj6vnN0XlZh9mBoE3TiAKa9tno3p9URPfDDI=; fh=cTOyeHIiotxFveWD397Up69SLR8Dqpy9YboYIfW0A00=; b=SmLzPt126dZM+GQUr3eqEhlHEHssUhv48MZVpj5j9XOTDOi6kfm2qyvJPMaWunm1eS +xI5E05Yd0ndaAmLQbtvITcg4QRDrDlAOjn/F8BoVjzcs4uzbDZ3YI5PKnB7zUbeZx6c 9pL/fJDmfJKKA08QGZvYkPwiOYrByJTT1he6B46dQDp/iAHcUIGcQefnwteLybC6MZGf GPFeqOdwwi4HlR0pu0AwB6Z+Ojxd9T5UZcegqAFI0gNuHpfZ9knxjDi/ypyvF+7+Hm9e iS7vjD1ceb9w/5CwuXv8H5nramnmA+VHWSgLAaPdfseGYVVJeQQjjVniykCBigdOv8w1 8KtQ== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31193-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31193-ouuuleilei=gmail.com@vger.kernel.org" Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id v13-20020a05620a090d00b0077f4e80e131si16051300qkv.692.2024.01.19.05.26.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jan 2024 05:26:52 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-31193-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31193-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31193-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id D3B2F1C2355F for ; Fri, 19 Jan 2024 13:26:51 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F422B54729; Fri, 19 Jan 2024 13:25:42 +0000 (UTC) Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (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 E1D8B524DE for ; Fri, 19 Jan 2024 13:25:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670741; cv=none; b=V2WqxXMHbB54YHRfXStmxUgOGl4Ph+SMkfKn1mPPma/dJs8P6n1X93KL72Pw8TdorNsjX1PfKNnkCyOt+5Bzkqj0jY92DHTdiEjdPFl6Dh2RSEEnwNrS/1kLqaIS8Voy9P6sw7K1CazuHKmmaAHkAUBt5xLc2k3CiV3G3ljuXK4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670741; c=relaxed/simple; bh=jDr0KT8gV5WT+Ey/AytkyFJuAM5xTX5pg/4GXSSHhOk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kCiLlGP0N7TgJkl3r0aTLOCdL8vUkd/fjqa7/6wVYEW7a6tLJP4yn9D7LLpOxPMeUWAVyGDIQu3c6DZdKsBXmmgYz09iFKfKLQS8XpIEP+pYGnZwg+q2ixB1WhnJVMBJq7ukUyk7viGAF5cqI05g28YuLHdokKNxcp43+rsXlCE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rQos7-00074K-C1; Fri, 19 Jan 2024 14:25:23 +0100 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rQos6-000viQ-A0; Fri, 19 Jan 2024 14:25:22 +0100 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1rQos6-00F98X-0f; Fri, 19 Jan 2024 14:25:22 +0100 From: Oleksij Rempel To: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, =?utf-8?q?S=C3=B8ren_Andersen?= Subject: [RFC PATCH v1 6/7] regulator: set Power State Change Reason before hw_protection_shutdown() Date: Fri, 19 Jan 2024 14:25:20 +0100 Message-Id: <20240119132521.3609945-7-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240119132521.3609945-1-o.rempel@pengutronix.de> References: <20240119132521.3609945-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788525477389047262 X-GMAIL-MSGID: 1788525477389047262 Store the state change reason to some black box, for later investigation. Signed-off-by: Oleksij Rempel Reviewed-by: Mark Brown --- drivers/regulator/core.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index a6cb84af989e..d8a45c89f14a 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -5074,6 +5075,7 @@ EXPORT_SYMBOL_GPL(regulator_bulk_free); static void regulator_handle_critical(struct regulator_dev *rdev, unsigned long event) { + enum power_state_change_reason pscr; const char *reason = NULL; if (!rdev->constraints->system_critical) @@ -5082,17 +5084,21 @@ static void regulator_handle_critical(struct regulator_dev *rdev, switch (event) { case REGULATOR_EVENT_UNDER_VOLTAGE: reason = "System critical regulator: voltage drop detected"; + pscr = PSCR_UNDER_VOLTAGE; break; case REGULATOR_EVENT_OVER_CURRENT: reason = "System critical regulator: over-current detected"; + pscr = PSCR_OVER_CURRENT; break; case REGULATOR_EVENT_FAIL: reason = "System critical regulator: unknown error"; + pscr = PSCR_REGULATOR_FAILURE; } if (!reason) return; + set_power_state_change_reason(pscr); hw_protection_shutdown(reason, rdev->constraints->uv_less_critical_window_ms); } From patchwork Fri Jan 19 13:25:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 189558 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2bc4:b0:101:a8e8:374 with SMTP id hx4csp1004307dyb; Fri, 19 Jan 2024 05:27:12 -0800 (PST) X-Google-Smtp-Source: AGHT+IHH3+gM1T6B5AlAKiUs9Djt3ZNoHnJ1bGgoBGPzfYe1DCvPU89vBs+Tx3/uJ6rOLi/tNMeB X-Received: by 2002:a05:6870:218c:b0:210:87c2:79d1 with SMTP id l12-20020a056870218c00b0021087c279d1mr2897956oae.57.1705670832296; Fri, 19 Jan 2024 05:27:12 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705670832; cv=pass; d=google.com; s=arc-20160816; b=EYy9sZj8dvJ/PSyotxcaullh/LYpvvqqcj0FVhKyYM15Bzh+IbWodfsvY5/r9eTgIx EzvgxDuH4sQIaYZ+gAIhP0baVumAbtgzMg4jSa76cp/Ekm/te7kZ2WLTgl+F2kOC1DN5 2TDoTxjk+es+BsuPHAR5j6bbkvt3Ri/qKOQaO7Mf3NFBj7A1KGR7kNlq54QZ1CFACe9Y Bi/7/jfjOg7S1XYba+4XgYBFwKyT2+RkujeonEMepTyiD+65g5trhyfYHfJMgU9A31vK V2jMCjEPMBPA6Z8zu6U1JqnOQxeKMiBJ7o4vqDJEyJvRgHOPd+QUqqxFkzoL128jVRHV PaNA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=eHMosafIrihmBRfxcNW5hmD38fZFyPZI9Z5O/m10eEg=; fh=cTOyeHIiotxFveWD397Up69SLR8Dqpy9YboYIfW0A00=; b=o2S83ALHQ57yLf/szfZ0WZpcpCfHArMdUpBOauB6sT7vtBq1zkefJtSk8ylbJ3sBZH qi++fxQu1Bswe4Vfg2ZypwQfA/D8pqJkf1Z4AHLIPOMe6/icT18aQhIQ2SeguM1tuSac DyGXZrtChodYAW0G19j4EMJzRwsuCwkrIx1CsdpUqIbA5fhtxd+UDA+EUVgKy0fwiRpg jqVaPyDAyI0Pfbf98l5IflAhHSBURL2AZhZ4nbG4h94bWrF3drp42B71UWt2vRs/4S9S kCTkI7wuS6j7mHf4LxrD3bvy8AnTNZAdQLo3BJdRSHoBfx7A+gn+KnmWIAzdnYcQutUR GcKw== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31192-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31192-ouuuleilei=gmail.com@vger.kernel.org" Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id y16-20020a63e250000000b005c279da45f1si3445609pgj.566.2024.01.19.05.27.12 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jan 2024 05:27:12 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-31192-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=pengutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-31192-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-31192-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 268E5285AD1 for ; Fri, 19 Jan 2024 13:26:31 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4309653E3F; Fri, 19 Jan 2024 13:25:42 +0000 (UTC) Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (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 4AAC2524D6 for ; Fri, 19 Jan 2024 13:25:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670740; cv=none; b=IsuAVW3mClxcFJqP+yqSqHEEq1dCibsQcegJIOUSQNeqyLBjLcG8OYOVVc++HwSqpBxjNs8tmn/ySCbHYmY3DoFZ9HsS+au0dTPytTT+FIffZ8/QUYRluJASJ12cRSgBcioUzyc5NTCcGFD5DK/fnxbPA4XL2h4JhFL5IvPCFOA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705670740; c=relaxed/simple; bh=FG8+XP94f/Ig6ekDFdWhMR1QY436ISnaJd2Qe3LwG1s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DA5v9cl8Ha8ykqX1+A3hKT5tcfFZkAed+x3iVS5srL6za01dVBVzhE4q7vi+T0ZFHMD/1R9kg83Ro/8mwWkn6YMcXXdctHiro/SpuDmDxP7FVoNiMQ14GK9SJgumWzkwej7IEz6W/M/iHKq+dKJKmj/5BTNvy+vchxy80H8ebqg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rQos7-00074L-C1; Fri, 19 Jan 2024 14:25:23 +0100 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rQos6-000viS-AL; Fri, 19 Jan 2024 14:25:22 +0100 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1rQos6-00F98h-0j; Fri, 19 Jan 2024 14:25:22 +0100 From: Oleksij Rempel To: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, Liam Girdwood , Mark Brown , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, =?utf-8?q?S=C3=B8ren_Andersen?= Subject: [RFC PATCH v1 7/7] thermal: core: set Power State Change Reason before hw_protection_shutdown() Date: Fri, 19 Jan 2024 14:25:21 +0100 Message-Id: <20240119132521.3609945-8-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240119132521.3609945-1-o.rempel@pengutronix.de> References: <20240119132521.3609945-1-o.rempel@pengutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788525498726055306 X-GMAIL-MSGID: 1788525498726055306 Store the state change reason to some black box for later investigation. Signed-off-by: Oleksij Rempel --- drivers/thermal/thermal_core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 9c17d35ccbbd..5ee3a59d7a0e 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -325,6 +326,7 @@ void thermal_zone_device_critical(struct thermal_zone_device *tz) dev_emerg(&tz->device, "%s: critical temperature reached, " "shutting down\n", tz->type); + set_power_state_change_reason(PSCR_OVERTEMPERATURE); hw_protection_shutdown("Temperature too high", poweroff_delay_ms); } EXPORT_SYMBOL(thermal_zone_device_critical);