aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/rfkill.h
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2008-06-23 16:23:00 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-06-26 14:21:20 -0400
commit801e49af4c1a9b988ba0d25de2b368c99c3bf2b3 (patch)
tree60fbf2b2ce2d9aab3055198853d2a76223b03f71 /include/linux/rfkill.h
parente954b0b85b9e737564b8ad9738de5816747b5901 (diff)
rfkill: add read-write rfkill switch support
Currently, rfkill support for read/write rfkill switches is hacked through a round-trip over the input layer and rfkill-input to let a driver sync rfkill->state to hardware changes. This is buggy and sub-optimal. It causes real problems. It is best to think of the rfkill class as supporting only write-only switches at the moment. In order to implement the read/write functionality properly: Add a get_state() hook that is called by the class every time it needs to fetch the current state of the switch. Add a call to this hook every time the *current* state of the radio plays a role in a decision. Also add a force_state() method that can be used to forcefully syncronize the class' idea of the current state of the switch. This allows for a faster implementation of the read/write functionality, as a driver which get events on switch changes can avoid the need for a get_state() hook. If the get_state() hook is left as NULL, current behaviour is maintained, so this change is fully backwards compatible with the current rfkill drivers. For hardware that issues events when the rfkill state changes, leave get_state() NULL in the rfkill struct, set the initial state properly before registering with the rfkill class, and use the force_state() method in the driver to keep the rfkill interface up-to-date. get_state() can be called by the class from atomic context. It must not sleep. Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Acked-by: Ivo van Doorn <IvDoorn@gmail.com> Cc: Dmitry Torokhov <dtor@mail.ru> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'include/linux/rfkill.h')
-rw-r--r--include/linux/rfkill.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h
index ca89ae1b0219..844e96114861 100644
--- a/include/linux/rfkill.h
+++ b/include/linux/rfkill.h
@@ -61,6 +61,8 @@ enum rfkill_state {
61 * @data: Pointer to the RF button drivers private data which will be 61 * @data: Pointer to the RF button drivers private data which will be
62 * passed along when toggling radio state. 62 * passed along when toggling radio state.
63 * @toggle_radio(): Mandatory handler to control state of the radio. 63 * @toggle_radio(): Mandatory handler to control state of the radio.
64 * @get_state(): handler to read current radio state from hardware,
65 * may be called from atomic context, should return 0 on success.
64 * @led_trigger: A LED trigger for this button's LED. 66 * @led_trigger: A LED trigger for this button's LED.
65 * @dev: Device structure integrating the switch into device tree. 67 * @dev: Device structure integrating the switch into device tree.
66 * @node: Used to place switch into list of all switches known to the 68 * @node: Used to place switch into list of all switches known to the
@@ -80,6 +82,7 @@ struct rfkill {
80 82
81 void *data; 83 void *data;
82 int (*toggle_radio)(void *data, enum rfkill_state state); 84 int (*toggle_radio)(void *data, enum rfkill_state state);
85 int (*get_state)(void *data, enum rfkill_state *state);
83 86
84#ifdef CONFIG_RFKILL_LEDS 87#ifdef CONFIG_RFKILL_LEDS
85 struct led_trigger led_trigger; 88 struct led_trigger led_trigger;
@@ -95,6 +98,8 @@ void rfkill_free(struct rfkill *rfkill);
95int rfkill_register(struct rfkill *rfkill); 98int rfkill_register(struct rfkill *rfkill);
96void rfkill_unregister(struct rfkill *rfkill); 99void rfkill_unregister(struct rfkill *rfkill);
97 100
101int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state);
102
98/** 103/**
99 * rfkill_get_led_name - Get the LED trigger name for the button's LED. 104 * rfkill_get_led_name - Get the LED trigger name for the button's LED.
100 * This function might return a NULL pointer if registering of the 105 * This function might return a NULL pointer if registering of the