aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegor Yefremov <yegorslists@googlemail.com>2015-03-16 04:38:13 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2015-03-22 18:50:11 -0400
commitc54eb70e3bb8cd0d7b8564bedab63e834656c567 (patch)
treea910f5408ea2f0bf9c7aab2d100348e14b5ce559
parentfba6f9117a3d87a269fc3b174127c99f25f4979e (diff)
can: add combined rx/tx LED trigger support
Add <ifname>-rxtx trigger, that will be activated both for tx as rx events. This trigger mimics "activity" LED for Ethernet devices. Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r--drivers/net/can/led.c22
-rw-r--r--include/linux/can/dev.h2
-rw-r--r--include/linux/can/led.h6
3 files changed, 25 insertions, 5 deletions
diff --git a/drivers/net/can/led.c b/drivers/net/can/led.c
index ab7f1b01be49..c1b667675fa1 100644
--- a/drivers/net/can/led.c
+++ b/drivers/net/can/led.c
@@ -30,20 +30,28 @@ void can_led_event(struct net_device *netdev, enum can_led_event event)
30 case CAN_LED_EVENT_OPEN: 30 case CAN_LED_EVENT_OPEN:
31 led_trigger_event(priv->tx_led_trig, LED_FULL); 31 led_trigger_event(priv->tx_led_trig, LED_FULL);
32 led_trigger_event(priv->rx_led_trig, LED_FULL); 32 led_trigger_event(priv->rx_led_trig, LED_FULL);
33 led_trigger_event(priv->rxtx_led_trig, LED_FULL);
33 break; 34 break;
34 case CAN_LED_EVENT_STOP: 35 case CAN_LED_EVENT_STOP:
35 led_trigger_event(priv->tx_led_trig, LED_OFF); 36 led_trigger_event(priv->tx_led_trig, LED_OFF);
36 led_trigger_event(priv->rx_led_trig, LED_OFF); 37 led_trigger_event(priv->rx_led_trig, LED_OFF);
38 led_trigger_event(priv->rxtx_led_trig, LED_OFF);
37 break; 39 break;
38 case CAN_LED_EVENT_TX: 40 case CAN_LED_EVENT_TX:
39 if (led_delay) 41 if (led_delay) {
40 led_trigger_blink_oneshot(priv->tx_led_trig, 42 led_trigger_blink_oneshot(priv->tx_led_trig,
41 &led_delay, &led_delay, 1); 43 &led_delay, &led_delay, 1);
44 led_trigger_blink_oneshot(priv->rxtx_led_trig,
45 &led_delay, &led_delay, 1);
46 }
42 break; 47 break;
43 case CAN_LED_EVENT_RX: 48 case CAN_LED_EVENT_RX:
44 if (led_delay) 49 if (led_delay) {
45 led_trigger_blink_oneshot(priv->rx_led_trig, 50 led_trigger_blink_oneshot(priv->rx_led_trig,
46 &led_delay, &led_delay, 1); 51 &led_delay, &led_delay, 1);
52 led_trigger_blink_oneshot(priv->rxtx_led_trig,
53 &led_delay, &led_delay, 1);
54 }
47 break; 55 break;
48 } 56 }
49} 57}
@@ -55,6 +63,7 @@ static void can_led_release(struct device *gendev, void *res)
55 63
56 led_trigger_unregister_simple(priv->tx_led_trig); 64 led_trigger_unregister_simple(priv->tx_led_trig);
57 led_trigger_unregister_simple(priv->rx_led_trig); 65 led_trigger_unregister_simple(priv->rx_led_trig);
66 led_trigger_unregister_simple(priv->rxtx_led_trig);
58} 67}
59 68
60/* Register CAN LED triggers for a CAN device 69/* Register CAN LED triggers for a CAN device
@@ -76,11 +85,15 @@ void devm_can_led_init(struct net_device *netdev)
76 "%s-tx", netdev->name); 85 "%s-tx", netdev->name);
77 snprintf(priv->rx_led_trig_name, sizeof(priv->rx_led_trig_name), 86 snprintf(priv->rx_led_trig_name, sizeof(priv->rx_led_trig_name),
78 "%s-rx", netdev->name); 87 "%s-rx", netdev->name);
88 snprintf(priv->rxtx_led_trig_name, sizeof(priv->rxtx_led_trig_name),
89 "%s-rxtx", netdev->name);
79 90
80 led_trigger_register_simple(priv->tx_led_trig_name, 91 led_trigger_register_simple(priv->tx_led_trig_name,
81 &priv->tx_led_trig); 92 &priv->tx_led_trig);
82 led_trigger_register_simple(priv->rx_led_trig_name, 93 led_trigger_register_simple(priv->rx_led_trig_name,
83 &priv->rx_led_trig); 94 &priv->rx_led_trig);
95 led_trigger_register_simple(priv->rxtx_led_trig_name,
96 &priv->rxtx_led_trig);
84 97
85 devres_add(&netdev->dev, res); 98 devres_add(&netdev->dev, res);
86} 99}
@@ -97,7 +110,7 @@ static int can_led_notifier(struct notifier_block *nb, unsigned long msg,
97 if (!priv) 110 if (!priv)
98 return NOTIFY_DONE; 111 return NOTIFY_DONE;
99 112
100 if (!priv->tx_led_trig || !priv->rx_led_trig) 113 if (!priv->tx_led_trig || !priv->rx_led_trig || !priv->rxtx_led_trig)
101 return NOTIFY_DONE; 114 return NOTIFY_DONE;
102 115
103 if (msg == NETDEV_CHANGENAME) { 116 if (msg == NETDEV_CHANGENAME) {
@@ -106,6 +119,9 @@ static int can_led_notifier(struct notifier_block *nb, unsigned long msg,
106 119
107 snprintf(name, sizeof(name), "%s-rx", netdev->name); 120 snprintf(name, sizeof(name), "%s-rx", netdev->name);
108 led_trigger_rename_static(name, priv->rx_led_trig); 121 led_trigger_rename_static(name, priv->rx_led_trig);
122
123 snprintf(name, sizeof(name), "%s-rxtx", netdev->name);
124 led_trigger_rename_static(name, priv->rxtx_led_trig);
109 } 125 }
110 126
111 return NOTIFY_DONE; 127 return NOTIFY_DONE;
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
index c05ff0f9f9a5..c3a9c8fc60fa 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -61,6 +61,8 @@ struct can_priv {
61 char tx_led_trig_name[CAN_LED_NAME_SZ]; 61 char tx_led_trig_name[CAN_LED_NAME_SZ];
62 struct led_trigger *rx_led_trig; 62 struct led_trigger *rx_led_trig;
63 char rx_led_trig_name[CAN_LED_NAME_SZ]; 63 char rx_led_trig_name[CAN_LED_NAME_SZ];
64 struct led_trigger *rxtx_led_trig;
65 char rxtx_led_trig_name[CAN_LED_NAME_SZ];
64#endif 66#endif
65}; 67};
66 68
diff --git a/include/linux/can/led.h b/include/linux/can/led.h
index e0475c5cbb92..146de4506d21 100644
--- a/include/linux/can/led.h
+++ b/include/linux/can/led.h
@@ -21,8 +21,10 @@ enum can_led_event {
21 21
22#ifdef CONFIG_CAN_LEDS 22#ifdef CONFIG_CAN_LEDS
23 23
24/* keep space for interface name + "-tx"/"-rx" suffix and null terminator */ 24/* keep space for interface name + "-tx"/"-rx"/"-rxtx"
25#define CAN_LED_NAME_SZ (IFNAMSIZ + 4) 25 * suffix and null terminator
26 */
27#define CAN_LED_NAME_SZ (IFNAMSIZ + 6)
26 28
27void can_led_event(struct net_device *netdev, enum can_led_event event); 29void can_led_event(struct net_device *netdev, enum can_led_event event);
28void devm_can_led_init(struct net_device *netdev); 30void devm_can_led_init(struct net_device *netdev);