diff options
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/thinkpad_acpi.c | 231 | ||||
-rw-r--r-- | drivers/misc/thinkpad_acpi.h | 40 |
2 files changed, 153 insertions, 118 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index e2a1b63a812f..809ec8400ec5 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
@@ -277,7 +277,7 @@ static int _sta(acpi_handle handle) | |||
277 | * ACPI device model | 277 | * ACPI device model |
278 | */ | 278 | */ |
279 | 279 | ||
280 | static void ibm_handle_init(char *name, | 280 | static void drv_acpi_handle_init(char *name, |
281 | acpi_handle *handle, acpi_handle parent, | 281 | acpi_handle *handle, acpi_handle parent, |
282 | char **paths, int num_paths, char **path) | 282 | char **paths, int num_paths, char **path) |
283 | { | 283 | { |
@@ -295,40 +295,42 @@ static void ibm_handle_init(char *name, | |||
295 | *handle = NULL; | 295 | *handle = NULL; |
296 | } | 296 | } |
297 | 297 | ||
298 | static void dispatch_notify(acpi_handle handle, u32 event, void *data) | 298 | static void dispatch_acpi_notify(acpi_handle handle, u32 event, void *data) |
299 | { | 299 | { |
300 | struct ibm_struct *ibm = data; | 300 | struct ibm_struct *ibm = data; |
301 | 301 | ||
302 | if (!ibm || !ibm->notify) | 302 | if (!ibm || !ibm->acpi || !ibm->acpi->notify) |
303 | return; | 303 | return; |
304 | 304 | ||
305 | ibm->notify(ibm, event); | 305 | ibm->acpi->notify(ibm, event); |
306 | } | 306 | } |
307 | 307 | ||
308 | static int __init setup_notify(struct ibm_struct *ibm) | 308 | static int __init setup_acpi_notify(struct ibm_struct *ibm) |
309 | { | 309 | { |
310 | acpi_status status; | 310 | acpi_status status; |
311 | int ret; | 311 | int ret; |
312 | 312 | ||
313 | if (!*ibm->handle) | 313 | BUG_ON(!ibm->acpi); |
314 | |||
315 | if (!*ibm->acpi->handle) | ||
314 | return 0; | 316 | return 0; |
315 | 317 | ||
316 | dbg_printk(TPACPI_DBG_INIT, | 318 | dbg_printk(TPACPI_DBG_INIT, |
317 | "setting up ACPI notify for %s\n", ibm->name); | 319 | "setting up ACPI notify for %s\n", ibm->name); |
318 | 320 | ||
319 | ret = acpi_bus_get_device(*ibm->handle, &ibm->device); | 321 | ret = acpi_bus_get_device(*ibm->acpi->handle, &ibm->acpi->device); |
320 | if (ret < 0) { | 322 | if (ret < 0) { |
321 | printk(IBM_ERR "%s device not present\n", ibm->name); | 323 | printk(IBM_ERR "%s device not present\n", ibm->name); |
322 | return -ENODEV; | 324 | return -ENODEV; |
323 | } | 325 | } |
324 | 326 | ||
325 | acpi_driver_data(ibm->device) = ibm; | 327 | acpi_driver_data(ibm->acpi->device) = ibm; |
326 | sprintf(acpi_device_class(ibm->device), "%s/%s", | 328 | sprintf(acpi_device_class(ibm->acpi->device), "%s/%s", |
327 | IBM_ACPI_EVENT_PREFIX, | 329 | IBM_ACPI_EVENT_PREFIX, |
328 | ibm->name); | 330 | ibm->name); |
329 | 331 | ||
330 | status = acpi_install_notify_handler(*ibm->handle, ibm->type, | 332 | status = acpi_install_notify_handler(*ibm->acpi->handle, |
331 | dispatch_notify, ibm); | 333 | ibm->acpi->type, dispatch_acpi_notify, ibm); |
332 | if (ACPI_FAILURE(status)) { | 334 | if (ACPI_FAILURE(status)) { |
333 | if (status == AE_ALREADY_EXISTS) { | 335 | if (status == AE_ALREADY_EXISTS) { |
334 | printk(IBM_NOTICE "another device driver is already handling %s events\n", | 336 | printk(IBM_NOTICE "another device driver is already handling %s events\n", |
@@ -339,11 +341,11 @@ static int __init setup_notify(struct ibm_struct *ibm) | |||
339 | } | 341 | } |
340 | return -ENODEV; | 342 | return -ENODEV; |
341 | } | 343 | } |
342 | ibm->flags.notify_installed = 1; | 344 | ibm->flags.acpi_notify_installed = 1; |
343 | return 0; | 345 | return 0; |
344 | } | 346 | } |
345 | 347 | ||
346 | static int __init ibm_device_add(struct acpi_device *device) | 348 | static int __init tpacpi_device_add(struct acpi_device *device) |
347 | { | 349 | { |
348 | return 0; | 350 | return 0; |
349 | } | 351 | } |
@@ -355,24 +357,26 @@ static int __init register_tpacpi_subdriver(struct ibm_struct *ibm) | |||
355 | dbg_printk(TPACPI_DBG_INIT, | 357 | dbg_printk(TPACPI_DBG_INIT, |
356 | "registering %s as an ACPI driver\n", ibm->name); | 358 | "registering %s as an ACPI driver\n", ibm->name); |
357 | 359 | ||
358 | ibm->driver = kzalloc(sizeof(struct acpi_driver), GFP_KERNEL); | 360 | BUG_ON(!ibm->acpi); |
359 | if (!ibm->driver) { | 361 | |
362 | ibm->acpi->driver = kzalloc(sizeof(struct acpi_driver), GFP_KERNEL); | ||
363 | if (!ibm->acpi->driver) { | ||
360 | printk(IBM_ERR "kzalloc(ibm->driver) failed\n"); | 364 | printk(IBM_ERR "kzalloc(ibm->driver) failed\n"); |
361 | return -ENOMEM; | 365 | return -ENOMEM; |
362 | } | 366 | } |
363 | 367 | ||
364 | sprintf(ibm->driver->name, "%s_%s", IBM_NAME, ibm->name); | 368 | sprintf(ibm->acpi->driver->name, "%s_%s", IBM_NAME, ibm->name); |
365 | ibm->driver->ids = ibm->hid; | 369 | ibm->acpi->driver->ids = ibm->acpi->hid; |
366 | ibm->driver->ops.add = &ibm_device_add; | 370 | ibm->acpi->driver->ops.add = &tpacpi_device_add; |
367 | 371 | ||
368 | ret = acpi_bus_register_driver(ibm->driver); | 372 | ret = acpi_bus_register_driver(ibm->acpi->driver); |
369 | if (ret < 0) { | 373 | if (ret < 0) { |
370 | printk(IBM_ERR "acpi_bus_register_driver(%s) failed: %d\n", | 374 | printk(IBM_ERR "acpi_bus_register_driver(%s) failed: %d\n", |
371 | ibm->hid, ret); | 375 | ibm->acpi->hid, ret); |
372 | kfree(ibm->driver); | 376 | kfree(ibm->acpi->driver); |
373 | ibm->driver = NULL; | 377 | ibm->acpi->driver = NULL; |
374 | } else if (!ret) | 378 | } else if (!ret) |
375 | ibm->flags.driver_registered = 1; | 379 | ibm->flags.acpi_driver_registered = 1; |
376 | 380 | ||
377 | return ret; | 381 | return ret; |
378 | } | 382 | } |
@@ -386,8 +390,8 @@ static int __init register_tpacpi_subdriver(struct ibm_struct *ibm) | |||
386 | **************************************************************************** | 390 | **************************************************************************** |
387 | ****************************************************************************/ | 391 | ****************************************************************************/ |
388 | 392 | ||
389 | static int dispatch_read(char *page, char **start, off_t off, int count, | 393 | static int dispatch_procfs_read(char *page, char **start, off_t off, |
390 | int *eof, void *data) | 394 | int count, int *eof, void *data) |
391 | { | 395 | { |
392 | struct ibm_struct *ibm = data; | 396 | struct ibm_struct *ibm = data; |
393 | int len; | 397 | int len; |
@@ -411,8 +415,9 @@ static int dispatch_read(char *page, char **start, off_t off, int count, | |||
411 | return len; | 415 | return len; |
412 | } | 416 | } |
413 | 417 | ||
414 | static int dispatch_write(struct file *file, const char __user * userbuf, | 418 | static int dispatch_procfs_write(struct file *file, |
415 | unsigned long count, void *data) | 419 | const char __user * userbuf, |
420 | unsigned long count, void *data) | ||
416 | { | 421 | { |
417 | struct ibm_struct *ibm = data; | 422 | struct ibm_struct *ibm = data; |
418 | char *kernbuf; | 423 | char *kernbuf; |
@@ -508,7 +513,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) | |||
508 | { | 513 | { |
509 | vdbg_printk(TPACPI_DBG_INIT, "initializing hotkey subdriver\n"); | 514 | vdbg_printk(TPACPI_DBG_INIT, "initializing hotkey subdriver\n"); |
510 | 515 | ||
511 | IBM_HANDLE_INIT(hkey); | 516 | IBM_ACPIHANDLE_INIT(hkey); |
512 | 517 | ||
513 | /* hotkey not supported on 570 */ | 518 | /* hotkey not supported on 570 */ |
514 | tp_features.hotkey = hkey_handle != NULL; | 519 | tp_features.hotkey = hkey_handle != NULL; |
@@ -545,10 +550,10 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) | |||
545 | int hkey; | 550 | int hkey; |
546 | 551 | ||
547 | if (acpi_evalf(hkey_handle, &hkey, "MHKP", "d")) | 552 | if (acpi_evalf(hkey_handle, &hkey, "MHKP", "d")) |
548 | acpi_bus_generate_event(ibm->device, event, hkey); | 553 | acpi_bus_generate_event(ibm->acpi->device, event, hkey); |
549 | else { | 554 | else { |
550 | printk(IBM_ERR "unknown hotkey event %d\n", event); | 555 | printk(IBM_ERR "unknown hotkey event %d\n", event); |
551 | acpi_bus_generate_event(ibm->device, event, 0); | 556 | acpi_bus_generate_event(ibm->acpi->device, event, 0); |
552 | } | 557 | } |
553 | } | 558 | } |
554 | 559 | ||
@@ -643,15 +648,19 @@ static int hotkey_write(char *buf) | |||
643 | return 0; | 648 | return 0; |
644 | } | 649 | } |
645 | 650 | ||
651 | static struct tp_acpi_drv_struct ibm_hotkey_acpidriver = { | ||
652 | .hid = IBM_HKEY_HID, | ||
653 | .notify = hotkey_notify, | ||
654 | .handle = &hkey_handle, | ||
655 | .type = ACPI_DEVICE_NOTIFY, | ||
656 | }; | ||
657 | |||
646 | static struct ibm_struct hotkey_driver_data = { | 658 | static struct ibm_struct hotkey_driver_data = { |
647 | .name = "hotkey", | 659 | .name = "hotkey", |
648 | .hid = IBM_HKEY_HID, | ||
649 | .read = hotkey_read, | 660 | .read = hotkey_read, |
650 | .write = hotkey_write, | 661 | .write = hotkey_write, |
651 | .exit = hotkey_exit, | 662 | .exit = hotkey_exit, |
652 | .notify = hotkey_notify, | 663 | .acpi = &ibm_hotkey_acpidriver, |
653 | .handle = &hkey_handle, | ||
654 | .type = ACPI_DEVICE_NOTIFY, | ||
655 | }; | 664 | }; |
656 | 665 | ||
657 | /************************************************************************* | 666 | /************************************************************************* |
@@ -662,7 +671,7 @@ static int __init bluetooth_init(struct ibm_init_struct *iibm) | |||
662 | { | 671 | { |
663 | vdbg_printk(TPACPI_DBG_INIT, "initializing bluetooth subdriver\n"); | 672 | vdbg_printk(TPACPI_DBG_INIT, "initializing bluetooth subdriver\n"); |
664 | 673 | ||
665 | IBM_HANDLE_INIT(hkey); | 674 | IBM_ACPIHANDLE_INIT(hkey); |
666 | 675 | ||
667 | /* bluetooth not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p, | 676 | /* bluetooth not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p, |
668 | G4x, R30, R31, R40e, R50e, T20-22, X20-21 */ | 677 | G4x, R30, R31, R40e, R50e, T20-22, X20-21 */ |
@@ -742,7 +751,7 @@ static int __init wan_init(struct ibm_init_struct *iibm) | |||
742 | { | 751 | { |
743 | vdbg_printk(TPACPI_DBG_INIT, "initializing wan subdriver\n"); | 752 | vdbg_printk(TPACPI_DBG_INIT, "initializing wan subdriver\n"); |
744 | 753 | ||
745 | IBM_HANDLE_INIT(hkey); | 754 | IBM_ACPIHANDLE_INIT(hkey); |
746 | 755 | ||
747 | tp_features.wan = hkey_handle && | 756 | tp_features.wan = hkey_handle && |
748 | acpi_evalf(hkey_handle, NULL, "GWAN", "qv"); | 757 | acpi_evalf(hkey_handle, NULL, "GWAN", "qv"); |
@@ -835,8 +844,8 @@ static int __init video_init(struct ibm_init_struct *iibm) | |||
835 | 844 | ||
836 | vdbg_printk(TPACPI_DBG_INIT, "initializing video subdriver\n"); | 845 | vdbg_printk(TPACPI_DBG_INIT, "initializing video subdriver\n"); |
837 | 846 | ||
838 | IBM_HANDLE_INIT(vid); | 847 | IBM_ACPIHANDLE_INIT(vid); |
839 | IBM_HANDLE_INIT(vid2); | 848 | IBM_ACPIHANDLE_INIT(vid2); |
840 | 849 | ||
841 | if (vid2_handle && acpi_evalf(NULL, &ivga, "\\IVGA", "d") && ivga) | 850 | if (vid2_handle && acpi_evalf(NULL, &ivga, "\\IVGA", "d") && ivga) |
842 | /* G41, assume IVGA doesn't change */ | 851 | /* G41, assume IVGA doesn't change */ |
@@ -1053,9 +1062,9 @@ static int __init light_init(struct ibm_init_struct *iibm) | |||
1053 | { | 1062 | { |
1054 | vdbg_printk(TPACPI_DBG_INIT, "initializing light subdriver\n"); | 1063 | vdbg_printk(TPACPI_DBG_INIT, "initializing light subdriver\n"); |
1055 | 1064 | ||
1056 | IBM_HANDLE_INIT(ledb); | 1065 | IBM_ACPIHANDLE_INIT(ledb); |
1057 | IBM_HANDLE_INIT(lght); | 1066 | IBM_ACPIHANDLE_INIT(lght); |
1058 | IBM_HANDLE_INIT(cmos); | 1067 | IBM_ACPIHANDLE_INIT(cmos); |
1059 | 1068 | ||
1060 | /* light not supported on 570, 600e/x, 770e, 770x, G4x, R30, R31 */ | 1069 | /* light not supported on 570, 600e/x, 770e, 770x, G4x, R30, R31 */ |
1061 | tp_features.light = (cmos_handle || lght_handle) && !ledb_handle; | 1070 | tp_features.light = (cmos_handle || lght_handle) && !ledb_handle; |
@@ -1148,8 +1157,8 @@ static int __init dock_init(struct ibm_init_struct *iibm) | |||
1148 | { | 1157 | { |
1149 | vdbg_printk(TPACPI_DBG_INIT, "initializing dock subdriver\n"); | 1158 | vdbg_printk(TPACPI_DBG_INIT, "initializing dock subdriver\n"); |
1150 | 1159 | ||
1151 | IBM_HANDLE_INIT(dock); | 1160 | IBM_ACPIHANDLE_INIT(dock); |
1152 | IBM_HANDLE_INIT(pci); | 1161 | IBM_ACPIHANDLE_INIT(pci); |
1153 | 1162 | ||
1154 | vdbg_printk(TPACPI_DBG_INIT, "dock is %s\n", | 1163 | vdbg_printk(TPACPI_DBG_INIT, "dock is %s\n", |
1155 | str_supported(dock_handle != NULL)); | 1164 | str_supported(dock_handle != NULL)); |
@@ -1160,22 +1169,22 @@ static int __init dock_init(struct ibm_init_struct *iibm) | |||
1160 | static void dock_notify(struct ibm_struct *ibm, u32 event) | 1169 | static void dock_notify(struct ibm_struct *ibm, u32 event) |
1161 | { | 1170 | { |
1162 | int docked = dock_docked(); | 1171 | int docked = dock_docked(); |
1163 | int pci = ibm->hid && strstr(ibm->hid, IBM_PCI_HID); | 1172 | int pci = ibm->acpi->hid && strstr(ibm->acpi->hid, IBM_PCI_HID); |
1164 | 1173 | ||
1165 | if (event == 1 && !pci) /* 570 */ | 1174 | if (event == 1 && !pci) /* 570 */ |
1166 | acpi_bus_generate_event(ibm->device, event, 1); /* button */ | 1175 | acpi_bus_generate_event(ibm->acpi->device, event, 1); /* button */ |
1167 | else if (event == 1 && pci) /* 570 */ | 1176 | else if (event == 1 && pci) /* 570 */ |
1168 | acpi_bus_generate_event(ibm->device, event, 3); /* dock */ | 1177 | acpi_bus_generate_event(ibm->acpi->device, event, 3); /* dock */ |
1169 | else if (event == 3 && docked) | 1178 | else if (event == 3 && docked) |
1170 | acpi_bus_generate_event(ibm->device, event, 1); /* button */ | 1179 | acpi_bus_generate_event(ibm->acpi->device, event, 1); /* button */ |
1171 | else if (event == 3 && !docked) | 1180 | else if (event == 3 && !docked) |
1172 | acpi_bus_generate_event(ibm->device, event, 2); /* undock */ | 1181 | acpi_bus_generate_event(ibm->acpi->device, event, 2); /* undock */ |
1173 | else if (event == 0 && docked) | 1182 | else if (event == 0 && docked) |
1174 | acpi_bus_generate_event(ibm->device, event, 3); /* dock */ | 1183 | acpi_bus_generate_event(ibm->acpi->device, event, 3); /* dock */ |
1175 | else { | 1184 | else { |
1176 | printk(IBM_ERR "unknown dock event %d, status %d\n", | 1185 | printk(IBM_ERR "unknown dock event %d, status %d\n", |
1177 | event, _sta(dock_handle)); | 1186 | event, _sta(dock_handle)); |
1178 | acpi_bus_generate_event(ibm->device, event, 0); /* unknown */ | 1187 | acpi_bus_generate_event(ibm->acpi->device, event, 0); /* unknown */ |
1179 | } | 1188 | } |
1180 | } | 1189 | } |
1181 | 1190 | ||
@@ -1218,17 +1227,13 @@ static int dock_write(char *buf) | |||
1218 | return 0; | 1227 | return 0; |
1219 | } | 1228 | } |
1220 | 1229 | ||
1221 | static struct ibm_struct dock_driver_data[2] = { | 1230 | static struct tp_acpi_drv_struct ibm_dock_acpidriver[2] = { |
1222 | { | 1231 | { |
1223 | .name = "dock", | ||
1224 | .read = dock_read, | ||
1225 | .write = dock_write, | ||
1226 | .notify = dock_notify, | 1232 | .notify = dock_notify, |
1227 | .handle = &dock_handle, | 1233 | .handle = &dock_handle, |
1228 | .type = ACPI_SYSTEM_NOTIFY, | 1234 | .type = ACPI_SYSTEM_NOTIFY, |
1229 | }, | 1235 | }, |
1230 | { | 1236 | { |
1231 | .name = "dock", | ||
1232 | .hid = IBM_PCI_HID, | 1237 | .hid = IBM_PCI_HID, |
1233 | .notify = dock_notify, | 1238 | .notify = dock_notify, |
1234 | .handle = &pci_handle, | 1239 | .handle = &pci_handle, |
@@ -1236,6 +1241,19 @@ static struct ibm_struct dock_driver_data[2] = { | |||
1236 | }, | 1241 | }, |
1237 | }; | 1242 | }; |
1238 | 1243 | ||
1244 | static struct ibm_struct dock_driver_data[2] = { | ||
1245 | { | ||
1246 | .name = "dock", | ||
1247 | .read = dock_read, | ||
1248 | .write = dock_write, | ||
1249 | .acpi = &ibm_dock_acpidriver[0], | ||
1250 | }, | ||
1251 | { | ||
1252 | .name = "dock", | ||
1253 | .acpi = &ibm_dock_acpidriver[1], | ||
1254 | }, | ||
1255 | }; | ||
1256 | |||
1239 | #endif /* CONFIG_THINKPAD_ACPI_DOCK */ | 1257 | #endif /* CONFIG_THINKPAD_ACPI_DOCK */ |
1240 | 1258 | ||
1241 | /************************************************************************* | 1259 | /************************************************************************* |
@@ -1262,12 +1280,12 @@ static int __init bay_init(struct ibm_init_struct *iibm) | |||
1262 | { | 1280 | { |
1263 | vdbg_printk(TPACPI_DBG_INIT, "initializing bay subdriver\n"); | 1281 | vdbg_printk(TPACPI_DBG_INIT, "initializing bay subdriver\n"); |
1264 | 1282 | ||
1265 | IBM_HANDLE_INIT(bay); | 1283 | IBM_ACPIHANDLE_INIT(bay); |
1266 | if (bay_handle) | 1284 | if (bay_handle) |
1267 | IBM_HANDLE_INIT(bay_ej); | 1285 | IBM_ACPIHANDLE_INIT(bay_ej); |
1268 | IBM_HANDLE_INIT(bay2); | 1286 | IBM_ACPIHANDLE_INIT(bay2); |
1269 | if (bay2_handle) | 1287 | if (bay2_handle) |
1270 | IBM_HANDLE_INIT(bay2_ej); | 1288 | IBM_ACPIHANDLE_INIT(bay2_ej); |
1271 | 1289 | ||
1272 | tp_features.bay_status = bay_handle && | 1290 | tp_features.bay_status = bay_handle && |
1273 | acpi_evalf(bay_handle, NULL, "_STA", "qv"); | 1291 | acpi_evalf(bay_handle, NULL, "_STA", "qv"); |
@@ -1292,7 +1310,7 @@ static int __init bay_init(struct ibm_init_struct *iibm) | |||
1292 | 1310 | ||
1293 | static void bay_notify(struct ibm_struct *ibm, u32 event) | 1311 | static void bay_notify(struct ibm_struct *ibm, u32 event) |
1294 | { | 1312 | { |
1295 | acpi_bus_generate_event(ibm->device, event, 0); | 1313 | acpi_bus_generate_event(ibm->acpi->device, event, 0); |
1296 | } | 1314 | } |
1297 | 1315 | ||
1298 | #define bay_occupied(b) (_sta(b##_handle) & 1) | 1316 | #define bay_occupied(b) (_sta(b##_handle) & 1) |
@@ -1347,13 +1365,17 @@ static int bay_write(char *buf) | |||
1347 | return 0; | 1365 | return 0; |
1348 | } | 1366 | } |
1349 | 1367 | ||
1368 | static struct tp_acpi_drv_struct ibm_bay_acpidriver = { | ||
1369 | .notify = bay_notify, | ||
1370 | .handle = &bay_handle, | ||
1371 | .type = ACPI_SYSTEM_NOTIFY, | ||
1372 | }; | ||
1373 | |||
1350 | static struct ibm_struct bay_driver_data = { | 1374 | static struct ibm_struct bay_driver_data = { |
1351 | .name = "bay", | 1375 | .name = "bay", |
1352 | .read = bay_read, | 1376 | .read = bay_read, |
1353 | .write = bay_write, | 1377 | .write = bay_write, |
1354 | .notify = bay_notify, | 1378 | .acpi = &ibm_bay_acpidriver, |
1355 | .handle = &bay_handle, | ||
1356 | .type = ACPI_SYSTEM_NOTIFY, | ||
1357 | }; | 1379 | }; |
1358 | 1380 | ||
1359 | #endif /* CONFIG_THINKPAD_ACPI_BAY */ | 1381 | #endif /* CONFIG_THINKPAD_ACPI_BAY */ |
@@ -1367,7 +1389,7 @@ static int __init cmos_init(struct ibm_init_struct *iibm) | |||
1367 | vdbg_printk(TPACPI_DBG_INIT, | 1389 | vdbg_printk(TPACPI_DBG_INIT, |
1368 | "initializing cmos commands subdriver\n"); | 1390 | "initializing cmos commands subdriver\n"); |
1369 | 1391 | ||
1370 | IBM_HANDLE_INIT(cmos); | 1392 | IBM_ACPIHANDLE_INIT(cmos); |
1371 | 1393 | ||
1372 | vdbg_printk(TPACPI_DBG_INIT, "cmos commands are %s\n", | 1394 | vdbg_printk(TPACPI_DBG_INIT, "cmos commands are %s\n", |
1373 | str_supported(cmos_handle != NULL)); | 1395 | str_supported(cmos_handle != NULL)); |
@@ -1441,7 +1463,7 @@ static int __init led_init(struct ibm_init_struct *iibm) | |||
1441 | { | 1463 | { |
1442 | vdbg_printk(TPACPI_DBG_INIT, "initializing LED subdriver\n"); | 1464 | vdbg_printk(TPACPI_DBG_INIT, "initializing LED subdriver\n"); |
1443 | 1465 | ||
1444 | IBM_HANDLE_INIT(led); | 1466 | IBM_ACPIHANDLE_INIT(led); |
1445 | 1467 | ||
1446 | if (!led_handle) | 1468 | if (!led_handle) |
1447 | /* led not supported on R30, R31 */ | 1469 | /* led not supported on R30, R31 */ |
@@ -1566,7 +1588,7 @@ static int __init beep_init(struct ibm_init_struct *iibm) | |||
1566 | { | 1588 | { |
1567 | vdbg_printk(TPACPI_DBG_INIT, "initializing beep subdriver\n"); | 1589 | vdbg_printk(TPACPI_DBG_INIT, "initializing beep subdriver\n"); |
1568 | 1590 | ||
1569 | IBM_HANDLE_INIT(beep); | 1591 | IBM_ACPIHANDLE_INIT(beep); |
1570 | 1592 | ||
1571 | vdbg_printk(TPACPI_DBG_INIT, "beep is %s\n", | 1593 | vdbg_printk(TPACPI_DBG_INIT, "beep is %s\n", |
1572 | str_supported(beep_handle != NULL)); | 1594 | str_supported(beep_handle != NULL)); |
@@ -2200,9 +2222,9 @@ static int __init fan_init(struct ibm_init_struct *iibm) | |||
2200 | fan_watchdog_maxinterval = 0; | 2222 | fan_watchdog_maxinterval = 0; |
2201 | tp_features.fan_ctrl_status_undef = 0; | 2223 | tp_features.fan_ctrl_status_undef = 0; |
2202 | 2224 | ||
2203 | IBM_HANDLE_INIT(fans); | 2225 | IBM_ACPIHANDLE_INIT(fans); |
2204 | IBM_HANDLE_INIT(gfan); | 2226 | IBM_ACPIHANDLE_INIT(gfan); |
2205 | IBM_HANDLE_INIT(sfan); | 2227 | IBM_ACPIHANDLE_INIT(sfan); |
2206 | 2228 | ||
2207 | if (gfan_handle) { | 2229 | if (gfan_handle) { |
2208 | /* 570, 600e/x, 770e, 770x */ | 2230 | /* 570, 600e/x, 770e, 770x */ |
@@ -2728,22 +2750,24 @@ static int __init ibm_init(struct ibm_init_struct *iibm) | |||
2728 | ibm->flags.init_called = 1; | 2750 | ibm->flags.init_called = 1; |
2729 | } | 2751 | } |
2730 | 2752 | ||
2731 | if (ibm->hid) { | 2753 | if (ibm->acpi) { |
2732 | ret = register_tpacpi_subdriver(ibm); | 2754 | if (ibm->acpi->hid) { |
2733 | if (ret) | 2755 | ret = register_tpacpi_subdriver(ibm); |
2734 | goto err_out; | 2756 | if (ret) |
2735 | } | 2757 | goto err_out; |
2758 | } | ||
2736 | 2759 | ||
2737 | if (ibm->notify) { | 2760 | if (ibm->acpi->notify) { |
2738 | ret = setup_notify(ibm); | 2761 | ret = setup_acpi_notify(ibm); |
2739 | if (ret == -ENODEV) { | 2762 | if (ret == -ENODEV) { |
2740 | printk(IBM_NOTICE "disabling subdriver %s\n", | 2763 | printk(IBM_NOTICE "disabling subdriver %s\n", |
2741 | ibm->name); | 2764 | ibm->name); |
2742 | ret = 0; | 2765 | ret = 0; |
2743 | goto err_out; | 2766 | goto err_out; |
2767 | } | ||
2768 | if (ret < 0) | ||
2769 | goto err_out; | ||
2744 | } | 2770 | } |
2745 | if (ret < 0) | ||
2746 | goto err_out; | ||
2747 | } | 2771 | } |
2748 | 2772 | ||
2749 | dbg_printk(TPACPI_DBG_INIT, | 2773 | dbg_printk(TPACPI_DBG_INIT, |
@@ -2761,9 +2785,9 @@ static int __init ibm_init(struct ibm_init_struct *iibm) | |||
2761 | } | 2785 | } |
2762 | entry->owner = THIS_MODULE; | 2786 | entry->owner = THIS_MODULE; |
2763 | entry->data = ibm; | 2787 | entry->data = ibm; |
2764 | entry->read_proc = &dispatch_read; | 2788 | entry->read_proc = &dispatch_procfs_read; |
2765 | if (ibm->write) | 2789 | if (ibm->write) |
2766 | entry->write_proc = &dispatch_write; | 2790 | entry->write_proc = &dispatch_procfs_write; |
2767 | ibm->flags.proc_created = 1; | 2791 | ibm->flags.proc_created = 1; |
2768 | } | 2792 | } |
2769 | 2793 | ||
@@ -2786,12 +2810,15 @@ static void ibm_exit(struct ibm_struct *ibm) | |||
2786 | 2810 | ||
2787 | list_del_init(&ibm->all_drivers); | 2811 | list_del_init(&ibm->all_drivers); |
2788 | 2812 | ||
2789 | if (ibm->flags.notify_installed) { | 2813 | if (ibm->flags.acpi_notify_installed) { |
2790 | dbg_printk(TPACPI_DBG_EXIT, | 2814 | dbg_printk(TPACPI_DBG_EXIT, |
2791 | "%s: acpi_remove_notify_handler\n", ibm->name); | 2815 | "%s: acpi_remove_notify_handler\n", ibm->name); |
2792 | acpi_remove_notify_handler(*ibm->handle, ibm->type, | 2816 | BUG_ON(!ibm->acpi); |
2793 | dispatch_notify); | 2817 | acpi_remove_notify_handler(*ibm->acpi->handle, |
2794 | ibm->flags.notify_installed = 0; | 2818 | ibm->acpi->type, |
2819 | dispatch_acpi_notify); | ||
2820 | ibm->flags.acpi_notify_installed = 0; | ||
2821 | ibm->flags.acpi_notify_installed = 0; | ||
2795 | } | 2822 | } |
2796 | 2823 | ||
2797 | if (ibm->flags.proc_created) { | 2824 | if (ibm->flags.proc_created) { |
@@ -2801,13 +2828,14 @@ static void ibm_exit(struct ibm_struct *ibm) | |||
2801 | ibm->flags.proc_created = 0; | 2828 | ibm->flags.proc_created = 0; |
2802 | } | 2829 | } |
2803 | 2830 | ||
2804 | if (ibm->flags.driver_registered) { | 2831 | if (ibm->flags.acpi_driver_registered) { |
2805 | dbg_printk(TPACPI_DBG_EXIT, | 2832 | dbg_printk(TPACPI_DBG_EXIT, |
2806 | "%s: acpi_bus_unregister_driver\n", ibm->name); | 2833 | "%s: acpi_bus_unregister_driver\n", ibm->name); |
2807 | acpi_bus_unregister_driver(ibm->driver); | 2834 | BUG_ON(!ibm->acpi); |
2808 | kfree(ibm->driver); | 2835 | acpi_bus_unregister_driver(ibm->acpi->driver); |
2809 | ibm->driver = NULL; | 2836 | kfree(ibm->acpi->driver); |
2810 | ibm->flags.driver_registered = 0; | 2837 | ibm->acpi->driver = NULL; |
2838 | ibm->flags.acpi_driver_registered = 0; | ||
2811 | } | 2839 | } |
2812 | 2840 | ||
2813 | if (ibm->flags.init_called && ibm->exit) { | 2841 | if (ibm->flags.init_called && ibm->exit) { |
@@ -2860,7 +2888,7 @@ static int __init probe_for_thinkpad(void) | |||
2860 | is_thinkpad = dmi_name_in_vendors("ThinkPad"); | 2888 | is_thinkpad = dmi_name_in_vendors("ThinkPad"); |
2861 | 2889 | ||
2862 | /* ec is required because many other handles are relative to it */ | 2890 | /* ec is required because many other handles are relative to it */ |
2863 | IBM_HANDLE_INIT(ec); | 2891 | IBM_ACPIHANDLE_INIT(ec); |
2864 | if (!ec_handle) { | 2892 | if (!ec_handle) { |
2865 | if (is_thinkpad) | 2893 | if (is_thinkpad) |
2866 | printk(IBM_ERR | 2894 | printk(IBM_ERR |
@@ -3016,12 +3044,12 @@ static int __init thinkpad_acpi_module_init(void) | |||
3016 | return ret; | 3044 | return ret; |
3017 | 3045 | ||
3018 | ibm_thinkpad_ec_found = check_dmi_for_ec(); | 3046 | ibm_thinkpad_ec_found = check_dmi_for_ec(); |
3019 | IBM_HANDLE_INIT(ecrd); | 3047 | IBM_ACPIHANDLE_INIT(ecrd); |
3020 | IBM_HANDLE_INIT(ecwr); | 3048 | IBM_ACPIHANDLE_INIT(ecwr); |
3021 | 3049 | ||
3022 | proc_dir = proc_mkdir(IBM_DIR, acpi_root_dir); | 3050 | proc_dir = proc_mkdir(IBM_PROC_DIR, acpi_root_dir); |
3023 | if (!proc_dir) { | 3051 | if (!proc_dir) { |
3024 | printk(IBM_ERR "unable to create proc dir %s", IBM_DIR); | 3052 | printk(IBM_ERR "unable to create proc dir " IBM_PROC_DIR); |
3025 | thinkpad_acpi_module_exit(); | 3053 | thinkpad_acpi_module_exit(); |
3026 | return -ENODEV; | 3054 | return -ENODEV; |
3027 | } | 3055 | } |
@@ -3053,10 +3081,9 @@ static void thinkpad_acpi_module_exit(void) | |||
3053 | dbg_printk(TPACPI_DBG_INIT, "finished subdriver exit path...\n"); | 3081 | dbg_printk(TPACPI_DBG_INIT, "finished subdriver exit path...\n"); |
3054 | 3082 | ||
3055 | if (proc_dir) | 3083 | if (proc_dir) |
3056 | remove_proc_entry(IBM_DIR, acpi_root_dir); | 3084 | remove_proc_entry(IBM_PROC_DIR, acpi_root_dir); |
3057 | 3085 | ||
3058 | if (ibm_thinkpad_ec_found) | 3086 | kfree(ibm_thinkpad_ec_found); |
3059 | kfree(ibm_thinkpad_ec_found); | ||
3060 | } | 3087 | } |
3061 | 3088 | ||
3062 | module_init(thinkpad_acpi_module_init); | 3089 | module_init(thinkpad_acpi_module_init); |
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h index 4d3ab4015ff2..529528c2fb5d 100644 --- a/drivers/misc/thinkpad_acpi.h +++ b/drivers/misc/thinkpad_acpi.h | |||
@@ -52,8 +52,9 @@ | |||
52 | #define IBM_DESC "ThinkPad ACPI Extras" | 52 | #define IBM_DESC "ThinkPad ACPI Extras" |
53 | #define IBM_FILE "thinkpad_acpi" | 53 | #define IBM_FILE "thinkpad_acpi" |
54 | #define IBM_URL "http://ibm-acpi.sf.net/" | 54 | #define IBM_URL "http://ibm-acpi.sf.net/" |
55 | #define IBM_MAIL "ibm-acpi-devel@lists.sourceforge.net" | ||
55 | 56 | ||
56 | #define IBM_DIR "ibm" | 57 | #define IBM_PROC_DIR "ibm" |
57 | #define IBM_ACPI_EVENT_PREFIX "ibm" | 58 | #define IBM_ACPI_EVENT_PREFIX "ibm" |
58 | 59 | ||
59 | #define IBM_LOG IBM_FILE ": " | 60 | #define IBM_LOG IBM_FILE ": " |
@@ -108,20 +109,21 @@ static acpi_handle ec_handle; /* EC */ | |||
108 | static acpi_handle ecrd_handle, ecwr_handle; /* 570 EC access */ | 109 | static acpi_handle ecrd_handle, ecwr_handle; /* 570 EC access */ |
109 | static acpi_handle cmos_handle, hkey_handle; /* basic thinkpad handles */ | 110 | static acpi_handle cmos_handle, hkey_handle; /* basic thinkpad handles */ |
110 | 111 | ||
111 | static void ibm_handle_init(char *name, | 112 | static void drv_acpi_handle_init(char *name, |
112 | acpi_handle *handle, acpi_handle parent, | 113 | acpi_handle *handle, acpi_handle parent, |
113 | char **paths, int num_paths, char **path); | 114 | char **paths, int num_paths, char **path); |
114 | #define IBM_HANDLE_INIT(object) \ | 115 | #define IBM_ACPIHANDLE_INIT(object) \ |
115 | ibm_handle_init(#object, &object##_handle, *object##_parent, \ | 116 | drv_acpi_handle_init(#object, &object##_handle, *object##_parent, \ |
116 | object##_paths, ARRAY_SIZE(object##_paths), &object##_path) | 117 | object##_paths, ARRAY_SIZE(object##_paths), &object##_path) |
117 | 118 | ||
118 | /* procfs support */ | 119 | /* procfs support */ |
119 | static struct proc_dir_entry *proc_dir; | 120 | static struct proc_dir_entry *proc_dir; |
120 | 121 | ||
121 | /* procfs helpers */ | 122 | /* procfs helpers */ |
122 | static int dispatch_read(char *page, char **start, off_t off, int count, | 123 | static int dispatch_procfs_read(char *page, char **start, off_t off, |
123 | int *eof, void *data); | 124 | int count, int *eof, void *data); |
124 | static int dispatch_write(struct file *file, const char __user * userbuf, | 125 | static int dispatch_procfs_write(struct file *file, |
126 | const char __user * userbuf, | ||
125 | unsigned long count, void *data); | 127 | unsigned long count, void *data); |
126 | static char *next_cmd(char **cmds); | 128 | static char *next_cmd(char **cmds); |
127 | 129 | ||
@@ -140,28 +142,34 @@ static void thinkpad_acpi_module_exit(void); | |||
140 | * Subdrivers | 142 | * Subdrivers |
141 | */ | 143 | */ |
142 | 144 | ||
143 | struct ibm_struct { | 145 | struct ibm_struct; |
144 | char *name; | ||
145 | 146 | ||
147 | struct tp_acpi_drv_struct { | ||
146 | char *hid; | 148 | char *hid; |
147 | struct acpi_driver *driver; | 149 | struct acpi_driver *driver; |
148 | 150 | ||
149 | int (*read) (char *); | ||
150 | int (*write) (char *); | ||
151 | void (*exit) (void); | ||
152 | |||
153 | void (*notify) (struct ibm_struct *, u32); | 151 | void (*notify) (struct ibm_struct *, u32); |
154 | acpi_handle *handle; | 152 | acpi_handle *handle; |
155 | int type; | 153 | u32 type; |
156 | struct acpi_device *device; | 154 | struct acpi_device *device; |
155 | }; | ||
156 | |||
157 | struct ibm_struct { | ||
158 | char *name; | ||
159 | |||
160 | int (*read) (char *); | ||
161 | int (*write) (char *); | ||
162 | void (*exit) (void); | ||
157 | 163 | ||
158 | struct list_head all_drivers; | 164 | struct list_head all_drivers; |
159 | 165 | ||
166 | struct tp_acpi_drv_struct *acpi; | ||
167 | |||
160 | struct { | 168 | struct { |
161 | u8 driver_registered:1; | 169 | u8 acpi_driver_registered:1; |
170 | u8 acpi_notify_installed:1; | ||
162 | u8 proc_created:1; | 171 | u8 proc_created:1; |
163 | u8 init_called:1; | 172 | u8 init_called:1; |
164 | u8 notify_installed:1; | ||
165 | u8 experimental:1; | 173 | u8 experimental:1; |
166 | } flags; | 174 | } flags; |
167 | }; | 175 | }; |