diff options
-rw-r--r-- | drivers/thermal/int340x_thermal/int3400_thermal.c | 10 | ||||
-rw-r--r-- | drivers/thermal/intel_powerclamp.c | 1 | ||||
-rw-r--r-- | drivers/thermal/rcar_thermal.c | 26 | ||||
-rw-r--r-- | drivers/thermal/samsung/exynos_tmu.c | 38 | ||||
-rw-r--r-- | drivers/thermal/ti-soc-thermal/ti-bandgap.c | 2 | ||||
-rw-r--r-- | drivers/thermal/ti-soc-thermal/ti-thermal-common.c | 2 | ||||
-rw-r--r-- | include/linux/thermal.h | 56 | ||||
-rw-r--r-- | tools/thermal/tmon/.gitignore | 1 | ||||
-rw-r--r-- | tools/thermal/tmon/Makefile | 15 | ||||
-rw-r--r-- | tools/thermal/tmon/tmon.8 | 2 | ||||
-rw-r--r-- | tools/thermal/tmon/tmon.c | 14 | ||||
-rw-r--r-- | tools/thermal/tmon/tui.c | 45 |
12 files changed, 145 insertions, 67 deletions
diff --git a/drivers/thermal/int340x_thermal/int3400_thermal.c b/drivers/thermal/int340x_thermal/int3400_thermal.c index 25d244cbbe8f..031018e7a65b 100644 --- a/drivers/thermal/int340x_thermal/int3400_thermal.c +++ b/drivers/thermal/int340x_thermal/int3400_thermal.c | |||
@@ -262,13 +262,12 @@ static int int3400_thermal_probe(struct platform_device *pdev) | |||
262 | result = acpi_parse_art(priv->adev->handle, &priv->art_count, | 262 | result = acpi_parse_art(priv->adev->handle, &priv->art_count, |
263 | &priv->arts, true); | 263 | &priv->arts, true); |
264 | if (result) | 264 | if (result) |
265 | goto free_priv; | 265 | dev_dbg(&pdev->dev, "_ART table parsing error\n"); |
266 | |||
267 | 266 | ||
268 | result = acpi_parse_trt(priv->adev->handle, &priv->trt_count, | 267 | result = acpi_parse_trt(priv->adev->handle, &priv->trt_count, |
269 | &priv->trts, true); | 268 | &priv->trts, true); |
270 | if (result) | 269 | if (result) |
271 | goto free_art; | 270 | dev_dbg(&pdev->dev, "_TRT table parsing error\n"); |
272 | 271 | ||
273 | platform_set_drvdata(pdev, priv); | 272 | platform_set_drvdata(pdev, priv); |
274 | 273 | ||
@@ -281,7 +280,7 @@ static int int3400_thermal_probe(struct platform_device *pdev) | |||
281 | &int3400_thermal_params, 0, 0); | 280 | &int3400_thermal_params, 0, 0); |
282 | if (IS_ERR(priv->thermal)) { | 281 | if (IS_ERR(priv->thermal)) { |
283 | result = PTR_ERR(priv->thermal); | 282 | result = PTR_ERR(priv->thermal); |
284 | goto free_trt; | 283 | goto free_art_trt; |
285 | } | 284 | } |
286 | 285 | ||
287 | priv->rel_misc_dev_res = acpi_thermal_rel_misc_device_add( | 286 | priv->rel_misc_dev_res = acpi_thermal_rel_misc_device_add( |
@@ -295,9 +294,8 @@ static int int3400_thermal_probe(struct platform_device *pdev) | |||
295 | 294 | ||
296 | free_zone: | 295 | free_zone: |
297 | thermal_zone_device_unregister(priv->thermal); | 296 | thermal_zone_device_unregister(priv->thermal); |
298 | free_trt: | 297 | free_art_trt: |
299 | kfree(priv->trts); | 298 | kfree(priv->trts); |
300 | free_art: | ||
301 | kfree(priv->arts); | 299 | kfree(priv->arts); |
302 | free_priv: | 300 | free_priv: |
303 | kfree(priv); | 301 | kfree(priv); |
diff --git a/drivers/thermal/intel_powerclamp.c b/drivers/thermal/intel_powerclamp.c index 6ceebd659dd4..12623bc02f46 100644 --- a/drivers/thermal/intel_powerclamp.c +++ b/drivers/thermal/intel_powerclamp.c | |||
@@ -688,6 +688,7 @@ static const struct x86_cpu_id intel_powerclamp_ids[] = { | |||
688 | { X86_VENDOR_INTEL, 6, 0x45}, | 688 | { X86_VENDOR_INTEL, 6, 0x45}, |
689 | { X86_VENDOR_INTEL, 6, 0x46}, | 689 | { X86_VENDOR_INTEL, 6, 0x46}, |
690 | { X86_VENDOR_INTEL, 6, 0x4c}, | 690 | { X86_VENDOR_INTEL, 6, 0x4c}, |
691 | { X86_VENDOR_INTEL, 6, 0x4d}, | ||
691 | { X86_VENDOR_INTEL, 6, 0x56}, | 692 | { X86_VENDOR_INTEL, 6, 0x56}, |
692 | {} | 693 | {} |
693 | }; | 694 | }; |
diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c index 2580a4872f90..fe4e767018c4 100644 --- a/drivers/thermal/rcar_thermal.c +++ b/drivers/thermal/rcar_thermal.c | |||
@@ -387,21 +387,9 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
387 | 387 | ||
388 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 388 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
389 | if (irq) { | 389 | if (irq) { |
390 | int ret; | ||
391 | |||
392 | /* | 390 | /* |
393 | * platform has IRQ support. | 391 | * platform has IRQ support. |
394 | * Then, driver uses common registers | 392 | * Then, driver uses common registers |
395 | */ | ||
396 | |||
397 | ret = devm_request_irq(dev, irq->start, rcar_thermal_irq, 0, | ||
398 | dev_name(dev), common); | ||
399 | if (ret) { | ||
400 | dev_err(dev, "irq request failed\n "); | ||
401 | return ret; | ||
402 | } | ||
403 | |||
404 | /* | ||
405 | * rcar_has_irq_support() will be enabled | 393 | * rcar_has_irq_support() will be enabled |
406 | */ | 394 | */ |
407 | res = platform_get_resource(pdev, IORESOURCE_MEM, mres++); | 395 | res = platform_get_resource(pdev, IORESOURCE_MEM, mres++); |
@@ -456,8 +444,16 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
456 | } | 444 | } |
457 | 445 | ||
458 | /* enable temperature comparation */ | 446 | /* enable temperature comparation */ |
459 | if (irq) | 447 | if (irq) { |
448 | ret = devm_request_irq(dev, irq->start, rcar_thermal_irq, 0, | ||
449 | dev_name(dev), common); | ||
450 | if (ret) { | ||
451 | dev_err(dev, "irq request failed\n "); | ||
452 | goto error_unregister; | ||
453 | } | ||
454 | |||
460 | rcar_thermal_common_write(common, ENR, enr_bits); | 455 | rcar_thermal_common_write(common, ENR, enr_bits); |
456 | } | ||
461 | 457 | ||
462 | platform_set_drvdata(pdev, common); | 458 | platform_set_drvdata(pdev, common); |
463 | 459 | ||
@@ -467,9 +463,9 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
467 | 463 | ||
468 | error_unregister: | 464 | error_unregister: |
469 | rcar_thermal_for_each_priv(priv, common) { | 465 | rcar_thermal_for_each_priv(priv, common) { |
470 | thermal_zone_device_unregister(priv->zone); | ||
471 | if (rcar_has_irq_support(priv)) | 466 | if (rcar_has_irq_support(priv)) |
472 | rcar_thermal_irq_disable(priv); | 467 | rcar_thermal_irq_disable(priv); |
468 | thermal_zone_device_unregister(priv->zone); | ||
473 | } | 469 | } |
474 | 470 | ||
475 | pm_runtime_put(dev); | 471 | pm_runtime_put(dev); |
@@ -485,9 +481,9 @@ static int rcar_thermal_remove(struct platform_device *pdev) | |||
485 | struct rcar_thermal_priv *priv; | 481 | struct rcar_thermal_priv *priv; |
486 | 482 | ||
487 | rcar_thermal_for_each_priv(priv, common) { | 483 | rcar_thermal_for_each_priv(priv, common) { |
488 | thermal_zone_device_unregister(priv->zone); | ||
489 | if (rcar_has_irq_support(priv)) | 484 | if (rcar_has_irq_support(priv)) |
490 | rcar_thermal_irq_disable(priv); | 485 | rcar_thermal_irq_disable(priv); |
486 | thermal_zone_device_unregister(priv->zone); | ||
491 | } | 487 | } |
492 | 488 | ||
493 | pm_runtime_put(dev); | 489 | pm_runtime_put(dev); |
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c index 933cd80a6bc5..1fc54ab911d2 100644 --- a/drivers/thermal/samsung/exynos_tmu.c +++ b/drivers/thermal/samsung/exynos_tmu.c | |||
@@ -918,34 +918,16 @@ static irqreturn_t exynos_tmu_irq(int irq, void *id) | |||
918 | } | 918 | } |
919 | 919 | ||
920 | static const struct of_device_id exynos_tmu_match[] = { | 920 | static const struct of_device_id exynos_tmu_match[] = { |
921 | { | 921 | { .compatible = "samsung,exynos3250-tmu", }, |
922 | .compatible = "samsung,exynos3250-tmu", | 922 | { .compatible = "samsung,exynos4210-tmu", }, |
923 | }, | 923 | { .compatible = "samsung,exynos4412-tmu", }, |
924 | { | 924 | { .compatible = "samsung,exynos5250-tmu", }, |
925 | .compatible = "samsung,exynos4210-tmu", | 925 | { .compatible = "samsung,exynos5260-tmu", }, |
926 | }, | 926 | { .compatible = "samsung,exynos5420-tmu", }, |
927 | { | 927 | { .compatible = "samsung,exynos5420-tmu-ext-triminfo", }, |
928 | .compatible = "samsung,exynos4412-tmu", | 928 | { .compatible = "samsung,exynos5440-tmu", }, |
929 | }, | 929 | { .compatible = "samsung,exynos7-tmu", }, |
930 | { | 930 | { /* sentinel */ }, |
931 | .compatible = "samsung,exynos5250-tmu", | ||
932 | }, | ||
933 | { | ||
934 | .compatible = "samsung,exynos5260-tmu", | ||
935 | }, | ||
936 | { | ||
937 | .compatible = "samsung,exynos5420-tmu", | ||
938 | }, | ||
939 | { | ||
940 | .compatible = "samsung,exynos5420-tmu-ext-triminfo", | ||
941 | }, | ||
942 | { | ||
943 | .compatible = "samsung,exynos5440-tmu", | ||
944 | }, | ||
945 | { | ||
946 | .compatible = "samsung,exynos7-tmu", | ||
947 | }, | ||
948 | {}, | ||
949 | }; | 931 | }; |
950 | MODULE_DEVICE_TABLE(of, exynos_tmu_match); | 932 | MODULE_DEVICE_TABLE(of, exynos_tmu_match); |
951 | 933 | ||
diff --git a/drivers/thermal/ti-soc-thermal/ti-bandgap.c b/drivers/thermal/ti-soc-thermal/ti-bandgap.c index 634b6ce0e63a..62a5d449c388 100644 --- a/drivers/thermal/ti-soc-thermal/ti-bandgap.c +++ b/drivers/thermal/ti-soc-thermal/ti-bandgap.c | |||
@@ -1402,7 +1402,7 @@ int ti_bandgap_remove(struct platform_device *pdev) | |||
1402 | return 0; | 1402 | return 0; |
1403 | } | 1403 | } |
1404 | 1404 | ||
1405 | #ifdef CONFIG_PM | 1405 | #ifdef CONFIG_PM_SLEEP |
1406 | static int ti_bandgap_save_ctxt(struct ti_bandgap *bgp) | 1406 | static int ti_bandgap_save_ctxt(struct ti_bandgap *bgp) |
1407 | { | 1407 | { |
1408 | int i; | 1408 | int i; |
diff --git a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c index 3fb054a10f6a..a38c1756442a 100644 --- a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c +++ b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c | |||
@@ -429,7 +429,7 @@ int ti_thermal_unregister_cpu_cooling(struct ti_bandgap *bgp, int id) | |||
429 | 429 | ||
430 | data = ti_bandgap_get_sensor_data(bgp, id); | 430 | data = ti_bandgap_get_sensor_data(bgp, id); |
431 | 431 | ||
432 | if (data && data->cool_dev) | 432 | if (data) |
433 | cpufreq_cooling_unregister(data->cool_dev); | 433 | cpufreq_cooling_unregister(data->cool_dev); |
434 | 434 | ||
435 | return 0; | 435 | return 0; |
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index fc52e307efab..5eac316490ea 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h | |||
@@ -314,6 +314,8 @@ void thermal_zone_of_sensor_unregister(struct device *dev, | |||
314 | } | 314 | } |
315 | 315 | ||
316 | #endif | 316 | #endif |
317 | |||
318 | #if IS_ENABLED(CONFIG_THERMAL) | ||
317 | struct thermal_zone_device *thermal_zone_device_register(const char *, int, int, | 319 | struct thermal_zone_device *thermal_zone_device_register(const char *, int, int, |
318 | void *, struct thermal_zone_device_ops *, | 320 | void *, struct thermal_zone_device_ops *, |
319 | const struct thermal_zone_params *, int, int); | 321 | const struct thermal_zone_params *, int, int); |
@@ -340,8 +342,58 @@ struct thermal_instance *get_thermal_instance(struct thermal_zone_device *, | |||
340 | struct thermal_cooling_device *, int); | 342 | struct thermal_cooling_device *, int); |
341 | void thermal_cdev_update(struct thermal_cooling_device *); | 343 | void thermal_cdev_update(struct thermal_cooling_device *); |
342 | void thermal_notify_framework(struct thermal_zone_device *, int); | 344 | void thermal_notify_framework(struct thermal_zone_device *, int); |
343 | 345 | #else | |
344 | #ifdef CONFIG_NET | 346 | static inline struct thermal_zone_device *thermal_zone_device_register( |
347 | const char *type, int trips, int mask, void *devdata, | ||
348 | struct thermal_zone_device_ops *ops, | ||
349 | const struct thermal_zone_params *tzp, | ||
350 | int passive_delay, int polling_delay) | ||
351 | { return ERR_PTR(-ENODEV); } | ||
352 | static inline void thermal_zone_device_unregister( | ||
353 | struct thermal_zone_device *tz) | ||
354 | { } | ||
355 | static inline int thermal_zone_bind_cooling_device( | ||
356 | struct thermal_zone_device *tz, int trip, | ||
357 | struct thermal_cooling_device *cdev, | ||
358 | unsigned long upper, unsigned long lower) | ||
359 | { return -ENODEV; } | ||
360 | static inline int thermal_zone_unbind_cooling_device( | ||
361 | struct thermal_zone_device *tz, int trip, | ||
362 | struct thermal_cooling_device *cdev) | ||
363 | { return -ENODEV; } | ||
364 | static inline void thermal_zone_device_update(struct thermal_zone_device *tz) | ||
365 | { } | ||
366 | static inline struct thermal_cooling_device * | ||
367 | thermal_cooling_device_register(char *type, void *devdata, | ||
368 | const struct thermal_cooling_device_ops *ops) | ||
369 | { return ERR_PTR(-ENODEV); } | ||
370 | static inline struct thermal_cooling_device * | ||
371 | thermal_of_cooling_device_register(struct device_node *np, | ||
372 | char *type, void *devdata, const struct thermal_cooling_device_ops *ops) | ||
373 | { return ERR_PTR(-ENODEV); } | ||
374 | static inline void thermal_cooling_device_unregister( | ||
375 | struct thermal_cooling_device *cdev) | ||
376 | { } | ||
377 | static inline struct thermal_zone_device *thermal_zone_get_zone_by_name( | ||
378 | const char *name) | ||
379 | { return ERR_PTR(-ENODEV); } | ||
380 | static inline int thermal_zone_get_temp( | ||
381 | struct thermal_zone_device *tz, unsigned long *temp) | ||
382 | { return -ENODEV; } | ||
383 | static inline int get_tz_trend(struct thermal_zone_device *tz, int trip) | ||
384 | { return -ENODEV; } | ||
385 | static inline struct thermal_instance * | ||
386 | get_thermal_instance(struct thermal_zone_device *tz, | ||
387 | struct thermal_cooling_device *cdev, int trip) | ||
388 | { return ERR_PTR(-ENODEV); } | ||
389 | static inline void thermal_cdev_update(struct thermal_cooling_device *cdev) | ||
390 | { } | ||
391 | static inline void thermal_notify_framework(struct thermal_zone_device *tz, | ||
392 | int trip) | ||
393 | { } | ||
394 | #endif /* CONFIG_THERMAL */ | ||
395 | |||
396 | #if defined(CONFIG_NET) && IS_ENABLED(CONFIG_THERMAL) | ||
345 | extern int thermal_generate_netlink_event(struct thermal_zone_device *tz, | 397 | extern int thermal_generate_netlink_event(struct thermal_zone_device *tz, |
346 | enum events event); | 398 | enum events event); |
347 | #else | 399 | #else |
diff --git a/tools/thermal/tmon/.gitignore b/tools/thermal/tmon/.gitignore new file mode 100644 index 000000000000..06e96be65276 --- /dev/null +++ b/tools/thermal/tmon/.gitignore | |||
@@ -0,0 +1 @@ | |||
/tmon | |||
diff --git a/tools/thermal/tmon/Makefile b/tools/thermal/tmon/Makefile index e775adcbd29f..0788621c8d76 100644 --- a/tools/thermal/tmon/Makefile +++ b/tools/thermal/tmon/Makefile | |||
@@ -2,8 +2,8 @@ VERSION = 1.0 | |||
2 | 2 | ||
3 | BINDIR=usr/bin | 3 | BINDIR=usr/bin |
4 | WARNFLAGS=-Wall -Wshadow -W -Wformat -Wimplicit-function-declaration -Wimplicit-int | 4 | WARNFLAGS=-Wall -Wshadow -W -Wformat -Wimplicit-function-declaration -Wimplicit-int |
5 | CFLAGS= -O1 ${WARNFLAGS} -fstack-protector | 5 | CFLAGS+= -O1 ${WARNFLAGS} -fstack-protector |
6 | CC=gcc | 6 | CC=$(CROSS_COMPILE)gcc |
7 | 7 | ||
8 | CFLAGS+=-D VERSION=\"$(VERSION)\" | 8 | CFLAGS+=-D VERSION=\"$(VERSION)\" |
9 | LDFLAGS+= | 9 | LDFLAGS+= |
@@ -16,12 +16,21 @@ INSTALL_CONFIGFILE=install -m 644 -p | |||
16 | CONFIG_FILE= | 16 | CONFIG_FILE= |
17 | CONFIG_PATH= | 17 | CONFIG_PATH= |
18 | 18 | ||
19 | # Static builds might require -ltinfo, for instance | ||
20 | ifneq ($(findstring -static, $(LDFLAGS)),) | ||
21 | STATIC := --static | ||
22 | endif | ||
23 | |||
24 | TMON_LIBS=-lm -lpthread | ||
25 | TMON_LIBS += $(shell pkg-config --libs $(STATIC) panelw ncursesw 2> /dev/null || \ | ||
26 | pkg-config --libs $(STATIC) panel ncurses 2> /dev/null || \ | ||
27 | echo -lpanel -lncurses) | ||
19 | 28 | ||
20 | OBJS = tmon.o tui.o sysfs.o pid.o | 29 | OBJS = tmon.o tui.o sysfs.o pid.o |
21 | OBJS += | 30 | OBJS += |
22 | 31 | ||
23 | tmon: $(OBJS) Makefile tmon.h | 32 | tmon: $(OBJS) Makefile tmon.h |
24 | $(CC) ${CFLAGS} $(LDFLAGS) $(OBJS) -o $(TARGET) -lm -lpanel -lncursesw -ltinfo -lpthread | 33 | $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $(TARGET) $(TMON_LIBS) |
25 | 34 | ||
26 | valgrind: tmon | 35 | valgrind: tmon |
27 | sudo valgrind -v --track-origins=yes --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./$(TARGET) 1> /dev/null | 36 | sudo valgrind -v --track-origins=yes --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./$(TARGET) 1> /dev/null |
diff --git a/tools/thermal/tmon/tmon.8 b/tools/thermal/tmon/tmon.8 index 0be727cb9892..02d5179803aa 100644 --- a/tools/thermal/tmon/tmon.8 +++ b/tools/thermal/tmon/tmon.8 | |||
@@ -55,6 +55,8 @@ The \fB-l --log\fP option write data to /var/tmp/tmon.log | |||
55 | .PP | 55 | .PP |
56 | The \fB-t --time-interval\fP option sets the polling interval in seconds | 56 | The \fB-t --time-interval\fP option sets the polling interval in seconds |
57 | .PP | 57 | .PP |
58 | The \fB-T --target-temp\fP option sets the initial target temperature | ||
59 | .PP | ||
58 | The \fB-v --version\fP option shows the version of \fBtmon \fP | 60 | The \fB-v --version\fP option shows the version of \fBtmon \fP |
59 | .PP | 61 | .PP |
60 | The \fB-z --zone\fP option sets the target therma zone instance to be controlled | 62 | The \fB-z --zone\fP option sets the target therma zone instance to be controlled |
diff --git a/tools/thermal/tmon/tmon.c b/tools/thermal/tmon/tmon.c index 09b7c3218334..9aa19652e8e8 100644 --- a/tools/thermal/tmon/tmon.c +++ b/tools/thermal/tmon/tmon.c | |||
@@ -64,6 +64,7 @@ void usage() | |||
64 | printf(" -h, --help show this help message\n"); | 64 | printf(" -h, --help show this help message\n"); |
65 | printf(" -l, --log log data to /var/tmp/tmon.log\n"); | 65 | printf(" -l, --log log data to /var/tmp/tmon.log\n"); |
66 | printf(" -t, --time-interval sampling time interval, > 1 sec.\n"); | 66 | printf(" -t, --time-interval sampling time interval, > 1 sec.\n"); |
67 | printf(" -T, --target-temp initial target temperature\n"); | ||
67 | printf(" -v, --version show version\n"); | 68 | printf(" -v, --version show version\n"); |
68 | printf(" -z, --zone target thermal zone id\n"); | 69 | printf(" -z, --zone target thermal zone id\n"); |
69 | 70 | ||
@@ -219,6 +220,7 @@ static struct option opts[] = { | |||
219 | { "control", 1, NULL, 'c' }, | 220 | { "control", 1, NULL, 'c' }, |
220 | { "daemon", 0, NULL, 'd' }, | 221 | { "daemon", 0, NULL, 'd' }, |
221 | { "time-interval", 1, NULL, 't' }, | 222 | { "time-interval", 1, NULL, 't' }, |
223 | { "target-temp", 1, NULL, 'T' }, | ||
222 | { "log", 0, NULL, 'l' }, | 224 | { "log", 0, NULL, 'l' }, |
223 | { "help", 0, NULL, 'h' }, | 225 | { "help", 0, NULL, 'h' }, |
224 | { "version", 0, NULL, 'v' }, | 226 | { "version", 0, NULL, 'v' }, |
@@ -231,7 +233,7 @@ int main(int argc, char **argv) | |||
231 | { | 233 | { |
232 | int err = 0; | 234 | int err = 0; |
233 | int id2 = 0, c; | 235 | int id2 = 0, c; |
234 | double yk = 0.0; /* controller output */ | 236 | double yk = 0.0, temp; /* controller output */ |
235 | int target_tz_index; | 237 | int target_tz_index; |
236 | 238 | ||
237 | if (geteuid() != 0) { | 239 | if (geteuid() != 0) { |
@@ -239,7 +241,7 @@ int main(int argc, char **argv) | |||
239 | exit(EXIT_FAILURE); | 241 | exit(EXIT_FAILURE); |
240 | } | 242 | } |
241 | 243 | ||
242 | while ((c = getopt_long(argc, argv, "c:dlht:vgz:", opts, &id2)) != -1) { | 244 | while ((c = getopt_long(argc, argv, "c:dlht:T:vgz:", opts, &id2)) != -1) { |
243 | switch (c) { | 245 | switch (c) { |
244 | case 'c': | 246 | case 'c': |
245 | no_control = 0; | 247 | no_control = 0; |
@@ -254,6 +256,14 @@ int main(int argc, char **argv) | |||
254 | if (ticktime < 1) | 256 | if (ticktime < 1) |
255 | ticktime = 1; | 257 | ticktime = 1; |
256 | break; | 258 | break; |
259 | case 'T': | ||
260 | temp = strtod(optarg, NULL); | ||
261 | if (temp < 0) { | ||
262 | fprintf(stderr, "error: temperature must be positive\n"); | ||
263 | return 1; | ||
264 | } | ||
265 | target_temp_user = temp; | ||
266 | break; | ||
257 | case 'l': | 267 | case 'l': |
258 | printf("Logging data to /var/tmp/tmon.log\n"); | 268 | printf("Logging data to /var/tmp/tmon.log\n"); |
259 | logging = 1; | 269 | logging = 1; |
diff --git a/tools/thermal/tmon/tui.c b/tools/thermal/tmon/tui.c index 89f8ef0e15c8..b5d1c6b22dd3 100644 --- a/tools/thermal/tmon/tui.c +++ b/tools/thermal/tmon/tui.c | |||
@@ -30,6 +30,18 @@ | |||
30 | 30 | ||
31 | #include "tmon.h" | 31 | #include "tmon.h" |
32 | 32 | ||
33 | #define min(x, y) ({ \ | ||
34 | typeof(x) _min1 = (x); \ | ||
35 | typeof(y) _min2 = (y); \ | ||
36 | (void) (&_min1 == &_min2); \ | ||
37 | _min1 < _min2 ? _min1 : _min2; }) | ||
38 | |||
39 | #define max(x, y) ({ \ | ||
40 | typeof(x) _max1 = (x); \ | ||
41 | typeof(y) _max2 = (y); \ | ||
42 | (void) (&_max1 == &_max2); \ | ||
43 | _max1 > _max2 ? _max1 : _max2; }) | ||
44 | |||
33 | static PANEL *data_panel; | 45 | static PANEL *data_panel; |
34 | static PANEL *dialogue_panel; | 46 | static PANEL *dialogue_panel; |
35 | static PANEL *top; | 47 | static PANEL *top; |
@@ -98,6 +110,18 @@ void write_status_bar(int x, char *line) | |||
98 | wrefresh(status_bar_window); | 110 | wrefresh(status_bar_window); |
99 | } | 111 | } |
100 | 112 | ||
113 | /* wrap at 5 */ | ||
114 | #define DIAG_DEV_ROWS 5 | ||
115 | /* | ||
116 | * list cooling devices + "set temp" entry; wraps after 5 rows, if they fit | ||
117 | */ | ||
118 | static int diag_dev_rows(void) | ||
119 | { | ||
120 | int entries = ptdata.nr_cooling_dev + 1; | ||
121 | int rows = max(DIAG_DEV_ROWS, (entries + 1) / 2); | ||
122 | return min(rows, entries); | ||
123 | } | ||
124 | |||
101 | void setup_windows(void) | 125 | void setup_windows(void) |
102 | { | 126 | { |
103 | int y_begin = 1; | 127 | int y_begin = 1; |
@@ -122,7 +146,7 @@ void setup_windows(void) | |||
122 | * dialogue window is a pop-up, when needed it lays on top of cdev win | 146 | * dialogue window is a pop-up, when needed it lays on top of cdev win |
123 | */ | 147 | */ |
124 | 148 | ||
125 | dialogue_window = subwin(stdscr, ptdata.nr_cooling_dev+5, maxx-50, | 149 | dialogue_window = subwin(stdscr, diag_dev_rows() + 5, maxx-50, |
126 | DIAG_Y, DIAG_X); | 150 | DIAG_Y, DIAG_X); |
127 | 151 | ||
128 | thermal_data_window = subwin(stdscr, ptdata.nr_tz_sensor * | 152 | thermal_data_window = subwin(stdscr, ptdata.nr_tz_sensor * |
@@ -258,21 +282,26 @@ void show_cooling_device(void) | |||
258 | } | 282 | } |
259 | 283 | ||
260 | const char DIAG_TITLE[] = "[ TUNABLES ]"; | 284 | const char DIAG_TITLE[] = "[ TUNABLES ]"; |
261 | #define DIAG_DEV_ROWS 5 | ||
262 | void show_dialogue(void) | 285 | void show_dialogue(void) |
263 | { | 286 | { |
264 | int j, x = 0, y = 0; | 287 | int j, x = 0, y = 0; |
288 | int rows, cols; | ||
265 | WINDOW *w = dialogue_window; | 289 | WINDOW *w = dialogue_window; |
266 | 290 | ||
267 | if (tui_disabled || !w) | 291 | if (tui_disabled || !w) |
268 | return; | 292 | return; |
269 | 293 | ||
294 | getmaxyx(w, rows, cols); | ||
295 | |||
296 | /* Silence compiler 'unused' warnings */ | ||
297 | (void)cols; | ||
298 | |||
270 | werase(w); | 299 | werase(w); |
271 | box(w, 0, 0); | 300 | box(w, 0, 0); |
272 | mvwprintw(w, 0, maxx/4, DIAG_TITLE); | 301 | mvwprintw(w, 0, maxx/4, DIAG_TITLE); |
273 | /* list all the available tunables */ | 302 | /* list all the available tunables */ |
274 | for (j = 0; j <= ptdata.nr_cooling_dev; j++) { | 303 | for (j = 0; j <= ptdata.nr_cooling_dev; j++) { |
275 | y = j % DIAG_DEV_ROWS; | 304 | y = j % diag_dev_rows(); |
276 | if (y == 0 && j != 0) | 305 | if (y == 0 && j != 0) |
277 | x += 20; | 306 | x += 20; |
278 | if (j == ptdata.nr_cooling_dev) | 307 | if (j == ptdata.nr_cooling_dev) |
@@ -283,12 +312,10 @@ void show_dialogue(void) | |||
283 | ptdata.cdi[j].type, ptdata.cdi[j].instance); | 312 | ptdata.cdi[j].type, ptdata.cdi[j].instance); |
284 | } | 313 | } |
285 | wattron(w, A_BOLD); | 314 | wattron(w, A_BOLD); |
286 | mvwprintw(w, DIAG_DEV_ROWS+1, 1, "Enter Choice [A-Z]?"); | 315 | mvwprintw(w, diag_dev_rows()+1, 1, "Enter Choice [A-Z]?"); |
287 | wattroff(w, A_BOLD); | 316 | wattroff(w, A_BOLD); |
288 | /* y size of dialogue win is nr cdev + 5, so print legend | 317 | /* print legend at the bottom line */ |
289 | * at the bottom line | 318 | mvwprintw(w, rows - 2, 1, |
290 | */ | ||
291 | mvwprintw(w, ptdata.nr_cooling_dev+3, 1, | ||
292 | "Legend: A=Active, P=Passive, C=Critical"); | 319 | "Legend: A=Active, P=Passive, C=Critical"); |
293 | 320 | ||
294 | wrefresh(dialogue_window); | 321 | wrefresh(dialogue_window); |
@@ -437,7 +464,7 @@ static void handle_input_choice(int ch) | |||
437 | snprintf(buf, sizeof(buf), "New Value for %.10s-%2d: ", | 464 | snprintf(buf, sizeof(buf), "New Value for %.10s-%2d: ", |
438 | ptdata.cdi[cdev_id].type, | 465 | ptdata.cdi[cdev_id].type, |
439 | ptdata.cdi[cdev_id].instance); | 466 | ptdata.cdi[cdev_id].instance); |
440 | write_dialogue_win(buf, DIAG_DEV_ROWS+2, 2); | 467 | write_dialogue_win(buf, diag_dev_rows() + 2, 2); |
441 | handle_input_val(cdev_id); | 468 | handle_input_val(cdev_id); |
442 | } else { | 469 | } else { |
443 | snprintf(buf, sizeof(buf), "Invalid selection %d", ch); | 470 | snprintf(buf, sizeof(buf), "Invalid selection %d", ch); |