2022-09-09 08:00:29

by Amjad Ouled-Ameur

[permalink] [raw]
Subject: [PATCH v4 0/4] thermal: mediatek: Add support for MT8365 SoC

This patchset adds thermal support for MT8365 SoC which contains three
thermal sensors.

Changes in V4:
- rebased on thermal/linux-next
- Use callback for raw_to_mcelsius()
- Use struct 'struct thermal_zone_device_ops' instead of
no longer existent 'struct thermal_zone_of_device_ops'

Amjad Ouled-Ameur (1):
thermal: mediatek: add another get_temp ops for thermal sensors

Fabien Parent (2):
dt-bindings: thermal: mediatek: add binding documentation for MT8365
SoC
thermal: mediatek: add support for MT8365 SoC

Markus Schneider-Pargmann (1):
thermal: mediatek: control buffer enablement tweaks

.../bindings/thermal/mediatek-thermal.txt | 1 +
drivers/thermal/mtk_thermal.c | 197 +++++++++++++++---
2 files changed, 166 insertions(+), 32 deletions(-)

--
2.37.3


2022-09-09 08:16:19

by Amjad Ouled-Ameur

[permalink] [raw]
Subject: [PATCH v4 4/4] thermal: mediatek: add another get_temp ops for thermal sensors

Provide thermal zone to read thermal sensor in the SoC. We can read all the
thermal sensors value in the SoC by the node /sys/class/thermal/

In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS
on the first read of sensor that often are bogus values.
This can avoid following warning on boot:

thermal thermal_zone6: failed to read out thermal zone (-13)

Signed-off-by: Michael Kao <[email protected]>
Signed-off-by: Hsin-Yi Wang <[email protected]>
Signed-off-by: Amjad Ouled-Ameur <[email protected]>
---
Changes in V4:
- Use callback for raw_to_mcelsius()
- Use struct 'struct thermal_zone_device_ops' instead of
no longer existent 'struct thermal_zone_of_device_ops'

drivers/thermal/mtk_thermal.c | 104 ++++++++++++++++++++++++++--------
1 file changed, 79 insertions(+), 25 deletions(-)

diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c
index 3a5df1440822..311ad611fdab 100644
--- a/drivers/thermal/mtk_thermal.c
+++ b/drivers/thermal/mtk_thermal.c
@@ -259,6 +259,11 @@ enum mtk_thermal_version {

struct mtk_thermal;

+struct mtk_thermal_zone {
+ struct mtk_thermal *mt;
+ int id;
+};
+
struct thermal_bank_cfg {
unsigned int num_sensors;
const int *sensors;
@@ -307,6 +312,8 @@ struct mtk_thermal {

const struct mtk_thermal_data *conf;
struct mtk_thermal_bank banks[MAX_NUM_ZONES];
+
+ int (*raw_to_mcelsius)(struct mtk_thermal *mt, int sensno, s32 raw);
};

/* MT8183 thermal sensor data */
@@ -709,6 +716,29 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank)
mutex_unlock(&mt->lock);
}

+static int _get_sensor_temp(struct mtk_thermal *mt, int id)
+{
+ u32 raw;
+ int temp;
+
+ const struct mtk_thermal_data *conf = mt->conf;
+
+ raw = readl(mt->thermal_base + conf->msr[id]);
+
+ temp = mt->raw_to_mcelsius(mt, id, raw);
+
+ /*
+ * The first read of a sensor often contains very high bogus
+ * temperature value. Filter these out so that the system does
+ * not immediately shut down.
+ */
+
+ if (temp > 200000)
+ return -EAGAIN;
+ else
+ return temp;
+}
+
/**
* mtk_thermal_bank_temperature - get the temperature of a bank
* @bank: The bank
@@ -721,26 +751,9 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank)
struct mtk_thermal *mt = bank->mt;
const struct mtk_thermal_data *conf = mt->conf;
int i, temp = INT_MIN, max = INT_MIN;
- u32 raw;

for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) {
- raw = readl(mt->thermal_base + conf->msr[i]);
-
- if (mt->conf->version == MTK_THERMAL_V1) {
- temp = raw_to_mcelsius_v1(
- mt, conf->bank_data[bank->id].sensors[i], raw);
- } else {
- temp = raw_to_mcelsius_v2(
- mt, conf->bank_data[bank->id].sensors[i], raw);
- }
-
- /*
- * The first read of a sensor often contains very high bogus
- * temperature value. Filter these out so that the system does
- * not immediately shut down.
- */
- if (temp > 200000)
- temp = 0;
+ temp = _get_sensor_temp(mt, i);

