#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 {
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");
}