realtek: add base register field LED support
[openwrt/staging/svanheule.git] / target / linux / realtek / files-5.10 / drivers / leds / realtek / led-regfield.h
diff --git a/target/linux/realtek/files-5.10/drivers/leds/realtek/led-regfield.h b/target/linux/realtek/files-5.10/drivers/leds/realtek/led-regfield.h
new file mode 100644 (file)
index 0000000..f0a7c02
--- /dev/null
@@ -0,0 +1,55 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef LEDS_REALTEK_LED_REGFIELD_H
+#define LEDS_REALTEK_LED_REGFIELD_H
+
+#include <linux/device.h>
+#include <linux/fwnode.h>
+#include <linux/leds.h>
+#include <linux/regmap.h>
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0)
+#include <linux/container_of.h>
+#else
+#include <linux/kernel.h>
+#endif
+
+/*
+ * Register field LED
+ *
+ * Next to being able to turn an LED on or off, Realtek provides LED management
+ * peripherals with hardware accelerated blinking modes with 50% duty cycle.
+ */
+struct regfield_led_blink_mode {
+       u16 toggle_ms; /* Toggle interval in ms */
+       u8 mode; /* ASIC mode bits */
+};
+
+struct regfield_led_modes {
+       u8 off;
+       u8 on;
+       /*
+        * List of blink modes. Must be sorted by interval and terminated by an
+        * entry where regfield_led_blink_mode::toggle_ms equals zero.
+        */
+       struct regfield_led_blink_mode blink[];
+};
+
+struct regfield_led {
+       struct led_classdev cdev;
+       const struct regfield_led_modes *modes;
+       struct regmap_field *field;
+       void (*commit)(struct regfield_led *led);
+       bool active_low;
+};
+
+static inline struct regfield_led *to_regfield_led(struct led_classdev *cdev)
+{
+       return container_of(cdev, struct regfield_led, cdev);
+}
+
+int regfield_led_init(struct regfield_led *led, struct regmap_field *field,
+                     struct fwnode_handle *led_node, const struct regfield_led_modes *modes);
+
+#endif