2005-04-17 02:20:36 +04:00
/*
* acpi_system . c - ACPI System Driver ( $ Revision : 63 $ )
*
* Copyright ( C ) 2001 , 2002 Andy Grover < andrew . grover @ intel . com >
* Copyright ( C ) 2001 , 2002 Paul Diefenbaugh < paul . s . diefenbaugh @ intel . com >
*
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or ( at
* your option ) any later version .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA .
*
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*/
# 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
2005-08-05 08:44:28 +04:00
ACPI_MODULE_NAME ( " acpi_system " )
2007-01-29 06:02:42 +03:00
# ifdef MODULE_PARAM_PREFIX
# undef MODULE_PARAM_PREFIX
# endif
# define MODULE_PARAM_PREFIX "acpi."
2005-04-17 02:20:36 +04:00
# define ACPI_SYSTEM_CLASS "system"
# define ACPI_SYSTEM_DRIVER_NAME "ACPI System Driver"
# define ACPI_SYSTEM_DEVICE_NAME "System"
# define ACPI_SYSTEM_FILE_INFO "info"
# define ACPI_SYSTEM_FILE_EVENT "event"
# define ACPI_SYSTEM_FILE_DSDT "dsdt"
# define ACPI_SYSTEM_FILE_FADT "fadt"
2007-01-29 06:02:42 +03:00
/*
* Make ACPICA version work as module param
*/
static int param_get_acpica_version ( char * buffer , struct kernel_param * kp ) {
int result ;
result = sprintf ( buffer , " %x " , ACPI_CA_VERSION ) ;
return result ;
}
module_param_call ( acpica_version , NULL , param_get_acpica_version , NULL , 0444 ) ;
2005-04-17 02:20:36 +04:00
/* --------------------------------------------------------------------------
FS Interface ( / proc )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2007-01-29 06:02:42 +03:00
# ifdef CONFIG_ACPI_PROCFS
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
static int acpi_system_read_info ( struct seq_file * seq , void * offset )
2005-04-17 02:20:36 +04:00
{
seq_printf ( seq , " version: %x \n " , ACPI_CA_VERSION ) ;
2006-06-27 08:41:40 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
}
static int acpi_system_info_open_fs ( struct inode * inode , struct file * file )
{
return single_open ( file , acpi_system_read_info , PDE ( inode ) - > data ) ;
}
2006-07-04 21:06:00 +04:00
static const struct file_operations acpi_system_info_ops = {
2005-08-05 08:44:28 +04:00
. open = acpi_system_info_open_fs ,
. read = seq_read ,
. llseek = seq_lseek ,
. release = single_release ,
2005-04-17 02:20:36 +04:00
} ;
2007-01-29 06:02:42 +03:00
# endif
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
static ssize_t acpi_system_read_dsdt ( struct file * , char __user * , size_t ,
loff_t * ) ;
2005-04-17 02:20:36 +04:00
2006-07-04 21:06:00 +04:00
static const struct file_operations acpi_system_dsdt_ops = {
2005-08-05 08:44:28 +04:00
. read = acpi_system_read_dsdt ,
2005-04-17 02:20:36 +04:00
} ;
static ssize_t
2005-08-05 08:44:28 +04:00
acpi_system_read_dsdt ( struct file * file ,
char __user * buffer , size_t count , loff_t * ppos )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
acpi_status status = AE_OK ;
2007-02-02 19:48:19 +03:00
struct acpi_table_header * dsdt = NULL ;
2005-08-05 08:44:28 +04:00
ssize_t res ;
2005-04-17 02:20:36 +04:00
2007-02-02 19:48:19 +03:00
status = acpi_get_table ( ACPI_SIG_DSDT , 1 , & dsdt ) ;
2005-04-17 02:20:36 +04:00
if ( ACPI_FAILURE ( status ) )
2006-06-27 08:41:40 +04:00
return - ENODEV ;
2005-04-17 02:20:36 +04:00
res = simple_read_from_buffer ( buffer , count , ppos ,
2007-02-02 19:48:19 +03:00
dsdt , dsdt - > length ) ;
2005-04-17 02:20:36 +04:00
2006-06-27 08:41:40 +04:00
return res ;
2005-04-17 02:20:36 +04:00
}
2005-08-05 08:44:28 +04:00
static ssize_t acpi_system_read_fadt ( struct file * , char __user * , size_t ,
loff_t * ) ;
2005-04-17 02:20:36 +04:00
2006-07-04 21:06:00 +04:00
static const struct file_operations acpi_system_fadt_ops = {
2005-08-05 08:44:28 +04:00
. read = acpi_system_read_fadt ,
2005-04-17 02:20:36 +04:00
} ;
static ssize_t
2005-08-05 08:44:28 +04:00
acpi_system_read_fadt ( struct file * file ,
char __user * buffer , size_t count , loff_t * ppos )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
acpi_status status = AE_OK ;
2007-02-02 19:48:19 +03:00
struct acpi_table_header * fadt = NULL ;
2005-08-05 08:44:28 +04:00
ssize_t res ;
2005-04-17 02:20:36 +04:00
2007-02-02 19:48:19 +03:00
status = acpi_get_table ( ACPI_SIG_FADT , 1 , & fadt ) ;
2005-04-17 02:20:36 +04:00
if ( ACPI_FAILURE ( status ) )
2006-06-27 08:41:40 +04:00
return - ENODEV ;
2005-04-17 02:20:36 +04:00
res = simple_read_from_buffer ( buffer , count , ppos ,
2007-02-02 19:48:19 +03:00
fadt , fadt - > length ) ;
2005-04-17 02:20:36 +04:00
2006-06-27 08:41:40 +04:00
return res ;
2005-04-17 02:20:36 +04:00
}
2005-08-05 08:44:28 +04:00
static int __init acpi_system_init ( void )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
struct proc_dir_entry * entry ;
2005-04-17 02:20:36 +04:00
int error = 0 ;
2005-08-05 08:44:28 +04:00
char * name ;
2005-04-17 02:20:36 +04:00
if ( acpi_disabled )
2006-06-27 08:41:40 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
2007-01-29 06:02:42 +03:00
# ifdef CONFIG_ACPI_PROCFS
2005-04-17 02:20:36 +04:00
/* 'info' [R] */
name = ACPI_SYSTEM_FILE_INFO ;
2005-08-05 08:44:28 +04:00
entry = create_proc_entry ( name , S_IRUGO , acpi_root_dir ) ;
2005-04-17 02:20:36 +04:00
if ( ! entry )
goto Error ;
else {
entry - > proc_fops = & acpi_system_info_ops ;
}
2007-01-29 06:02:42 +03:00
# endif
2005-04-17 02:20:36 +04:00
/* '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 ;
2005-08-05 08:44:28 +04:00
else
2005-04-17 02:20:36 +04:00
goto Error ;
/* 'fadt' [R] */
name = ACPI_SYSTEM_FILE_FADT ;
entry = create_proc_entry ( name , S_IRUSR , acpi_root_dir ) ;
if ( entry )
entry - > proc_fops = & acpi_system_fadt_ops ;
else
goto Error ;
2005-08-05 08:44:28 +04:00
Done :
2006-06-27 08:41:40 +04:00
return error ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
Error :
2005-04-17 02:20:36 +04:00
remove_proc_entry ( ACPI_SYSTEM_FILE_FADT , acpi_root_dir ) ;
remove_proc_entry ( ACPI_SYSTEM_FILE_DSDT , acpi_root_dir ) ;
2007-01-29 06:02:42 +03:00
# ifdef CONFIG_ACPI_PROCFS
2005-04-17 02:20:36 +04:00
remove_proc_entry ( ACPI_SYSTEM_FILE_INFO , acpi_root_dir ) ;
2007-01-29 06:02:42 +03:00
# endif
2005-04-17 02:20:36 +04:00
error = - EFAULT ;
goto Done ;
}
subsys_initcall ( acpi_system_init ) ;