From nobody Mon Apr 6 23:12:35 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9F1FBECAAD1 for ; Thu, 1 Sep 2022 10:54:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234227AbiIAKyw (ORCPT ); Thu, 1 Sep 2022 06:54:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51174 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233399AbiIAKyi (ORCPT ); Thu, 1 Sep 2022 06:54:38 -0400 Received: from mail-pf1-x431.google.com (mail-pf1-x431.google.com [IPv6:2607:f8b0:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 579521321E6 for ; Thu, 1 Sep 2022 03:54:34 -0700 (PDT) Received: by mail-pf1-x431.google.com with SMTP id 76so17124195pfy.3 for ; Thu, 01 Sep 2022 03:54:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=JUQCoAsOqHp/dubozy2ybfyMmZNRsIHeStZD6k/cN8k=; b=pEHoyzdBfl05pa53IbQHgeW5T2Pk8XlmAmTFxk2pg4HL/nrmtoC975q8j2ZDRANdNv Co4fEWnThatHt8+F6pTwPDv4/sLtMi2cDLupK0G6zsFZd9Z2SPyy8ZAhJEwwU8Hl9ZYh msAX2J4/xLFzGPNKgh2znuo8frcPgb8APsDbgcF3G347i2VqUN/GZccYTTb9GDnawbhq 77WMY/iP53dNcAo6iSvT8BVwsox8r2g/4P70wJrbQRCQG6DrzyYew63m1jl/GIGoNkWy RhFpHtLewIltZoSklyakFdiBYNwYUa2jlrHAfy0GKdiaIFB//dMH9xfkE2814WdTL06F RFyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=JUQCoAsOqHp/dubozy2ybfyMmZNRsIHeStZD6k/cN8k=; b=Z3VzF8nn6ZZf38ZkkSGw/lYDINRh+3wL4XnlHVPCFvl+Hc+F6r6NosFC+4cbsNFBeU MzW4jbuAP67VgFEpQLO1HmEAYPcFvyDU7hiA5Bp5trMdDH4/MotUwS9Z7UfHZhytcDLC g2jsDTYtCz3dOmsSdU23ny3pqFhSc/ei2u9zkeQHGG8c75+a9Soh3HPW+EylfhruS7Rx 4gjoy6xVDCa7mhmAn4xoOkYX1BhN/F61cA9u0AoOCa0zuLDHnk4t67n6hdGXLXL/iGMs LbgTeEORcTtBXpjqhOgc2+sZQ8Nfik5+3RTgPzIVTc7KVSMUduwYcAMmB8PKei4GAleR H1tw== X-Gm-Message-State: ACgBeo12FFi8iqoyywYkIEZ47UY6SkHseuZbd2GnO3T1itK1Muwuv5tK C3oxLBI0/4lnwIeGzeuEK58wvtSvBLNX3w== X-Google-Smtp-Source: AA6agR42SHfyY0313yjJ+yTynSdioV4ONB04qGKCcLNFL7OWBmLXKp2Mj65GLrNmOCcD22FWobLf/Q== X-Received: by 2002:a62:1ac5:0:b0:538:3332:d531 with SMTP id a188-20020a621ac5000000b005383332d531mr19601658pfa.46.1662029673282; Thu, 01 Sep 2022 03:54:33 -0700 (PDT) Received: from localhost.localdomain ([2401:4900:1c60:5362:8069:f46:34af:eb19]) by smtp.gmail.com with ESMTPSA id ij13-20020a170902ab4d00b0016c57657977sm13508910plb.41.2022.09.01.03.54.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Sep 2022 03:54:33 -0700 (PDT) From: Bhupesh Sharma To: linux-pm@vger.kernel.org Cc: bhupesh.sharma@linaro.org, bhupesh.linux@gmail.com, linux-kernel@vger.kernel.org, andersson@kernel.org, konrad.dybcio@somainline.org, linux-arm-msm@vger.kernel.org, daniel.lezcano@linaro.org, robh+dt@kernel.org, rafael@kernel.org, Amit Kucheria , Thara Gopinath Subject: [PATCH v4 1/4] firmware: qcom: scm: Add support for tsens reinit workaround Date: Thu, 1 Sep 2022 16:24:11 +0530 Message-Id: <20220901105414.1171813-2-bhupesh.sharma@linaro.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220901105414.1171813-1-bhupesh.sharma@linaro.org> References: <20220901105414.1171813-1-bhupesh.sharma@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Some versions of Qualcomm tsens controller might enter a 'bad state' while running stability tests causing sensor temperatures/interrupts status to be in an 'invalid' state. It is recommended to re-initialize the tsens controller via trustzone (secure registers) using scm call(s) when that happens. Add support for the same in the qcom_scm driver. Cc: Amit Kucheria Cc: Thara Gopinath Cc: linux-pm@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org Reviewed-by: Bjorn Andersson Signed-off-by: Bhupesh Sharma --- drivers/firmware/qcom_scm.c | 15 +++++++++++++++ drivers/firmware/qcom_scm.h | 4 ++++ include/linux/qcom_scm.h | 2 ++ 3 files changed, 21 insertions(+) diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index cdbfe54c8146..93adcc046a62 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -858,6 +858,21 @@ int qcom_scm_mem_protect_video_var(u32 cp_start, u32 c= p_size, } EXPORT_SYMBOL(qcom_scm_mem_protect_video_var); =20 +int qcom_scm_tsens_reinit(void) +{ + int ret; + const struct qcom_scm_desc desc =3D { + .svc =3D QCOM_SCM_SVC_TSENS, + .cmd =3D QCOM_SCM_TSENS_INIT_ID, + }; + struct qcom_scm_res res; + + ret =3D qcom_scm_call(__scm->dev, &desc, &res); + + return ret ? : res.result[0]; +} +EXPORT_SYMBOL(qcom_scm_tsens_reinit); + static int __qcom_scm_assign_mem(struct device *dev, phys_addr_t mem_regio= n, size_t mem_sz, phys_addr_t src, size_t src_sz, phys_addr_t dest, size_t dest_sz) diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 0d51eef2472f..5762f02dde7c 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -94,6 +94,10 @@ extern int scm_legacy_call(struct device *dev, const str= uct qcom_scm_desc *desc, #define QCOM_SCM_PIL_PAS_IS_SUPPORTED 0x07 #define QCOM_SCM_PIL_PAS_MSS_RESET 0x0a =20 +/* TSENS Services and Function IDs */ +#define QCOM_SCM_SVC_TSENS 0x1e +#define QCOM_SCM_TSENS_INIT_ID 0x5 + #define QCOM_SCM_SVC_IO 0x05 #define QCOM_SCM_IO_READ 0x01 #define QCOM_SCM_IO_WRITE 0x02 diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index f8335644a01a..5c37e1658cef 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -124,4 +124,6 @@ extern int qcom_scm_lmh_dcvsh(u32 payload_fn, u32 paylo= ad_reg, u32 payload_val, extern int qcom_scm_lmh_profile_change(u32 profile_id); extern bool qcom_scm_lmh_dcvsh_available(void); =20 +extern int qcom_scm_tsens_reinit(void); + #endif --=20 2.37.1 From nobody Mon Apr 6 23:12:35 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 816F2ECAAD1 for ; Thu, 1 Sep 2022 10:55:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233911AbiIAKzG (ORCPT ); Thu, 1 Sep 2022 06:55:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51316 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234201AbiIAKyp (ORCPT ); Thu, 1 Sep 2022 06:54:45 -0400 Received: from mail-pf1-x42a.google.com (mail-pf1-x42a.google.com [IPv6:2607:f8b0:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 96914132511 for ; Thu, 1 Sep 2022 03:54:38 -0700 (PDT) Received: by mail-pf1-x42a.google.com with SMTP id 72so17111845pfx.9 for ; Thu, 01 Sep 2022 03:54:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=/E3bLVpztjFs44eA5Xz7SMeGWJRyaaTq3Re2Dj7/T3M=; b=spXh+pJT5SqG5t6NTOSkq6QW5VYWjZoE8iJPYmc1RP/pmPGs6/qNdz3rukAwbyj7GG EfULhk5RoJaAZrdjybCxYfGJlIqaq9VuvINyTAPaXk3ybmZru570YQGIVMnrmtnlQF+i toclcMfr42m5YHGSC8iGfSEwVzOrMGFByIsRNdBy8bXkbSy1NpZgEMG6C4a9/HrXoUXK 2S41rL/ahfqJqfdkV7dXQhoFDUGaK4JP5MmoebYhZttM+Fj7KM66i4jrB40EhptXIpcF TzuJ6dA6BI0mXcQopbx46lDHGcQhRaxZoxZgdMn52b9G7TvcJ+dOuEgNmY7ljvsy9hur c61g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=/E3bLVpztjFs44eA5Xz7SMeGWJRyaaTq3Re2Dj7/T3M=; b=tjcZRzrHNb8gg0HF6lriC+5h/g4gxA6WqYOjJVB2tdTqo09sVU83Mr+gTzxHA6zF2J S1obcLWIQkECiP4BgEy0z5J8LaINYB1PfcmUENLeDO2TZIyVEHM7OsYjua5ZJkWyJfN0 DDQZM2ZpHW0j/ONajtOvm4ppmSC0pSVxxIFnoMoKFW0IqvwxiJ/7zZWhusnpNWPO5xTt X1ohXLC4d7d4bEYzc4/14xdMyLqBcNI0CpyTrvxH2t8T8fIIKj0GYGWQDr9lWurHDr4G 8FRaUPnoaD4Ti6IeieZAHlyIz8Lcnx7ssHKHmWS+OIpAX6pC4XaA0x6fGYmU1BdASMUb TScA== X-Gm-Message-State: ACgBeo25N8dRbp2p1dZaXtPCPkpINkYm9p+fSbFdsIz2ri/vCeBuNBC+ hJFfZAV4xhHDxc+Hc8+nFDWiiz4otUPjZw== X-Google-Smtp-Source: AA6agR550SywU0WxvQxOEqmZLAsYRGMp1aaY9hKI+xKj95WtXCrsyB/gNQQab7KaawgAFWjFNma7fQ== X-Received: by 2002:a05:6a00:c8e:b0:52e:af2:3d4b with SMTP id a14-20020a056a000c8e00b0052e0af23d4bmr30813724pfv.76.1662029677555; Thu, 01 Sep 2022 03:54:37 -0700 (PDT) Received: from localhost.localdomain ([2401:4900:1c60:5362:8069:f46:34af:eb19]) by smtp.gmail.com with ESMTPSA id ij13-20020a170902ab4d00b0016c57657977sm13508910plb.41.2022.09.01.03.54.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Sep 2022 03:54:37 -0700 (PDT) From: Bhupesh Sharma To: linux-pm@vger.kernel.org Cc: bhupesh.sharma@linaro.org, bhupesh.linux@gmail.com, linux-kernel@vger.kernel.org, andersson@kernel.org, konrad.dybcio@somainline.org, linux-arm-msm@vger.kernel.org, daniel.lezcano@linaro.org, robh+dt@kernel.org, rafael@kernel.org, Amit Kucheria , Thara Gopinath Subject: [PATCH v4 2/4] thermal: qcom: tsens: Add hooks for supplying platform specific reinit quirks Date: Thu, 1 Sep 2022 16:24:12 +0530 Message-Id: <20220901105414.1171813-3-bhupesh.sharma@linaro.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220901105414.1171813-1-bhupesh.sharma@linaro.org> References: <20220901105414.1171813-1-bhupesh.sharma@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add hooks inside platform specific data which can be used by Qualcomm tsens controller(s) which might need reinitialization via trustzone. Cc: Bjorn Andersson Cc: Amit Kucheria Cc: Thara Gopinath Cc: linux-pm@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org Signed-off-by: Bhupesh Sharma --- drivers/thermal/qcom/tsens.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h index ba05c8233356..92787017c6ab 100644 --- a/drivers/thermal/qcom/tsens.h +++ b/drivers/thermal/qcom/tsens.h @@ -513,6 +513,7 @@ struct tsens_features { * @num_sensors: Number of sensors supported by platform * @ops: operations the tsens instance supports * @hw_ids: Subset of sensors ids supported by platform, if not the first n + * @needs_reinit_wa: tsens controller might need reinit via trustzone * @feat: features of the IP * @fields: bitfield locations */ @@ -520,6 +521,7 @@ struct tsens_plat_data { const u32 num_sensors; const struct tsens_ops *ops; unsigned int *hw_ids; + bool needs_reinit_wa; struct tsens_features *feat; const struct reg_field *fields; }; @@ -542,6 +544,7 @@ struct tsens_context { * @srot_map: pointer to SROT register address space * @tm_offset: deal with old device trees that don't address TM and SROT * address space separately + * @needs_reinit_wa: tsens controller might need reinit via trustzone * @ul_lock: lock while processing upper/lower threshold interrupts * @crit_lock: lock while processing critical threshold interrupts * @rf: array of regmap_fields used to store value of the field @@ -559,6 +562,7 @@ struct tsens_priv { struct regmap *tm_map; struct regmap *srot_map; u32 tm_offset; + bool needs_reinit_wa; =20 /* lock for upper/lower threshold interrupts */ spinlock_t ul_lock; --=20 2.37.1 From nobody Mon Apr 6 23:12:35 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A6CD8ECAAD1 for ; Thu, 1 Sep 2022 10:55:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234377AbiIAKzN (ORCPT ); Thu, 1 Sep 2022 06:55:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52118 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234298AbiIAKyz (ORCPT ); Thu, 1 Sep 2022 06:54:55 -0400 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 416031348B9 for ; Thu, 1 Sep 2022 03:54:42 -0700 (PDT) Received: by mail-pl1-x632.google.com with SMTP id w2so16774708pld.0 for ; Thu, 01 Sep 2022 03:54:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=0SHo6OixBYLl5f1CcBGhyTfpbNp9C9ObDkRBknfANgo=; b=a/Kqe3liSeaVfqTXOyiqV0v3O8IMto/n4wptEy1A99SajwLYVRNNItD1B0jwChJ7Ff AxrjJf/a715pHaDo0Oe86gZUAc6Hb5z2W3kHIsX+KVsYTo81eZ7O2jn2Gs2r4GB91A+a cEda7Ee8BOn/cQT6LkJef1wm29155Q5pIJlKIwnO+H19XUzdo8hUee0iCutE1Gj5F4s9 qqAoKXd8CMbukHfD8UPE+mH3ledgAZlndcsxt9iXLduBuTfMJSVXvSa6wZMjwVEC0OGr Y/knRMcypS+XGLe/YZD6mXqRpLEsrSGKmubeox+k6/vGm68QMJDFkArMj91G8Yy/VOsV cp6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=0SHo6OixBYLl5f1CcBGhyTfpbNp9C9ObDkRBknfANgo=; b=x4YU6iD7RxL8msWL6JMdrfwjCm1gLRkmy2oANspvj5RXDkP+Qc2xkZot8Lpj7Zx+FH F0QbxGDA28x+3KdFc222MkL/HYE3jrGIz0hBs0aSfFsexk4X3donJ0vbMh7TEZFWTBJx 6aCEe8GhXDwfmFeRbUQ/nxWBwnD0LnG/SY9Dq8oySfvG2rNVCNiUfpLXMNCO6xdbA2dg FYR4QqU5CK5Suzl9WT4g4fr9oeewxFo6a+GiwG0Quy8/07xfEB0EyErlUZFZSuMSPwIt onKbjRei8gegGJmwjbiHbJ1CBOqbaCs5ZJH9PNVVt632aPSD+o4tAcFzZGsu3l3U5EBK R1Jw== X-Gm-Message-State: ACgBeo1LM0sy55OSX9XxX7WA/l0Wci7bh1UbI5TTlDwjNqAzFhyJ6Ecd d/DEn4LM9bgJbe02RzKVyw2tsw== X-Google-Smtp-Source: AA6agR5Td9OaLIjW5v+rGoMJ54Jxx+IAKemsK7IOKn71sway8bd2Xjszf7wFOOKp1PYIoGxKNRnzow== X-Received: by 2002:a17:902:6b42:b0:174:4308:ce52 with SMTP id g2-20020a1709026b4200b001744308ce52mr27682121plt.81.1662029681584; Thu, 01 Sep 2022 03:54:41 -0700 (PDT) Received: from localhost.localdomain ([2401:4900:1c60:5362:8069:f46:34af:eb19]) by smtp.gmail.com with ESMTPSA id ij13-20020a170902ab4d00b0016c57657977sm13508910plb.41.2022.09.01.03.54.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Sep 2022 03:54:41 -0700 (PDT) From: Bhupesh Sharma To: linux-pm@vger.kernel.org Cc: bhupesh.sharma@linaro.org, bhupesh.linux@gmail.com, linux-kernel@vger.kernel.org, andersson@kernel.org, konrad.dybcio@somainline.org, linux-arm-msm@vger.kernel.org, daniel.lezcano@linaro.org, robh+dt@kernel.org, rafael@kernel.org, Amit Kucheria , Thara Gopinath Subject: [PATCH v4 3/4] thermal: qcom: tsens: Add driver support for re-initialization quirk Date: Thu, 1 Sep 2022 16:24:13 +0530 Message-Id: <20220901105414.1171813-4-bhupesh.sharma@linaro.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220901105414.1171813-1-bhupesh.sharma@linaro.org> References: <20220901105414.1171813-1-bhupesh.sharma@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Since for some Qualcomm tsens controllers, its suggested to monitor the controller health periodically and in case an issue is detected, to re-initialize the tsens controller via trustzone, add the support for the same in the qcom tsens driver. Note that once the tsens controller is reset using scm call, all SROT and TM region registers will enter the reset mode. While all the SROT registers will be re-programmed and re-enabled in trustzone prior to the scm call exit, the TM region registers will not re-initialized in trustzone and thus need to be handled by the tsens driver. Cc: Bjorn Andersson Cc: Amit Kucheria Cc: Thara Gopinath Cc: linux-pm@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org Signed-off-by: Bhupesh Sharma --- drivers/thermal/qcom/tsens-v2.c | 3 + drivers/thermal/qcom/tsens.c | 190 ++++++++++++++++++++++++++++++++ drivers/thermal/qcom/tsens.h | 12 ++ 3 files changed, 205 insertions(+) diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v= 2.c index b293ed32174b..f521e4479cc5 100644 --- a/drivers/thermal/qcom/tsens-v2.c +++ b/drivers/thermal/qcom/tsens-v2.c @@ -88,6 +88,9 @@ static const struct reg_field tsens_v2_regfields[MAX_REGF= IELDS] =3D { =20 /* TRDY: 1=3Dready, 0=3Din progress */ [TRDY] =3D REG_FIELD(TM_TRDY_OFF, 0, 0), + + /* FIRST_ROUND_COMPLETE: 1=3Dcomplete, 0=3Dnot complete */ + [FIRST_ROUND_COMPLETE] =3D REG_FIELD(TM_TRDY_OFF, 3, 3), }; =20 static const struct tsens_ops ops_generic_v2 =3D { diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c index b1b10005fb28..ecf544683e73 100644 --- a/drivers/thermal/qcom/tsens.c +++ b/drivers/thermal/qcom/tsens.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -594,6 +595,107 @@ static void tsens_disable_irq(struct tsens_priv *priv) regmap_field_write(priv->rf[INT_EN], 0); } =20 +static void tsens_reenable_hw_after_scm(struct tsens_priv *priv) +{ + /* + * Re-enable watchdog, unmask the bark and + * disable cycle completion monitoring. + */ + regmap_field_write(priv->rf[WDOG_BARK_CLEAR], 1); + regmap_field_write(priv->rf[WDOG_BARK_CLEAR], 0); + regmap_field_write(priv->rf[WDOG_BARK_MASK], 0); + regmap_field_write(priv->rf[CC_MON_MASK], 1); + + /* Re-enable interrupts */ + tsens_enable_irq(priv); +} + +static int tsens_health_check_and_reinit(struct tsens_priv *priv, + int hw_id) +{ + int ret, trdy, first_round, sw_reg; + unsigned long timeout; + + /* Check early if the mutex is in locked state */ + WARN_ON(!mutex_is_locked(&priv->reinit_mutex)); + + /* First check if TRDY is SET */ + ret =3D regmap_field_read(priv->rf[TRDY], &trdy); + if (ret) + goto err; + + if (trdy) + return 0; /* success */ + + ret =3D regmap_field_read(priv->rf[FIRST_ROUND_COMPLETE], &first_round); + if (ret) + goto err; + + if (first_round) + return 0; /* success */ + + /* Wait for 2 ms for tsens controller to recover */ + ret =3D regmap_field_read_poll_timeout(priv->rf[FIRST_ROUND_COMPLETE], + first_round, first_round, 100, + RESET_TIMEOUT_MS * USEC_PER_MSEC); + if (ret =3D=3D 0) { + dev_dbg(priv->dev, "tsens controller recovered\n"); + return 0; /* success */ + } + + if (ret) + goto err; + + spin_lock(&priv->reinit_lock); + + /* + * Invoke SCM call only if SW register write is reflecting in controller. + * Try it for 2 ms. In case that fails mark the tsens controller as + * unrecoverable. + */ + timeout =3D jiffies + msecs_to_jiffies(RESET_TIMEOUT_MS); + do { + ret =3D regmap_field_write(priv->rf[INT_EN], CRITICAL_INT_EN); + if (ret) + goto err_unlock; + + ret =3D regmap_field_read(priv->rf[INT_EN], &sw_reg); + if (ret) + goto err_unlock; + } while ((sw_reg & CRITICAL_INT_EN) && (time_before(jiffies, timeout))); + + if (!(sw_reg & CRITICAL_INT_EN)) { + ret =3D -ENOTRECOVERABLE; + goto err_unlock; + } + + /* tsens controller did not recover, proceed with SCM call to re-init it.= */ + ret =3D qcom_scm_tsens_reinit(); + if (ret) { + dev_err(priv->dev, "tsens reinit scm call failed (%d)\n", ret); + goto err_unlock; + } + + /* + * After the SCM call, we need to re-enable the interrupts and also set + * active threshold for each sensor. + */ + tsens_reenable_hw_after_scm(priv); + + /* Notify reinit wa worker */ + queue_work(system_highpri_wq, &priv->reinit_wa_notify); + + spin_unlock(&priv->reinit_lock); + + return 0; /* success */ + +err_unlock: + spin_unlock(&priv->reinit_lock); + +err: + return ret; +} + int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp) { struct tsens_priv *priv =3D s->priv; @@ -607,6 +709,20 @@ int get_temp_tsens_valid(const struct tsens_sensor *s,= int *temp) if (tsens_version(priv) =3D=3D VER_0) goto get_temp; =20 + /* + * For some tsens controllers, its suggested to monitor the controller + * health periodically and in case an issue is detected to reinit tsens + * controller via trustzone. + */ + if (priv->needs_reinit_wa) { + mutex_lock(&priv->reinit_mutex); + ret =3D tsens_health_check_and_reinit(priv, hw_id); + mutex_unlock(&priv->reinit_mutex); + + if (ret) + return ret; + } + /* Valid bit is 0 for 6 AHB clock cycles. * At 19.2MHz, 1 AHB clock is ~60ns. * We should enter this loop very, very rarely. @@ -739,6 +855,40 @@ static const struct regmap_config tsens_srot_config = =3D { .reg_stride =3D 4, }; =20 +static void __tsens_reinit_worker(struct tsens_priv *priv) +{ + int ret, temp; + unsigned int i; + struct tsens_irq_data d; + + for (i =3D 0; i < priv->num_sensors; i++) { + const struct tsens_sensor *s =3D &priv->sensor[i]; + u32 hw_id =3D s->hw_id; + + if (!s->tzd) + continue; + if (!tsens_threshold_violated(priv, hw_id, &d)) + continue; + + ret =3D get_temp_tsens_valid(s, &temp); + if (ret) { + dev_err(priv->dev, "[%u] error reading sensor during reinit\n", hw_id); + continue; + } + + tsens_read_irq_state(priv, hw_id, s, &d); + + if ((d.up_thresh < temp) || (d.low_thresh > temp)) { + dev_dbg(priv->dev, "[%u] TZ update trigger during reinit (%d mC)\n", + hw_id, temp); + thermal_zone_device_update(s->tzd, THERMAL_EVENT_UNSPECIFIED); + } else { + dev_dbg(priv->dev, "[%u] no violation during reinit (%d)\n", + hw_id, temp); + } + } +} + int __init init_common(struct tsens_priv *priv) { void __iomem *tm_base, *srot_base; @@ -860,6 +1010,14 @@ int __init init_common(struct tsens_priv *priv) goto err_put_device; } =20 + priv->rf[FIRST_ROUND_COMPLETE] =3D devm_regmap_field_alloc(dev, + priv->tm_map, + priv->fields[FIRST_ROUND_COMPLETE]); + if (IS_ERR(priv->rf[FIRST_ROUND_COMPLETE])) { + ret =3D PTR_ERR(priv->rf[FIRST_ROUND_COMPLETE]); + goto err_put_device; + } + /* This loop might need changes if enum regfield_ids is reordered */ for (j =3D LAST_TEMP_0; j <=3D UP_THRESH_15; j +=3D 16) { for (i =3D 0; i < priv->feat->max_sensors; i++) { @@ -1082,6 +1240,14 @@ static int tsens_register(struct tsens_priv *priv) return ret; } =20 +static void tsens_reinit_worker_notify(struct work_struct *work) +{ + struct tsens_priv *priv =3D container_of(work, struct tsens_priv, + reinit_wa_notify); + + __tsens_reinit_worker(priv); +} + static int tsens_probe(struct platform_device *pdev) { int ret, i; @@ -1123,6 +1289,11 @@ static int tsens_probe(struct platform_device *pdev) =20 priv->dev =3D dev; priv->num_sensors =3D num_sensors; + priv->needs_reinit_wa =3D data->needs_reinit_wa; + + if (priv->needs_reinit_wa && !qcom_scm_is_available()) + return -EPROBE_DEFER; + priv->ops =3D data->ops; for (i =3D 0; i < priv->num_sensors; i++) { if (data->hw_ids) @@ -1138,6 +1309,25 @@ static int tsens_probe(struct platform_device *pdev) if (!priv->ops || !priv->ops->init || !priv->ops->get_temp) return -EINVAL; =20 + /* + * Reinitialization workaround is currently supported only for + * tsens controller versions v2. + * + * If incorrect platform data is passed to this effect, ignore + * the requested setting and move forward. + */ + if (priv->needs_reinit_wa && (tsens_version(priv) < VER_2_X)) { + dev_warn(dev, + "%s: Reinit quirk available only for tsens v2\n", __func__); + priv->needs_reinit_wa =3D false; + } + + mutex_init(&priv->reinit_mutex); + spin_lock_init(&priv->reinit_lock); + + if (priv->needs_reinit_wa) + INIT_WORK(&priv->reinit_wa_notify, tsens_reinit_worker_notify); + ret =3D priv->ops->init(priv); if (ret < 0) { dev_err(dev, "%s: init failed\n", __func__); diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h index 92787017c6ab..900d2a74d25e 100644 --- a/drivers/thermal/qcom/tsens.h +++ b/drivers/thermal/qcom/tsens.h @@ -14,9 +14,12 @@ #define SLOPE_FACTOR 1000 #define SLOPE_DEFAULT 3200 #define TIMEOUT_US 100 +#define RESET_TIMEOUT_MS 2 #define THRESHOLD_MAX_ADC_CODE 0x3ff #define THRESHOLD_MIN_ADC_CODE 0x0 =20 +#define CRITICAL_INT_EN (BIT(2)) + #include #include #include @@ -165,6 +168,7 @@ enum regfield_ids { /* ----- TM ------ */ /* TRDY */ TRDY, + FIRST_ROUND_COMPLETE, /* INTERRUPT ENABLE */ INT_EN, /* v2+ has separate enables for crit, upper and lower irq */ /* STATUS */ @@ -564,6 +568,14 @@ struct tsens_priv { u32 tm_offset; bool needs_reinit_wa; =20 + struct work_struct reinit_wa_notify; + + /* protects reinit related serialization */ + struct mutex reinit_mutex; + + /* lock for reinit workaround */ + spinlock_t reinit_lock; + /* lock for upper/lower threshold interrupts */ spinlock_t ul_lock; =20 --=20 2.37.1 From nobody Mon Apr 6 23:12:35 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A273BECAAD3 for ; Thu, 1 Sep 2022 10:55:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234201AbiIAKz3 (ORCPT ); Thu, 1 Sep 2022 06:55:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51174 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234336AbiIAKzD (ORCPT ); Thu, 1 Sep 2022 06:55:03 -0400 Received: from mail-pg1-x52d.google.com (mail-pg1-x52d.google.com [IPv6:2607:f8b0:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1217BA1B6 for ; Thu, 1 Sep 2022 03:54:47 -0700 (PDT) Received: by mail-pg1-x52d.google.com with SMTP id q9so16025232pgq.6 for ; Thu, 01 Sep 2022 03:54:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=9Rgza/BFhiKgz5qbn9tPTsIEssmmxYhCqKqdcg+i9QY=; b=gSPF6cYdqAKPZBIfnj0ykq8qkjlihGmDcLYbY1JGovRpm98ByZ/r58JoGphkqYmn/W saR5sAJ8dhx80eN8CLs3yhUzH9aDWx+57vnNlj/pkgxDik3jNmDPd7cGoIQr0qgHJ27L z2KajvrNb9oAMZRVwKPWmlX732/E8MZVcdG4AknCEWmPfw9jvlQcXErOvqlFg3YBjrb0 T7pj/36wWglz35CHTiYG+M3Q+85w31cf9KKJUKNatDPlGuwuWz0Jzrs717RzwYtl0Jlz Robmj4WKGtZJqBchIgsSeXXc7CQ2tbc85Yk0QdH157dsOMDbKlIqtPcTbiMi6Ta/gtNv R0rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=9Rgza/BFhiKgz5qbn9tPTsIEssmmxYhCqKqdcg+i9QY=; b=wHp6I1+InslLGV96GoqYpEfALvrbs10tr6lIePYx+xxpDpvA7TsjswYQ4af+GZjGR8 aeND8TGWPQ+ePkkRozD5G6BOR11JLVieFZMOeD98lhOndL2a1QDMe1lP3+6aiKXyjuTP IuVjlGAQamBLQyIxd8s87tqoaH+EwDypwBzAw5cvme8lHUTGIu0wSZEDGVXaXhwfhC7S +fxl7m8ScKbj8QIy8Gj0N+X3sWCRdoPNx+V93VKz5y6jLhghmopgAv1igV3zP+SFmNyq 36rDx5a41CADeisPKTDV7QhVrKMjND0Uhs3TBWEpTMhVLx3P1nNCuQMtabbJsQY252zt Bg/g== X-Gm-Message-State: ACgBeo0Wl/tIrBjZXdcdohlKfFoFs9hNRPAO1BxOCBSLayKvVXkX/QlK LmUca7Bkusx/pvxCBKRLNDqcXQ== X-Google-Smtp-Source: AA6agR5tOEba8IL4Jg1YiwEsoVUeCfd8Ux+DLPb4woSbhcyyLTvyIkvIYPlLjgqQvWYomSPtBhYbFg== X-Received: by 2002:a63:4503:0:b0:430:48ac:6046 with SMTP id s3-20020a634503000000b0043048ac6046mr4910890pga.74.1662029685943; Thu, 01 Sep 2022 03:54:45 -0700 (PDT) Received: from localhost.localdomain ([2401:4900:1c60:5362:8069:f46:34af:eb19]) by smtp.gmail.com with ESMTPSA id ij13-20020a170902ab4d00b0016c57657977sm13508910plb.41.2022.09.01.03.54.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Sep 2022 03:54:45 -0700 (PDT) From: Bhupesh Sharma To: linux-pm@vger.kernel.org Cc: bhupesh.sharma@linaro.org, bhupesh.linux@gmail.com, linux-kernel@vger.kernel.org, andersson@kernel.org, konrad.dybcio@somainline.org, linux-arm-msm@vger.kernel.org, daniel.lezcano@linaro.org, robh+dt@kernel.org, rafael@kernel.org, Amit Kucheria , Thara Gopinath Subject: [PATCH v4 4/4] thermal: qcom: tsens: Add reinit quirk support for tsens v2 controllers Date: Thu, 1 Sep 2022 16:24:14 +0530 Message-Id: <20220901105414.1171813-5-bhupesh.sharma@linaro.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220901105414.1171813-1-bhupesh.sharma@linaro.org> References: <20220901105414.1171813-1-bhupesh.sharma@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Some Qualcomm tsens v2 controllers like those present on sm8150 SoC might require re-initialization via trustzone [via scm call(s)] when it enters a 'bad state' causing sensor temperatures/interrupts status to be in an 'invalid' state. Add hooks for the same in the qcom tsens driver. Devices requiring the same can pass the relevant compatible string in dt and the driver hook can be used accordingly. Cc: Amit Kucheria Cc: Thara Gopinath Cc: linux-pm@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org Reviewed-by: Bjorn Andersson Signed-off-by: Bhupesh Sharma --- drivers/thermal/qcom/tsens-v2.c | 12 ++++++++++++ drivers/thermal/qcom/tsens.c | 3 +++ drivers/thermal/qcom/tsens.h | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v= 2.c index f521e4479cc5..431f17f99d34 100644 --- a/drivers/thermal/qcom/tsens-v2.c +++ b/drivers/thermal/qcom/tsens-v2.c @@ -104,6 +104,18 @@ struct tsens_plat_data data_tsens_v2 =3D { .fields =3D tsens_v2_regfields, }; =20 +/* + * For some tsens v2 controllers, its suggested to monitor the + * controller health periodically and in case an issue is detected + * to reinit tsens controller via trustzone. + */ +struct tsens_plat_data data_tsens_v2_reinit =3D { + .ops =3D &ops_generic_v2, + .feat =3D &tsens_v2_feat, + .needs_reinit_wa =3D true, + .fields =3D tsens_v2_regfields, +}; + /* Kept around for backward compatibility with old msm8996.dtsi */ struct tsens_plat_data data_8996 =3D { .num_sensors =3D 13, diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c index ecf544683e73..ab8561ddedb2 100644 --- a/drivers/thermal/qcom/tsens.c +++ b/drivers/thermal/qcom/tsens.c @@ -1138,6 +1138,9 @@ static const struct of_device_id tsens_table[] =3D { }, { .compatible =3D "qcom,msm8996-tsens", .data =3D &data_8996, + }, { + .compatible =3D "qcom,sm8150-tsens", + .data =3D &data_tsens_v2_reinit, }, { .compatible =3D "qcom,tsens-v1", .data =3D &data_tsens_v1, diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h index 900d2a74d25e..03cc3a790972 100644 --- a/drivers/thermal/qcom/tsens.h +++ b/drivers/thermal/qcom/tsens.h @@ -607,6 +607,6 @@ extern struct tsens_plat_data data_8916, data_8939, dat= a_8974, data_9607; extern struct tsens_plat_data data_tsens_v1, data_8976; =20 /* TSENS v2 targets */ -extern struct tsens_plat_data data_8996, data_tsens_v2; +extern struct tsens_plat_data data_8996, data_tsens_v2_reinit, data_tsens_= v2; =20 #endif /* __QCOM_TSENS_H__ */ --=20 2.37.1