diff options
Diffstat (limited to 'drivers/acpi/bay.c')
-rw-r--r-- | drivers/acpi/bay.c | 107 |
1 files changed, 7 insertions, 100 deletions
diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c index 91082ce6f5d1..fb3f31b5e69f 100644 --- a/drivers/acpi/bay.c +++ b/drivers/acpi/bay.c | |||
@@ -32,11 +32,9 @@ | |||
32 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
33 | #include <linux/platform_device.h> | 33 | #include <linux/platform_device.h> |
34 | 34 | ||
35 | #define ACPI_BAY_DRIVER_NAME "ACPI Removable Drive Bay Driver" | 35 | ACPI_MODULE_NAME("bay"); |
36 | |||
37 | ACPI_MODULE_NAME("bay") | ||
38 | MODULE_AUTHOR("Kristen Carlson Accardi"); | 36 | MODULE_AUTHOR("Kristen Carlson Accardi"); |
39 | MODULE_DESCRIPTION(ACPI_BAY_DRIVER_NAME); | 37 | MODULE_DESCRIPTION("ACPI Removable Drive Bay Driver"); |
40 | MODULE_LICENSE("GPL"); | 38 | MODULE_LICENSE("GPL"); |
41 | #define ACPI_BAY_CLASS "bay" | 39 | #define ACPI_BAY_CLASS "bay" |
42 | #define ACPI_BAY_COMPONENT 0x10000000 | 40 | #define ACPI_BAY_COMPONENT 0x10000000 |
@@ -47,18 +45,6 @@ MODULE_LICENSE("GPL"); | |||
47 | acpi_get_name(h, ACPI_FULL_PATHNAME, &buffer);\ | 45 | acpi_get_name(h, ACPI_FULL_PATHNAME, &buffer);\ |
48 | printk(KERN_DEBUG PREFIX "%s: %s\n", prefix, s); } | 46 | printk(KERN_DEBUG PREFIX "%s: %s\n", prefix, s); } |
49 | static void bay_notify(acpi_handle handle, u32 event, void *data); | 47 | static void bay_notify(acpi_handle handle, u32 event, void *data); |
50 | static int acpi_bay_add(struct acpi_device *device); | ||
51 | static int acpi_bay_remove(struct acpi_device *device, int type); | ||
52 | |||
53 | static struct acpi_driver acpi_bay_driver = { | ||
54 | .name = ACPI_BAY_DRIVER_NAME, | ||
55 | .class = ACPI_BAY_CLASS, | ||
56 | .ids = ACPI_BAY_HID, | ||
57 | .ops = { | ||
58 | .add = acpi_bay_add, | ||
59 | .remove = acpi_bay_remove, | ||
60 | }, | ||
61 | }; | ||
62 | 48 | ||
63 | struct bay { | 49 | struct bay { |
64 | acpi_handle handle; | 50 | acpi_handle handle; |
@@ -234,14 +220,6 @@ int eject_removable_drive(struct device *dev) | |||
234 | } | 220 | } |
235 | EXPORT_SYMBOL_GPL(eject_removable_drive); | 221 | EXPORT_SYMBOL_GPL(eject_removable_drive); |
236 | 222 | ||
237 | static int acpi_bay_add(struct acpi_device *device) | ||
238 | { | ||
239 | bay_dprintk(device->handle, "adding bay device"); | ||
240 | strcpy(acpi_device_name(device), "Dockable Bay"); | ||
241 | strcpy(acpi_device_class(device), "bay"); | ||
242 | return 0; | ||
243 | } | ||
244 | |||
245 | static int acpi_bay_add_fs(struct bay *bay) | 223 | static int acpi_bay_add_fs(struct bay *bay) |
246 | { | 224 | { |
247 | int ret; | 225 | int ret; |
@@ -303,7 +281,7 @@ static int bay_add(acpi_handle handle, int id) | |||
303 | 281 | ||
304 | /* initialize platform device stuff */ | 282 | /* initialize platform device stuff */ |
305 | pdev = platform_device_register_simple(ACPI_BAY_CLASS, id, NULL, 0); | 283 | pdev = platform_device_register_simple(ACPI_BAY_CLASS, id, NULL, 0); |
306 | if (pdev == NULL) { | 284 | if (IS_ERR(pdev)) { |
307 | printk(KERN_ERR PREFIX "Error registering bay device\n"); | 285 | printk(KERN_ERR PREFIX "Error registering bay device\n"); |
308 | goto bay_add_err; | 286 | goto bay_add_err; |
309 | } | 287 | } |
@@ -339,52 +317,6 @@ bay_add_err: | |||
339 | return -ENODEV; | 317 | return -ENODEV; |
340 | } | 318 | } |
341 | 319 | ||
342 | static int acpi_bay_remove(struct acpi_device *device, int type) | ||
343 | { | ||
344 | /*** FIXME: do something here */ | ||
345 | return 0; | ||
346 | } | ||
347 | |||
348 | /** | ||
349 | * bay_create_acpi_device - add new devices to acpi | ||
350 | * @handle - handle of the device to add | ||
351 | * | ||
352 | * This function will create a new acpi_device for the given | ||
353 | * handle if one does not exist already. This should cause | ||
354 | * acpi to scan for drivers for the given devices, and call | ||
355 | * matching driver's add routine. | ||
356 | * | ||
357 | * Returns a pointer to the acpi_device corresponding to the handle. | ||
358 | */ | ||
359 | static struct acpi_device * bay_create_acpi_device(acpi_handle handle) | ||
360 | { | ||
361 | struct acpi_device *device = NULL; | ||
362 | struct acpi_device *parent_device; | ||
363 | acpi_handle parent; | ||
364 | int ret; | ||
365 | |||
366 | bay_dprintk(handle, "Trying to get device"); | ||
367 | if (acpi_bus_get_device(handle, &device)) { | ||
368 | /* | ||
369 | * no device created for this object, | ||
370 | * so we should create one. | ||
371 | */ | ||
372 | bay_dprintk(handle, "No device for handle"); | ||
373 | acpi_get_parent(handle, &parent); | ||
374 | if (acpi_bus_get_device(parent, &parent_device)) | ||
375 | parent_device = NULL; | ||
376 | |||
377 | ret = acpi_bus_add(&device, parent_device, handle, | ||
378 | ACPI_BUS_TYPE_DEVICE); | ||
379 | if (ret) { | ||
380 | pr_debug("error adding bus, %x\n", | ||
381 | -ret); | ||
382 | return NULL; | ||
383 | } | ||
384 | } | ||
385 | return device; | ||
386 | } | ||
387 | |||
388 | /** | 320 | /** |
389 | * bay_notify - act upon an acpi bay notification | 321 | * bay_notify - act upon an acpi bay notification |
390 | * @handle: the bay handle | 322 | * @handle: the bay handle |
@@ -394,38 +326,19 @@ static struct acpi_device * bay_create_acpi_device(acpi_handle handle) | |||
394 | */ | 326 | */ |
395 | static void bay_notify(acpi_handle handle, u32 event, void *data) | 327 | static void bay_notify(acpi_handle handle, u32 event, void *data) |
396 | { | 328 | { |
397 | struct acpi_device *dev; | 329 | struct bay *bay_dev = (struct bay *)data; |
330 | struct device *dev = &bay_dev->pdev->dev; | ||
398 | 331 | ||
399 | bay_dprintk(handle, "Bay event"); | 332 | bay_dprintk(handle, "Bay event"); |
400 | 333 | ||
401 | switch(event) { | 334 | switch(event) { |
402 | case ACPI_NOTIFY_BUS_CHECK: | 335 | case ACPI_NOTIFY_BUS_CHECK: |
403 | printk("Bus Check\n"); | ||
404 | case ACPI_NOTIFY_DEVICE_CHECK: | 336 | case ACPI_NOTIFY_DEVICE_CHECK: |
405 | printk("Device Check\n"); | ||
406 | dev = bay_create_acpi_device(handle); | ||
407 | if (dev) | ||
408 | acpi_bus_generate_event(dev, event, 0); | ||
409 | else | ||
410 | printk("No device for generating event\n"); | ||
411 | /* wouldn't it be a good idea to just rescan SATA | ||
412 | * right here? | ||
413 | */ | ||
414 | break; | ||
415 | case ACPI_NOTIFY_EJECT_REQUEST: | 337 | case ACPI_NOTIFY_EJECT_REQUEST: |
416 | printk("Eject request\n"); | 338 | kobject_uevent(&dev->kobj, KOBJ_CHANGE); |
417 | dev = bay_create_acpi_device(handle); | ||
418 | if (dev) | ||
419 | acpi_bus_generate_event(dev, event, 0); | ||
420 | else | ||
421 | printk("No device for generating eventn"); | ||
422 | |||
423 | /* wouldn't it be a good idea to just call the | ||
424 | * eject_device here if we were a SATA device? | ||
425 | */ | ||
426 | break; | 339 | break; |
427 | default: | 340 | default: |
428 | printk("unknown event %d\n", event); | 341 | printk(KERN_ERR PREFIX "Bay: unknown event %d\n", event); |
429 | } | 342 | } |
430 | } | 343 | } |
431 | 344 | ||
@@ -457,10 +370,6 @@ static int __init bay_init(void) | |||
457 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | 370 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, |
458 | ACPI_UINT32_MAX, find_bay, &bays, NULL); | 371 | ACPI_UINT32_MAX, find_bay, &bays, NULL); |
459 | 372 | ||
460 | if (bays) | ||
461 | if ((acpi_bus_register_driver(&acpi_bay_driver) < 0)) | ||
462 | printk(KERN_ERR "Unable to register bay driver\n"); | ||
463 | |||
464 | if (!bays) | 373 | if (!bays) |
465 | return -ENODEV; | 374 | return -ENODEV; |
466 | 375 | ||
@@ -481,8 +390,6 @@ static void __exit bay_exit(void) | |||
481 | kfree(bay->name); | 390 | kfree(bay->name); |
482 | kfree(bay); | 391 | kfree(bay); |
483 | } | 392 | } |
484 | |||
485 | acpi_bus_unregister_driver(&acpi_bay_driver); | ||
486 | } | 393 | } |
487 | 394 | ||
488 | postcore_initcall(bay_init); | 395 | postcore_initcall(bay_init); |