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