aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.4/950-0916-leds-Add-the-actpwr-trigger.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0916-leds-Add-the-actpwr-trigger.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.4/950-0916-leds-Add-the-actpwr-trigger.patch236
1 files changed, 0 insertions, 236 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0916-leds-Add-the-actpwr-trigger.patch b/target/linux/bcm27xx/patches-5.4/950-0916-leds-Add-the-actpwr-trigger.patch
deleted file mode 100644
index 2f0aaa0006..0000000000
--- a/target/linux/bcm27xx/patches-5.4/950-0916-leds-Add-the-actpwr-trigger.patch
+++ /dev/null
@@ -1,236 +0,0 @@
-From 6586d75915287dd336b71e17826f037be7926ebe Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.com>
-Date: Mon, 13 Jul 2020 10:33:19 +0100
-Subject: [PATCH] leds: Add the actpwr trigger
-
-The actpwr trigger is a meta trigger that cycles between an inverted
-mmc0 and default-on. It is written in a way that could fairly easily
-be generalised to support alternative sets of source triggers.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.com>
----
- drivers/leds/trigger/Kconfig | 11 ++
- drivers/leds/trigger/Makefile | 1 +
- drivers/leds/trigger/ledtrig-actpwr.c | 191 ++++++++++++++++++++++++++
- 3 files changed, 203 insertions(+)
- create mode 100644 drivers/leds/trigger/ledtrig-actpwr.c
-
---- a/drivers/leds/trigger/Kconfig
-+++ b/drivers/leds/trigger/Kconfig
-@@ -151,4 +151,15 @@ config LEDS_TRIGGER_AUDIO
- the audio mute and mic-mute changes.
- If unsure, say N
-
-+config LEDS_TRIGGER_ACTPWR
-+ tristate "ACT/PWR Input Trigger"
-+ depends on LEDS_TRIGGERS
-+ help
-+ This trigger is intended for platforms that have one software-
-+ controllable LED and no dedicated activity or power LEDs, hence the
-+ need to make the one LED perform both functions. It cycles between
-+ default-on and an inverted mmc0 every 500ms, guaranteeing that it is
-+ on for at least half of the time.
-+ If unsure, say N.
-+
- endif # LEDS_TRIGGERS
---- a/drivers/leds/trigger/Makefile
-+++ b/drivers/leds/trigger/Makefile
-@@ -16,3 +16,4 @@ obj-$(CONFIG_LEDS_TRIGGER_PANIC) += ledt
- obj-$(CONFIG_LEDS_TRIGGER_NETDEV) += ledtrig-netdev.o
- obj-$(CONFIG_LEDS_TRIGGER_PATTERN) += ledtrig-pattern.o
- obj-$(CONFIG_LEDS_TRIGGER_AUDIO) += ledtrig-audio.o
-+obj-$(CONFIG_LEDS_TRIGGER_ACTPWR) += ledtrig-actpwr.o
---- /dev/null
-+++ b/drivers/leds/trigger/ledtrig-actpwr.c
-@@ -0,0 +1,191 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Activity/power trigger
-+ *
-+ * Copyright (C) 2020 Raspberry Pi (Trading) Ltd.
-+ *
-+ * Based on Atsushi Nemoto's ledtrig-heartbeat.c, although there may be
-+ * nothing left of the original now.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/timer.h>
-+#include <linux/leds.h>
-+#include "../leds.h"
-+
-+enum {
-+ TRIG_ACT,
-+ TRIG_PWR,
-+
-+ TRIG_COUNT
-+};
-+
-+struct actpwr_trig_src {
-+ const char *name;
-+ int interval;
-+ bool invert;
-+};
-+
-+struct actpwr_vled {
-+ struct led_classdev cdev;
-+ struct actpwr_trig_data *parent;
-+ enum led_brightness value;
-+ unsigned int interval;
-+ bool invert;
-+};
-+
-+struct actpwr_trig_data {
-+ struct led_trigger trig;
-+ struct actpwr_vled virt_leds[TRIG_COUNT];
-+ struct actpwr_vled *active;
-+ struct timer_list timer;
-+ int next_active;
-+};
-+
-+static int actpwr_trig_activate(struct led_classdev *led_cdev);
-+static void actpwr_trig_deactivate(struct led_classdev *led_cdev);
-+
-+static const struct actpwr_trig_src actpwr_trig_sources[TRIG_COUNT] = {
-+ [TRIG_ACT] = { "mmc0", 500, true },
-+ [TRIG_PWR] = { "default-on", 500, false },
-+};
-+
-+static struct actpwr_trig_data actpwr_data = {
-+ {
-+ .name = "actpwr",
-+ .activate = actpwr_trig_activate,
-+ .deactivate = actpwr_trig_deactivate,
-+ }
-+};
-+
-+static void actpwr_brightness_set(struct led_classdev *led_cdev,
-+ enum led_brightness value)
-+{
-+ struct actpwr_vled *vled = container_of(led_cdev, struct actpwr_vled,
-+ cdev);
-+ struct actpwr_trig_data *trig = vled->parent;
-+
-+ if (vled->invert)
-+ value = !value;
-+ vled->value = value;
-+
-+ if (vled == trig->active)
-+ led_trigger_event(&trig->trig, value);
-+}
-+
-+static int actpwr_brightness_set_blocking(struct led_classdev *led_cdev,
-+ enum led_brightness value)
-+{
-+ actpwr_brightness_set(led_cdev, value);
-+ return 0;
-+}
-+
-+static enum led_brightness actpwr_brightness_get(struct led_classdev *led_cdev)
-+{
-+ struct actpwr_vled *vled = container_of(led_cdev, struct actpwr_vled,
-+ cdev);
-+
-+ return vled->value;
-+}
-+
-+static void actpwr_trig_cycle(struct timer_list *t)
-+{
-+ struct actpwr_trig_data *trig = &actpwr_data;
-+ struct actpwr_vled *active;
-+ enum led_brightness value;
-+
-+ active = &trig->virt_leds[trig->next_active];
-+ trig->active = active;
-+ trig->next_active = (trig->next_active + 1) % TRIG_COUNT;
-+
-+ led_trigger_event(&trig->trig, active->value);
-+
-+ mod_timer(&trig->timer, jiffies + msecs_to_jiffies(active->interval));
-+}
-+
-+static int actpwr_trig_activate(struct led_classdev *led_cdev)
-+{
-+ struct actpwr_trig_data *trig = &actpwr_data;
-+
-+ /* Start the timer if this is the first LED */
-+ if (!trig->active)
-+ actpwr_trig_cycle(&trig->timer);
-+ else
-+ led_set_brightness_nosleep(led_cdev, trig->active->value);
-+
-+ return 0;
-+}
-+
-+static void actpwr_trig_deactivate(struct led_classdev *led_cdev)
-+{
-+ struct actpwr_trig_data *trig = &actpwr_data;
-+
-+ if (list_empty(&trig->trig.led_cdevs)) {
-+ del_timer_sync(&trig->timer);
-+ trig->active = NULL;
-+ }
-+}
-+
-+static int __init actpwr_trig_init(void)
-+{
-+ struct actpwr_trig_data *trig = &actpwr_data;
-+ int ret = 0;
-+ int i;
-+
-+ timer_setup(&trig->timer, actpwr_trig_cycle, 0);
-+
-+ /* Register one "LED" for each source trigger */
-+ for (i = 0; i < TRIG_COUNT; i++)
-+ {
-+ struct actpwr_vled *vled = &trig->virt_leds[i];
-+ struct led_classdev *cdev = &vled->cdev;
-+ const struct actpwr_trig_src *src = &actpwr_trig_sources[i];
-+
-+ vled->parent = trig;
-+ vled->interval = src->interval;
-+ vled->invert = src->invert;
-+ cdev->name = src->name;
-+ cdev->brightness_set = actpwr_brightness_set;
-+ cdev->brightness_set_blocking = actpwr_brightness_set_blocking;
-+ cdev->brightness_get = actpwr_brightness_get;
-+ cdev->default_trigger = src->name;
-+ ret = led_classdev_register(NULL, cdev);
-+ if (ret)
-+ goto error_classdev;
-+ }
-+
-+ ret = led_trigger_register(&trig->trig);
-+ if (ret)
-+ goto error_classdev;
-+
-+ return 0;
-+
-+error_classdev:
-+ while (i > 0)
-+ {
-+ i--;
-+ led_classdev_unregister(&trig->virt_leds[i].cdev);
-+ }
-+
-+ return ret;
-+}
-+
-+static void __exit actpwr_trig_exit(void)
-+{
-+ int i;
-+
-+ led_trigger_unregister(&actpwr_data.trig);
-+ for (i = 0; i < TRIG_COUNT; i++)
-+ {
-+ led_classdev_unregister(&actpwr_data.virt_leds[i].cdev);
-+ }
-+}
-+
-+module_init(actpwr_trig_init);
-+module_exit(actpwr_trig_exit);
-+
-+MODULE_AUTHOR("Phil Elwell <phil@raspberrypi.com>");
-+MODULE_DESCRIPTION("ACT/PWR LED trigger");
-+MODULE_LICENSE("GPL v2");