fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / acpi / system.c
index bee370a..d86dcb3 100644 (file)
  */
 
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/init.h>
 #include <asm/uaccess.h>
 
 #include <acpi/acpi_drivers.h>
 
-
 #define _COMPONENT             ACPI_SYSTEM_COMPONENT
-ACPI_MODULE_NAME               ("acpi_system")
-
+ACPI_MODULE_NAME("acpi_system")
 #define ACPI_SYSTEM_CLASS              "system"
 #define ACPI_SYSTEM_DRIVER_NAME                "ACPI System Driver"
 #define ACPI_SYSTEM_DEVICE_NAME                "System"
@@ -40,153 +39,110 @@ ACPI_MODULE_NAME          ("acpi_system")
 #define ACPI_SYSTEM_FILE_EVENT         "event"
 #define ACPI_SYSTEM_FILE_DSDT          "dsdt"
 #define ACPI_SYSTEM_FILE_FADT          "fadt"
-
-extern FADT_DESCRIPTOR         acpi_fadt;
+extern struct fadt_descriptor acpi_fadt;
 
 /* --------------------------------------------------------------------------
                               FS Interface (/proc)
    -------------------------------------------------------------------------- */
 
-static int
-acpi_system_read_info (
-       char                    *page,
-       char                    **start,
-       off_t                   off,
-       int                     count,
-       int                     *eof,
-       void                    *data)
+static int acpi_system_read_info(struct seq_file *seq, void *offset)
 {
-       char                    *p = page;
-       int                     size = 0;
-
-       ACPI_FUNCTION_TRACE("acpi_system_read_info");
-
-       if (off != 0)
-               goto end;
 
-       p += sprintf(p, "version:                 %x\n", ACPI_CA_VERSION);
-
-end:
-       size = (p - page);
-       if (size <= off+count) *eof = 1;
-       *start = page + off;
-       size -= off;
-       if (size>count) size = count;
-       if (size<0) size = 0;
+       seq_printf(seq, "version:                 %x\n", ACPI_CA_VERSION);
+       return 0;
+}
 
-       return_VALUE(size);
+static int acpi_system_info_open_fs(struct inode *inode, struct file *file)
+{
+       return single_open(file, acpi_system_read_info, PDE(inode)->data);
 }
 
-static ssize_t acpi_system_read_dsdt (struct file*, char*, size_t, loff_t*);
+static const struct file_operations acpi_system_info_ops = {
+       .open = acpi_system_info_open_fs,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+};
+
+static ssize_t acpi_system_read_dsdt(struct file *, char __user *, size_t,
+                                    loff_t *);
 
-static struct file_operations acpi_system_dsdt_ops = {
-       .read =                 acpi_system_read_dsdt,
+static const struct file_operations acpi_system_dsdt_ops = {
+       .read = acpi_system_read_dsdt,
 };
 
 static ssize_t
-acpi_system_read_dsdt (
-       struct file             *file,
-       char                    *buffer,
-       size_t                  count,
-       loff_t                  *ppos)
+acpi_system_read_dsdt(struct file *file,
+                     char __user * buffer, size_t count, loff_t * ppos)
 {
-       acpi_status             status = AE_OK;
-       struct acpi_buffer      dsdt = {ACPI_ALLOCATE_BUFFER, NULL};
-       void                    *data = 0;
-       size_t                  size = 0;
+       acpi_status status = AE_OK;
+       struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL };
+       ssize_t res;
 
-       ACPI_FUNCTION_TRACE("acpi_system_read_dsdt");
 
-       status = acpi_get_table(ACPI_TABLE_DSDT, 1, &dsdt);
+       status = acpi_get_table(ACPI_TABLE_ID_DSDT, 1, &dsdt);
        if (ACPI_FAILURE(status))
-               return_VALUE(-ENODEV);
-
-       if (*ppos < dsdt.length) {
-               data = dsdt.pointer + file->f_pos;
-               size = dsdt.length - file->f_pos;
-               if (size > count)
-                       size = count;
-               if (copy_to_user(buffer, data, size)) {
-                       acpi_os_free(dsdt.pointer);
-                       return_VALUE(-EFAULT);
-               }
-       }
-
-       acpi_os_free(dsdt.pointer);
+               return -ENODEV;
 
-       *ppos += size;
+       res = simple_read_from_buffer(buffer, count, ppos,
+                                     dsdt.pointer, dsdt.length);
+       kfree(dsdt.pointer);
 
-       return_VALUE(size);
+       return res;
 }
 