if (temp > max)
max = temp;
@@ -749,9 +762,10 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank)
return max;
}

-static int mtk_read_temp(struct thermal_zone_device *tz, int *temperature)
+static int mtk_read_temp(struct thermal_zone_device *tzdev, int *temperature)
{
- struct mtk_thermal *mt = tz->devdata;
+ struct mtk_thermal_zone *tz = tzdev->devdata;
+ struct mtk_thermal *mt = tz->mt;
int i;
int tempmax = INT_MIN;

@@ -770,10 +784,28 @@ static int mtk_read_temp(struct thermal_zone_device *tz, int *temperature)
return 0;
}

+static int mtk_read_sensor_temp(struct thermal_zone_device *tzdev, int *temperature)
+{
+ struct mtk_thermal_zone *tz = tzdev->devdata;
+ struct mtk_thermal *mt = tz->mt;
+ int id = tz->id - 1;
+
+ if (id < 0)
+ return -EACCES;
+
+ *temperature = _get_sensor_temp(mt, id);
+
+ return 0;
+}
+
static const struct thermal_zone_device_ops mtk_thermal_ops = {
.get_temp = mtk_read_temp,
};

+static const struct thermal_zone_device_ops mtk_thermal_sensor_ops = {
+ .get_temp = mtk_read_sensor_temp,
+};
+
static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num,
u32 apmixed_phys_base, u32 auxadc_phys_base,
int ctrl_id)
@@ -1072,6 +1104,7 @@ static int mtk_thermal_probe(struct platform_device *pdev)
u64 auxadc_phys_base, apmixed_phys_base;
struct thermal_zone_device *tzdev;
void __iomem *apmixed_base, *auxadc_base;
+ struct mtk_thermal_zone *tz;

mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL);
if (!mt)
@@ -1150,6 +1183,9 @@ static int mtk_thermal_probe(struct platform_device *pdev)

mtk_thermal_turn_on_buffer(mt, apmixed_base);

+ mt->raw_to_mcelsius = (mt->conf->version == MTK_THERMAL_V1) ?
+ raw_to_mcelsius_v1 : raw_to_mcelsius_v2;
+
if (mt->conf->version == MTK_THERMAL_V2) {
mtk_thermal_release_periodic_ts(mt, auxadc_base);
}
@@ -1161,11 +1197,29 @@ static int mtk_thermal_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, mt);

- tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
- &mtk_thermal_ops);
- if (IS_ERR(tzdev)) {
- ret = PTR_ERR(tzdev);
- goto err_disable_clk_peri_therm;
+ for (i = 0; i < mt->conf->num_sensors + 1; i++) {
+ tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL);
+ if (!tz)
+ return -ENOMEM;
+
+ tz->mt = mt;
+ tz->id = i;
+
+ tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ?
+ &mtk_thermal_ops :
+ &mtk_thermal_sensor_ops);
+
+ if (IS_ERR(tzdev)) {
+ if (PTR_ERR(tzdev) == -ENODEV) {
+ dev_warn(&pdev->dev,
+ "sensor %d not registered in thermal zone in dt\n", i);
+ continue;
+ }
+ if (PTR_ERR(tzdev) == -EACCES) {
+ ret = PTR_ERR(tzdev);
+ goto err_disable_clk_peri_therm;
+ }
+ }
}

ret = devm_thermal_add_hwmon_sysfs(tzdev);
--
2.37.3

2022-09-09 08:28:29

by Amjad Ouled-Ameur

