aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/bay.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/bay.c')
-rw-r--r--drivers/acpi/bay.c101
1 files changed, 5 insertions, 96 deletions
diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c
index 91082ce6f5d1..9c28081ba6a6 100644
--- a/drivers/acpi/bay.c
+++ b/drivers/acpi/bay.c
@@ -47,18 +47,6 @@ MODULE_LICENSE("GPL");
47 acpi_get_name(h, ACPI_FULL_PATHNAME, &buffer);\ 47 acpi_get_name(h, ACPI_FULL_PATHNAME, &buffer);\
48 printk(KERN_DEBUG PREFIX "%s: %s\n", prefix, s); } 48 printk(KERN_DEBUG PREFIX "%s: %s\n", prefix, s); }
49static void bay_notify(acpi_handle handle, u32 event, void *data); 49static void bay_notify(acpi_handle handle, u32 event, void *data);
50static int acpi_bay_add(struct acpi_device *device);
51static int acpi_bay_remove(struct acpi_device *device, int type);
52
53static 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 50
63struct bay { 51struct bay {
64 acpi_handle handle; 52 acpi_handle handle;
@@ -234,14 +222,6 @@ int eject_removable_drive(struct device *dev)
234} 222}
235EXPORT_SYMBOL_GPL(eject_removable_drive); 223EXPORT_SYMBOL_GPL(eject_removable_drive);
236 224
237static 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
245static int acpi_bay_add_fs(struct bay *bay) 225static int acpi_bay_add_fs(struct bay *bay)
246{ 226{
247 int ret; 227 int ret;
@@ -303,7 +283,7 @@ static int bay_add(acpi_handle handle, int id)
303 283
304 /* initialize platform device stuff */ 284 /* initialize platform device stuff */
305 pdev = platform_device_register_simple(ACPI_BAY_CLASS, id, NULL, 0); 285 pdev = platform_device_register_simple(ACPI_BAY_CLASS, id, NULL, 0);
306 if (pdev == NULL) { 286 if (IS_ERR(pdev)) {
307 printk(KERN_ERR PREFIX "Error registering bay device\n"); 287 printk(KERN_ERR PREFIX "Error registering bay device\n");
308 goto bay_add_err; 288 goto bay_add_err;
309 } 289 }
@@ -339,52 +319,6 @@ bay_add_err:
339 return -ENODEV; 319 return -ENODEV;
340} 320}
341 321
342static 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 */
359static 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/** 322/**
389 * bay_notify - act upon an acpi bay notification 323 * bay_notify - act upon an acpi bay notification
390 * @handle: the bay handle 324 * @handle: the bay handle
@@ -394,38 +328,19 @@ static struct acpi_device * bay_create_acpi_device(acpi_handle handle)
394 */ 328 */
395static void bay_notify(acpi_handle handle, u32 event, void *data) 329static void bay_notify(acpi_handle handle, u32 event, void *data)
396{ 330{
397 struct acpi_device *dev; 331 struct bay *bay_dev = (struct bay *)data;
332 struct device *dev = &bay_dev->pdev->dev;
398 333
399 bay_dprintk(handle, "Bay event"); 334 bay_dprintk(handle, "Bay event");
400 335
401 switch(event) { 336 switch(event) {
402 case ACPI_NOTIFY_BUS_CHECK: 337 case ACPI_NOTIFY_BUS_CHECK:
403 printk("Bus Check\n");
404 case ACPI_NOTIFY_DEVICE_CHECK: 338 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: 339 case ACPI_NOTIFY_EJECT_REQUEST:
416 printk("Eject request\n"); 340 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; 341 break;
427 default: 342 default:
428 printk("unknown event %d\n", event); 343 printk(KERN_ERR PREFIX "Bay: unknown event %d\n", event);
429 } 344 }
430} 345}
431 346
@@ -457,10 +372,6 @@ static int __init bay_init(void)
457 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 372 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
458 ACPI_UINT32_MAX, find_bay, &bays, NULL); 373 ACPI_UINT32_MAX, find_bay, &bays, NULL);
459 374
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) 375 if (!bays)
465 return -ENODEV; 376 return -ENODEV;
466 377
@@ -481,8 +392,6 @@ static void __exit bay_exit(void)
481 kfree(bay->name); 392 kfree(bay->name);
482 kfree(bay); 393 kfree(bay);
483 } 394 }
484
485 acpi_bus_unregister_driver(&acpi_bay_driver);
486} 395}
487 396
488postcore_initcall(bay_init); 397postcore_initcall(bay_init);