diff options
-rw-r--r-- | drivers/platform/x86/acer-wmi.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index d798314b81fe..652a84ec36cf 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
@@ -217,6 +217,7 @@ struct acer_debug { | |||
217 | static struct rfkill *wireless_rfkill; | 217 | static struct rfkill *wireless_rfkill; |
218 | static struct rfkill *bluetooth_rfkill; | 218 | static struct rfkill *bluetooth_rfkill; |
219 | static struct rfkill *threeg_rfkill; | 219 | static struct rfkill *threeg_rfkill; |
220 | static bool rfkill_inited; | ||
220 | 221 | ||
221 | /* Each low-level interface must define at least some of the following */ | 222 | /* Each low-level interface must define at least some of the following */ |
222 | struct wmi_interface { | 223 | struct wmi_interface { |
@@ -1157,9 +1158,13 @@ static int acer_rfkill_set(void *data, bool blocked) | |||
1157 | { | 1158 | { |
1158 | acpi_status status; | 1159 | acpi_status status; |
1159 | u32 cap = (unsigned long)data; | 1160 | u32 cap = (unsigned long)data; |
1160 | status = set_u32(!blocked, cap); | 1161 | |
1161 | if (ACPI_FAILURE(status)) | 1162 | if (rfkill_inited) { |
1162 | return -ENODEV; | 1163 | status = set_u32(!blocked, cap); |
1164 | if (ACPI_FAILURE(status)) | ||
1165 | return -ENODEV; | ||
1166 | } | ||
1167 | |||
1163 | return 0; | 1168 | return 0; |
1164 | } | 1169 | } |
1165 | 1170 | ||
@@ -1183,14 +1188,16 @@ static struct rfkill *acer_rfkill_register(struct device *dev, | |||
1183 | return ERR_PTR(-ENOMEM); | 1188 | return ERR_PTR(-ENOMEM); |
1184 | 1189 | ||
1185 | status = get_device_status(&state, cap); | 1190 | status = get_device_status(&state, cap); |
1186 | if (ACPI_SUCCESS(status)) | ||
1187 | rfkill_init_sw_state(rfkill_dev, !state); | ||
1188 | 1191 | ||
1189 | err = rfkill_register(rfkill_dev); | 1192 | err = rfkill_register(rfkill_dev); |
1190 | if (err) { | 1193 | if (err) { |
1191 | rfkill_destroy(rfkill_dev); | 1194 | rfkill_destroy(rfkill_dev); |
1192 | return ERR_PTR(err); | 1195 | return ERR_PTR(err); |
1193 | } | 1196 | } |
1197 | |||
1198 | if (ACPI_SUCCESS(status)) | ||
1199 | rfkill_set_sw_state(rfkill_dev, !state); | ||
1200 | |||
1194 | return rfkill_dev; | 1201 | return rfkill_dev; |
1195 | } | 1202 | } |
1196 | 1203 | ||
@@ -1225,6 +1232,8 @@ static int acer_rfkill_init(struct device *dev) | |||
1225 | } | 1232 | } |
1226 | } | 1233 | } |
1227 | 1234 | ||
1235 | rfkill_inited = true; | ||
1236 | |||
1228 | schedule_delayed_work(&acer_rfkill_work, round_jiffies_relative(HZ)); | 1237 | schedule_delayed_work(&acer_rfkill_work, round_jiffies_relative(HZ)); |
1229 | 1238 | ||
1230 | return 0; | 1239 | return 0; |