aboutsummaryrefslogtreecommitdiffstats
path: root/net/rfkill
diff options
context:
space:
mode:
Diffstat (limited to 'net/rfkill')
-rw-r--r--net/rfkill/Kconfig7
-rw-r--r--net/rfkill/rfkill.c42
2 files changed, 48 insertions, 1 deletions
diff --git a/net/rfkill/Kconfig b/net/rfkill/Kconfig
index d28a6d9303e4..7f807b30cfbb 100644
--- a/net/rfkill/Kconfig
+++ b/net/rfkill/Kconfig
@@ -22,3 +22,10 @@ config RFKILL_INPUT
22 22
23 To compile this driver as a module, choose M here: the 23 To compile this driver as a module, choose M here: the
24 module will be called rfkill-input. 24 module will be called rfkill-input.
25
26# LED trigger support
27config RFKILL_LEDS
28 bool
29 depends on RFKILL && LEDS_TRIGGERS
30 default y
31
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c
index 637a9f0c7655..a8c5e0b914e4 100644
--- a/net/rfkill/rfkill.c
+++ b/net/rfkill/rfkill.c
@@ -37,6 +37,22 @@ static DEFINE_MUTEX(rfkill_mutex);
37 37
38static enum rfkill_state rfkill_states[RFKILL_TYPE_MAX]; 38static enum rfkill_state rfkill_states[RFKILL_TYPE_MAX];
39 39
40
41static void rfkill_led_trigger(struct rfkill *rfkill,
42 enum rfkill_state state)
43{
44#ifdef CONFIG_RFKILL_LEDS
45 struct led_trigger *led = &rfkill->led_trigger;
46
47 if (!led->name)
48 return;
49 if (state == RFKILL_STATE_OFF)
50 led_trigger_event(led, LED_OFF);
51 else
52 led_trigger_event(led, LED_FULL);
53#endif /* CONFIG_RFKILL_LEDS */
54}
55
40static int rfkill_toggle_radio(struct rfkill *rfkill, 56static int rfkill_toggle_radio(struct rfkill *rfkill,
41 enum rfkill_state state) 57 enum rfkill_state state)
42{ 58{
@@ -48,8 +64,10 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
48 64
49 if (state != rfkill->state) { 65 if (state != rfkill->state) {
50 retval = rfkill->toggle_radio(rfkill->data, state); 66 retval = rfkill->toggle_radio(rfkill->data, state);
51 if (!retval) 67 if (!retval) {
52 rfkill->state = state; 68 rfkill->state = state;
69 rfkill_led_trigger(rfkill, state);
70 }
53 } 71 }
54 72
55 mutex_unlock(&rfkill->mutex); 73 mutex_unlock(&rfkill->mutex);
@@ -328,6 +346,26 @@ void rfkill_free(struct rfkill *rfkill)
328} 346}
329EXPORT_SYMBOL(rfkill_free); 347EXPORT_SYMBOL(rfkill_free);
330 348
349static void rfkill_led_trigger_register(struct rfkill *rfkill)
350{
351#ifdef CONFIG_RFKILL_LEDS
352 int error;
353
354 rfkill->led_trigger.name = rfkill->dev.bus_id;
355 error = led_trigger_register(&rfkill->led_trigger);
356 if (error)
357 rfkill->led_trigger.name = NULL;
358#endif /* CONFIG_RFKILL_LEDS */
359}
360
361static void rfkill_led_trigger_unregister(struct rfkill *rfkill)
362{
363#ifdef CONFIG_RFKILL_LEDS
364 if (rfkill->led_trigger.name)
365 led_trigger_unregister(&rfkill->led_trigger);
366#endif
367}
368
331/** 369/**
332 * rfkill_register - Register a rfkill structure. 370 * rfkill_register - Register a rfkill structure.
333 * @rfkill: rfkill structure to be registered 371 * @rfkill: rfkill structure to be registered
@@ -357,6 +395,7 @@ int rfkill_register(struct rfkill *rfkill)
357 rfkill_remove_switch(rfkill); 395 rfkill_remove_switch(rfkill);
358 return error; 396 return error;
359 } 397 }
398 rfkill_led_trigger_register(rfkill);
360 399
361 return 0; 400 return 0;
362} 401}
@@ -372,6 +411,7 @@ EXPORT_SYMBOL(rfkill_register);
372 */ 411 */
373void rfkill_unregister(struct rfkill *rfkill) 412void rfkill_unregister(struct rfkill *rfkill)
374{ 413{
414 rfkill_led_trigger_unregister(rfkill);
375 device_del(&rfkill->dev); 415 device_del(&rfkill->dev);
376 rfkill_remove_switch(rfkill); 416 rfkill_remove_switch(rfkill);
377 put_device(&rfkill->dev); 417 put_device(&rfkill->dev);