Message ID | 1588238074-19338-2-git-send-email-henry.yen@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Mediatek thermal driver update | expand |
On Thu, 2020-04-30 at 17:14 +0800, Henry Yen wrote: > It is known that Mediatek owns two thermal systems, which only differ > in the way of reading calibration data and converting temperature. > MT8173, MT8183, MT2701 and MT2712 belongs to version 1 thermal > system, and MT7622 belongs to version 2. > > In order to handle both systems, the suffix _V1 is appended to the > current code, and then the second patch will add _V2 functions with > the same purpose but different implementation. > > Signed-off-by: Henry Yen <henry.yen@mediatek.com> > --- > drivers/thermal/mtk_thermal.c | 114 ++++++++++++++++++---------------- > 1 file changed, 62 insertions(+), 52 deletions(-) > > diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c > index 76e30603d4d5..10107d9d56a8 100644 > --- a/drivers/thermal/mtk_thermal.c > +++ b/drivers/thermal/mtk_thermal.c > @@ -120,18 +120,18 @@ > * MT2701 has 3 sensors and needs 3 VTS calibration data. > * MT2712 has 4 sensors and needs 4 VTS calibration data. > */ > -#define CALIB_BUF0_VALID BIT(0) > -#define CALIB_BUF1_ADC_GE(x) (((x) >> 22) & 0x3ff) > -#define CALIB_BUF0_VTS_TS1(x) (((x) >> 17) & 0x1ff) > -#define CALIB_BUF0_VTS_TS2(x) (((x) >> 8) & 0x1ff) > -#define CALIB_BUF1_VTS_TS3(x) (((x) >> 0) & 0x1ff) > -#define CALIB_BUF2_VTS_TS4(x) (((x) >> 23) & 0x1ff) > -#define CALIB_BUF2_VTS_TS5(x) (((x) >> 5) & 0x1ff) > -#define CALIB_BUF2_VTS_TSABB(x) (((x) >> 14) & 0x1ff) > -#define CALIB_BUF0_DEGC_CALI(x) (((x) >> 1) & 0x3f) > -#define CALIB_BUF0_O_SLOPE(x) (((x) >> 26) & 0x3f) > -#define CALIB_BUF0_O_SLOPE_SIGN(x) (((x) >> 7) & 0x1) > -#define CALIB_BUF1_ID(x) (((x) >> 9) & 0x1) > +#define CALIB_BUF0_VALID_V1 BIT(0) > +#define CALIB_BUF1_ADC_GE_V1(x) (((x) >> 22) & 0x3ff) > +#define CALIB_BUF0_VTS_TS1_V1(x) (((x) >> 17) & 0x1ff) > +#define CALIB_BUF0_VTS_TS2_V1(x) (((x) >> 8) & 0x1ff) > +#define CALIB_BUF1_VTS_TS3_V1(x) (((x) >> 0) & 0x1ff) > +#define CALIB_BUF2_VTS_TS4_V1(x) (((x) >> 23) & 0x1ff) > +#define CALIB_BUF2_VTS_TS5_V1(x) (((x) >> 5) & 0x1ff) > +#define CALIB_BUF2_VTS_TSABB_V1(x) (((x) >> 14) & 0x1ff) > +#define CALIB_BUF0_DEGC_CALI_V1(x) (((x) >> 1) & 0x3f) > +#define CALIB_BUF0_O_SLOPE_V1(x) (((x) >> 26) & 0x3f) > +#define CALIB_BUF0_O_SLOPE_SIGN_V1(x) (((x) >> 7) & 0x1) > +#define CALIB_BUF1_ID_V1(x) (((x) >> 9) & 0x1) > > enum { > VTS1, > @@ -525,7 +525,7 @@ static const struct mtk_thermal_data mt8183_thermal_data = { > * This converts the raw ADC value to mcelsius using the SoC specific > * calibration constants > */ > -static int raw_to_mcelsius(struct mtk_thermal *mt, int sensno, s32 raw) > +static int raw_to_mcelsius_v1(struct mtk_thermal *mt, int sensno, s32 raw) > { > s32 tmp; > > @@ -594,9 +594,9 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > raw = readl(mt->thermal_base + > conf->msr[conf->bank_data[bank->id].sensors[i]]); > > - temp = raw_to_mcelsius(mt, > - conf->bank_data[bank->id].sensors[i], > - raw); > + temp = raw_to_mcelsius_v1(mt, > + conf->bank_data[bank->id].sensors[i], > + raw); > > /* > * The first read of a sensor often contains very high bogus > @@ -758,6 +758,51 @@ static u64 of_get_phys_base(struct device_node *np) > return of_translate_address(np, regaddr_p); > } > > +static int mtk_thermal_extract_efuse_v1(struct mtk_thermal *mt, u32 *buf) > +{ > + int i; > + > + if (!(buf[0] & CALIB_BUF0_VALID_V1)) > + return -EINVAL; > + > + mt->adc_ge = CALIB_BUF1_ADC_GE_V1(buf[1]); > + > + for (i = 0; i < mt->conf->num_sensors; i++) { > + switch (mt->conf->vts_index[i]) { > + case VTS1: > + mt->vts[VTS1] = CALIB_BUF0_VTS_TS1_V1(buf[0]); > + break; > + case VTS2: > + mt->vts[VTS2] = CALIB_BUF0_VTS_TS2_V1(buf[0]); > + break; > + case VTS3: > + mt->vts[VTS3] = CALIB_BUF1_VTS_TS3_V1(buf[1]); > + break; > + case VTS4: > + mt->vts[VTS4] = CALIB_BUF2_VTS_TS4_V1(buf[2]); > + break; > + case VTS5: > + mt->vts[VTS5] = CALIB_BUF2_VTS_TS5_V1(buf[2]); > + break; > + case VTSABB: > + mt->vts[VTSABB] = > + CALIB_BUF2_VTS_TSABB_V1(buf[2]); > + break; > + default: > + break; > + } > + } > + > + mt->degc_cali = CALIB_BUF0_DEGC_CALI_V1(buf[0]); > + if (CALIB_BUF1_ID_V1(buf[1]) & > + CALIB_BUF0_O_SLOPE_SIGN_V1(buf[0])) > + mt->o_slope = -CALIB_BUF0_O_SLOPE_V1(buf[0]); > + else > + mt->o_slope = CALIB_BUF0_O_SLOPE_V1(buf[0]); > + > + return 0; > +} > + > static int mtk_thermal_get_calibration_data(struct device *dev, > struct mtk_thermal *mt) > { > @@ -793,43 +838,8 @@ static int mtk_thermal_get_calibration_data(struct device *dev, > goto out; > } > > - if (buf[0] & CALIB_BUF0_VALID) { > - mt->adc_ge = CALIB_BUF1_ADC_GE(buf[1]); > - > - for (i = 0; i < mt->conf->num_sensors; i++) { > - switch (mt->conf->vts_index[i]) { > - case VTS1: > - mt->vts[VTS1] = CALIB_BUF0_VTS_TS1(buf[0]); > - break; > - case VTS2: > - mt->vts[VTS2] = CALIB_BUF0_VTS_TS2(buf[0]); > - break; > - case VTS3: > - mt->vts[VTS3] = CALIB_BUF1_VTS_TS3(buf[1]); > - break; > - case VTS4: > - mt->vts[VTS4] = CALIB_BUF2_VTS_TS4(buf[2]); > - break; > - case VTS5: > - mt->vts[VTS5] = CALIB_BUF2_VTS_TS5(buf[2]); > - break; > - case VTSABB: > - mt->vts[VTSABB] = CALIB_BUF2_VTS_TSABB(buf[2]); > - break; > - default: > - break; > - } > - } > - > - mt->degc_cali = CALIB_BUF0_DEGC_CALI(buf[0]); > - if (CALIB_BUF1_ID(buf[1]) & > - CALIB_BUF0_O_SLOPE_SIGN(buf[0])) > - mt->o_slope = -CALIB_BUF0_O_SLOPE(buf[0]); > - else > - mt->o_slope = CALIB_BUF0_O_SLOPE(buf[0]); > - } else { > + if (mtk_thermal_extract_efuse_v1(mt, buf)) > dev_info(dev, "Device not calibrated, using default calibration values\n"); > - } > > out: > kfree(buf); Just gently ping. Many thanks.
On 30/04/2020 11:14, Henry Yen wrote: > It is known that Mediatek owns two thermal systems, which only differ > in the way of reading calibration data and converting temperature. > MT8173, MT8183, MT2701 and MT2712 belongs to version 1 thermal > system, and MT7622 belongs to version 2. > > In order to handle both systems, the suffix _V1 is appended to the > current code, and then the second patch will add _V2 functions with > the same purpose but different implementation. > > Signed-off-by: Henry Yen <henry.yen@mediatek.com> Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com> > --- > drivers/thermal/mtk_thermal.c | 114 ++++++++++++++++++---------------- > 1 file changed, 62 insertions(+), 52 deletions(-) > > diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c > index 76e30603d4d5..10107d9d56a8 100644 > --- a/drivers/thermal/mtk_thermal.c > +++ b/drivers/thermal/mtk_thermal.c > @@ -120,18 +120,18 @@ > * MT2701 has 3 sensors and needs 3 VTS calibration data. > * MT2712 has 4 sensors and needs 4 VTS calibration data. > */ > -#define CALIB_BUF0_VALID BIT(0) > -#define CALIB_BUF1_ADC_GE(x) (((x) >> 22) & 0x3ff) > -#define CALIB_BUF0_VTS_TS1(x) (((x) >> 17) & 0x1ff) > -#define CALIB_BUF0_VTS_TS2(x) (((x) >> 8) & 0x1ff) > -#define CALIB_BUF1_VTS_TS3(x) (((x) >> 0) & 0x1ff) > -#define CALIB_BUF2_VTS_TS4(x) (((x) >> 23) & 0x1ff) > -#define CALIB_BUF2_VTS_TS5(x) (((x) >> 5) & 0x1ff) > -#define CALIB_BUF2_VTS_TSABB(x) (((x) >> 14) & 0x1ff) > -#define CALIB_BUF0_DEGC_CALI(x) (((x) >> 1) & 0x3f) > -#define CALIB_BUF0_O_SLOPE(x) (((x) >> 26) & 0x3f) > -#define CALIB_BUF0_O_SLOPE_SIGN(x) (((x) >> 7) & 0x1) > -#define CALIB_BUF1_ID(x) (((x) >> 9) & 0x1) > +#define CALIB_BUF0_VALID_V1 BIT(0) > +#define CALIB_BUF1_ADC_GE_V1(x) (((x) >> 22) & 0x3ff) > +#define CALIB_BUF0_VTS_TS1_V1(x) (((x) >> 17) & 0x1ff) > +#define CALIB_BUF0_VTS_TS2_V1(x) (((x) >> 8) & 0x1ff) > +#define CALIB_BUF1_VTS_TS3_V1(x) (((x) >> 0) & 0x1ff) > +#define CALIB_BUF2_VTS_TS4_V1(x) (((x) >> 23) & 0x1ff) > +#define CALIB_BUF2_VTS_TS5_V1(x) (((x) >> 5) & 0x1ff) > +#define CALIB_BUF2_VTS_TSABB_V1(x) (((x) >> 14) & 0x1ff) > +#define CALIB_BUF0_DEGC_CALI_V1(x) (((x) >> 1) & 0x3f) > +#define CALIB_BUF0_O_SLOPE_V1(x) (((x) >> 26) & 0x3f) > +#define CALIB_BUF0_O_SLOPE_SIGN_V1(x) (((x) >> 7) & 0x1) > +#define CALIB_BUF1_ID_V1(x) (((x) >> 9) & 0x1) > > enum { > VTS1, > @@ -525,7 +525,7 @@ static const struct mtk_thermal_data mt8183_thermal_data = { > * This converts the raw ADC value to mcelsius using the SoC specific > * calibration constants > */ > -static int raw_to_mcelsius(struct mtk_thermal *mt, int sensno, s32 raw) > +static int raw_to_mcelsius_v1(struct mtk_thermal *mt, int sensno, s32 raw) > { > s32 tmp; > > @@ -594,9 +594,9 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > raw = readl(mt->thermal_base + > conf->msr[conf->bank_data[bank->id].sensors[i]]); > > - temp = raw_to_mcelsius(mt, > - conf->bank_data[bank->id].sensors[i], > - raw); > + temp = raw_to_mcelsius_v1(mt, > + conf->bank_data[bank->id].sensors[i], > + raw); > > /* > * The first read of a sensor often contains very high bogus > @@ -758,6 +758,51 @@ static u64 of_get_phys_base(struct device_node *np) > return of_translate_address(np, regaddr_p); > } > > +static int mtk_thermal_extract_efuse_v1(struct mtk_thermal *mt, u32 *buf) > +{ > + int i; > + > + if (!(buf[0] & CALIB_BUF0_VALID_V1)) > + return -EINVAL; > + > + mt->adc_ge = CALIB_BUF1_ADC_GE_V1(buf[1]); > + > + for (i = 0; i < mt->conf->num_sensors; i++) { > + switch (mt->conf->vts_index[i]) { > + case VTS1: > + mt->vts[VTS1] = CALIB_BUF0_VTS_TS1_V1(buf[0]); > + break; > + case VTS2: > + mt->vts[VTS2] = CALIB_BUF0_VTS_TS2_V1(buf[0]); > + break; > + case VTS3: > + mt->vts[VTS3] = CALIB_BUF1_VTS_TS3_V1(buf[1]); > + break; > + case VTS4: > + mt->vts[VTS4] = CALIB_BUF2_VTS_TS4_V1(buf[2]); > + break; > + case VTS5: > + mt->vts[VTS5] = CALIB_BUF2_VTS_TS5_V1(buf[2]); > + break; > + case VTSABB: > + mt->vts[VTSABB] = > + CALIB_BUF2_VTS_TSABB_V1(buf[2]); > + break; > + default: > + break; > + } > + } > + > + mt->degc_cali = CALIB_BUF0_DEGC_CALI_V1(buf[0]); > + if (CALIB_BUF1_ID_V1(buf[1]) & > + CALIB_BUF0_O_SLOPE_SIGN_V1(buf[0])) > + mt->o_slope = -CALIB_BUF0_O_SLOPE_V1(buf[0]); > + else > + mt->o_slope = CALIB_BUF0_O_SLOPE_V1(buf[0]); > + > + return 0; > +} > + > static int mtk_thermal_get_calibration_data(struct device *dev, > struct mtk_thermal *mt) > { > @@ -793,43 +838,8 @@ static int mtk_thermal_get_calibration_data(struct device *dev, > goto out; > } > > - if (buf[0] & CALIB_BUF0_VALID) { > - mt->adc_ge = CALIB_BUF1_ADC_GE(buf[1]); > - > - for (i = 0; i < mt->conf->num_sensors; i++) { > - switch (mt->conf->vts_index[i]) { > - case VTS1: > - mt->vts[VTS1] = CALIB_BUF0_VTS_TS1(buf[0]); > - break; > - case VTS2: > - mt->vts[VTS2] = CALIB_BUF0_VTS_TS2(buf[0]); > - break; > - case VTS3: > - mt->vts[VTS3] = CALIB_BUF1_VTS_TS3(buf[1]); > - break; > - case VTS4: > - mt->vts[VTS4] = CALIB_BUF2_VTS_TS4(buf[2]); > - break; > - case VTS5: > - mt->vts[VTS5] = CALIB_BUF2_VTS_TS5(buf[2]); > - break; > - case VTSABB: > - mt->vts[VTSABB] = CALIB_BUF2_VTS_TSABB(buf[2]); > - break; > - default: > - break; > - } > - } > - > - mt->degc_cali = CALIB_BUF0_DEGC_CALI(buf[0]); > - if (CALIB_BUF1_ID(buf[1]) & > - CALIB_BUF0_O_SLOPE_SIGN(buf[0])) > - mt->o_slope = -CALIB_BUF0_O_SLOPE(buf[0]); > - else > - mt->o_slope = CALIB_BUF0_O_SLOPE(buf[0]); > - } else { > + if (mtk_thermal_extract_efuse_v1(mt, buf)) > dev_info(dev, "Device not calibrated, using default calibration values\n"); > - } > > out: > kfree(buf); >
Tested on bpi-r64 and r2, i hope this can be merged to next / 5.9
Tested-By: Frank Wunderlich <frank-w@public-files.de>
regards Frank
diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c index 76e30603d4d5..10107d9d56a8 100644 --- a/drivers/thermal/mtk_thermal.c +++ b/drivers/thermal/mtk_thermal.c @@ -120,18 +120,18 @@ * MT2701 has 3 sensors and needs 3 VTS calibration data. * MT2712 has 4 sensors and needs 4 VTS calibration data. */ -#define CALIB_BUF0_VALID BIT(0) -#define CALIB_BUF1_ADC_GE(x) (((x) >> 22) & 0x3ff) -#define CALIB_BUF0_VTS_TS1(x) (((x) >> 17) & 0x1ff) -#define CALIB_BUF0_VTS_TS2(x) (((x) >> 8) & 0x1ff) -#define CALIB_BUF1_VTS_TS3(x) (((x) >> 0) & 0x1ff) -#define CALIB_BUF2_VTS_TS4(x) (((x) >> 23) & 0x1ff) -#define CALIB_BUF2_VTS_TS5(x) (((x) >> 5) & 0x1ff) -#define CALIB_BUF2_VTS_TSABB(x) (((x) >> 14) & 0x1ff) -#define CALIB_BUF0_DEGC_CALI(x) (((x) >> 1) & 0x3f) -#define CALIB_BUF0_O_SLOPE(x) (((x) >> 26) & 0x3f) -#define CALIB_BUF0_O_SLOPE_SIGN(x) (((x) >> 7) & 0x1) -#define CALIB_BUF1_ID(x) (((x) >> 9) & 0x1) +#define CALIB_BUF0_VALID_V1 BIT(0) +#define CALIB_BUF1_ADC_GE_V1(x) (((x) >> 22) & 0x3ff) +#define CALIB_BUF0_VTS_TS1_V1(x) (((x) >> 17) & 0x1ff) +#define CALIB_BUF0_VTS_TS2_V1(x) (((x) >> 8) & 0x1ff) +#define CALIB_BUF1_VTS_TS3_V1(x) (((x) >> 0) & 0x1ff) +#define CALIB_BUF2_VTS_TS4_V1(x) (((x) >> 23) & 0x1ff) +#define CALIB_BUF2_VTS_TS5_V1(x) (((x) >> 5) & 0x1ff) +#define CALIB_BUF2_VTS_TSABB_V1(x) (((x) >> 14) & 0x1ff) +#define CALIB_BUF0_DEGC_CALI_V1(x) (((x) >> 1) & 0x3f) +#define CALIB_BUF0_O_SLOPE_V1(x) (((x) >> 26) & 0x3f) +#define CALIB_BUF0_O_SLOPE_SIGN_V1(x) (((x) >> 7) & 0x1) +#define CALIB_BUF1_ID_V1(x) (((x) >> 9) & 0x1) enum { VTS1, @@ -525,7 +525,7 @@ static const struct mtk_thermal_data mt8183_thermal_data = { * This converts the raw ADC value to mcelsius using the SoC specific * calibration constants */ -static int raw_to_mcelsius(struct mtk_thermal *mt, int sensno, s32 raw) +static int raw_to_mcelsius_v1(struct mtk_thermal *mt, int sensno, s32 raw) { s32 tmp; @@ -594,9 +594,9 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) raw = readl(mt->thermal_base + conf->msr[conf->bank_data[bank->id].sensors[i]]); - temp = raw_to_mcelsius(mt, - conf->bank_data[bank->id].sensors[i], - raw); + temp = raw_to_mcelsius_v1(mt, + conf->bank_data[bank->id].sensors[i], + raw); /* * The first read of a sensor often contains very high bogus @@ -758,6 +758,51 @@ static u64 of_get_phys_base(struct device_node *np) return of_translate_address(np, regaddr_p); } +static int mtk_thermal_extract_efuse_v1(struct mtk_thermal *mt, u32 *buf) +{ + int i; + + if (!(buf[0] & CALIB_BUF0_VALID_V1)) + return -EINVAL; + + mt->adc_ge = CALIB_BUF1_ADC_GE_V1(buf[1]); + + for (i = 0; i < mt->conf->num_sensors; i++) { + switch (mt->conf->vts_index[i]) { + case VTS1: + mt->vts[VTS1] = CALIB_BUF0_VTS_TS1_V1(buf[0]); + break; + case VTS2: + mt->vts[VTS2] = CALIB_BUF0_VTS_TS2_V1(buf[0]); + break; + case VTS3: + mt->vts[VTS3] = CALIB_BUF1_VTS_TS3_V1(buf[1]); + break; + case VTS4: + mt->vts[VTS4] = CALIB_BUF2_VTS_TS4_V1(buf[2]); + break; + case VTS5: + mt->vts[VTS5] = CALIB_BUF2_VTS_TS5_V1(buf[2]); + break; + case VTSABB: + mt->vts[VTSABB] = + CALIB_BUF2_VTS_TSABB_V1(buf[2]); + break; + default: + break; + } + } + + mt->degc_cali = CALIB_BUF0_DEGC_CALI_V1(buf[0]); + if (CALIB_BUF1_ID_V1(buf[1]) & + CALIB_BUF0_O_SLOPE_SIGN_V1(buf[0])) + mt->o_slope = -CALIB_BUF0_O_SLOPE_V1(buf[0]); + else + mt->o_slope = CALIB_BUF0_O_SLOPE_V1(buf[0]); + + return 0; +} + static int mtk_thermal_get_calibration_data(struct device *dev, struct mtk_thermal *mt) { @@ -793,43 +838,8 @@ static int mtk_thermal_get_calibration_data(struct device *dev, goto out; } - if (buf[0] & CALIB_BUF0_VALID) { - mt->adc_ge = CALIB_BUF1_ADC_GE(buf[1]); - - for (i = 0; i < mt->conf->num_sensors; i++) { - switch (mt->conf->vts_index[i]) { - case VTS1: - mt->vts[VTS1] = CALIB_BUF0_VTS_TS1(buf[0]); - break; - case VTS2: - mt->vts[VTS2] = CALIB_BUF0_VTS_TS2(buf[0]); - break; - case VTS3: - mt->vts[VTS3] = CALIB_BUF1_VTS_TS3(buf[1]); - break; - case VTS4: - mt->vts[VTS4] = CALIB_BUF2_VTS_TS4(buf[2]); - break; - case VTS5: - mt->vts[VTS5] = CALIB_BUF2_VTS_TS5(buf[2]); - break; - case VTSABB: - mt->vts[VTSABB] = CALIB_BUF2_VTS_TSABB(buf[2]); - break; - default: - break; - } - } - - mt->degc_cali = CALIB_BUF0_DEGC_CALI(buf[0]); - if (CALIB_BUF1_ID(buf[1]) & - CALIB_BUF0_O_SLOPE_SIGN(buf[0])) - mt->o_slope = -CALIB_BUF0_O_SLOPE(buf[0]); - else - mt->o_slope = CALIB_BUF0_O_SLOPE(buf[0]); - } else { + if (mtk_thermal_extract_efuse_v1(mt, buf)) dev_info(dev, "Device not calibrated, using default calibration values\n"); - } out: kfree(buf);
It is known that Mediatek owns two thermal systems, which only differ in the way of reading calibration data and converting temperature. MT8173, MT8183, MT2701 and MT2712 belongs to version 1 thermal system, and MT7622 belongs to version 2. In order to handle both systems, the suffix _V1 is appended to the current code, and then the second patch will add _V2 functions with the same purpose but different implementation. Signed-off-by: Henry Yen <henry.yen@mediatek.com> --- drivers/thermal/mtk_thermal.c | 114 ++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 52 deletions(-)