+static ssize_t acpi_system_read_fadt(struct file *, char __user *, size_t,
+                                    loff_t *);
 
-static ssize_t acpi_system_read_fadt (struct file*, char*, size_t, loff_t*);
-
-static struct file_operations acpi_system_fadt_ops = {
-       .read =                 acpi_system_read_fadt,
+static const struct file_operations acpi_system_fadt_ops = {
+       .read = acpi_system_read_fadt,
 };
 
 static ssize_t
-acpi_system_read_fadt (
-       struct file             *file,
-       char                    *buffer,
-       size_t                  count,
-       loff_t                  *ppos)
+acpi_system_read_fadt(struct file *file,
+                     char __user * buffer, size_t count, loff_t * ppos)
 {
-       acpi_status             status = AE_OK;
-       struct acpi_buffer      fadt = {ACPI_ALLOCATE_BUFFER, NULL};
-       void                    *data = 0;
-       size_t                  size = 0;
+       acpi_status status = AE_OK;
+       struct acpi_buffer fadt = { ACPI_ALLOCATE_BUFFER, NULL };
+       ssize_t res;
 
-       ACPI_FUNCTION_TRACE("acpi_system_read_fadt");
 
-       status = acpi_get_table(ACPI_TABLE_FADT, 1, &fadt);
+       status = acpi_get_table(ACPI_TABLE_ID_FADT, 1, &fadt);
        if (ACPI_FAILURE(status))
-               return_VALUE(-ENODEV);
-
-       if (*ppos < fadt.length) {
-               data = fadt.pointer + file->f_pos;
-               size = fadt.length - file->f_pos;
-               if (size > count)
-                       size = count;
-               if (copy_to_user(buffer, data, size)) {
-                       acpi_os_free(fadt.pointer);
-                       return_VALUE(-EFAULT);
-               }
-       }
-
-       acpi_os_free(fadt.pointer);
+               return -ENODEV;
 
-       *ppos += size;
+       res = simple_read_from_buffer(buffer, count, ppos,
+                                     fadt.pointer, fadt.length);
+       kfree(fadt.pointer);
 
-       return_VALUE(size);
+       return res;
 }
 
-
-static int __init acpi_system_init (void)
+static int __init acpi_system_init(void)
 {
-       struct proc_dir_entry   *entry;
+       struct proc_dir_entry *entry;
        int error = 0;
-       char * name;
+       char *name;
 
-       ACPI_FUNCTION_TRACE("acpi_system_init");
 
        if (acpi_disabled)
-               return_VALUE(0);
+               return 0;
 
        /* 'info' [R] */
        name = ACPI_SYSTEM_FILE_INFO;
-       entry = create_proc_read_entry(name,
-               S_IRUGO, acpi_root_dir, acpi_system_read_info,NULL);
+       entry = create_proc_entry(name, S_IRUGO, acpi_root_dir);
        if (!entry)
                goto Error;
+       else {
+               entry->proc_fops = &acpi_system_info_ops;
+       }
 
        /* 'dsdt' [R] */
        name = ACPI_SYSTEM_FILE_DSDT;
        entry = create_proc_entry(name, S_IRUSR, acpi_root_dir);
        if (entry)
                entry->proc_fops = &acpi_system_dsdt_ops;
-       else 
+       else
                goto Error;
 
        /* 'fadt' [R] */
@@ -197,13 +153,10 @@ static int __init acpi_system_init (void)
        else
                goto Error;
 
- Done:
-       return_VALUE(error);
-
- Error:
-       ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 
-                        "Unable to create '%s' proc fs entry\n", name));
+      Done:
+       return error;
 
+      Error:
        remove_proc_entry(ACPI_SYSTEM_FILE_FADT, acpi_root_dir);
        remove_proc_entry(ACPI_SYSTEM_FILE_DSDT, acpi_root_dir);
        remove_proc_entry(ACPI_SYSTEM_FILE_INFO, acpi_root_dir);
@@ -212,5 +165,4 @@ static int __init acpi_system_init (void)
        goto Done;
 }
 
-
 subsys_initcall(acpi_system_init);