diff options
author | Len Brown <len.brown@intel.com> | 2007-02-16 18:52:41 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2007-02-16 18:52:41 -0500 |
commit | 81450b73dde07f473a4a7208b209b4c8b7251d90 (patch) | |
tree | 94e676c74c32f2a74dc306cf863d7e190777f2ab /drivers/acpi/bay.c | |
parent | 8a03d9a498eaf02c8a118752050a5154852c13bf (diff) | |
parent | 0539771d7236b425f285652f6f297cc7939c8f9a (diff) |
Pull misc-for-upstream into release branch
Conflicts:
drivers/usb/misc/appledisplay.c
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/bay.c')
-rw-r--r-- | drivers/acpi/bay.c | 101 |
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); } |
49 | static void bay_notify(acpi_handle handle, u32 event, void *data); | 49 | 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 | 50 | ||
63 | struct bay { | 51 | struct bay { |
64 | acpi_handle handle; | 52 | acpi_handle handle; |
@@ -234,14 +222,6 @@ int eject_removable_drive(struct device *dev) | |||
234 | } | 222 | } |
235 | EXPORT_SYMBOL_GPL(eject_removable_drive); | 223 | EXPORT_SYMBOL_GPL(eject_removable_drive); |
236 | 224 | ||
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) | 225 | static 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 | ||
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 | /** | 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 | */ |
395 | static void bay_notify(acpi_handle handle, u32 event, void *data) | 329 | static 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 | ||
488 | postcore_initcall(bay_init); | 397 | postcore_initcall(bay_init); |