ideapad: Stop using global variables

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

+58 -34
+58 -34
drivers/platform/x86/ideapad_acpi.c
··· 34 #define IDEAPAD_DEV_3G 3 35 #define IDEAPAD_DEV_KILLSW 4 36 37 - static struct rfkill *ideapad_rfkill[5]; 38 - 39 - static const char *ideapad_rfk_names[] = { 40 - "ideapad_camera", "ideapad_wlan", "ideapad_bluetooth", "ideapad_3g", "ideapad_rfkill" 41 }; 42 - static const int ideapad_rfk_types[] = { 43 - 0, RFKILL_TYPE_WLAN, RFKILL_TYPE_BLUETOOTH, RFKILL_TYPE_WWAN, RFKILL_TYPE_WLAN 44 }; 45 46 static int ideapad_dev_exists(int device) ··· 161 .set_block = ideapad_rfk_set, 162 }; 163 164 - static void ideapad_sync_rfk_state(void) 165 { 166 int hw_blocked = !ideapad_dev_get_state(IDEAPAD_DEV_KILLSW); 167 int i; 168 169 - rfkill_set_hw_state(ideapad_rfkill[IDEAPAD_DEV_KILLSW], hw_blocked); 170 for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++) 171 - if (ideapad_rfkill[i]) 172 - rfkill_set_hw_state(ideapad_rfkill[i], hw_blocked); 173 if (hw_blocked) 174 return; 175 176 for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++) 177 - if (ideapad_rfkill[i]) 178 - rfkill_set_sw_state(ideapad_rfkill[i], !ideapad_dev_get_state(i)); 179 } 180 181 - static int ideapad_register_rfkill(struct acpi_device *device, int dev) 182 { 183 int ret; 184 185 - ideapad_rfkill[dev] = rfkill_alloc(ideapad_rfk_names[dev], &device->dev, 186 - ideapad_rfk_types[dev], &ideapad_rfk_ops, 187 - (void *)(long)dev); 188 - if (!ideapad_rfkill[dev]) 189 return -ENOMEM; 190 191 - ret = rfkill_register(ideapad_rfkill[dev]); 192 if (ret) { 193 - rfkill_destroy(ideapad_rfkill[dev]); 194 return ret; 195 } 196 return 0; 197 } 198 199 - static void ideapad_unregister_rfkill(int dev) 200 { 201 - if (!ideapad_rfkill[dev]) 202 return; 203 204 - rfkill_unregister(ideapad_rfkill[dev]); 205 - rfkill_destroy(ideapad_rfkill[dev]); 206 } 207 208 static const struct acpi_device_id ideapad_device_ids[] = { ··· 215 }; 216 MODULE_DEVICE_TABLE(acpi, ideapad_device_ids); 217 218 - static int ideapad_acpi_add(struct acpi_device *device) 219 { 220 int i; 221 int devs_present[5]; 222 223 for (i = IDEAPAD_DEV_CAMERA; i < IDEAPAD_DEV_KILLSW; i++) { 224 devs_present[i] = ideapad_dev_exists(i); ··· 230 /* The hardware switch is always present */ 231 devs_present[IDEAPAD_DEV_KILLSW] = 1; 232 233 if (devs_present[IDEAPAD_DEV_CAMERA]) { 234 - int ret = device_create_file(&device->dev, &dev_attr_camera_power); 235 - if (ret) 236 return ret; 237 } 238 239 for (i = IDEAPAD_DEV_WLAN; i <= IDEAPAD_DEV_KILLSW; i++) { 240 if (!devs_present[i]) 241 continue; 242 243 - ideapad_register_rfkill(device, i); 244 } 245 - ideapad_sync_rfk_state(); 246 return 0; 247 } 248 249 - static int ideapad_acpi_remove(struct acpi_device *device, int type) 250 { 251 int i; 252 - device_remove_file(&device->dev, &dev_attr_camera_power); 253 - for (i = 0; i < 5; i++) 254 - ideapad_unregister_rfkill(i); 255 return 0; 256 } 257 258 - static void ideapad_acpi_notify(struct acpi_device *device, u32 event) 259 { 260 - ideapad_sync_rfk_state(); 261 } 262 263 static struct acpi_driver ideapad_acpi_driver = {
··· 34 #define IDEAPAD_DEV_3G 3 35 #define IDEAPAD_DEV_KILLSW 4 36 37 + struct ideapad_private { 38 + struct rfkill *rfk[5]; 39 }; 40 + 41 + static struct { 42 + char *name; 43 + int type; 44 + } ideapad_rfk_data[] = { 45 + /* camera has no rfkill */ 46 + { "ideapad_wlan", RFKILL_TYPE_WLAN }, 47 + { "ideapad_bluetooth", RFKILL_TYPE_BLUETOOTH }, 48 + { "ideapad_3g", RFKILL_TYPE_WWAN }, 49 + { "ideapad_killsw", RFKILL_TYPE_WLAN } 50 }; 51 52 static int ideapad_dev_exists(int device) ··· 155 .set_block = ideapad_rfk_set, 156 }; 157 158 + static void ideapad_sync_rfk_state(struct acpi_device *adevice) 159 { 160 + struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); 161 int hw_blocked = !ideapad_dev_get_state(IDEAPAD_DEV_KILLSW); 162 int i; 163 164 + rfkill_set_hw_state(priv->rfk[IDEAPAD_DEV_KILLSW], hw_blocked); 165 for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++) 166 + if (priv->rfk[i]) 167 + rfkill_set_hw_state(priv->rfk[i], hw_blocked); 168 if (hw_blocked) 169 return; 170 171 for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++) 172 + if (priv->rfk[i]) 173 + rfkill_set_sw_state(priv->rfk[i], !ideapad_dev_get_state(i)); 174 } 175 176 + static int ideapad_register_rfkill(struct acpi_device *adevice, int dev) 177 { 178 + struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); 179 int ret; 180 181 + priv->rfk[dev] = rfkill_alloc(ideapad_rfk_data[dev-1].name, &adevice->dev, 182 + ideapad_rfk_data[dev-1].type, &ideapad_rfk_ops, 183 + (void *)(long)dev); 184 + if (!priv->rfk[dev]) 185 return -ENOMEM; 186 187 + ret = rfkill_register(priv->rfk[dev]); 188 if (ret) { 189 + rfkill_destroy(priv->rfk[dev]); 190 return ret; 191 } 192 return 0; 193 } 194 195 + static void ideapad_unregister_rfkill(struct acpi_device *adevice, int dev) 196 { 197 + struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); 198 + 199 + if (!priv->rfk[dev]) 200 return; 201 202 + rfkill_unregister(priv->rfk[dev]); 203 + rfkill_destroy(priv->rfk[dev]); 204 } 205 206 static const struct acpi_device_id ideapad_device_ids[] = { ··· 205 }; 206 MODULE_DEVICE_TABLE(acpi, ideapad_device_ids); 207 208 + static int ideapad_acpi_add(struct acpi_device *adevice) 209 { 210 int i; 211 int devs_present[5]; 212 + struct ideapad_private *priv; 213 214 for (i = IDEAPAD_DEV_CAMERA; i < IDEAPAD_DEV_KILLSW; i++) { 215 devs_present[i] = ideapad_dev_exists(i); ··· 219 /* The hardware switch is always present */ 220 devs_present[IDEAPAD_DEV_KILLSW] = 1; 221 222 + priv = kzalloc(sizeof(*priv), GFP_KERNEL); 223 + if (!priv) 224 + return -ENOMEM; 225 + 226 if (devs_present[IDEAPAD_DEV_CAMERA]) { 227 + int ret = device_create_file(&adevice->dev, &dev_attr_camera_power); 228 + if (ret) { 229 + kfree(priv); 230 return ret; 231 + } 232 } 233 234 + dev_set_drvdata(&adevice->dev, priv); 235 for (i = IDEAPAD_DEV_WLAN; i <= IDEAPAD_DEV_KILLSW; i++) { 236 if (!devs_present[i]) 237 continue; 238 239 + ideapad_register_rfkill(adevice, i); 240 } 241 + ideapad_sync_rfk_state(adevice); 242 return 0; 243 } 244 245 + static int ideapad_acpi_remove(struct acpi_device *adevice, int type) 246 { 247 + struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); 248 int i; 249 + 250 + device_remove_file(&adevice->dev, &dev_attr_camera_power); 251 + 252 + for (i = IDEAPAD_DEV_WLAN; i <= IDEAPAD_DEV_KILLSW; i++) 253 + ideapad_unregister_rfkill(adevice, i); 254 + 255 + dev_set_drvdata(&adevice->dev, NULL); 256 + kfree(priv); 257 return 0; 258 } 259 260 + static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event) 261 { 262 + ideapad_sync_rfk_state(adevice); 263 } 264 265 static struct acpi_driver ideapad_acpi_driver = {