From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
To: Stephan Gerhold <stephan@gerhold.net>
Cc: Stephan Gerhold <stephan.gerhold@kernkonzept.com>,
Daniel Lezcano <daniel.lezcano@linaro.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Amit Kucheria <amitk@kernel.org>,
Thara Gopinath <thara.gopinath@gmail.com>,
Zhang Rui <rui.zhang@intel.com>, Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
Andy Gross <agross@kernel.org>,
linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org,
devicetree@vger.kernel.org
Subject: Re: [PATCH 3/3] thermal: qcom: tsens: Add data for MSM8909
Date: Fri, 9 Sep 2022 17:54:04 +0300 [thread overview]
Message-ID: <e752fd61-2807-381c-78ab-a6af8ad9b8d6@linaro.org> (raw)
In-Reply-To: <YxtEtDLVEAGP8sGE@gerhold.net>
On 09/09/2022 16:51, Stephan Gerhold wrote:
> On Thu, Sep 08, 2022 at 11:57:41PM +0300, Dmitry Baryshkov wrote:
>> On 27/06/2022 16:14, Stephan Gerhold wrote:
>>> The MSM8909 SoC has 5 thermal sensors in a TSENS v0.1 block similar to
>>> MSM8916, except that the bit offsets in the qfprom were changed.
>>> Also, some fixed correction factors are needed as workaround because the
>>> factory calibration apparently was not reliable enough.
>>>
>>> Add the defines and calibration function for MSM8909 in the existing
>>> tsens-v0_1.c driver to make the thermal sensors work on MSM8909.
>>> The changes are derived from the original msm-3.18 kernel [1] from
>>> Qualcomm but cleaned up and adapted to the driver in mainline.
>>>
>>> [1]: https://git.codelinaro.org/clo/la/kernel/msm-3.18/-/blob/LA.UM.7.7.c26-08600-8x09.0/drivers/thermal/msm-tsens.c
>>>
>>> Signed-off-by: Stephan Gerhold <stephan.gerhold@kernkonzept.com>
>>> ---
>>> drivers/thermal/qcom/tsens-v0_1.c | 119 +++++++++++++++++++++++++++++-
>>> drivers/thermal/qcom/tsens.c | 3 +
>>> drivers/thermal/qcom/tsens.h | 2 +-
>>> 3 files changed, 122 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/thermal/qcom/tsens-v0_1.c b/drivers/thermal/qcom/tsens-v0_1.c
>>> index f136cb350238..e17c4f9d9aa5 100644
>>> --- a/drivers/thermal/qcom/tsens-v0_1.c
>>> +++ b/drivers/thermal/qcom/tsens-v0_1.c
>>> @@ -15,6 +15,48 @@
>>> #define TM_Sn_STATUS_OFF 0x0030
>>> #define TM_TRDY_OFF 0x005c
>>> +/* eeprom layout data for 8909 */
>>> +#define MSM8909_CAL_SEL_MASK 0x00070000
>>> +#define MSM8909_CAL_SEL_SHIFT 16
>>> +
>>> +#define MSM8909_BASE0_MASK 0x000000ff
>>> +#define MSM8909_BASE1_MASK 0x0000ff00
>>> +#define MSM8909_BASE0_SHIFT 0
>>> +#define MSM8909_BASE1_SHIFT 8
>>> +
>>> +#define MSM8909_S0_P1_MASK 0x0000003f
>>> +#define MSM8909_S1_P1_MASK 0x0003f000
>>> +#define MSM8909_S2_P1_MASK 0x3f000000
>>> +#define MSM8909_S3_P1_MASK 0x000003f0
>>> +#define MSM8909_S4_P1_MASK 0x003f0000
>>> +
>>> +#define MSM8909_S0_P2_MASK 0x00000fc0
>>> +#define MSM8909_S1_P2_MASK 0x00fc0000
>>> +#define MSM8909_S2_P2_MASK_0_1 0xc0000000
>>> +#define MSM8909_S2_P2_MASK_2_5 0x0000000f
>>> +#define MSM8909_S3_P2_MASK 0x0000fc00
>>> +#define MSM8909_S4_P2_MASK 0x0fc00000
>>> +
>>> +#define MSM8909_S0_P1_SHIFT 0
>>> +#define MSM8909_S1_P1_SHIFT 12
>>> +#define MSM8909_S2_P1_SHIFT 24
>>> +#define MSM8909_S3_P1_SHIFT 4
>>> +#define MSM8909_S4_P1_SHIFT 16
>>> +
>>> +#define MSM8909_S0_P2_SHIFT 6
>>> +#define MSM8909_S1_P2_SHIFT 18
>>> +#define MSM8909_S2_P2_SHIFT_0_1 30
>>> +#define MSM8909_S2_P2_SHIFT_2_5 2
>>> +#define MSM8909_S3_P2_SHIFT 10
>>> +#define MSM8909_S4_P2_SHIFT 22
>>> +
>>> +#define MSM8909_D30_WA_S1 10
>>> +#define MSM8909_D30_WA_S3 9
>>> +#define MSM8909_D30_WA_S4 8
>>> +#define MSM8909_D120_WA_S1 6
>>> +#define MSM8909_D120_WA_S3 9
>>> +#define MSM8909_D120_WA_S4 10
>>> +
>>> /* eeprom layout data for 8916 */
>>> #define MSM8916_BASE0_MASK 0x0000007f
>>> #define MSM8916_BASE1_MASK 0xfe000000
>>> @@ -223,6 +265,68 @@
>>> #define MDM9607_CAL_SEL_MASK 0x00700000
>>> #define MDM9607_CAL_SEL_SHIFT 20
>>> +static int calibrate_8909(struct tsens_priv *priv)
>>> +{
>>> + u32 *qfprom_cdata, *qfprom_csel;
>>> + int base0, base1, mode, i;
>>> + u32 p1[5], p2[5];
>>> +
>>> + qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib");
>>> + if (IS_ERR(qfprom_cdata))
>>> + return PTR_ERR(qfprom_cdata);
>>> +
>>> + qfprom_csel = (u32 *)qfprom_read(priv->dev, "calib_sel");
>>> + if (IS_ERR(qfprom_csel)) {
>>> + kfree(qfprom_cdata);
>>> + return PTR_ERR(qfprom_csel);
>>> + }
>>> +
>>> + mode = (qfprom_csel[0] & MSM8909_CAL_SEL_MASK) >> MSM8909_CAL_SEL_SHIFT;
>>> + dev_dbg(priv->dev, "calibration mode is %d\n", mode);
>>> +
>>> + switch (mode) {
>>> + case TWO_PT_CALIB:
>>> + base1 = (qfprom_csel[0] & MSM8909_BASE1_MASK) >> MSM8909_BASE1_SHIFT;
>>> + p2[0] = (qfprom_cdata[0] & MSM8909_S0_P2_MASK) >> MSM8909_S0_P2_SHIFT;
>>> + p2[1] = (qfprom_cdata[0] & MSM8909_S1_P2_MASK) >> MSM8909_S1_P2_SHIFT;
>>> + p2[2] = (qfprom_cdata[0] & MSM8909_S2_P2_MASK_0_1) >> MSM8909_S2_P2_SHIFT_0_1;
>>> + p2[2] |= (qfprom_cdata[1] & MSM8909_S2_P2_MASK_2_5) << MSM8909_S2_P2_SHIFT_2_5;
>>> + p2[3] = (qfprom_cdata[1] & MSM8909_S3_P2_MASK) >> MSM8909_S3_P2_SHIFT;
>>> + p2[4] = (qfprom_cdata[1] & MSM8909_S4_P2_MASK) >> MSM8909_S4_P2_SHIFT;
>>
>> Please use nvmem_cell_read_* to read these values. This would allow you to
>> push all the possible si_pi definitions into the DT and use mode to switch
>> between them. And mode can be read using the nvmem_cell_read_* too.
>
> Thanks for the suggestion.
>
> I agree that this would have been nicer if this had been implemented
> that way for all the existing platforms supported by the tsens driver.
> But now we already have 7+ platforms using exactly the approach I'm
> using in this patch, with existing bindings and existing device trees
> that must stay supported.
>
> My msm8909.dtsi is actually mostly just a simple overlay on top of
> msm8916.dtsi, so I would like to keep these platforms consistent
> wherever possible. We could change all the existing platforms as well
> but in my opinion this would just make the driver and bindings a lot
> more complicated because the old approach still must be supported.
>
> Also, I think the main benefit of having all the points as separate
> NVMEM cells would be to allow having a generic qcom,tsens-v0.1
> compatible, without SoC-specific code required in the driver. However,
> subtle differences in the way the calibration points are used (e.g. the
> fixed correction offsets in this patch) will likely make SoC-specific
> code necessary anyway. And then it doesn't matter much if the bit masks
> are in the driver like all existing code or end up being put into the DT.
>
> TL;DR: I would prefer to keep this as-is to keep the driver simple and
> consistent across all the supported platforms.
At least let's change the driver to use FIELD_GET, this will allow us to
remove SHIFT defines. I will take a look in the next few days if we can
switch to nvmem_cell in a sensible manner.
--
With best wishes
Dmitry
next prev parent reply other threads:[~2022-09-09 14:54 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-27 13:14 [PATCH 0/3] thermal: qcom: tsens: Add data for MSM8909 Stephan Gerhold
2022-06-27 13:14 ` [PATCH 1/3] dt-bindings: thermal: qcom-tsens: Drop redundant compatibles Stephan Gerhold
2022-06-29 10:46 ` Krzysztof Kozlowski
2022-06-27 13:14 ` [PATCH 2/3] dt-bindings: thermal: qcom-tsens: Add MSM8909 compatible Stephan Gerhold
2022-06-29 10:46 ` Krzysztof Kozlowski
2022-06-27 13:14 ` [PATCH 3/3] thermal: qcom: tsens: Add data for MSM8909 Stephan Gerhold
2022-09-08 20:57 ` Dmitry Baryshkov
2022-09-09 13:51 ` Stephan Gerhold
2022-09-09 14:54 ` Dmitry Baryshkov [this message]
2022-09-08 20:08 ` [PATCH 0/3] " Stephan Gerhold
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e752fd61-2807-381c-78ab-a6af8ad9b8d6@linaro.org \
--to=dmitry.baryshkov@linaro.org \
--cc=agross@kernel.org \
--cc=amitk@kernel.org \
--cc=bjorn.andersson@linaro.org \
--cc=daniel.lezcano@linaro.org \
--cc=devicetree@vger.kernel.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=robh+dt@kernel.org \
--cc=rui.zhang@intel.com \
--cc=stephan.gerhold@kernkonzept.com \
--cc=stephan@gerhold.net \
--cc=thara.gopinath@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).