diff options
| -rw-r--r-- | drivers/acpi/bay.c | 154 |
1 files changed, 2 insertions, 152 deletions
diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c index 412590d48011..0c0a6204d167 100644 --- a/drivers/acpi/bay.c +++ b/drivers/acpi/bay.c | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | #include <linux/notifier.h> | 28 | #include <linux/notifier.h> |
| 29 | #include <acpi/acpi_bus.h> | 29 | #include <acpi/acpi_bus.h> |
| 30 | #include <acpi/acpi_drivers.h> | 30 | #include <acpi/acpi_drivers.h> |
| 31 | #include <linux/proc_fs.h> | ||
| 32 | #include <linux/seq_file.h> | 31 | #include <linux/seq_file.h> |
| 33 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
| 34 | 33 | ||
| @@ -67,12 +66,10 @@ struct bay { | |||
| 67 | acpi_handle handle; | 66 | acpi_handle handle; |
| 68 | char *name; | 67 | char *name; |
| 69 | struct list_head list; | 68 | struct list_head list; |
| 70 | struct proc_dir_entry *proc; | ||
| 71 | }; | 69 | }; |
| 72 | 70 | ||
| 73 | LIST_HEAD(drive_bays); | 71 | LIST_HEAD(drive_bays); |
| 74 | 72 | ||
| 75 | static struct proc_dir_entry *acpi_bay_dir; | ||
| 76 | 73 | ||
| 77 | /***************************************************************************** | 74 | /***************************************************************************** |
| 78 | * Drive Bay functions * | 75 | * Drive Bay functions * |
| @@ -219,147 +216,16 @@ static int acpi_bay_add(struct acpi_device *device) | |||
| 219 | return 0; | 216 | return 0; |
| 220 | } | 217 | } |
| 221 | 218 | ||
| 222 | static int acpi_bay_status_seq_show(struct seq_file *seq, void *offset) | ||
| 223 | { | ||
| 224 | struct bay *bay = (struct bay *)seq->private; | ||
| 225 | |||
| 226 | if (!bay) | ||
| 227 | return 0; | ||
| 228 | |||
| 229 | if (bay_present(bay)) | ||
| 230 | seq_printf(seq, "present\n"); | ||
| 231 | else | ||
| 232 | seq_printf(seq, "removed\n"); | ||
| 233 | |||
| 234 | return 0; | ||
| 235 | } | ||
| 236 | |||
| 237 | static ssize_t | ||
| 238 | acpi_bay_write_eject(struct file *file, | ||
| 239 | const char __user * buffer, | ||
| 240 | size_t count, loff_t * data) | ||
| 241 | { | ||
| 242 | struct seq_file *m = (struct seq_file *)file->private_data; | ||
| 243 | struct bay *bay = (struct bay *)m->private; | ||
| 244 | char str[12] = { 0 }; | ||
| 245 | u32 state = 0; | ||
| 246 | |||
| 247 | /* FIXME - our only valid value here is 1 */ | ||
| 248 | if (!bay || count + 1 > sizeof str) | ||
| 249 | return -EINVAL; | ||
| 250 | |||
| 251 | if (copy_from_user(str, buffer, count)) | ||
| 252 | return -EFAULT; | ||
| 253 | |||
| 254 | str[count] = 0; | ||
| 255 | state = simple_strtoul(str, NULL, 0); | ||
| 256 | if (state) | ||
| 257 | eject_device(bay->handle); | ||
| 258 | |||
| 259 | return count; | ||
| 260 | } | ||
| 261 | |||
| 262 | static int | ||
| 263 | acpi_bay_status_open_fs(struct inode *inode, struct file *file) | ||
| 264 | { | ||
| 265 | return single_open(file, acpi_bay_status_seq_show, | ||
| 266 | PDE(inode)->data); | ||
| 267 | } | ||
| 268 | |||
| 269 | static int | ||
| 270 | acpi_bay_eject_open_fs(struct inode *inode, struct file *file) | ||
| 271 | { | ||
| 272 | return single_open(file, acpi_bay_status_seq_show, | ||
| 273 | PDE(inode)->data); | ||
| 274 | } | ||
| 275 | |||
| 276 | static struct file_operations acpi_bay_status_fops = { | ||
| 277 | .open = acpi_bay_status_open_fs, | ||
| 278 | .read = seq_read, | ||
| 279 | .llseek = seq_lseek, | ||
| 280 | .release = single_release, | ||
| 281 | }; | ||
| 282 | |||
| 283 | static struct file_operations acpi_bay_eject_fops = { | ||
| 284 | .open = acpi_bay_eject_open_fs, | ||
| 285 | .read = seq_read, | ||
| 286 | .write = acpi_bay_write_eject, | ||
| 287 | .llseek = seq_lseek, | ||
| 288 | .release = single_release, | ||
| 289 | }; | ||
| 290 | #if 0 | ||
| 291 | static struct file_operations acpi_bay_insert_fops = { | ||
| 292 | .open = acpi_bay_insert_open_fs, | ||
| 293 | .read = seq_read, | ||
| 294 | .llseek = seq_lseek, | ||
| 295 | .release = single_release, | ||
| 296 | }; | ||
| 297 | #endif | ||
| 298 | static int acpi_bay_add_fs(struct bay *bay) | 219 | static int acpi_bay_add_fs(struct bay *bay) |
| 299 | { | 220 | { |
| 300 | struct proc_dir_entry *entry = NULL; | ||
| 301 | |||
| 302 | if (!bay) | 221 | if (!bay) |
| 303 | return -EINVAL; | 222 | return -EINVAL; |
| 304 | |||
| 305 | /* | ||
| 306 | * create a proc entry for this device | ||
| 307 | * we need to do this a little bit differently than normal | ||
| 308 | * acpi device drivers because our device may not be present | ||
| 309 | * at the moment, and therefore we have no acpi_device struct | ||
| 310 | */ | ||
| 311 | |||
| 312 | bay->proc = proc_mkdir(bay->name, acpi_bay_dir); | ||
| 313 | |||
| 314 | /* 'status' [R] */ | ||
| 315 | entry = create_proc_entry("status", | ||
| 316 | S_IRUGO, bay->proc); | ||
| 317 | if (!entry) | ||
| 318 | return -EIO; | ||
| 319 | else { | ||
| 320 | entry->proc_fops = &acpi_bay_status_fops; | ||
| 321 | entry->data = bay; | ||
| 322 | entry->owner = THIS_MODULE; | ||
| 323 | } | ||
| 324 | /* 'eject' [W] */ | ||
| 325 | entry = create_proc_entry("eject", | ||
| 326 | S_IWUGO, bay->proc); | ||
| 327 | if (!entry) | ||
| 328 | return -EIO; | ||
| 329 | else { | ||
| 330 | entry->proc_fops = &acpi_bay_eject_fops; | ||
| 331 | entry->data = bay; | ||
| 332 | entry->owner = THIS_MODULE; | ||
| 333 | } | ||
| 334 | #if 0 | ||
| 335 | /* 'insert' [W] */ | ||
| 336 | entry = create_proc_entry("insert", | ||
| 337 | S_IWUGO, bay->proc); | ||
| 338 | if (!entry) | ||
| 339 | return -EIO; | ||
| 340 | else { | ||
| 341 | entry->proc_fops = &acpi_bay_insert_fops; | ||
| 342 | entry->data = bay; | ||
| 343 | entry->owner = THIS_MODULE; | ||
| 344 | } | ||
| 345 | #endif | ||
| 346 | return 0; | ||
| 347 | } | 223 | } |
| 348 | 224 | ||
| 349 | static void acpi_bay_remove_fs(struct bay *bay) | 225 | static void acpi_bay_remove_fs(struct bay *bay) |
| 350 | { | 226 | { |
| 351 | if (!bay) | 227 | if (!bay) |
| 352 | return; | 228 | return; |
| 353 | |||
| 354 | if (bay->proc) { | ||
| 355 | remove_proc_entry("status", bay->proc); | ||
| 356 | remove_proc_entry("eject", bay->proc); | ||
| 357 | #if 0 | ||
| 358 | remove_proc_entry("insert", bay->proc); | ||
| 359 | #endif | ||
| 360 | remove_proc_entry(bay->name, acpi_bay_dir); | ||
| 361 | bay->proc = NULL; | ||
| 362 | } | ||
| 363 | } | 229 | } |
| 364 | 230 | ||
| 365 | static int bay_is_dock_device(acpi_handle handle) | 231 | static int bay_is_dock_device(acpi_handle handle) |
| @@ -384,13 +250,6 @@ static int bay_add(acpi_handle handle) | |||
| 384 | bay_dprintk(handle, "Adding notify handler"); | 250 | bay_dprintk(handle, "Adding notify handler"); |
| 385 | 251 | ||
| 386 | /* | 252 | /* |
| 387 | * if this is the first bay device found, make the root | ||
| 388 | * proc entry | ||
| 389 | */ | ||
| 390 | if (acpi_bay_dir == NULL) | ||
| 391 | acpi_bay_dir = proc_mkdir(ACPI_BAY_CLASS, acpi_root_dir); | ||
| 392 | |||
| 393 | /* | ||
| 394 | * Initialize bay device structure | 253 | * Initialize bay device structure |
| 395 | */ | 254 | */ |
| 396 | new_bay = kmalloc(GFP_ATOMIC, sizeof(*new_bay)); | 255 | new_bay = kmalloc(GFP_ATOMIC, sizeof(*new_bay)); |
| @@ -544,21 +403,15 @@ static int __init bay_init(void) | |||
| 544 | { | 403 | { |
| 545 | int bays = 0; | 404 | int bays = 0; |
| 546 | 405 | ||
| 547 | acpi_bay_dir = NULL; | ||
| 548 | INIT_LIST_HEAD(&drive_bays); | 406 | INIT_LIST_HEAD(&drive_bays); |
| 549 | 407 | ||
| 550 | /* look for dockable drive bays */ | 408 | /* look for dockable drive bays */ |
| 551 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | 409 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, |
| 552 | ACPI_UINT32_MAX, find_bay, &bays, NULL); | 410 | ACPI_UINT32_MAX, find_bay, &bays, NULL); |
| 553 | 411 | ||
| 554 | if (bays) { | 412 | if (bays) |
| 555 | if ((acpi_bus_register_driver(&acpi_bay_driver) < 0)) { | 413 | if ((acpi_bus_register_driver(&acpi_bay_driver) < 0)) |
| 556 | printk(KERN_ERR "Unable to register bay driver\n"); | 414 | printk(KERN_ERR "Unable to register bay driver\n"); |
| 557 | if (acpi_bay_dir) | ||
| 558 | remove_proc_entry(ACPI_BAY_CLASS, | ||
| 559 | acpi_root_dir); | ||
| 560 | } | ||
| 561 | } | ||
| 562 | 415 | ||
| 563 | if (!bays) | 416 | if (!bays) |
| 564 | return -ENODEV; | 417 | return -ENODEV; |
| @@ -580,9 +433,6 @@ static void __exit bay_exit(void) | |||
| 580 | kfree(bay); | 433 | kfree(bay); |
| 581 | } | 434 | } |
| 582 | 435 | ||
| 583 | if (acpi_bay_dir) | ||
| 584 | remove_proc_entry(ACPI_BAY_CLASS, acpi_root_dir); | ||
| 585 | |||
| 586 | acpi_bus_unregister_driver(&acpi_bay_driver); | 436 | acpi_bus_unregister_driver(&acpi_bay_driver); |
| 587 | } | 437 | } |
| 588 | 438 | ||
