Currently, each trip point defined in the device tree corresponds to a
single hardware interrupt. This commit instead switches to using two
hardware interrupts, whose values are set dynamically using the
set_trips callback. Additionally, the critical temperature threshold is
handled specifically.
Setting interrupts in this way also fixes a long-standing lockdep
warning, which was caused by calling thermal_zone_get_trips with our
lock being held. Do note that this requires TMU initialization to be
split into two parts, as done by the parent commit: parts of the
initialization call into the thermal_zone_device structure and so must
be done after its registration, but the initialization is also
responsible for setting up calibration, which must be done before
thermal_zone_device registration, which will call set_trips for the
first time; if the calibration is not done in time, the interrupt values
will be silently wrong!
Signed-off-by: Mateusz Majewski <m.majewski2@samsung.com>
---
drivers/thermal/samsung/exynos_tmu.c | 390 +++++++++++++++------------
1 file changed, 217 insertions(+), 173 deletions(-)
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index aa3de367b3c7..5b35c51fca79 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -159,7 +159,6 @@ enum soc_type {
* 0 < reference_voltage <= 31
* @reg_conf: pointer to structure to register with core thermal.
* @tzd: pointer to thermal_zone_device structure
- * @ntrip: number of supported trip points.
* @enabled: current status of TMU device
* @tmu_set_trip_temp: SoC specific method to set trip (rising threshold)
* @tmu_set_trip_hyst: SoC specific to set hysteresis (falling threshold)
@@ -184,13 +183,13 @@ struct exynos_tmu_data {
u8 gain;
u8 reference_voltage;
struct thermal_zone_device *tzd;
- unsigned int ntrip;
bool enabled;
- void (*tmu_set_trip_temp)(struct exynos_tmu_data *data, int trip,
- u8 temp);
- void (*tmu_set_trip_hyst)(struct exynos_tmu_data *data, int trip,
- u8 temp, u8 hyst);
+ void (*tmu_set_low_temp)(struct exynos_tmu_data *data, u8 temp);
+ void (*tmu_set_high_temp)(struct exynos_tmu_data *data, u8 temp);
+ void (*tmu_set_crit_temp)(struct exynos_tmu_data *data, u8 temp);
+ void (*tmu_disable_low)(struct exynos_tmu_data *data);
+ void (*tmu_disable_high)(struct exynos_tmu_data *data);
void (*tmu_initialize)(struct platform_device *pdev);
void (*tmu_control)(struct platform_device *pdev, bool on);
int (*tmu_read)(struct exynos_tmu_data *data);
@@ -274,43 +273,24 @@ static int exynos_thermal_zone_configure(struct platform_device *pdev)
{
struct exynos_tmu_data *data = platform_get_drvdata(pdev);
struct thermal_zone_device *tzd = data->tzd;
- int num_trips = thermal_zone_get_num_trips(tzd);
int ret = 0, temp;
ret = thermal_zone_get_crit_temp(tzd, &temp);
-
- if (ret && data->soc != SOC_ARCH_EXYNOS5433) { /* FIXME */
- dev_err(&pdev->dev,
- "No CRITICAL trip point defined in device tree!\n");
- goto err;
- }
-
- mutex_lock(&data->lock);
-
- if (num_trips > data->ntrip) {
- dev_info(&pdev->dev,
- "More trip points than supported by this TMU.\n");
- dev_info(&pdev->dev,
- "%d trip points should be configured in polling mode.\n",
- num_trips - data->ntrip);
- }
-
- int i, ntrips = min_t(int, num_trips, data->ntrip);
-
- /* Write temperature code for rising and falling threshold */
- for (i = 0; i < ntrips; i++) {
- struct thermal_trip trip;
-
- ret = thermal_zone_get_trip(tzd, i, &trip);
- if (ret)
+ if (ret) {
+ if (data->soc ==
+ SOC_ARCH_EXYNOS5433) { /* FIXME: Remove this and the check below */
+ temp = INT_MAX;
+ ret = 0;
+ } else {
+ dev_err(&pdev->dev,
+ "No CRITICAL trip point defined in device tree!\n");
goto err;
-
- data->tmu_set_trip_temp(data, i, trip.temperature / MCELSIUS);
- data->tmu_set_trip_hyst(data, i, trip.temperature / MCELSIUS,
- trip.hysteresis / MCELSIUS);
+ }
}
- mutex_unlock(&data->lock);
+ if (temp < INT_MAX)
+ data->tmu_set_crit_temp(data, temp / MCELSIUS);
+
err:
return ret;
}
@@ -343,17 +323,56 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
mutex_unlock(&data->lock);
}
-static void exynos4210_tmu_set_trip_temp(struct exynos_tmu_data *data,
- int trip_id, u8 temp)
+static void exynos_tmu_update_bit(struct exynos_tmu_data *data, int reg_off,
+ int bit_off, bool enable)
{
- temp = temp_to_code(data, temp);
- writeb(temp, data->base + EXYNOS4210_TMU_REG_TRIG_LEVEL0 + trip_id * 4);
+ u32 interrupt_en;
+
+ interrupt_en = readl(data->base + reg_off);
+ if (enable)
+ interrupt_en |= 1 << bit_off;
+ else
+ interrupt_en &= ~(1 << bit_off);
+ writel(interrupt_en, data->base + reg_off);
}
-/* failing thresholds are not supported on Exynos4210 */
-static void exynos4210_tmu_set_trip_hyst(struct exynos_tmu_data *data,
- int trip, u8 temp, u8 hyst)
+static void exynos4210_tmu_set_low_temp(struct exynos_tmu_data *data, u8 temp)
{
+ /* Failing thresholds are not supported on Exynos 4210.
+ * We use polling instead.
+ */
+}
+
+static void exynos4210_tmu_set_high_temp(struct exynos_tmu_data *data, u8 temp)
+{
+ temp = temp_to_code(data, temp);
+ writeb(temp, data->base + EXYNOS4210_TMU_REG_TRIG_LEVEL0 + 4);
+ exynos_tmu_update_bit(data, EXYNOS_TMU_REG_INTEN,
+ EXYNOS_TMU_INTEN_RISE0_SHIFT + 4, true);
+}
+
+static void exynos4210_tmu_disable_low(struct exynos_tmu_data *data)
+{
+ /* Again, this is handled by polling. */
+}
+
+static void exynos4210_tmu_disable_high(struct exynos_tmu_data *data)
+{
+ exynos_tmu_update_bit(data, EXYNOS_TMU_REG_INTEN,
+ EXYNOS_TMU_INTEN_RISE0_SHIFT + 4, false);
+}
+
+static void exynos4210_tmu_set_crit_temp(struct exynos_tmu_data *data, u8 temp)
+{
+ /* Hardware critical temperature handling is not supported on Exynos 4210.
+ * We still set the critical temperature threshold, but this is only to
+ * make sure it is handled as soon as possible. It is just a normal interrupt.
+ */
+
+ temp = temp_to_code(data, temp);
+ writeb(temp, data->base + EXYNOS4210_TMU_REG_TRIG_LEVEL0 + 12);
+ exynos_tmu_update_bit(data, EXYNOS_TMU_REG_INTEN,
+ EXYNOS_TMU_INTEN_RISE0_SHIFT + 12, true);
}
static void exynos4210_tmu_initialize(struct platform_device *pdev)
@@ -365,33 +384,49 @@ static void exynos4210_tmu_initialize(struct platform_device *pdev)
writeb(0, data->base + EXYNOS4210_TMU_REG_THRESHOLD_TEMP);
}
-static void exynos4412_tmu_set_trip_temp(struct exynos_tmu_data *data,
- int trip, u8 temp)
-{
- u32 th, con;
-
- th = readl(data->base + EXYNOS_THD_TEMP_RISE);
- th &= ~(0xff << 8 * trip);
- th |= temp_to_code(data, temp) << 8 * trip;
- writel(th, data->base + EXYNOS_THD_TEMP_RISE);
-
- if (trip == 3) {
- con = readl(data->base + EXYNOS_TMU_REG_CONTROL);
- con |= (1 << EXYNOS_TMU_THERM_TRIP_EN_SHIFT);
- writel(con, data->base + EXYNOS_TMU_REG_CONTROL);
- }
-}
-
-static void exynos4412_tmu_set_trip_hyst(struct exynos_tmu_data *data,
- int trip, u8 temp, u8 hyst)
+static void exynos4412_tmu_set_low_temp(struct exynos_tmu_data *data, u8 temp)
{
u32 th;
th = readl(data->base + EXYNOS_THD_TEMP_FALL);
- th &= ~(0xff << 8 * trip);
- if (hyst)
- th |= temp_to_code(data, temp - hyst) << 8 * trip;
+ th &= ~(0xff << 0);
+ th |= temp_to_code(data, temp) << 0;
writel(th, data->base + EXYNOS_THD_TEMP_FALL);
+
+ exynos_tmu_update_bit(data, EXYNOS_TMU_REG_INTEN,
+ EXYNOS_TMU_INTEN_FALL0_SHIFT, true);
+}
+
+static void exynos4412_tmu_set_high_temp(struct exynos_tmu_data *data, u8 temp)
+{
+ u32 th;
+
+ th = readl(data->base + EXYNOS_THD_TEMP_RISE);
+ th &= ~(0xff << 8);
+ th |= temp_to_code(data, temp) << 8;
+ writel(th, data->base + EXYNOS_THD_TEMP_RISE);
+
+ exynos_tmu_update_bit(data, EXYNOS_TMU_REG_INTEN,
+ EXYNOS_TMU_INTEN_RISE0_SHIFT + 4, true);
+}
+
+static void exynos4412_tmu_disable_low(struct exynos_tmu_data *data)
+{
+ exynos_tmu_update_bit(data, EXYNOS_TMU_REG_INTEN,
+ EXYNOS_TMU_INTEN_FALL0_SHIFT, false);
+}
+
+static void exynos4412_tmu_set_crit_temp(struct exynos_tmu_data *data, u8 temp)
+{
+ u32 th;
+
+ th = readl(data->base + EXYNOS_THD_TEMP_RISE);
+ th &= ~(0xff << 24);
+ th |= temp_to_code(data, temp) << 24;
+ writel(th, data->base + EXYNOS_THD_TEMP_RISE);
+
+ exynos_tmu_update_bit(data, EXYNOS_TMU_REG_CONTROL,
+ EXYNOS_TMU_THERM_TRIP_EN_SHIFT, true);
}
static void exynos4412_tmu_initialize(struct platform_device *pdev)
@@ -421,44 +456,57 @@ static void exynos4412_tmu_initialize(struct platform_device *pdev)
sanitize_temp_error(data, trim_info);
}
-static void exynos5433_tmu_set_trip_temp(struct exynos_tmu_data *data,
- int trip, u8 temp)
+static void exynos5433_tmu_set_low_temp(struct exynos_tmu_data *data, u8 temp)
{
- unsigned int reg_off, j;
u32 th;
- if (trip > 3) {
- reg_off = EXYNOS5433_THD_TEMP_RISE7_4;
- j = trip - 4;
- } else {
- reg_off = EXYNOS5433_THD_TEMP_RISE3_0;
- j = trip;
- }
+ th = readl(data->base + EXYNOS5433_THD_TEMP_FALL3_0);
+ th &= ~(0xff << 0);
+ th |= temp_to_code(data, temp) << 0;
+ writel(th, data->base + EXYNOS5433_THD_TEMP_FALL3_0);
- th = readl(data->base + reg_off);
- th &= ~(0xff << j * 8);
- th |= (temp_to_code(data, temp) << j * 8);
- writel(th, data->base + reg_off);
+ exynos_tmu_update_bit(data, EXYNOS5433_TMU_REG_INTEN,
+ EXYNOS_TMU_INTEN_FALL0_SHIFT, true);
}
-static void exynos5433_tmu_set_trip_hyst(struct exynos_tmu_data *data,
- int trip, u8 temp, u8 hyst)
+static void exynos5433_tmu_set_high_temp(struct exynos_tmu_data *data, u8 temp)
{
- unsigned int reg_off, j;
u32 th;
- if (trip > 3) {
- reg_off = EXYNOS5433_THD_TEMP_FALL7_4;
- j = trip - 4;
- } else {
- reg_off = EXYNOS5433_THD_TEMP_FALL3_0;
- j = trip;
- }
+ th = readl(data->base + EXYNOS5433_THD_TEMP_RISE3_0);
+ th &= ~(0xff << 8);
+ th |= temp_to_code(data, temp) << 8;
+ writel(th, data->base + EXYNOS5433_THD_TEMP_RISE3_0);
- th = readl(data->base + reg_off);
- th &= ~(0xff << j * 8);
- th |= (temp_to_code(data, temp - hyst) << j * 8);
- writel(th, data->base + reg_off);
+ exynos_tmu_update_bit(data, EXYNOS5433_TMU_REG_INTEN,
+ EXYNOS7_TMU_INTEN_RISE0_SHIFT + 1, true);
+}
+
+static void exynos5433_tmu_disable_low(struct exynos_tmu_data *data)
+{
+ exynos_tmu_update_bit(data, EXYNOS5433_TMU_REG_INTEN,
+ EXYNOS_TMU_INTEN_FALL0_SHIFT, false);
+}
+
+static void exynos5433_tmu_disable_high(struct exynos_tmu_data *data)
+{
+ exynos_tmu_update_bit(data, EXYNOS5433_TMU_REG_INTEN,
+ EXYNOS7_TMU_INTEN_RISE0_SHIFT + 1, false);
+}
+
+static void exynos5433_tmu_set_crit_temp(struct exynos_tmu_data *data, u8 temp)
+{
+ u32 th;
+
+ th = readl(data->base + EXYNOS5433_THD_TEMP_RISE7_4);
+ th &= ~(0xff << 24);
+ th |= temp_to_code(data, temp) << 24;
+ writel(th, data->base + EXYNOS5433_THD_TEMP_RISE7_4);
+
+ exynos_tmu_update_bit(data, EXYNOS_TMU_REG_CONTROL,
+ EXYNOS_TMU_THERM_TRIP_EN_SHIFT, true);
+ exynos_tmu_update_bit(data, EXYNOS5433_TMU_REG_INTEN,
+ EXYNOS7_TMU_INTEN_RISE0_SHIFT + 7, true);
}
static void exynos5433_tmu_initialize(struct platform_device *pdev)
@@ -494,34 +542,47 @@ static void exynos5433_tmu_initialize(struct platform_device *pdev)
cal_type ? 2 : 1);
}
-static void exynos7_tmu_set_trip_temp(struct exynos_tmu_data *data,
- int trip, u8 temp)
+static void exynos7_tmu_update_temp(struct exynos_tmu_data *data, u8 temp,
+ int idx, bool rise)
{
unsigned int reg_off, bit_off;
u32 th;
+ void __iomem *reg;
- reg_off = ((7 - trip) / 2) * 4;
- bit_off = ((8 - trip) % 2);
+ reg_off = ((7 - idx) / 2) * 4;
+ bit_off = ((8 - idx) % 2);
- th = readl(data->base + EXYNOS7_THD_TEMP_RISE7_6 + reg_off);
+ reg = data->base +
+ (rise ? EXYNOS7_THD_TEMP_RISE7_6 : EXYNOS7_THD_TEMP_FALL7_6) +
+ reg_off;
+ th = readl(reg);
th &= ~(EXYNOS7_TMU_TEMP_MASK << (16 * bit_off));
th |= temp_to_code(data, temp) << (16 * bit_off);
- writel(th, data->base + EXYNOS7_THD_TEMP_RISE7_6 + reg_off);
+ writel(th, reg);
+
+ exynos_tmu_update_bit(data, EXYNOS5433_TMU_REG_INTEN,
+ (rise ? EXYNOS7_TMU_INTEN_RISE0_SHIFT :
+ EXYNOS_TMU_INTEN_FALL0_SHIFT) +
+ idx,
+ true);
}
-static void exynos7_tmu_set_trip_hyst(struct exynos_tmu_data *data,
- int trip, u8 temp, u8 hyst)
+static void exynos7_tmu_set_low_temp(struct exynos_tmu_data *data, u8 temp)
{
- unsigned int reg_off, bit_off;
- u32 th;
+ exynos7_tmu_update_temp(data, temp, 0, false);
+}
- reg_off = ((7 - trip) / 2) * 4;
- bit_off = ((8 - trip) % 2);
+static void exynos7_tmu_set_high_temp(struct exynos_tmu_data *data, u8 temp)
+{
+ exynos7_tmu_update_temp(data, temp, 1, true);
+}
- th = readl(data->base + EXYNOS7_THD_TEMP_FALL7_6 + reg_off);
- th &= ~(EXYNOS7_TMU_TEMP_MASK << (16 * bit_off));
- th |= temp_to_code(data, temp - hyst) << (16 * bit_off);
- writel(th, data->base + EXYNOS7_THD_TEMP_FALL7_6 + reg_off);
+static void exynos7_tmu_set_crit_temp(struct exynos_tmu_data *data, u8 temp)
+{
+ /* Like Exynos 4210, Exynos 7 does not seem to support critical temperature
+ * handling in hardware. Again, we still set a separate interrupt for it.
+ */
+ exynos7_tmu_update_temp(data, temp, 7, true);
}
static void exynos7_tmu_initialize(struct platform_device *pdev)
@@ -536,87 +597,44 @@ static void exynos7_tmu_initialize(struct platform_device *pdev)
static void exynos4210_tmu_control(struct platform_device *pdev, bool on)
{
struct exynos_tmu_data *data = platform_get_drvdata(pdev);
- struct thermal_zone_device *tz = data->tzd;
- struct thermal_trip trip;
- unsigned int con, interrupt_en = 0, i;
+ unsigned int con;
con = get_con_reg(data, readl(data->base + EXYNOS_TMU_REG_CONTROL));
- if (on) {
- for (i = 0; i < data->ntrip; i++) {
- if (thermal_zone_get_trip(tz, i, &trip))
- continue;
-
- interrupt_en |=
- (1 << (EXYNOS_TMU_INTEN_RISE0_SHIFT + i * 4));
- }
-
- if (data->soc != SOC_ARCH_EXYNOS4210)
- interrupt_en |=
- interrupt_en << EXYNOS_TMU_INTEN_FALL0_SHIFT;
-
+ if (on)
con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT);
- } else {
+ else
con &= ~(1 << EXYNOS_TMU_CORE_EN_SHIFT);
- }
- writel(interrupt_en, data->base + EXYNOS_TMU_REG_INTEN);
writel(con, data->base + EXYNOS_TMU_REG_CONTROL);
}
static void exynos5433_tmu_control(struct platform_device *pdev, bool on)
{
struct exynos_tmu_data *data = platform_get_drvdata(pdev);
- struct thermal_zone_device *tz = data->tzd;
- struct thermal_trip trip;
- unsigned int con, interrupt_en = 0, pd_det_en, i;
+ unsigned int con, pd_det_en;
con = get_con_reg(data, readl(data->base + EXYNOS_TMU_REG_CONTROL));
- if (on) {
- for (i = 0; i < data->ntrip; i++) {
- if (thermal_zone_get_trip(tz, i, &trip))
- continue;
-
- interrupt_en |=
- (1 << (EXYNOS7_TMU_INTEN_RISE0_SHIFT + i));
- }
-
- interrupt_en |=
- interrupt_en << EXYNOS_TMU_INTEN_FALL0_SHIFT;
-
+ if (on)
con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT);
- } else
+ else
con &= ~(1 << EXYNOS_TMU_CORE_EN_SHIFT);
pd_det_en = on ? EXYNOS5433_PD_DET_EN : 0;
writel(pd_det_en, data->base + EXYNOS5433_TMU_PD_DET_EN);
- writel(interrupt_en, data->base + EXYNOS5433_TMU_REG_INTEN);
writel(con, data->base + EXYNOS_TMU_REG_CONTROL);
}
static void exynos7_tmu_control(struct platform_device *pdev, bool on)
{
struct exynos_tmu_data *data = platform_get_drvdata(pdev);
- struct thermal_zone_device *tz = data->tzd;
- struct thermal_trip trip;
- unsigned int con, interrupt_en = 0, i;
+ unsigned int con;
con = get_con_reg(data, readl(data->base + EXYNOS_TMU_REG_CONTROL));
if (on) {
- for (i = 0; i < data->ntrip; i++) {
- if (thermal_zone_get_trip(tz, i, &trip))
- continue;
-
- interrupt_en |=
- (1 << (EXYNOS7_TMU_INTEN_RISE0_SHIFT + i));
- }
-
- interrupt_en |=
- interrupt_en << EXYNOS_TMU_INTEN_FALL0_SHIFT;
-
con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT);
con |= (1 << EXYNOS7_PD_DET_EN_SHIFT);
} else {
@@ -624,7 +642,6 @@ static void exynos7_tmu_control(struct platform_device *pdev, bool on)
con &= ~(1 << EXYNOS7_PD_DET_EN_SHIFT);
}
- writel(interrupt_en, data->base + EXYNOS7_TMU_REG_INTEN);
writel(con, data->base + EXYNOS_TMU_REG_CONTROL);
}
@@ -856,13 +873,15 @@ static int exynos_map_dt_data(struct platform_device *pdev)
switch (data->soc) {
case SOC_ARCH_EXYNOS4210:
- data->tmu_set_trip_temp = exynos4210_tmu_set_trip_temp;
- data->tmu_set_trip_hyst = exynos4210_tmu_set_trip_hyst;
+ data->tmu_set_low_temp = exynos4210_tmu_set_low_temp;
+ data->tmu_set_high_temp = exynos4210_tmu_set_high_temp;
+ data->tmu_disable_low = exynos4210_tmu_disable_low;
+ data->tmu_disable_high = exynos4210_tmu_disable_high;
+ data->tmu_set_crit_temp = exynos4210_tmu_set_crit_temp;
data->tmu_initialize = exynos4210_tmu_initialize;
data->tmu_control = exynos4210_tmu_control;
data->tmu_read = exynos4210_tmu_read;
data->tmu_clear_irqs = exynos4210_tmu_clear_irqs;
- data->ntrip = 4;
data->gain = 15;
data->reference_voltage = 7;
data->efuse_value = 55;
@@ -875,14 +894,16 @@ static int exynos_map_dt_data(struct platform_device *pdev)
case SOC_ARCH_EXYNOS5260:
case SOC_ARCH_EXYNOS5420:
case SOC_ARCH_EXYNOS5420_TRIMINFO:
- data->tmu_set_trip_temp = exynos4412_tmu_set_trip_temp;
- data->tmu_set_trip_hyst = exynos4412_tmu_set_trip_hyst;
+ data->tmu_set_low_temp = exynos4412_tmu_set_low_temp;
+ data->tmu_set_high_temp = exynos4412_tmu_set_high_temp;
+ data->tmu_disable_low = exynos4412_tmu_disable_low;
+ data->tmu_disable_high = exynos4210_tmu_disable_high;
+ data->tmu_set_crit_temp = exynos4412_tmu_set_crit_temp;
data->tmu_initialize = exynos4412_tmu_initialize;
data->tmu_control = exynos4210_tmu_control;
data->tmu_read = exynos4412_tmu_read;
data->tmu_set_emulation = exynos4412_tmu_set_emulation;
data->tmu_clear_irqs = exynos4210_tmu_clear_irqs;
- data->ntrip = 4;
data->gain = 8;
data->reference_voltage = 16;
data->efuse_value = 55;
@@ -894,14 +915,16 @@ static int exynos_map_dt_data(struct platform_device *pdev)
data->max_efuse_value = 100;
break;
case SOC_ARCH_EXYNOS5433:
- data->tmu_set_trip_temp = exynos5433_tmu_set_trip_temp;
- data->tmu_set_trip_hyst = exynos5433_tmu_set_trip_hyst;
+ data->tmu_set_low_temp = exynos5433_tmu_set_low_temp;
+ data->tmu_set_high_temp = exynos5433_tmu_set_high_temp;
+ data->tmu_disable_low = exynos5433_tmu_disable_low;
+ data->tmu_disable_high = exynos5433_tmu_disable_high;
+ data->tmu_set_crit_temp = exynos5433_tmu_set_crit_temp;
data->tmu_initialize = exynos5433_tmu_initialize;
data->tmu_control = exynos5433_tmu_control;
data->tmu_read = exynos4412_tmu_read;
data->tmu_set_emulation = exynos4412_tmu_set_emulation;
data->tmu_clear_irqs = exynos4210_tmu_clear_irqs;
- data->ntrip = 8;
data->gain = 8;
if (res.start == EXYNOS5433_G3D_BASE)
data->reference_voltage = 23;
@@ -912,14 +935,16 @@ static int exynos_map_dt_data(struct platform_device *pdev)
data->max_efuse_value = 150;
break;
case SOC_ARCH_EXYNOS7:
- data->tmu_set_trip_temp = exynos7_tmu_set_trip_temp;
- data->tmu_set_trip_hyst = exynos7_tmu_set_trip_hyst;
+ data->tmu_set_low_temp = exynos7_tmu_set_low_temp;
+ data->tmu_set_high_temp = exynos7_tmu_set_high_temp;
+ data->tmu_disable_low = exynos5433_tmu_disable_low;
+ data->tmu_disable_high = exynos5433_tmu_disable_high;
+ data->tmu_set_crit_temp = exynos7_tmu_set_crit_temp;
data->tmu_initialize = exynos7_tmu_initialize;
data->tmu_control = exynos7_tmu_control;
data->tmu_read = exynos7_tmu_read;
data->tmu_set_emulation = exynos4412_tmu_set_emulation;
data->tmu_clear_irqs = exynos4210_tmu_clear_irqs;
- data->ntrip = 8;
data->gain = 9;
data->reference_voltage = 17;
data->efuse_value = 75;
@@ -955,9 +980,28 @@ static int exynos_map_dt_data(struct platform_device *pdev)
return 0;
}
+static int exynos_set_trips(struct thermal_zone_device *tz, int low, int high)
+{
+ struct exynos_tmu_data *data = thermal_zone_device_priv(tz);
+
+ mutex_lock(&data->lock);
+ if (low > INT_MIN)
+ data->tmu_set_low_temp(data, low / MCELSIUS);
+ else
+ data->tmu_disable_low(data);
+ if (high < INT_MAX)
+ data->tmu_set_high_temp(data, high / MCELSIUS);
+ else
+ data->tmu_disable_high(data);
+ mutex_unlock(&data->lock);
+
+ return 0;
+}
+
static const struct thermal_zone_device_ops exynos_sensor_ops = {
.get_temp = exynos_get_temp,
.set_emul_temp = exynos_tmu_set_emulation,
+ .set_trips = exynos_set_trips,
};
static int exynos_tmu_probe(struct platform_device *pdev)
--
2.41.0
Hi Mateusz,
kernel test robot noticed the following build warnings:
[auto build test WARNING on rafael-pm/thermal]
[also build test WARNING on krzk/for-next arm/for-next arm/fixes arm64/for-next/core clk/clk-next kvmarm/next rockchip/for-next shawnguo/for-next soc/for-next linus/master v6.5 next-20230829]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Mateusz-Majewski/ARM-dts-exynos-enable-polling-in-Exynos-4210/20230829-172850
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal
patch link: https://lore.kernel.org/r/20230829091853.626011-11-m.majewski2%40samsung.com
patch subject: [PATCH 10/11] thermal: exynos: use set_trips
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230829/202308291857.W4jDgr7Y-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230829/202308291857.W4jDgr7Y-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202308291857.W4jDgr7Y-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/thermal/samsung/exynos_tmu.c:198: warning: Function parameter or member 'tmu_set_low_temp' not described in 'exynos_tmu_data'
>> drivers/thermal/samsung/exynos_tmu.c:198: warning: Function parameter or member 'tmu_set_high_temp' not described in 'exynos_tmu_data'
>> drivers/thermal/samsung/exynos_tmu.c:198: warning: Function parameter or member 'tmu_set_crit_temp' not described in 'exynos_tmu_data'
>> drivers/thermal/samsung/exynos_tmu.c:198: warning: Function parameter or member 'tmu_disable_low' not described in 'exynos_tmu_data'
>> drivers/thermal/samsung/exynos_tmu.c:198: warning: Function parameter or member 'tmu_disable_high' not described in 'exynos_tmu_data'
vim +198 drivers/thermal/samsung/exynos_tmu.c
7efd18a2a181551 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 137
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 138 /**
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 139 * struct exynos_tmu_data : A structure to hold the private data of the TMU
9625e9e694e7470 drivers/thermal/samsung/exynos_tmu.c Amit Kucheria 2019-11-20 140 * driver
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 141 * @base: base address of the single instance of the TMU controller.
9025d563cd9bd14 drivers/thermal/samsung/exynos_tmu.c Naveen Krishna Chatradhi 2013-12-19 142 * @base_second: base address of the common registers of the TMU controller.
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 143 * @irq: irq number of the TMU controller.
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 144 * @soc: id of the SOC type.
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 145 * @lock: lock to implement synchronization.
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 146 * @clk: pointer to the clock structure.
14a11dc7e0dbf4a drivers/thermal/samsung/exynos_tmu.c Naveen Krishna Chatradhi 2013-12-19 147 * @clk_sec: pointer to the clock structure for accessing the base_second.
6c247393cfdd669 drivers/thermal/samsung/exynos_tmu.c Abhilash Kesavan 2015-01-27 148 * @sclk: pointer to the clock structure for accessing the tmu special clk.
199b3e3c860cdf3 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 149 * @cal_type: calibration type for temperature
e3ed36499bc9565 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 150 * @efuse_value: SoC defined fuse value
e3ed36499bc9565 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 151 * @min_efuse_value: minimum valid trimming data
e3ed36499bc9565 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 152 * @max_efuse_value: maximum valid trimming data
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 153 * @temp_error1: fused value of the first point trim.
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 154 * @temp_error2: fused value of the second point trim.
fccfe0993b5dc55 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 155 * @gain: gain of amplifier in the positive-TC generator block
fccfe0993b5dc55 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 156 * 0 < gain <= 15
61020d189dbc4a7 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 157 * @reference_voltage: reference voltage of amplifier
61020d189dbc4a7 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 158 * in the positive-TC generator block
61020d189dbc4a7 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 159 * 0 < reference_voltage <= 31
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 160 * @reg_conf: pointer to structure to register with core thermal.
9625e9e694e7470 drivers/thermal/samsung/exynos_tmu.c Amit Kucheria 2019-11-20 161 * @tzd: pointer to thermal_zone_device structure
88fc6f73fddf64e drivers/thermal/samsung/exynos_tmu.c Marek Szyprowski 2018-04-16 162 * @enabled: current status of TMU device
9625e9e694e7470 drivers/thermal/samsung/exynos_tmu.c Amit Kucheria 2019-11-20 163 * @tmu_set_trip_temp: SoC specific method to set trip (rising threshold)
9625e9e694e7470 drivers/thermal/samsung/exynos_tmu.c Amit Kucheria 2019-11-20 164 * @tmu_set_trip_hyst: SoC specific to set hysteresis (falling threshold)
72d1100b736d2ff drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2014-11-13 165 * @tmu_initialize: SoC specific TMU initialization method
37f9034f99c3c1b drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2014-11-13 166 * @tmu_control: SoC specific TMU control method
b79985ca74b2592 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2014-11-13 167 * @tmu_read: SoC specific TMU temperature read method
285d994a51e45ca drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2014-11-13 168 * @tmu_set_emulation: SoC specific TMU emulation setting method
a7331f72d3eb2bf drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2014-11-13 169 * @tmu_clear_irqs: SoC specific TMU interrupts clearing method
cebe7373a7e659d drivers/thermal/samsung/exynos_tmu.c Amit Daniel Kachhap 2013-06-24 170 */
f22d9c03ccc9339 drivers/thermal/exynos_thermal.c Amit Daniel Kachhap 2012-08-16 171 struct exynos_tmu_data {
9d97e5c81e15afa drivers/hwmon/exynos4_tmu.c Donggeun Kim 2011-09-07 172 void __iomem *base;
9025d563cd9bd14 drivers/thermal/samsung/exynos_tmu.c Naveen Krishna Chatradhi 2013-12-19 173 void __iomem *base_second;
9d97e5c81e15afa drivers/hwmon/exynos4_tmu.c Donggeun Kim 2011-09-07 174 int irq;
f22d9c03ccc9339 drivers/thermal/exynos_thermal.c Amit Daniel Kachhap 2012-08-16 175 enum soc_type soc;
9d97e5c81e15afa drivers/hwmon/exynos4_tmu.c Donggeun Kim 2011-09-07 176 struct mutex lock;
6c247393cfdd669 drivers/thermal/samsung/exynos_tmu.c Abhilash Kesavan 2015-01-27 177 struct clk *clk, *clk_sec, *sclk;
199b3e3c860cdf3 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 178 u32 cal_type;
e3ed36499bc9565 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 179 u32 efuse_value;
e3ed36499bc9565 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 180 u32 min_efuse_value;
e3ed36499bc9565 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 181 u32 max_efuse_value;
6c247393cfdd669 drivers/thermal/samsung/exynos_tmu.c Abhilash Kesavan 2015-01-27 182 u16 temp_error1, temp_error2;
fccfe0993b5dc55 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 183 u8 gain;
61020d189dbc4a7 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-16 184 u8 reference_voltage;
3b6a1a805f34247 drivers/thermal/samsung/exynos_tmu.c Lukasz Majewski 2015-01-23 185 struct thermal_zone_device *tzd;
88fc6f73fddf64e drivers/thermal/samsung/exynos_tmu.c Marek Szyprowski 2018-04-16 186 bool enabled;
3b6a1a805f34247 drivers/thermal/samsung/exynos_tmu.c Lukasz Majewski 2015-01-23 187
93106a41fa1d04f drivers/thermal/samsung/exynos_tmu.c Mateusz Majewski 2023-08-29 188 void (*tmu_set_low_temp)(struct exynos_tmu_data *data, u8 temp);
93106a41fa1d04f drivers/thermal/samsung/exynos_tmu.c Mateusz Majewski 2023-08-29 189 void (*tmu_set_high_temp)(struct exynos_tmu_data *data, u8 temp);
93106a41fa1d04f drivers/thermal/samsung/exynos_tmu.c Mateusz Majewski 2023-08-29 190 void (*tmu_set_crit_temp)(struct exynos_tmu_data *data, u8 temp);
93106a41fa1d04f drivers/thermal/samsung/exynos_tmu.c Mateusz Majewski 2023-08-29 191 void (*tmu_disable_low)(struct exynos_tmu_data *data);
93106a41fa1d04f drivers/thermal/samsung/exynos_tmu.c Mateusz Majewski 2023-08-29 192 void (*tmu_disable_high)(struct exynos_tmu_data *data);
c35268f589d545f drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2018-04-26 193 void (*tmu_initialize)(struct platform_device *pdev);
37f9034f99c3c1b drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2014-11-13 194 void (*tmu_control)(struct platform_device *pdev, bool on);
b79985ca74b2592 drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2014-11-13 195 int (*tmu_read)(struct exynos_tmu_data *data);
17e8351a77397e8 drivers/thermal/samsung/exynos_tmu.c Sascha Hauer 2015-07-24 196 void (*tmu_set_emulation)(struct exynos_tmu_data *data, int temp);
a7331f72d3eb2bf drivers/thermal/samsung/exynos_tmu.c Bartlomiej Zolnierkiewicz 2014-11-13 197 void (*tmu_clear_irqs)(struct exynos_tmu_data *data);
9d97e5c81e15afa drivers/hwmon/exynos4_tmu.c Donggeun Kim 2011-09-07 @198 };
9d97e5c81e15afa drivers/hwmon/exynos4_tmu.c Donggeun Kim 2011-09-07 199
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2025 Red Hat, Inc.