Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp930826ybc; Tue, 12 Nov 2019 11:25:20 -0800 (PST) X-Google-Smtp-Source: APXvYqw2lePtn6XSQ45EquD2xtj/HdKjqObiUGQ/ehYCsCjFlzJXzGKvEqLSfr+xVJG2MDsrmCqP X-Received: by 2002:aa7:c1d4:: with SMTP id d20mr34563347edp.273.1573586720462; Tue, 12 Nov 2019 11:25:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573586720; cv=none; d=google.com; s=arc-20160816; b=nXQpO4s9Z2mbjCgrprzvT2zDty8JqYpFPRP4IdjoyAx6dDDh2zQYjKWZbs2qxwmd38 t6g3zX9oi6fXSFNxYkQol7FKQR2uad2di3Wmi/v4tBhftoxs8pUhm3GiSrS7tY/Vn7h8 KZYnvTjz501/Gd4VhCgHHhzeZ1ZINVlpq7r2JI+Yq67gf3p8l2Wk+2W472tpOKJjNZ0+ VFWiVQnJg7zAmv5QGxa8yE8zd65WONX0T6gEkGgcei7Hk3BiyPZG0Vr0Ov/pPi4/vKtU ckUM414TiH6n8vWKobNyL/O46YypwvL8ccEQfmLnX7jzAyadCzeoQun8GutRpUA/lwbN uoFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=luJmse4qyPM7h1duRVVj4w9vtvYZ5N4OxnAMNKQuEwE=; b=e9dj3IXE7PKoCY3Kgc+/NyyYsZcCRF/XFGYWRoKhlcTyzN1MJSoop7LFHcTsDrdNLK 2ur/t/i1pLQMmVQgCyohcgVQbn7dZ6RUC38cE15djCEPV3DPOaYA/1/nzCB/GQ5lhztv T8VrxBQ+PI3TuCEFOW6Dxma9uVKGoulGJHzZbkjESO3sA9tOyZ5HmbpZ2GMYSaaxmCHN MhvFy14b8XIDMXTEewRf6EYcCtuLiMAKJhQClG5VmYOgN1IWGfN9HhYgfH7gRgYoa8bN XoP9R0caE3SMKSDGFigHjRGtbnVlpuQuTujq03ggpQq8A9LDpTCD+b7e3R8IVgafRbWE 15IQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=m16JaE0t; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a11si658357ejt.202.2019.11.12.11.24.54; Tue, 12 Nov 2019 11:25:20 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=m16JaE0t; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727134AbfKLTWs (ORCPT + 99 others); Tue, 12 Nov 2019 14:22:48 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:37135 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725997AbfKLTWs (ORCPT ); Tue, 12 Nov 2019 14:22:48 -0500 Received: by mail-pf1-f194.google.com with SMTP id p24so14057543pfn.4 for ; Tue, 12 Nov 2019 11:22:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=luJmse4qyPM7h1duRVVj4w9vtvYZ5N4OxnAMNKQuEwE=; b=m16JaE0tMOWtKv1tqF+/ZWdvaOBM4HlTIkpMmeFucRm5m959uTSk/fcL/apBRI3BFt h8GgmusICQJZhhiTgshtPUUlSnORNdufj5yL0fmAN/If3aSA/nKvgqeyY0YHCiRWM09u 2odKLe6PykEV5dVoLFdJHIY827tkpLhe9n2arNALTus4Bxjdbj/d8lljWkt881mrtvOx 3qHv1rerAHnw00bm0MJLYhf6ZsvevbRzfEauwdw9n3XdouFliMpMysHVbKvg6zc7wfoN WTOkwdTnjGXLKFimj3/T2/+3VsDKEE8n5+O/VANZFd/zadb/u+7PuYV2hKjBlofehj8B K4BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=luJmse4qyPM7h1duRVVj4w9vtvYZ5N4OxnAMNKQuEwE=; b=QvBwC39+JY2jACHyA9yqgMqQRbQtQZBYeTMOPEfxW5e+p1g194HCFsfl+Hu/JWEiyT rsNWo5vMxwx0mFoZEBgsgLWOMAoav1bp/30TmjLWP6mHxPR5z4y+M919WEdW/q+pUW7d HAKuyBVtYm2s0VyVdj1snHSuaYEbWQMAmdsQAoo7//te30m9UyHRLtxSmedl0SuqlNlU upWoSNITRsxbb4LjfU7aGQRGKHeF9XK0akxi5A8mVhnt1LUUIC0U90zb+xg1eENbsn0N 5LwcGlM1rW0lo3C8pfKCRNfDUqtSsjuWulCUZRmopH/TmBL2ETfqXaLwsHZhrCugxX/2 UCXQ== X-Gm-Message-State: APjAAAUq8VlPCqBG0N0qTEJjlSD7z86kiiZggFX01FziYRHwMBYRn/dM HWFTbjFhjiLrEFKS4uLnnj8qtQ== X-Received: by 2002:a63:586:: with SMTP id 128mr27395209pgf.198.1573586567270; Tue, 12 Nov 2019 11:22:47 -0800 (PST) Received: from builder (104-188-17-28.lightspeed.sndgca.sbcglobal.net. [104.188.17.28]) by smtp.gmail.com with ESMTPSA id i22sm3220287pjx.1.2019.11.12.11.22.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Nov 2019 11:22:46 -0800 (PST) Date: Tue, 12 Nov 2019 11:22:44 -0800 From: Bjorn Andersson To: Amit Kucheria Cc: linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, edubezval@gmail.com, swboyd@chromium.org, sivaa@codeaurora.org, Andy Gross , Daniel Lezcano , Amit Kucheria , linux-pm@vger.kernel.org Subject: Re: [PATCH 2/3] drivers: thermal: tsens: Add watchdog support Message-ID: <20191112192244.GB3140946@builder> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.12.2 (2019-09-21) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon 11 Nov 11:21 PST 2019, Amit Kucheria wrote: > TSENS IP v2.3 onwards adds support for a watchdog to detect if the TSENS > HW FSM is frozen. Add support to detect and restart the FSM in the > driver. The watchdog is configured by the bootloader, we just enable the > feature in the kernel. > > Signed-off-by: Amit Kucheria > --- > drivers/thermal/qcom/tsens-common.c | 41 +++++++++++++++++++++++++++++ > drivers/thermal/qcom/tsens-v2.c | 10 +++++++ > drivers/thermal/qcom/tsens.h | 12 +++++++++ > 3 files changed, 63 insertions(+) > > diff --git a/drivers/thermal/qcom/tsens-common.c b/drivers/thermal/qcom/tsens-common.c > index 2989cb952cdb..9432518502a7 100644 > --- a/drivers/thermal/qcom/tsens-common.c > +++ b/drivers/thermal/qcom/tsens-common.c > @@ -378,6 +378,28 @@ irqreturn_t tsens_critical_irq_thread(int irq, void *data) > bool enable = true, disable = false; > unsigned long flags; > int temp, ret, i; > + u32 wdog_status, wdog_count, ver_minor; > + > + ret = regmap_field_read(priv->rf[VER_MINOR], &ver_minor); The version is unlikely to change from one interrupt to the next, so I suggest that you add a boolean "has_watchdog" to your context that you populate in init_common. > + if (ret) > + return ret; > + > + if (tsens_version(priv) > VER_1_X && ver_minor > 2) { > + /* Watchdog is present only on v2.3+ */ > + ret = regmap_field_read(priv->rf[WDOG_BARK_STATUS], &wdog_status); > + if (ret) > + return ret; > + > + /* Clear WDOG interrupt */ > + regmap_field_write(priv->rf[WDOG_BARK_CLEAR], 1); > + regmap_field_write(priv->rf[WDOG_BARK_CLEAR], 0); > + > + ret = regmap_field_read(priv->rf[WDOG_BARK_COUNT], &wdog_count); > + if (ret) > + return ret; > + if (wdog_count) > + dev_err(priv->dev, "%s: watchdog count: %d\n", __func__, wdog_count); What's the benefit of reading wdog_count and who's the audience for this print? What do I do when this goes to 11? Regards, Bjorn > + } > > for (i = 0; i < priv->num_sensors; i++) { > struct tsens_sensor *s = &priv->sensor[i]; > @@ -685,6 +707,7 @@ int __init init_common(struct tsens_priv *priv) > { > void __iomem *tm_base, *srot_base; > struct device *dev = priv->dev; > + u32 ver_minor; > struct resource *res; > u32 enabled; > int ret, i, j; > @@ -734,6 +757,9 @@ int __init init_common(struct tsens_priv *priv) > if (IS_ERR(priv->rf[i])) > return PTR_ERR(priv->rf[i]); > } > + ret = regmap_field_read(priv->rf[VER_MINOR], &ver_minor); > + if (ret) > + goto err_put_device; > } > > priv->rf[TSENS_EN] = devm_regmap_field_alloc(dev, priv->srot_map, > @@ -794,6 +820,21 @@ int __init init_common(struct tsens_priv *priv) > } > } > > + if (tsens_version(priv) > VER_1_X && ver_minor > 2) { > + /* Watchdog is present only on v2.3+ */ > + for (i = 0, j = WDOG_BARK_STATUS; j <= CC_MON_MASK; i++, j++) { > + priv->rf[j] = devm_regmap_field_alloc(dev, priv->tm_map, > + priv->fields[j]); > + if (IS_ERR(priv->rf[j])) { > + ret = PTR_ERR(priv->rf[j]); > + goto err_put_device; > + } > + } > + /* Enable WDOG and disable cycle completion monitoring */ > + regmap_field_write(priv->rf[WDOG_BARK_MASK], 0); > + regmap_field_write(priv->rf[CC_MON_MASK], 1); > + } > + > spin_lock_init(&priv->ul_lock); > tsens_enable_irq(priv); > tsens_debug_init(op); > diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v2.c > index 47d831df0803..4184850d1e42 100644 > --- a/drivers/thermal/qcom/tsens-v2.c > +++ b/drivers/thermal/qcom/tsens-v2.c > @@ -24,6 +24,7 @@ > #define TM_Sn_CRITICAL_THRESHOLD_OFF 0x0060 > #define TM_Sn_STATUS_OFF 0x00a0 > #define TM_TRDY_OFF 0x00e4 > +#define TM_WDOG_LOG_OFF 0x013c > > /* v2.x: 8996, 8998, sdm845 */ > > @@ -66,6 +67,15 @@ static const struct reg_field tsens_v2_regfields[MAX_REGFIELDS] = { > REG_FIELD_SPLIT_BITS_0_15(CRIT_INT_CLEAR, TM_CRITICAL_INT_CLEAR_OFF), > REG_FIELD_SPLIT_BITS_0_15(CRIT_INT_MASK, TM_CRITICAL_INT_MASK_OFF), > > + /* WATCHDOG on v2.3 or later */ > + [WDOG_BARK_STATUS] = REG_FIELD(TM_CRITICAL_INT_STATUS_OFF, 31, 31), > + [WDOG_BARK_CLEAR] = REG_FIELD(TM_CRITICAL_INT_CLEAR_OFF, 31, 31), > + [WDOG_BARK_MASK] = REG_FIELD(TM_CRITICAL_INT_MASK_OFF, 31, 31), > + [CC_MON_STATUS] = REG_FIELD(TM_CRITICAL_INT_STATUS_OFF, 30, 30), > + [CC_MON_CLEAR] = REG_FIELD(TM_CRITICAL_INT_CLEAR_OFF, 30, 30), > + [CC_MON_MASK] = REG_FIELD(TM_CRITICAL_INT_MASK_OFF, 30, 30), > + [WDOG_BARK_COUNT] = REG_FIELD(TM_WDOG_LOG_OFF, 0, 7), > + > /* Sn_STATUS */ > REG_FIELD_FOR_EACH_SENSOR16(LAST_TEMP, TM_Sn_STATUS_OFF, 0, 11), > REG_FIELD_FOR_EACH_SENSOR16(VALID, TM_Sn_STATUS_OFF, 21, 21), > diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h > index 9b5a30533c52..7608e7877a7b 100644 > --- a/drivers/thermal/qcom/tsens.h > +++ b/drivers/thermal/qcom/tsens.h > @@ -440,6 +440,18 @@ enum regfield_ids { > CRIT_THRESH_13, > CRIT_THRESH_14, > CRIT_THRESH_15, > + > + /* WATCHDOG */ > + WDOG_BARK_STATUS, > + WDOG_BARK_CLEAR, > + WDOG_BARK_MASK, > + WDOG_BARK_COUNT, > + > + /* CYCLE COMPLETION MONITOR */ > + CC_MON_STATUS, > + CC_MON_CLEAR, > + CC_MON_MASK, > + > MIN_STATUS_0, /* MIN threshold violated */ > MIN_STATUS_1, > MIN_STATUS_2, > -- > 2.17.1 >