Skip to content

Commit

Permalink
Merge back general thermal control changes for 6.4-rc1.
Browse files Browse the repository at this point in the history
  • Loading branch information
Rafael J. Wysocki committed Apr 14, 2023
2 parents 065ca2a + 75f74a9 commit cfeeb7d
Showing 20 changed files with 140 additions and 111 deletions.
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@ Required properties:
- "mediatek,mt7981-thermal", "mediatek,mt7986-thermal" : For MT7981 SoC
- "mediatek,mt7986-thermal" : For MT7986 SoC
- "mediatek,mt8183-thermal" : For MT8183 family of SoCs
- "mediatek,mt8365-thermal" : For MT8365 family of SoCs
- "mediatek,mt8516-thermal", "mediatek,mt2701-thermal : For MT8516 family of SoCs
- reg: Address range of the thermal controller
- interrupts: IRQ for the thermal controller
3 changes: 2 additions & 1 deletion drivers/thermal/Makefile
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@
#
# Makefile for sensor chip drivers.
#

CFLAGS_thermal_core.o := -I$(src)
obj-$(CONFIG_THERMAL) += thermal_sys.o
thermal_sys-y += thermal_core.o thermal_sysfs.o
thermal_sys-y += thermal_trip.o thermal_helpers.o
@@ -16,6 +16,7 @@ thermal_sys-$(CONFIG_THERMAL_OF) += thermal_of.o
thermal_sys-$(CONFIG_THERMAL_ACPI) += thermal_acpi.o

# governors
CFLAGS_gov_power_allocator.o := -I$(src)
thermal_sys-$(CONFIG_THERMAL_GOV_FAIR_SHARE) += gov_fair_share.o
thermal_sys-$(CONFIG_THERMAL_GOV_BANG_BANG) += gov_bang_bang.o
thermal_sys-$(CONFIG_THERMAL_GOV_STEP_WISE) += gov_step_wise.o
4 changes: 2 additions & 2 deletions drivers/thermal/cpufreq_cooling.c
Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@
#include <linux/thermal.h>
#include <linux/units.h>

#include <trace/events/thermal.h>
#include "thermal_trace.h"

/*
* Cooling state <-> CPUFreq frequency
@@ -633,7 +633,7 @@ of_cpufreq_cooling_register(struct cpufreq_policy *policy)
return NULL;
}

if (of_find_property(np, "#cooling-cells", NULL)) {
if (of_property_present(np, "#cooling-cells")) {
struct em_perf_domain *em = em_cpu_get(policy->cpu);

cdev = __cpufreq_cooling_register(np, policy, em);
7 changes: 5 additions & 2 deletions drivers/thermal/db8500_thermal.c
Original file line number Diff line number Diff line change
@@ -53,6 +53,7 @@ static const unsigned long db8500_thermal_points[] = {

struct db8500_thermal_zone {
struct thermal_zone_device *tz;
struct device *dev;
unsigned long interpolated_temp;
unsigned int cur_index;
};
@@ -114,7 +115,7 @@ static irqreturn_t prcmu_low_irq_handler(int irq, void *irq_data)
idx -= 1;

db8500_thermal_update_config(th, idx, next_low, next_high);
dev_dbg(&th->tz->device,
dev_dbg(th->dev,
"PRCMU set max %ld, min %ld\n", next_high, next_low);

thermal_zone_device_update(th->tz, THERMAL_EVENT_UNSPECIFIED);
@@ -136,7 +137,7 @@ static irqreturn_t prcmu_high_irq_handler(int irq, void *irq_data)

db8500_thermal_update_config(th, idx, next_low, next_high);

dev_dbg(&th->tz->device,
dev_dbg(th->dev,
"PRCMU set max %ld, min %ld\n", next_high, next_low);
} else if (idx == num_points - 1)
/* So we roof out 1 degree over the max point */
@@ -157,6 +158,8 @@ static int db8500_thermal_probe(struct platform_device *pdev)
if (!th)
return -ENOMEM;

th->dev = dev;

low_irq = platform_get_irq_byname(pdev, "IRQ_HOTMON_LOW");
if (low_irq < 0)
return low_irq;
2 changes: 1 addition & 1 deletion drivers/thermal/devfreq_cooling.c
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@
#include <linux/thermal.h>
#include <linux/units.h>

