diff options
author | Alan Jenkins <alan-jenkins@tuffmail.co.uk> | 2009-06-16 10:39:51 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-06-19 11:50:17 -0400 |
commit | 06d5caf47ef4fbd9efdceae33293c42778cb7b0c (patch) | |
tree | 51bce5f2f9f7aef903c464ac68c80da6f83e2c53 /drivers/platform | |
parent | 7fa20a7f60df0afceafbb8197b5d110507f42c72 (diff) |
rfkill: don't restore software blocked state on persistent devices
The setting of the "persistent" flag is also made more explicit using
a new rfkill_init_sw_state() function, instead of special-casing
rfkill_set_sw_state() when it is called before registration.
Suspend is a bit of a corner case so we try to get away without adding
another hack to rfkill-input - it's going to be removed soon.
If the state does change over suspend, users will simply have to prod
rfkill-input twice in order to toggle the state.
Userspace policy agents will be able to implement a more consistent user
experience. For example, they can avoid the above problem if they
toggle devices individually. Then there would be no "global state"
to get out of sync.
Currently there are only two rfkill drivers with persistent soft-blocked
state. thinkpad-acpi already checks the software state on resume.
eeepc-laptop will require modification.
Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
CC: Marcel Holtmann <marcel@holtmann.org>
Acked-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r-- | drivers/platform/x86/eeepc-laptop.c | 8 | ||||
-rw-r--r-- | drivers/platform/x86/thinkpad_acpi.c | 14 |
2 files changed, 11 insertions, 11 deletions
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index 03bf522bd7ab..01682eca4360 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c | |||
@@ -675,8 +675,8 @@ static int eeepc_hotk_add(struct acpi_device *device) | |||
675 | if (!ehotk->eeepc_wlan_rfkill) | 675 | if (!ehotk->eeepc_wlan_rfkill) |
676 | goto wlan_fail; | 676 | goto wlan_fail; |
677 | 677 | ||
678 | rfkill_set_sw_state(ehotk->eeepc_wlan_rfkill, | 678 | rfkill_init_sw_state(ehotk->eeepc_wlan_rfkill, |
679 | get_acpi(CM_ASL_WLAN) != 1); | 679 | get_acpi(CM_ASL_WLAN) != 1); |
680 | result = rfkill_register(ehotk->eeepc_wlan_rfkill); | 680 | result = rfkill_register(ehotk->eeepc_wlan_rfkill); |
681 | if (result) | 681 | if (result) |
682 | goto wlan_fail; | 682 | goto wlan_fail; |
@@ -693,8 +693,8 @@ static int eeepc_hotk_add(struct acpi_device *device) | |||
693 | if (!ehotk->eeepc_bluetooth_rfkill) | 693 | if (!ehotk->eeepc_bluetooth_rfkill) |
694 | goto bluetooth_fail; | 694 | goto bluetooth_fail; |
695 | 695 | ||
696 | rfkill_set_sw_state(ehotk->eeepc_bluetooth_rfkill, | 696 | rfkill_init_sw_state(ehotk->eeepc_bluetooth_rfkill, |
697 | get_acpi(CM_ASL_BLUETOOTH) != 1); | 697 | get_acpi(CM_ASL_BLUETOOTH) != 1); |
698 | result = rfkill_register(ehotk->eeepc_bluetooth_rfkill); | 698 | result = rfkill_register(ehotk->eeepc_bluetooth_rfkill); |
699 | if (result) | 699 | if (result) |
700 | goto bluetooth_fail; | 700 | goto bluetooth_fail; |
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 86e958539f46..40d64c03278c 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
@@ -1163,8 +1163,8 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id, | |||
1163 | { | 1163 | { |
1164 | struct tpacpi_rfk *atp_rfk; | 1164 | struct tpacpi_rfk *atp_rfk; |
1165 | int res; | 1165 | int res; |
1166 | bool initial_sw_state = false; | 1166 | bool sw_state = false; |
1167 | int initial_sw_status; | 1167 | int sw_status; |
1168 | 1168 | ||
1169 | BUG_ON(id >= TPACPI_RFK_SW_MAX || tpacpi_rfkill_switches[id]); | 1169 | BUG_ON(id >= TPACPI_RFK_SW_MAX || tpacpi_rfkill_switches[id]); |
1170 | 1170 | ||
@@ -1185,17 +1185,17 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id, | |||
1185 | atp_rfk->id = id; | 1185 | atp_rfk->id = id; |
1186 | atp_rfk->ops = tp_rfkops; | 1186 | atp_rfk->ops = tp_rfkops; |
1187 | 1187 | ||
1188 | initial_sw_status = (tp_rfkops->get_status)(); | 1188 | sw_status = (tp_rfkops->get_status)(); |
1189 | if (initial_sw_status < 0) { | 1189 | if (sw_status < 0) { |
1190 | printk(TPACPI_ERR | 1190 | printk(TPACPI_ERR |
1191 | "failed to read initial state for %s, error %d\n", | 1191 | "failed to read initial state for %s, error %d\n", |
1192 | name, initial_sw_status); | 1192 | name, sw_status); |
1193 | } else { | 1193 | } else { |
1194 | initial_sw_state = (initial_sw_status == TPACPI_RFK_RADIO_OFF); | 1194 | sw_state = (sw_status == TPACPI_RFK_RADIO_OFF); |
1195 | if (set_default) { | 1195 | if (set_default) { |
1196 | /* try to keep the initial state, since we ask the | 1196 | /* try to keep the initial state, since we ask the |
1197 | * firmware to preserve it across S5 in NVRAM */ | 1197 | * firmware to preserve it across S5 in NVRAM */ |
1198 | rfkill_set_sw_state(atp_rfk->rfkill, initial_sw_state); | 1198 | rfkill_init_sw_state(atp_rfk->rfkill, sw_state); |
1199 | } | 1199 | } |
1200 | } | 1200 | } |
1201 | rfkill_set_hw_state(atp_rfk->rfkill, tpacpi_rfk_check_hwblock_state()); | 1201 | rfkill_set_hw_state(atp_rfk->rfkill, tpacpi_rfk_check_hwblock_state()); |