diff options
Diffstat (limited to 'drivers')
-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 | ||