|
|
|
From af7c9bdc7c407c585fd3c6eac2ad42e78e1fb08c Mon Sep 17 00:00:00 2001
|
|
|
|
From: Stefan Wahren <stefan.wahren@i2se.com>
|
|
|
|
Date: Sat, 6 Oct 2018 16:46:18 +0200
|
|
|
|
Subject: [PATCH 146/725] hwmon: raspberrypi: Prevent voltage low warnings from
|
|
|
|
filling log
|
|
|
|
|
|
|
|
Although the correct fix for low voltage warnings is to
|
|
|
|
improve the power supply, the current implementation
|
|
|
|
of the detection can fill the log if the warning
|
|
|
|
happens freqently. This replaces the logging with
|
|
|
|
slightly custom ratelimited logging.
|
|
|
|
|
|
|
|
Signed-off-by: James Hughes <james.hughes@raspberrypi.org>
|
|
|
|
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
|
|
|
---
|
|
|
|
drivers/hwmon/raspberrypi-hwmon.c | 41 ++++++++++++++++++++++++++++---
|
|
|
|
1 file changed, 37 insertions(+), 4 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/hwmon/raspberrypi-hwmon.c
|
|
|
|
+++ b/drivers/hwmon/raspberrypi-hwmon.c
|
|
|
|
@@ -15,6 +15,36 @@
|
|
|
|
#include <linux/workqueue.h>
|
|
|
|
#include <soc/bcm2835/raspberrypi-firmware.h>
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * This section defines some rate limited logging that prevent
|
|
|
|
+ * repeated messages at much lower Hz than the default kernel settings.
|
|
|
|
+ * It's usually 5s, this is 5 minutes.
|
|
|
|
+ * Burst 3 means you may get three messages 'quickly', before
|
|
|
|
+ * the ratelimiting kicks in.
|
|
|
|
+ */
|
|
|
|
+#define LOCAL_RATELIMIT_INTERVAL (5 * 60 * HZ)
|
|
|
|
+#define LOCAL_RATELIMIT_BURST 3
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_PRINTK
|
|
|
|
+#define printk_ratelimited_local(fmt, ...) \
|
|
|
|
+({ \
|
|
|
|
+ static DEFINE_RATELIMIT_STATE(_rs, \
|
|
|
|
+ LOCAL_RATELIMIT_INTERVAL, \
|
|
|
|
+ LOCAL_RATELIMIT_BURST); \
|
|
|
|
+ \
|
|
|
|
+ if (__ratelimit(&_rs)) \
|
|
|
|
+ printk(fmt, ##__VA_ARGS__); \
|
|
|
|
+})
|
|
|
|
+#else
|
|
|
|
+#define printk_ratelimited_local(fmt, ...) \
|
|
|
|
+ no_printk(fmt, ##__VA_ARGS__)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#define pr_crit_ratelimited_local(fmt, ...) \
|
|
|
|
+ printk_ratelimited_local(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
|
|
|
|
+#define pr_info_ratelimited_local(fmt, ...) \
|
|
|
|
+printk_ratelimited_local(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
|
|
|
|
+
|
|
|
|
#define UNDERVOLTAGE_STICKY_BIT BIT(16)
|
|
|
|
|
|
|
|
struct rpi_hwmon_data {
|
|
|
|
@@ -47,10 +77,13 @@ static void rpi_firmware_get_throttled(s
|
|
|
|
if (new_uv == old_uv)
|
|
|
|
return;
|
|
|
|
|
|
|
|
- if (new_uv)
|
|
|
|
- dev_crit(data->hwmon_dev, "Undervoltage detected!\n");
|
|
|
|
- else
|
|
|
|
- dev_info(data->hwmon_dev, "Voltage normalised\n");
|
|
|
|
+ if (new_uv) {
|
|
|
|
+ pr_crit_ratelimited_local("Under-voltage detected! (0x%08x)\n",
|
|
|
|
+ value);
|
|
|
|
+ } else {
|
|
|
|
+ pr_info_ratelimited_local("Voltage normalised (0x%08x)\n",
|
|
|
|
+ value);
|
|
|
|
+ }
|
|
|
|
|
|
|
|
sysfs_notify(&data->hwmon_dev->kobj, NULL, "in0_lcrit_alarm");
|
|
|
|
}
|