Messages in this thread Patch in this message | | | From | Henrique de Moraes Holschuh <> | Subject | [PATCH 7/8] rfkill: add an "any radio" switch type and functionality | Date | Fri, 11 Apr 2008 17:37:23 -0300 |
| |
Add a RFKILL_TYPE_ANY switch. This switch can control more than one type of radio, and it is always subject to toggling by any type of rfkill-input event. It is suitable to implement kill-all-radios functionality when coupled with input event EV_SW SW_RADIO.
Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Cc: Ivo van Doorn <IvDoorn@gmail.com> Cc: John W. Linville <linville@tuxdriver.com> Cc: Dmitry Torokhov <dtor@mail.ru> --- include/linux/rfkill.h | 2 ++ net/rfkill/rfkill-input.c | 9 +++++++++ net/rfkill/rfkill.c | 3 +++ 3 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index 7650517..ba8a7e1 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h @@ -35,6 +35,7 @@ * RFKILL_TYPE_UWB: switch is on a ultra wideband device. * RFKILL_TYPE_WIMAX: switch is on a WiMAX device. * RFKILL_TYPE_WWAN: switch is on a wireless WAN device. + * RFKILL_TYPE_ANY: switch kills radios regardless of type. */ enum rfkill_type { RFKILL_TYPE_WLAN , @@ -42,6 +43,7 @@ enum rfkill_type { RFKILL_TYPE_UWB, RFKILL_TYPE_WIMAX, RFKILL_TYPE_WWAN, + RFKILL_TYPE_ANY, RFKILL_TYPE_MAX, }; diff --git a/net/rfkill/rfkill-input.c b/net/rfkill/rfkill-input.c index 675651b..ec9112c 100644 --- a/net/rfkill/rfkill-input.c +++ b/net/rfkill/rfkill-input.c @@ -102,6 +102,7 @@ static DEFINE_RFKILL_TASK(rfkill_bt, RFKILL_TYPE_BLUETOOTH); static DEFINE_RFKILL_TASK(rfkill_uwb, RFKILL_TYPE_UWB); static DEFINE_RFKILL_TASK(rfkill_wimax, RFKILL_TYPE_WIMAX); static DEFINE_RFKILL_TASK(rfkill_wwan, RFKILL_TYPE_WIMAX); +static DEFINE_RFKILL_TASK(rfkill_any, RFKILL_TYPE_ANY); static void rfkill_event(struct input_handle *handle, unsigned int type, unsigned int code, int data) @@ -110,18 +111,23 @@ static void rfkill_event(struct input_handle *handle, unsigned int type, switch (code) { case KEY_WLAN: rfkill_schedule_toggle(&rfkill_wlan); + rfkill_schedule_toggle(&rfkill_any); break; case KEY_BLUETOOTH: rfkill_schedule_toggle(&rfkill_bt); + rfkill_schedule_toggle(&rfkill_any); break; case KEY_UWB: rfkill_schedule_toggle(&rfkill_uwb); + rfkill_schedule_toggle(&rfkill_any); break; case KEY_WIMAX: rfkill_schedule_toggle(&rfkill_wimax); + rfkill_schedule_toggle(&rfkill_any); break; case KEY_RADIO: /* EVERY radio type */ + rfkill_schedule_toggle(&rfkill_any); rfkill_schedule_toggle(&rfkill_wwan); rfkill_schedule_toggle(&rfkill_wimax); rfkill_schedule_toggle(&rfkill_uwb); @@ -135,6 +141,9 @@ static void rfkill_event(struct input_handle *handle, unsigned int type, switch (code) { case SW_RADIO: /* EVERY radio type. data != 0 means radios ON */ + rfkill_schedule_set(&rfkill_any, + (data)? RFKILL_STATE_ON: + RFKILL_STATE_OFF); rfkill_schedule_set(&rfkill_wwan, (data)? RFKILL_STATE_ON: RFKILL_STATE_OFF); diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 56241a4..9d3bffb 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c @@ -174,6 +174,9 @@ static ssize_t rfkill_type_show(struct device *dev, case RFKILL_TYPE_WWAN: type = "wwan"; break; + case RFKILL_TYPE_ANY: + type = "any"; + break; default: BUG(); } -- 1.5.4.4
| |