#include <trace/events/thermal.h>
#include "thermal_trace.h"

#define SCALE_ERROR_MITIGATION 100

2 changes: 1 addition & 1 deletion drivers/thermal/gov_fair_share.c
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@
*/

#include <linux/thermal.h>
#include <trace/events/thermal.h>
#include "thermal_trace.h"

#include "thermal_core.h"

2 changes: 1 addition & 1 deletion drivers/thermal/gov_power_allocator.c
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@
#include <linux/thermal.h>

#define CREATE_TRACE_POINTS
#include <trace/events/thermal_power_allocator.h>
#include "thermal_trace_ipa.h"

#include "thermal_core.h"

2 changes: 1 addition & 1 deletion drivers/thermal/gov_step_wise.c
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@

#include <linux/thermal.h>
#include <linux/minmax.h>
#include <trace/events/thermal.h>
#include "thermal_trace.h"

#include "thermal_core.h"

4 changes: 1 addition & 3 deletions drivers/thermal/hisi_thermal.c
Original file line number Diff line number Diff line change
@@ -544,7 +544,6 @@ static int hisi_thermal_probe(struct platform_device *pdev)
{
struct hisi_thermal_data *data;
struct device *dev = &pdev->dev;
struct resource *res;
int i, ret;

data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
@@ -555,8 +554,7 @@ static int hisi_thermal_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, data);
data->ops = of_device_get_match_data(dev);

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
data->regs = devm_ioremap_resource(dev, res);
data->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(data->regs))
return PTR_ERR(data->regs);

