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); |
