Coverage Report

Created: 2026-10-13 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/barebox/drivers/led/led-triggers.c
Line
Count
Source
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
 * LED trigger support for barebox
4
 *
5
 * (C) Copyright 2010 Sascha Hauer, Pengutronix
6
 */
7
8
#include <common.h>
9
#include <poller.h>
10
#include <errno.h>
11
#include <clock.h>
12
#include <led.h>
13
#include <init.h>
14
15
/**
16
 * @file
17
 * @brief LED trigger framework
18
 *
19
 * This file contains triggers which can be associated to LEDs.
20
 *
21
 * With this framework LEDs can be associated to different events.
22
 * An event can be a heartbeat, network activity or panic.
23
 * led_trigger() is the central function which is called in the
24
 * different barebox frameworks to trigger an event.
25
 *
26
 * currently there are the following triggers are defined:
27
 *
28
 * led_trigger_panic:   triggered in panic()
29
 * led_trigger_heartbeat: shows the heartbeat of barebox. Blinks as long
30
 *        barebox is up and running.
31
 * led_trigger_net_rx:    Triggered during network packet reception
32
 * led_trigger_net_tx:    Triggered during network packet transmission
33
 * led_trigger_net_txrx:  combination of the two above
34
 */
35
36
struct led_trigger_struct {
37
  struct led *led;
38
  struct list_head list;
39
  enum led_trigger trigger;
40
};
41
42
static LIST_HEAD(led_triggers);
43
44
/**
45
 * led_trigger - triggers a trigger
46
 * @param trigger The trigger to enable/disable
47
 * @param enable  true if enable
48
 *
49
 * Enable/disable a LED for a given trigger.
50
 */
51
void led_trigger(enum led_trigger trigger, enum trigger_type type)
52
0
{
53
0
  struct led_trigger_struct *led_trigger;
54
55
0
  if (trigger >= LED_TRIGGER_MAX)
56
0
    return;
57
58
0
  list_for_each_entry(led_trigger, &led_triggers, list) {
59
0
    if (led_trigger->trigger != trigger)
60
0
      continue;
61
62
0
    switch (type) {
63
0
    case TRIGGER_FLASH:
64
0
      led_flash(led_trigger->led, 200);
65
0
      break;
66
0
    case TRIGGER_ENABLE:
67
0
      led_set(led_trigger->led, led_trigger->led->max_value);
68
0
      break;
69
0
    case TRIGGER_DISABLE:
70
0
      led_set(led_trigger->led, 0);
71
0
      break;
72
0
    }
73
0
  }
74
0
}
75
76
static struct led_trigger_struct *led_find_trigger(struct led *led)
77
0
{
78
0
  struct led_trigger_struct *led_trigger;
79
80
0
  list_for_each_entry(led_trigger, &led_triggers, list)
81
0
    if (led_trigger->led == led)
82
0
      return led_trigger;
83
84
0
  return NULL;
85
0
}
86
87
void led_trigger_disable(struct led *led)
88
0
{
89
0
  struct led_trigger_struct *led_trigger;
90
91
0
  led_trigger = led_find_trigger(led);
92
0
  if (!led_trigger)
93
0
    return;
94
95
0
  list_del(&led_trigger->list);
96
97
0
  led_set(led, 0);
98
99
0
  free(led_trigger);
100
0
}
101
102
/**
103
 * led_set_trigger - set the LED for a trigger
104
 * @param trigger The trigger to set a LED for
105
 * @param led   The LED
106
 *
107
 * This function associates a trigger with a LED. Pass led = NULL
108
 * to disable a trigger
109
 */
110
int led_set_trigger(enum led_trigger trigger, struct led *led)
111
0
{
112
0
  struct led_trigger_struct *led_trigger;
113
114
0
  if (trigger >= LED_TRIGGER_MAX)
115
0
    return -EINVAL;
116
117
0
  led_trigger_disable(led);
118
119
0
  led_trigger = xzalloc(sizeof(*led_trigger));
120
121
0
  led_trigger->led = led;
122
0
  led_trigger->trigger = trigger;
123
0
  list_add_tail(&led_trigger->list, &led_triggers);
124
125
0
  if (trigger == LED_TRIGGER_DEFAULT_ON)
126
0
    led_set(led, led->max_value);
127
0
  if (trigger == LED_TRIGGER_HEARTBEAT)
128
0
    led_blink(led, 200, 1000);
129
130
0
  return 0;
131
0
}
132
133
/**
134
 * led_triggers_show_info - Show information about all registered
135
 * triggers
136
 */
137
void led_triggers_show_info(void)
138
0
{
139
0
  struct led_trigger_struct *led_trigger;
140
0
  int i;
141
142
0
  for (i = 0; i < LED_TRIGGER_MAX; i++) {
143
0
    printf("%s", trigger_name(i));
144
145
0
    list_for_each_entry(led_trigger, &led_triggers, list) {
146
0
      struct led *led = led_trigger->led;
147
148
0
      if (led_trigger->trigger != i)
149
0
        continue;
150
151
0
      printf("\n  LED %d (%s)", led->num, led->name);
152
0
    }
153
154
0
    printf("\n");
155
0
  }
156
0
}