[permalink] [raw]
Subject: [PATCH v4 3/4] thermal: mediatek: add support for MT8365 SoC

From: Fabien Parent <[email protected]>

MT8365 is similar to the other SoCs supported by the driver. It has only
one bank and 3 actual sensors that can be multiplexed. There is another
one sensor that does not have usable data.

Signed-off-by: Fabien Parent <[email protected]>
Signed-off-by: Amjad Ouled-Ameur <[email protected]>
---
drivers/thermal/mtk_thermal.c | 68 +++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)

diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c
index d8ddceb75372..3a5df1440822 100644
--- a/drivers/thermal/mtk_thermal.c
+++ b/drivers/thermal/mtk_thermal.c
@@ -31,6 +31,7 @@
#define AUXADC_CON2_V 0x010
#define AUXADC_DATA(channel) (0x14 + (channel) * 4)

+#define APMIXED_SYS_TS_CON0 0x600
#define APMIXED_SYS_TS_CON1 0x604

/* Thermal Controller Registers */
@@ -245,6 +246,17 @@ enum mtk_thermal_version {
/* The calibration coefficient of sensor */
#define MT8183_CALIBRATION 153

+/* MT8365 */
+#define MT8365_TEMP_AUXADC_CHANNEL 11
+#define MT8365_CALIBRATION 164
+#define MT8365_NUM_CONTROLLER 1
+#define MT8365_NUM_BANKS 1
+#define MT8365_NUM_SENSORS 3
+#define MT8365_NUM_SENSORS_PER_ZONE 3
+#define MT8365_TS1 0
+#define MT8365_TS2 1
+#define MT8365_TS3 2
+
struct mtk_thermal;

struct thermal_bank_cfg {
@@ -389,6 +401,24 @@ static const int mt7622_mux_values[MT7622_NUM_SENSORS] = { 0, };
static const int mt7622_vts_index[MT7622_NUM_SENSORS] = { VTS1 };
static const int mt7622_tc_offset[MT7622_NUM_CONTROLLER] = { 0x0, };

+/* MT8365 thermal sensor data */
+static const int mt8365_bank_data[MT8365_NUM_SENSORS] = {
+ MT8365_TS1, MT8365_TS2, MT8365_TS3
+};
+
+static const int mt8365_msr[MT8365_NUM_SENSORS_PER_ZONE] = {
+ TEMP_MSR0, TEMP_MSR1, TEMP_MSR2
+};
+
+static const int mt8365_adcpnp[MT8365_NUM_SENSORS_PER_ZONE] = {
+ TEMP_ADCPNP0, TEMP_ADCPNP1, TEMP_ADCPNP2
+};
+
+static const int mt8365_mux_values[MT8365_NUM_SENSORS] = { 0, 1, 2 };
+static const int mt8365_tc_offset[MT8365_NUM_CONTROLLER] = { 0 };
+
+static const int mt8365_vts_index[MT8365_NUM_SENSORS] = { VTS1, VTS2, VTS3 };
+
/*
* The MT8173 thermal controller has four banks. Each bank can read up to
* four temperature sensors simultaneously. The MT8173 has a total of 5
@@ -463,6 +493,40 @@ static const struct mtk_thermal_data mt2701_thermal_data = {
.version = MTK_THERMAL_V1,
};

+/*
+ * The MT8365 thermal controller has one bank, which can read up to
+ * four temperature sensors simultaneously. The MT8365 has a total of 3
+ * temperature sensors.
+ *
+ * The thermal core only gets the maximum temperature of this one bank,
+ * so the bank concept wouldn't be necessary here. However, the SVS (Smart
+ * Voltage Scaling) unit makes its decisions based on the same bank
+ * data.
+ */
+static const struct mtk_thermal_data mt8365_thermal_data = {
+ .auxadc_channel = MT8365_TEMP_AUXADC_CHANNEL,
+ .num_banks = MT8365_NUM_BANKS,
+ .num_sensors = MT8365_NUM_SENSORS,
+ .vts_index = mt8365_vts_index,
+ .cali_val = MT8365_CALIBRATION,
+ .num_controller = MT8365_NUM_CONTROLLER,
+ .controller_offset = mt8365_tc_offset,
+ .need_switch_bank = false,
+ .bank_data = {
+ {
+ .num_sensors = MT8365_NUM_SENSORS,
+ .sensors = mt8365_bank_data
+ },
+ },
+ .msr = mt8365_msr,
+ .adcpnp = mt8365_adcpnp,
+ .sensor_mux_values = mt8365_mux_values,
+ .version = MTK_THERMAL_V1,
+ .apmixed_buffer_ctl_reg = APMIXED_SYS_TS_CON0,
+ .apmixed_buffer_ctl_mask = (u32) ~GENMASK(29, 28),
+ .apmixed_buffer_ctl_set = 0,
+};
+
/*
* The MT2712 thermal controller has one bank, which can read up to
* four temperature sensors simultaneously. The MT2712 has a total of 4
@@ -964,6 +1028,10 @@ static const struct of_device_id mtk_thermal_of_match[] = {
{
.compatible = "mediatek,mt8183-thermal",
.data = (void *)&mt8183_thermal_data,
+ },
+ {
+ .compatible = "mediatek,mt8365-thermal",
+ .data = (void *)&mt8365_thermal_data,
}, {
},
};
--
2.37.3

Subject: Re: [PATCH v4 3/4] thermal: mediatek: add support for MT8365 SoC

Il 09/09/22 09:36, Amjad Ouled-Ameur ha scritto:
> From: Fabien Parent <[email protected]>
>
> MT8365 is similar to the other SoCs supported by the driver. It has only
> one bank and 3 actual sensors that can be multiplexed. There is another
> one sensor that does not have usable data.
>
> Signed-off-by: Fabien Parent <[email protected]>
> Signed-off-by: Amjad Ouled-Ameur <[email protected]>

Reviewed-by: AngeloGioacchino Del Regno <[email protected]>


Subject: Re: [PATCH v4 4/4] thermal: mediatek: add another get_temp ops for thermal sensors

Il 09/09/22 09:36, Amjad Ouled-Ameur ha scritto:
> Provide thermal zone to read thermal sensor in the SoC. We can read all the
> thermal sensors value in the SoC by the node /sys/class/thermal/
>
> In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS
> on the first read of sensor that often are bogus values.
> This can avoid following warning on boot:
>
> thermal thermal_zone6: failed to read out thermal zone (-13)
>
> Signed-off-by: Michael Kao <[email protected]>
> Signed-off-by: Hsin-Yi Wang <[email protected]>
> Signed-off-by: Amjad Ouled-Ameur <[email protected]>

Reviewed-by: AngeloGioacchino Del Regno <[email protected]>


2022-09-15 17:49:07

by Daniel Lezcano

[permalink] [raw]
Subject: Re: [PATCH v4 0/4] thermal: mediatek: Add support for MT8365 SoC

On 09/09/2022 09:36, Amjad Ouled-Ameur wrote:
> This patchset adds thermal support for MT8365 SoC which contains three
> thermal sensors.
>
> Changes in V4:
> - rebased on thermal/linux-next
> - Use callback for raw_to_mcelsius()
> - Use struct 'struct thermal_zone_device_ops' instead of
> no longer existent 'struct thermal_zone_of_device_ops'
>
> Amjad Ouled-Ameur (1):
> thermal: mediatek: add another get_temp ops for thermal sensors
>
> Fabien Parent (2):
> dt-bindings: thermal: mediatek: add binding documentation for MT8365
> SoC
> thermal: mediatek: add support for MT8365 SoC
>
> Markus Schneider-Pargmann (1):
> thermal: mediatek: control buffer enablement tweaks
>
> .../bindings/thermal/mediatek-thermal.txt | 1 +
> drivers/thermal/mtk_thermal.c | 197 +++++++++++++++---
> 2 files changed, 166 insertions(+), 32 deletions(-)

The series does not apply on the thermal tree.

Please refresh the series against:

https://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux.git/log/?h=thermal/linux-next

Thanks

-- D.

--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog