ACPI: thinkpad-acpi: driver sysfs conversion
Add the sysfs attributes for the platform driver. Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
54ae15014c
commit
176750d688
|
@ -101,11 +101,39 @@ follow all sysfs guidelines and correctly process all errors (the sysfs
|
|||
interface makes extensive use of errors). File descriptors and open /
|
||||
close operations to the sysfs inodes must also be properly implemented.
|
||||
|
||||
Driver version -- /proc/acpi/ibm/driver
|
||||
---------------------------------------
|
||||
The version of thinkpad-acpi's sysfs interface is exported by the driver
|
||||
as a driver attribute (see below).
|
||||
|
||||
Sysfs driver attributes are on the driver's sysfs attribute space,
|
||||
for 2.6.20 this is /sys/bus/platform/drivers/thinkpad-acpi/.
|
||||
|
||||
Sysfs device attributes are on the driver's sysfs attribute space,
|
||||
for 2.6.20 this is /sys/devices/platform/thinkpad-acpi/.
|
||||
|
||||
Driver version
|
||||
--------------
|
||||
|
||||
procfs: /proc/acpi/ibm/driver
|
||||
sysfs driver attribute: version
|
||||
|
||||
The driver name and version. No commands can be written to this file.
|
||||
|
||||
Sysfs interface version
|
||||
-----------------------
|
||||
|
||||
sysfs driver attribute: interface_version
|
||||
|
||||
Version of the thinkpad-acpi sysfs interface, as an unsigned long
|
||||
(output in hex format: 0xAAAABBCC), where:
|
||||
AAAA - major revision
|
||||
BB - minor revision
|
||||
CC - bugfix revision
|
||||
|
||||
The sysfs interface version changelog for the driver can be found at the
|
||||
end of this document. Changes to the sysfs interface done by the kernel
|
||||
subsystems are not documented here, nor are they tracked by this
|
||||
attribute.
|
||||
|
||||
Hot keys -- /proc/acpi/ibm/hotkey
|
||||
---------------------------------
|
||||
|
||||
|
@ -745,9 +773,19 @@ to enable more than one output class, just add their values.
|
|||
There is also a kernel build option to enable more debugging
|
||||
information, which may be necessary to debug driver problems.
|
||||
|
||||
The level of debugging information output by the driver can be changed
|
||||
at runtime through sysfs, using the driver attribute debug_level. The
|
||||
attribute takes the same bitmask as the debug module parameter above.
|
||||
|
||||
Force loading of module
|
||||
-----------------------
|
||||
|
||||
If thinkpad-acpi refuses to detect your ThinkPad, you can try to specify
|
||||
the module parameter force_load=1. Regardless of whether this works or
|
||||
not, please contact ibm-acpi-devel@lists.sourceforge.net with a report.
|
||||
|
||||
|
||||
Sysfs interface changelog:
|
||||
|
||||
0x000100: Initial sysfs support, as a single platform driver and
|
||||
device.
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
*/
|
||||
|
||||
#define IBM_VERSION "0.14"
|
||||
#define TPACPI_SYSFS_VERSION 0x000100
|
||||
|
||||
/*
|
||||
* Changelog:
|
||||
|
@ -493,6 +494,87 @@ static struct platform_driver tpacpi_pdriver = {
|
|||
};
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* thinkpad-acpi driver attributes
|
||||
*/
|
||||
|
||||
/* interface_version --------------------------------------------------- */
|
||||
static ssize_t tpacpi_driver_interface_version_show(
|
||||
struct device_driver *drv,
|
||||
char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "0x%08x\n", TPACPI_SYSFS_VERSION);
|
||||
}
|
||||
|
||||
static DRIVER_ATTR(interface_version, S_IRUGO,
|
||||
tpacpi_driver_interface_version_show, NULL);
|
||||
|
||||
/* debug_level --------------------------------------------------------- */
|
||||
static ssize_t tpacpi_driver_debug_show(struct device_driver *drv,
|
||||
char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "0x%04x\n", dbg_level);
|
||||
}
|
||||
|
||||
static ssize_t tpacpi_driver_debug_store(struct device_driver *drv,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned long t;
|
||||
char *endp;
|
||||
|
||||
t = simple_strtoul(buf, &endp, 0);
|
||||
while (*endp && isspace(*endp))
|
||||
endp++;
|
||||
if (*endp)
|
||||
return -EINVAL;
|
||||
|
||||
dbg_level = t;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO,
|
||||
tpacpi_driver_debug_show, tpacpi_driver_debug_store);
|
||||
|
||||
/* version ------------------------------------------------------------- */
|
||||
static ssize_t tpacpi_driver_version_show(struct device_driver *drv,
|
||||
char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "%s v%s\n", IBM_DESC, IBM_VERSION);
|
||||
}
|
||||
|
||||
static DRIVER_ATTR(version, S_IRUGO,
|
||||
tpacpi_driver_version_show, NULL);
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
static struct driver_attribute* tpacpi_driver_attributes[] = {
|
||||
&driver_attr_debug_level, &driver_attr_version,
|
||||
&driver_attr_interface_version,
|
||||
};
|
||||
|
||||
static int __init tpacpi_create_driver_attributes(struct device_driver *drv)
|
||||
{
|
||||
int i, res;
|
||||
|
||||
i = 0;
|
||||
res = 0;
|
||||
while (!res && i < ARRAY_SIZE(tpacpi_driver_attributes)) {
|
||||
res = driver_create_file(drv, tpacpi_driver_attributes[i]);
|
||||
i++;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void tpacpi_remove_driver_attributes(struct device_driver *drv)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < ARRAY_SIZE(tpacpi_driver_attributes); i++)
|
||||
driver_remove_file(drv, tpacpi_driver_attributes[i]);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
****************************************************************************
|
||||
*
|
||||
|
@ -3268,6 +3350,13 @@ static int __init thinkpad_acpi_module_init(void)
|
|||
thinkpad_acpi_module_exit();
|
||||
return ret;
|
||||
}
|
||||
ret = tpacpi_create_driver_attributes(&tpacpi_pdriver.driver);
|
||||
if (ret) {
|
||||
printk(IBM_ERR "unable to create sysfs driver attributes\n");
|
||||
thinkpad_acpi_module_exit();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* Device initialization */
|
||||
tpacpi_pdev = platform_device_register_simple(IBM_DRVR_NAME, -1,
|
||||
|
@ -3318,6 +3407,7 @@ static void thinkpad_acpi_module_exit(void)
|
|||
if (tpacpi_pdev)
|
||||
platform_device_unregister(tpacpi_pdev);
|
||||
|
||||
tpacpi_remove_driver_attributes(&tpacpi_pdriver.driver);
|
||||
platform_driver_unregister(&tpacpi_pdriver);
|
||||
|
||||
if (proc_dir)
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/list.h>
|
||||
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -137,6 +138,8 @@ static char *next_cmd(char **cmds);
|
|||
static struct platform_device *tpacpi_pdev;
|
||||
static struct class_device *tpacpi_hwmon;
|
||||
static struct platform_driver tpacpi_pdriver;
|
||||
static int tpacpi_create_driver_attributes(struct device_driver *drv);
|
||||
static void tpacpi_remove_driver_attributes(struct device_driver *drv);
|
||||
|
||||
/* Module */
|
||||
static int experimental;
|
||||
|
|
Loading…
Reference in New Issue