aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/platform/x86/acer-wmi.c19
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 {
217static struct rfkill *wireless_rfkill; 217static struct rfkill *wireless_rfkill;
218static struct rfkill *bluetooth_rfkill; 218static struct rfkill *bluetooth_rfkill;
219static struct rfkill *threeg_rfkill; 219static struct rfkill *threeg_rfkill;
220static 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 */
222struct wmi_interface { 223struct 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;