From nobody Tue Apr 7 06:15:13 2026 Received: from mta-64-225.siemens.flowmailer.net (mta-64-225.siemens.flowmailer.net [185.136.64.225]) (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 7E3EA34B1A1 for ; Mon, 16 Mar 2026 07:05:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.136.64.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773644755; cv=none; b=MFdK+bHKrKZ1lwRbKTrMLdwjU/9GMf4ar/Sj/YtW0TVNbwsFt+vjfdRoU7mHjbLtDhtCwraJRfWplK8nVG9U3G1r7pOy6iRc/sLYuEoRkML6R4lSjCXs+PSbW3wlN/N6vZFOEOC2iLM86hfl2lfOUrha9G+EX0ASxgsJSXRakAg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773644755; c=relaxed/simple; bh=AKyxp5Owb55QcnIoyeAfKcR7uO+dojDomwowHlnfO3M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lhWHqcaDQ3Jct4BKSMxYY4aE9tmvLIIGyXyva60GtrEgzbb4DDFHPlh11h1Clli8VWuSUqpFw2SInpIt8j1IkOdia1bLA2grtyCbUC8ait7gM9GtNVowucHxbAsIBgdpPq4n0d2zV3f24aI9rQhzbMLUYOughZ+Ujp/7N/eXVdE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com; dkim=pass (2048-bit key) header.d=siemens.com header.i=alexander.sverdlin@siemens.com header.b=TbFNW1Dx; arc=none smtp.client-ip=185.136.64.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siemens.com header.i=alexander.sverdlin@siemens.com header.b="TbFNW1Dx" Received: by mta-64-225.siemens.flowmailer.net with ESMTPSA id 2026031607054233adf975ef0002072b for ; Mon, 16 Mar 2026 08:05:42 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=alexander.sverdlin@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=6vGAJVpZ1jpQDkOyacjMdeipgp709TifBFgj8Np5dLw=; b=TbFNW1DxAFl2RX3wTAh1skXmbZ9eD1YCqF8vA6rhSICghukMCpENByqULSz0EPckxAM8CX P627luJfeH6MYOjyABVydvAwq9JTjcUC7uOW+3RhRmmaZils4MxzSkLAzLYkmBBFMSJ9wEQf GtUlvX/E8CzRUknJasdu8Wyxky8CwZXswp5+THloQpnFagYUvAlHLdMqimhF9QTFzglvL3LS LvWFZ93YFzBPR2aseLPpNQefO93lsfXUEuLKj8lze4y6rqde244sgLdrAockXbRdIVL8Cxgd e2reS17M/ygqIt5mmbb9rdxdw2jsmWbLeHRZZRmGGupiIEdPiOp471Ow==; From: "A. Sverdlin" To: linux-arm-kernel@lists.infradead.org Cc: Alexander Sverdlin , Philipp Zabel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Nishanth Menon , Vignesh Raghavendra , Tero Kristo , Santosh Shilimkar , Andrew Davis , Jayesh Choudhary , Siddharth Vadapalli , Abraham I , Roger Quadros , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] soc: ti: k3-socinfo: Provide reset reason information Date: Mon, 16 Mar 2026 08:04:25 +0100 Message-ID: <20260316070429.1545707-4-alexander.sverdlin@siemens.com> In-Reply-To: <20260316070429.1545707-1-alexander.sverdlin@siemens.com> References: <20260316070429.1545707-1-alexander.sverdlin@siemens.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-456497:519-21489:flowmailer Content-Type: text/plain; charset="utf-8" From: Alexander Sverdlin Add reset_reason attribute decoging the RST_SRC register present in AM64x and later SoCs of K3 family. Textual representation of the bits was taken from the AM62x Processors Technical Reference Manual, except the POR, which is not signalled explicitly by the reset module. Signed-off-by: Alexander Sverdlin --- Changelog: v2: no changes drivers/soc/ti/k3-socinfo.c | 88 +++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/drivers/soc/ti/k3-socinfo.c b/drivers/soc/ti/k3-socinfo.c index 676041879eca3..3736c982fd0c8 100644 --- a/drivers/soc/ti/k3-socinfo.c +++ b/drivers/soc/ti/k3-socinfo.c @@ -45,6 +45,8 @@ #define JTAG_ID_PARTNO_J722S 0xBBA0 #define JTAG_ID_PARTNO_AM62LX 0xBBA7 =20 +#define CTRL_MMR_RST_SRC 8 + static const struct k3_soc_id { unsigned int id; const char *family_name; @@ -123,6 +125,90 @@ static const struct regmap_config k3_chipinfo_regmap_c= fg =3D { .reg_stride =3D 4, }; =20 +static u32 k3_reset_source; +static const char *const k3_reset_sources[] =3D { + [0] =3D "Reset Caused by MCU Reset Pin", + [1] =3D "Power On Reset", /* Reserved in HW */ + [2] =3D "Main Reset Pin", + [4] =3D "Thermal Reset", + [8] =3D "Debug Subsystem Initiated Reset", + [12] =3D "SMS Cold Reset", + [13] =3D "SMS Warm Reset", + [16] =3D "Software Warm Reset", + [20] =3D "Software Main Warm Reset From MCU CTRL MMR", + [21] =3D "Software Main Warm Reset from MAIN CTRL MMR", + [22] =3D "Watchdog Initiated Reset", + [24] =3D "Software Main Power On Reset From MCU CTRL MMR", + [25] =3D "Software Main Power On Reset From MAIN CTRL MMR", + [30] =3D "Reset Caused by Main ESM Error", + [31] =3D "Reset Caused by MCU ESM Error", +}; + +static ssize_t reset_reason_show(struct device *dev, struct device_attribu= te *attr, char *buf) +{ + int ret, i; + int total =3D 0; + + for (i =3D ARRAY_SIZE(k3_reset_sources); i >=3D 0; i--) { + if (!k3_reset_sources[i] || !(k3_reset_source & BIT(i))) + continue; + + ret =3D sprintf(buf + total, "%s\n", k3_reset_sources[i]); + if (ret < 0) + return ret; + total +=3D ret; + /* Note that several reset sources may be active simultaneously */ + } + + return total; +} + +static DEVICE_ATTR_RO(reset_reason); + +static struct attribute *k3_soc_attrs[] =3D { + &dev_attr_reset_reason.attr, + NULL +}; + +ATTRIBUTE_GROUPS(k3_soc); + +static const struct of_device_id k3_rst_id_table[] =3D { + { + .compatible =3D "ti,am64-rst", + }, + {} +}; + +static void k3_reset_reason_read(struct soc_device_attribute *soc_dev_attr) +{ + struct device_node *node =3D of_find_matching_node(NULL, k3_rst_id_table); + struct regmap *regmap; + + /* AM65x/J721E do not have similar registers */ + if (!node) + return; + + regmap =3D device_node_to_regmap(node); + of_node_put(node); + if (IS_ERR(regmap)) { + pr_err("Cannot obtain %s regmap\n", k3_rst_id_table[0].compatible); + return; + } + + regmap_read(regmap, CTRL_MMR_RST_SRC, &k3_reset_source); + /* + * The register is only being cleared on POR, so we have to clear reset + * source of the current boot manually + */ + regmap_write(regmap, CTRL_MMR_RST_SRC, k3_reset_source); + + /* Simplify the code a bit and use HW-reserved bit for POR indication */ + if (!k3_reset_source) + k3_reset_source |=3D BIT(1); + + soc_dev_attr->custom_attr_group =3D k3_soc_groups[0]; +} + static int k3_chipinfo_probe(struct platform_device *pdev) { struct device_node *node =3D pdev->dev.of_node; @@ -183,6 +269,8 @@ static int k3_chipinfo_probe(struct platform_device *pd= ev) of_property_read_string(node, "model", &soc_dev_attr->machine); of_node_put(node); =20 + k3_reset_reason_read(soc_dev_attr); + soc_dev =3D soc_device_register(soc_dev_attr); if (IS_ERR(soc_dev)) { ret =3D PTR_ERR(soc_dev); --=20 2.52.0