2 changes: 1 addition & 1 deletion drivers/thermal/imx8mm_thermal.c
Original file line number Diff line number Diff line change
@@ -282,7 +282,7 @@ static int imx8mm_tmu_probe_set_calib(struct platform_device *pdev,
* strongly recommended to update such old DTs to get correct
* temperature compensation values for each SoC.
*/
if (!of_find_property(pdev->dev.of_node, "nvmem-cells", NULL)) {
if (!of_property_present(pdev->dev.of_node, "nvmem-cells")) {
dev_warn(dev,
"No OCOTP nvmem reference found, SoC-specific calibration not loaded. Please update your DT.\n");
return 0;
23 changes: 9 additions & 14 deletions drivers/thermal/imx_thermal.c
Original file line number Diff line number Diff line change
@@ -330,33 +330,29 @@ static int imx_change_mode(struct thermal_zone_device *tz,
return 0;
}

static int imx_get_crit_temp(struct thermal_zone_device *tz, int *temp)
{
*temp = trips[IMX_TRIP_CRITICAL].temperature;

return 0;
}

static int imx_set_trip_temp(struct thermal_zone_device *tz, int trip,
static int imx_set_trip_temp(struct thermal_zone_device *tz, int trip_id,
int temp)
{
struct imx_thermal_data *data = thermal_zone_device_priv(tz);
struct thermal_trip trip;
int ret;

ret = pm_runtime_resume_and_get(data->dev);
if (ret < 0)
return ret;

ret = __thermal_zone_get_trip(tz, trip_id, &trip);
if (ret)
return ret;

/* do not allow changing critical threshold */
if (trip == IMX_TRIP_CRITICAL)
if (trip.type == THERMAL_TRIP_CRITICAL)
return -EPERM;

/* do not allow passive to be set higher than critical */
if (temp < 0 || temp > trips[IMX_TRIP_CRITICAL].temperature)
return -EINVAL;

trips[IMX_TRIP_PASSIVE].temperature = temp;

imx_set_alarm_temp(data, temp);

pm_runtime_put(data->dev);
@@ -384,7 +380,6 @@ static struct thermal_zone_device_ops imx_tz_ops = {
.unbind = imx_unbind,
.get_temp = imx_get_temp,
.change_mode = imx_change_mode,
.get_crit_temp = imx_get_crit_temp,
.set_trip_temp = imx_set_trip_temp,
};

@@ -571,7 +566,7 @@ static int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data)

np = of_get_cpu_node(data->policy->cpu, NULL);

if (!np || !of_find_property(np, "#cooling-cells", NULL)) {
if (!np || !of_property_present(np, "#cooling-cells")) {
data->cdev = cpufreq_cooling_register(data->policy);
if (IS_ERR(data->cdev)) {
ret = PTR_ERR(data->cdev);
@@ -648,7 +643,7 @@ static int imx_thermal_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, data);

if (of_find_property(pdev->dev.of_node, "nvmem-cells", NULL)) {
if (of_property_present(pdev->dev.of_node, "nvmem-cells")) {
ret = imx_init_from_nvmem_cells(pdev);
if (ret)
return dev_err_probe(&pdev->dev, ret,
107 changes: 90 additions & 17 deletions drivers/thermal/mediatek/auxadc_thermal.c
Original file line number Diff line number Diff line change
@@ -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 */
@@ -281,6 +282,17 @@ enum mtk_thermal_version {
/* The calibration coefficient of sensor */
#define MT7986_CALIBRATION 165

/* 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 {
@@ -307,6 +319,9 @@ struct mtk_thermal_data {
bool need_switch_bank;
struct thermal_bank_cfg bank_data[MAX_NUM_ZONES];
enum mtk_thermal_version version;
u32 apmixed_buffer_ctl_reg;
u32 apmixed_buffer_ctl_mask;
u32 apmixed_buffer_ctl_set;
};

struct mtk_thermal {
@@ -432,6 +447,24 @@ static const int mt7986_mux_values[MT7986_NUM_SENSORS] = { 0, };
static const int mt7986_vts_index[MT7986_NUM_SENSORS] = { VTS1 };
static const int mt7986_tc_offset[MT7986_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
@@ -506,6 +539,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
@@ -560,6 +627,9 @@ static const struct mtk_thermal_data mt7622_thermal_data = {
.adcpnp = mt7622_adcpnp,
.sensor_mux_values = mt7622_mux_values,
.version = MTK_THERMAL_V2,
.apmixed_buffer_ctl_reg = APMIXED_SYS_TS_CON1,
.apmixed_buffer_ctl_mask = GENMASK(31, 6) | BIT(3),
.apmixed_buffer_ctl_set = BIT(0),
};

/*
@@ -746,14 +816,6 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank)
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;

if (temp > max)
max = temp;
}
@@ -1074,19 +1136,27 @@ 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,
}, {
},
};
MODULE_DEVICE_TABLE(of, mtk_thermal_of_match);

static void mtk_thermal_turn_on_buffer(void __iomem *apmixed_base)
static void mtk_thermal_turn_on_buffer(struct mtk_thermal *mt,
void __iomem *apmixed_base)
{
int tmp;
u32 tmp;

tmp = readl(apmixed_base + APMIXED_SYS_TS_CON1);
tmp &= ~(0x37);
tmp |= 0x1;
writel(tmp, apmixed_base + APMIXED_SYS_TS_CON1);
if (!mt->conf->apmixed_buffer_ctl_reg)
return;

tmp = readl(apmixed_base + mt->conf->apmixed_buffer_ctl_reg);
tmp &= mt->conf->apmixed_buffer_ctl_mask;
tmp |= mt->conf->apmixed_buffer_ctl_set;
writel(tmp, apmixed_base + mt->conf->apmixed_buffer_ctl_reg);
udelay(200);
}

@@ -1184,10 +1254,10 @@ static int mtk_thermal_probe(struct platform_device *pdev)
goto err_disable_clk_auxadc;
}

if (mt->conf->version != MTK_THERMAL_V1) {
mtk_thermal_turn_on_buffer(apmixed_base);
mtk_thermal_turn_on_buffer(mt, apmixed_base);

if (mt->conf->version != MTK_THERMAL_V2)
mtk_thermal_release_periodic_ts(mt, auxadc_base);
}

if (mt->conf->version == MTK_THERMAL_V1)
mt->raw_to_mcelsius = raw_to_mcelsius_v1;
@@ -1203,6 +1273,9 @@ static int mtk_thermal_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, mt);

/* Delay for thermal banks to be ready */
msleep(30);

tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
&mtk_thermal_ops);
if (IS_ERR(tzdev)) {
Loading

0 comments on commit cfeeb7d

Please sign in to comment.