On 20.12.2022 03:47, Dmitry Baryshkov wrote: > Tsens driver mentions that msm8976 data should be used for both msm8976 > and msm8956 SoCs. This is not quite correct, as according to the > vendor kernels, msm8976 should use standard slope values (3200), while > msm8956 really uses the slope values found in the driver. > > Add separate compatibility string for msm8956, move slope value > overrides to the corresponding init function and use the standard > compute_intercept_slope() function for both platforms. > > Fixes: 0e580290170d ("thermal: qcom: tsens-v1: Add support for MSM8956 and MSM8976") > Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@xxxxxxxxxxxxx> > Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@xxxxxxxxxxxxx> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx> > --- Reviewed-by: Konrad Dybcio <konrad.dybcio@xxxxxxxxxx> Konrad > drivers/thermal/qcom/tsens-v1.c | 56 ++++++++++++++++++--------------- > drivers/thermal/qcom/tsens.c | 3 ++ > drivers/thermal/qcom/tsens.h | 2 +- > 3 files changed, 34 insertions(+), 27 deletions(-) > > diff --git a/drivers/thermal/qcom/tsens-v1.c b/drivers/thermal/qcom/tsens-v1.c > index a7f53966156b..83c2853546d0 100644 > --- a/drivers/thermal/qcom/tsens-v1.c > +++ b/drivers/thermal/qcom/tsens-v1.c > @@ -137,30 +137,6 @@ > #define CAL_SEL_MASK 7 > #define CAL_SEL_SHIFT 0 > > -static void compute_intercept_slope_8976(struct tsens_priv *priv, > - u32 *p1, u32 *p2, u32 mode) > -{ > - int i; > - > - priv->sensor[0].slope = 3313; > - priv->sensor[1].slope = 3275; > - priv->sensor[2].slope = 3320; > - priv->sensor[3].slope = 3246; > - priv->sensor[4].slope = 3279; > - priv->sensor[5].slope = 3257; > - priv->sensor[6].slope = 3234; > - priv->sensor[7].slope = 3269; > - priv->sensor[8].slope = 3255; > - priv->sensor[9].slope = 3239; > - priv->sensor[10].slope = 3286; > - > - for (i = 0; i < priv->num_sensors; i++) { > - priv->sensor[i].offset = (p1[i] * SLOPE_FACTOR) - > - (CAL_DEGC_PT1 * > - priv->sensor[i].slope); > - } > -} > - > static int calibrate_v1(struct tsens_priv *priv) > { > u32 base0 = 0, base1 = 0; > @@ -286,7 +262,7 @@ static int calibrate_8976(struct tsens_priv *priv) > break; > } > > - compute_intercept_slope_8976(priv, p1, p2, mode); > + compute_intercept_slope(priv, p1, p2, mode); > kfree(qfprom_cdata); > > return 0; > @@ -360,6 +336,22 @@ static const struct reg_field tsens_v1_regfields[MAX_REGFIELDS] = { > [TRDY] = REG_FIELD(TM_TRDY_OFF, 0, 0), > }; > > +static int __init init_8956(struct tsens_priv *priv) { > + priv->sensor[0].slope = 3313; > + priv->sensor[1].slope = 3275; > + priv->sensor[2].slope = 3320; > + priv->sensor[3].slope = 3246; > + priv->sensor[4].slope = 3279; > + priv->sensor[5].slope = 3257; > + priv->sensor[6].slope = 3234; > + priv->sensor[7].slope = 3269; > + priv->sensor[8].slope = 3255; > + priv->sensor[9].slope = 3239; > + priv->sensor[10].slope = 3286; > + > + return init_common(priv); > +} > + > static const struct tsens_ops ops_generic_v1 = { > .init = init_common, > .calibrate = calibrate_v1, > @@ -372,13 +364,25 @@ struct tsens_plat_data data_tsens_v1 = { > .fields = tsens_v1_regfields, > }; > > +static const struct tsens_ops ops_8956 = { > + .init = init_8956, > + .calibrate = calibrate_8976, > + .get_temp = get_temp_tsens_valid, > +}; > + > +struct tsens_plat_data data_8956 = { > + .num_sensors = 11, > + .ops = &ops_8956, > + .feat = &tsens_v1_feat, > + .fields = tsens_v1_regfields, > +}; > + > static const struct tsens_ops ops_8976 = { > .init = init_common, > .calibrate = calibrate_8976, > .get_temp = get_temp_tsens_valid, > }; > > -/* Valid for both MSM8956 and MSM8976. */ > struct tsens_plat_data data_8976 = { > .num_sensors = 11, > .ops = &ops_8976, > diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c > index b5b136ff323f..b191e19df93d 100644 > --- a/drivers/thermal/qcom/tsens.c > +++ b/drivers/thermal/qcom/tsens.c > @@ -983,6 +983,9 @@ static const struct of_device_id tsens_table[] = { > }, { > .compatible = "qcom,msm8939-tsens", > .data = &data_8939, > + }, { > + .compatible = "qcom,msm8956-tsens", > + .data = &data_8956, > }, { > .compatible = "qcom,msm8960-tsens", > .data = &data_8960, > diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h > index 899af128855f..7dd5fc246894 100644 > --- a/drivers/thermal/qcom/tsens.h > +++ b/drivers/thermal/qcom/tsens.h > @@ -594,7 +594,7 @@ extern struct tsens_plat_data data_8960; > extern struct tsens_plat_data data_8916, data_8939, data_8974, data_9607; > > /* TSENS v1 targets */ > -extern struct tsens_plat_data data_tsens_v1, data_8976; > +extern struct tsens_plat_data data_tsens_v1, data_8976, data_8956; > > /* TSENS v2 targets */ > extern struct tsens_plat_data data_8996, data_ipq8074, data_tsens_v2;