Commit 448bfad8 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux

Pull thermal fixes from Zhang Rui:
 "Specifics:

   - update Email address of Thermal subsystem maintainer Eduardo
     Valentin.

   - fix a problem that unloading thermal module results in kernel crash
     because a non-exist device file is removed on thermal unload.

   - fix a problem that critical trip point is set wrongly on latest
     i.MX6 SOC and results in system critical shutdown.

   - a couple of fixes to Tmon tool, of-thermal code and ti thermal
     driver"

* 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux:
  tmon: set umask to a reasonable value
  tmon: Check log file for common secuirty issues
  tools/thermal: tmon: fix compilation errors when building statically
  thermal: ti-soc-thermal: ti-bandgap.c: Cleaning up wrong address is checked
  Thermal: imx: correct critical trip temperature setting
  thermal: Bind cooling devices with the correct arguments
  thermal: Add braces around suspect code
  thermal: hwmon: Make the check for critical temp valid consistent
  MAINTAINERS: Update Eduardo Valentin's email address
parents 4c2f503a 4adccf9f
...@@ -8984,7 +8984,7 @@ F: drivers/media/radio/radio-raremono.c ...@@ -8984,7 +8984,7 @@ F: drivers/media/radio/radio-raremono.c
THERMAL THERMAL
M: Zhang Rui <rui.zhang@intel.com> M: Zhang Rui <rui.zhang@intel.com>
M: Eduardo Valentin <eduardo.valentin@ti.com> M: Eduardo Valentin <edubezval@gmail.com>
L: linux-pm@vger.kernel.org L: linux-pm@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git
T: git git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git
...@@ -9011,7 +9011,7 @@ S: Maintained ...@@ -9011,7 +9011,7 @@ S: Maintained
F: drivers/platform/x86/thinkpad_acpi.c F: drivers/platform/x86/thinkpad_acpi.c
TI BANDGAP AND THERMAL DRIVER TI BANDGAP AND THERMAL DRIVER
M: Eduardo Valentin <eduardo.valentin@ti.com> M: Eduardo Valentin <edubezval@gmail.com>
L: linux-pm@vger.kernel.org L: linux-pm@vger.kernel.org
S: Supported S: Supported
F: drivers/thermal/ti-soc-thermal/ F: drivers/thermal/ti-soc-thermal/
......
...@@ -306,7 +306,7 @@ static int imx_get_sensor_data(struct platform_device *pdev) ...@@ -306,7 +306,7 @@ static int imx_get_sensor_data(struct platform_device *pdev)
{ {
struct imx_thermal_data *data = platform_get_drvdata(pdev); struct imx_thermal_data *data = platform_get_drvdata(pdev);
struct regmap *map; struct regmap *map;
int t1, t2, n1, n2; int t1, n1;
int ret; int ret;
u32 val; u32 val;
u64 temp64; u64 temp64;
...@@ -333,14 +333,10 @@ static int imx_get_sensor_data(struct platform_device *pdev) ...@@ -333,14 +333,10 @@ static int imx_get_sensor_data(struct platform_device *pdev)
/* /*
* Sensor data layout: * Sensor data layout:
* [31:20] - sensor value @ 25C * [31:20] - sensor value @ 25C
* [19:8] - sensor value of hot
* [7:0] - hot temperature value
* Use universal formula now and only need sensor value @ 25C * Use universal formula now and only need sensor value @ 25C
* slope = 0.4297157 - (0.0015976 * 25C fuse) * slope = 0.4297157 - (0.0015976 * 25C fuse)
*/ */
n1 = val >> 20; n1 = val >> 20;
n2 = (val & 0xfff00) >> 8;
t2 = val & 0xff;
t1 = 25; /* t1 always 25C */ t1 = 25; /* t1 always 25C */
/* /*
...@@ -366,16 +362,16 @@ static int imx_get_sensor_data(struct platform_device *pdev) ...@@ -366,16 +362,16 @@ static int imx_get_sensor_data(struct platform_device *pdev)
data->c2 = n1 * data->c1 + 1000 * t1; data->c2 = n1 * data->c1 + 1000 * t1;
/* /*
* Set the default passive cooling trip point to 20 °C below the * Set the default passive cooling trip point,
* maximum die temperature. Can be changed from userspace. * can be changed from userspace.
*/ */
data->temp_passive = 1000 * (t2 - 20); data->temp_passive = IMX_TEMP_PASSIVE;
/* /*
* The maximum die temperature is t2, let's give 5 °C cushion * The maximum die temperature set to 20 C higher than
* for noise and possible temperature rise between measurements. * IMX_TEMP_PASSIVE.
*/ */
data->temp_critical = 1000 * (t2 - 5); data->temp_critical = 1000 * 20 + data->temp_passive;
return 0; return 0;
} }
......
...@@ -156,8 +156,8 @@ static int of_thermal_bind(struct thermal_zone_device *thermal, ...@@ -156,8 +156,8 @@ static int of_thermal_bind(struct thermal_zone_device *thermal,
ret = thermal_zone_bind_cooling_device(thermal, ret = thermal_zone_bind_cooling_device(thermal,
tbp->trip_id, cdev, tbp->trip_id, cdev,
tbp->min, tbp->max,
tbp->max); tbp->min);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -712,11 +712,12 @@ thermal_of_build_thermal_zone(struct device_node *np) ...@@ -712,11 +712,12 @@ thermal_of_build_thermal_zone(struct device_node *np)
} }
i = 0; i = 0;
for_each_child_of_node(child, gchild) for_each_child_of_node(child, gchild) {
ret = thermal_of_populate_bind_params(gchild, &tz->tbps[i++], ret = thermal_of_populate_bind_params(gchild, &tz->tbps[i++],
tz->trips, tz->ntrips); tz->trips, tz->ntrips);
if (ret) if (ret)
goto free_tbps; goto free_tbps;
}
finish: finish:
of_node_put(child); of_node_put(child);
......
...@@ -140,6 +140,12 @@ thermal_hwmon_lookup_temp(const struct thermal_hwmon_device *hwmon, ...@@ -140,6 +140,12 @@ thermal_hwmon_lookup_temp(const struct thermal_hwmon_device *hwmon,
return NULL; return NULL;
} }
static bool thermal_zone_crit_temp_valid(struct thermal_zone_device *tz)
{
unsigned long temp;
return tz->ops->get_crit_temp && !tz->ops->get_crit_temp(tz, &temp);
}
int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
{ {
struct thermal_hwmon_device *hwmon; struct thermal_hwmon_device *hwmon;
...@@ -189,9 +195,7 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) ...@@ -189,9 +195,7 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
if (result) if (result)
goto free_temp_mem; goto free_temp_mem;
if (tz->ops->get_crit_temp) { if (thermal_zone_crit_temp_valid(tz)) {
unsigned long temperature;
if (!tz->ops->get_crit_temp(tz, &temperature)) {
snprintf(temp->temp_crit.name, snprintf(temp->temp_crit.name,
sizeof(temp->temp_crit.name), sizeof(temp->temp_crit.name),
"temp%d_crit", hwmon->count); "temp%d_crit", hwmon->count);
...@@ -204,7 +208,6 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) ...@@ -204,7 +208,6 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
if (result) if (result)
goto unregister_input; goto unregister_input;
} }
}
mutex_lock(&thermal_hwmon_list_lock); mutex_lock(&thermal_hwmon_list_lock);
if (new_hwmon_device) if (new_hwmon_device)
...@@ -250,7 +253,7 @@ void thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz) ...@@ -250,7 +253,7 @@ void thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
} }
device_remove_file(hwmon->device, &temp->temp_input.attr); device_remove_file(hwmon->device, &temp->temp_input.attr);
if (tz->ops->get_crit_temp) if (thermal_zone_crit_temp_valid(tz))
device_remove_file(hwmon->device, &temp->temp_crit.attr); device_remove_file(hwmon->device, &temp->temp_crit.attr);
mutex_lock(&thermal_hwmon_list_lock); mutex_lock(&thermal_hwmon_list_lock);
......
...@@ -1155,7 +1155,7 @@ static struct ti_bandgap *ti_bandgap_build(struct platform_device *pdev) ...@@ -1155,7 +1155,7 @@ static struct ti_bandgap *ti_bandgap_build(struct platform_device *pdev)
/* register shadow for context save and restore */ /* register shadow for context save and restore */
bgp->regval = devm_kzalloc(&pdev->dev, sizeof(*bgp->regval) * bgp->regval = devm_kzalloc(&pdev->dev, sizeof(*bgp->regval) *
bgp->conf->sensor_count, GFP_KERNEL); bgp->conf->sensor_count, GFP_KERNEL);
if (!bgp) { if (!bgp->regval) {
dev_err(&pdev->dev, "Unable to allocate mem for driver ref\n"); dev_err(&pdev->dev, "Unable to allocate mem for driver ref\n");
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
......
...@@ -21,7 +21,7 @@ OBJS = tmon.o tui.o sysfs.o pid.o ...@@ -21,7 +21,7 @@ OBJS = tmon.o tui.o sysfs.o pid.o
OBJS += OBJS +=
tmon: $(OBJS) Makefile tmon.h tmon: $(OBJS) Makefile tmon.h
$(CC) ${CFLAGS} $(LDFLAGS) $(OBJS) -o $(TARGET) -lm -lpanel -lncursesw -lpthread $(CC) ${CFLAGS} $(LDFLAGS) $(OBJS) -o $(TARGET) -lm -lpanel -lncursesw -ltinfo -lpthread
valgrind: tmon valgrind: tmon
sudo valgrind -v --track-origins=yes --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./$(TARGET) 1> /dev/null sudo valgrind -v --track-origins=yes --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./$(TARGET) 1> /dev/null
......
...@@ -142,6 +142,7 @@ static void start_syslog(void) ...@@ -142,6 +142,7 @@ static void start_syslog(void)
static void prepare_logging(void) static void prepare_logging(void)
{ {
int i; int i;
struct stat logstat;
if (!logging) if (!logging)
return; return;
...@@ -152,6 +153,29 @@ static void prepare_logging(void) ...@@ -152,6 +153,29 @@ static void prepare_logging(void)
return; return;
} }
if (lstat(TMON_LOG_FILE, &logstat) < 0) {
syslog(LOG_ERR, "Unable to stat log file %s\n", TMON_LOG_FILE);
fclose(tmon_log);
tmon_log = NULL;
return;
}
/* The log file must be a regular file owned by us */
if (S_ISLNK(logstat.st_mode)) {
syslog(LOG_ERR, "Log file is a symlink. Will not log\n");
fclose(tmon_log);
tmon_log = NULL;
return;
}
if (logstat.st_uid != getuid()) {
syslog(LOG_ERR, "We don't own the log file. Not logging\n");
fclose(tmon_log);
tmon_log = NULL;
return;
}
fprintf(tmon_log, "#----------- THERMAL SYSTEM CONFIG -------------\n"); fprintf(tmon_log, "#----------- THERMAL SYSTEM CONFIG -------------\n");
for (i = 0; i < ptdata.nr_tz_sensor; i++) { for (i = 0; i < ptdata.nr_tz_sensor; i++) {
char binding_str[33]; /* size of long + 1 */ char binding_str[33]; /* size of long + 1 */
...@@ -331,7 +355,7 @@ static void start_daemon_mode() ...@@ -331,7 +355,7 @@ static void start_daemon_mode()
disable_tui(); disable_tui();
/* change the file mode mask */ /* change the file mode mask */
umask(0); umask(S_IWGRP | S_IWOTH);
/* new SID for the daemon process */ /* new SID for the daemon process */
sid = setsid(); sid = setsid();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment