*/
#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"
#define ACPI_SYSTEM_FILE_EVENT "event"
#define ACPI_SYSTEM_FILE_DSDT "dsdt"
#define ACPI_SYSTEM_FILE_FADT "fadt"
-
-extern FADT_DESCRIPTOR acpi_fadt;
+extern 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_VALUE(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 __user *, size_t, loff_t*);
+static 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,
+ .read = acpi_system_read_dsdt,
};
static ssize_t
-acpi_system_read_dsdt (
- struct file *file,
- char __user *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 = NULL;
- 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");
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);
- }
- }
-
+ res = simple_read_from_buffer(buffer, count, ppos,
+ dsdt.pointer, dsdt.length);
acpi_os_free(dsdt.pointer);
- *ppos += size;
-
- return_VALUE(size);
+ return_VALUE(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 __user *, size_t,
+ loff_t *);
static struct file_operations acpi_system_fadt_ops = {
- .read = acpi_system_read_fadt,
+ .read = acpi_system_read_fadt,
};
static ssize_t
-acpi_system_read_fadt (
- struct file *file,
- char __user *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 = NULL;
- 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");
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);
- }
- }
-
+ res = simple_read_from_buffer(buffer, count, ppos,
+ fadt.pointer, fadt.length);
acpi_os_free(fadt.pointer);
- *ppos += size;
-
- return_VALUE(size);
+ return_VALUE(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");
/* '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] */
else
goto Error;
- Done:
+ Done:
return_VALUE(error);
- Error:
- ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
- "Unable to create '%s' proc fs entry\n", name));
+ Error:
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+ "Unable to create '%s' proc fs entry\n", name));
remove_proc_entry(ACPI_SYSTEM_FILE_FADT, acpi_root_dir);
remove_proc_entry(ACPI_SYSTEM_FILE_DSDT, acpi_root_dir);
goto Done;
}
-
subsys_initcall(acpi_system_init);