Commit 54ae1501 authored by Henrique de Moraes Holschuh's avatar Henrique de Moraes Holschuh Committed by Len Brown

ACPI: thinkpad-acpi: register with the device model

Register thinkpad-acpi platform driver and platform device for the device
model.  Also register the platform device with the hwmon class.
Signed-off-by: default avatarHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 99fba3f8
ThinkPad ACPI Extras Driver ThinkPad ACPI Extras Driver
Version 0.14 Version 0.14
March 26th, 2007 April 21st, 2007
Borislav Deianov <borislav@users.sf.net> Borislav Deianov <borislav@users.sf.net>
Henrique de Moraes Holschuh <hmh@hmh.eng.br> Henrique de Moraes Holschuh <hmh@hmh.eng.br>
...@@ -67,11 +67,39 @@ thinkpad-specific bay functionality. ...@@ -67,11 +67,39 @@ thinkpad-specific bay functionality.
Features Features
-------- --------
The driver creates the /proc/acpi/ibm directory. There is a file under The driver exports two different interfaces to userspace, which can be
that directory for each feature described below. Note that while the used to access the features it provides. One is a legacy procfs-based
driver is still in the alpha stage, the exact proc file format and interface, which will be removed at some time in the distant future.
commands supported by the various features is guaranteed to change The other is a new sysfs-based interface which is not complete yet.
frequently.
The procfs interface creates the /proc/acpi/ibm directory. There is a
file under that directory for each feature it supports. The procfs
interface is mostly frozen, and will change very little if at all: it
will not be extended to add any new functionality in the driver, instead
all new functionality will be implemented on the sysfs interface.
The sysfs interface tries to blend in the generic Linux sysfs subsystems
and classes as much as possible. Since some of these subsystems are not
yet ready or stabilized, it is expected that this interface will change,
and any and all userspace programs must deal with it.
Notes about the sysfs interface:
Unlike what was done with the procfs interface, correctness when talking
to the sysfs interfaces will be enforced, as will correctness in the
thinkpad-acpi's implementation of sysfs interfaces.
Also, any bugs in the thinkpad-acpi sysfs driver code or in the
thinkpad-acpi's implementation of the sysfs interfaces will be fixed for
maximum correctness, even if that means changing an interface in
non-compatible ways. As these interfaces mature both in the kernel and
in thinkpad-acpi, such changes should become quite rare.
Applications interfacing to the thinkpad-acpi sysfs interfaces must
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 Driver version -- /proc/acpi/ibm/driver
--------------------------------------- ---------------------------------------
......
...@@ -126,6 +126,7 @@ config THINKPAD_ACPI ...@@ -126,6 +126,7 @@ config THINKPAD_ACPI
tristate "ThinkPad ACPI Laptop Extras" tristate "ThinkPad ACPI Laptop Extras"
depends on X86 && ACPI depends on X86 && ACPI
select BACKLIGHT_CLASS_DEVICE select BACKLIGHT_CLASS_DEVICE
select HWMON
---help--- ---help---
This is a driver for the IBM and Lenovo ThinkPad laptops. It adds This is a driver for the IBM and Lenovo ThinkPad laptops. It adds
support for Fn-Fx key combinations, Bluetooth control, video support for Fn-Fx key combinations, Bluetooth control, video
......
...@@ -474,6 +474,25 @@ static char *next_cmd(char **cmds) ...@@ -474,6 +474,25 @@ static char *next_cmd(char **cmds)
} }
/****************************************************************************
****************************************************************************
*
* Device model: hwmon and platform
*
****************************************************************************
****************************************************************************/
static struct platform_device *tpacpi_pdev = NULL;
static struct class_device *tpacpi_hwmon = NULL;
static struct platform_driver tpacpi_pdriver = {
.driver = {
.name = IBM_DRVR_NAME,
.owner = THIS_MODULE,
},
};
/**************************************************************************** /****************************************************************************
**************************************************************************** ****************************************************************************
* *
...@@ -3225,10 +3244,12 @@ static int __init thinkpad_acpi_module_init(void) ...@@ -3225,10 +3244,12 @@ static int __init thinkpad_acpi_module_init(void)
{ {
int ret, i; int ret, i;
/* Driver-level probe */
ret = probe_for_thinkpad(); ret = probe_for_thinkpad();
if (ret) if (ret)
return ret; return ret;
/* Driver initialization */
ibm_thinkpad_ec_found = check_dmi_for_ec(); ibm_thinkpad_ec_found = check_dmi_for_ec();
IBM_ACPIHANDLE_INIT(ecrd); IBM_ACPIHANDLE_INIT(ecrd);
IBM_ACPIHANDLE_INIT(ecwr); IBM_ACPIHANDLE_INIT(ecwr);
...@@ -3241,6 +3262,31 @@ static int __init thinkpad_acpi_module_init(void) ...@@ -3241,6 +3262,31 @@ static int __init thinkpad_acpi_module_init(void)
} }
proc_dir->owner = THIS_MODULE; proc_dir->owner = THIS_MODULE;
ret = platform_driver_register(&tpacpi_pdriver);
if (ret) {
printk(IBM_ERR "unable to register platform driver\n");
thinkpad_acpi_module_exit();
return ret;
}
/* Device initialization */
tpacpi_pdev = platform_device_register_simple(IBM_DRVR_NAME, -1,
NULL, 0);
if (IS_ERR(tpacpi_pdev)) {
ret = PTR_ERR(tpacpi_pdev);
tpacpi_pdev = NULL;
printk(IBM_ERR "unable to register platform device\n");
thinkpad_acpi_module_exit();
return ret;
}
tpacpi_hwmon = hwmon_device_register(&tpacpi_pdev->dev);
if (IS_ERR(tpacpi_hwmon)) {
ret = PTR_ERR(tpacpi_hwmon);
tpacpi_hwmon = NULL;
printk(IBM_ERR "unable to register hwmon device\n");
thinkpad_acpi_module_exit();
return ret;
}
for (i = 0; i < ARRAY_SIZE(ibms_init); i++) { for (i = 0; i < ARRAY_SIZE(ibms_init); i++) {
ret = ibm_init(&ibms_init[i]); ret = ibm_init(&ibms_init[i]);
if (ret >= 0 && *ibms_init[i].param) if (ret >= 0 && *ibms_init[i].param)
...@@ -3266,6 +3312,14 @@ static void thinkpad_acpi_module_exit(void) ...@@ -3266,6 +3312,14 @@ static void thinkpad_acpi_module_exit(void)
dbg_printk(TPACPI_DBG_INIT, "finished subdriver exit path...\n"); dbg_printk(TPACPI_DBG_INIT, "finished subdriver exit path...\n");
if (tpacpi_hwmon)
hwmon_device_unregister(tpacpi_hwmon);
if (tpacpi_pdev)
platform_device_unregister(tpacpi_pdev);
platform_driver_unregister(&tpacpi_pdriver);
if (proc_dir) if (proc_dir)
remove_proc_entry(IBM_PROC_DIR, acpi_root_dir); remove_proc_entry(IBM_PROC_DIR, acpi_root_dir);
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/backlight.h> #include <linux/backlight.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/platform_device.h>
#include <linux/hwmon.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <linux/dmi.h> #include <linux/dmi.h>
...@@ -56,6 +58,7 @@ ...@@ -56,6 +58,7 @@
#define IBM_PROC_DIR "ibm" #define IBM_PROC_DIR "ibm"
#define IBM_ACPI_EVENT_PREFIX "ibm" #define IBM_ACPI_EVENT_PREFIX "ibm"
#define IBM_DRVR_NAME IBM_FILE
#define IBM_LOG IBM_FILE ": " #define IBM_LOG IBM_FILE ": "
#define IBM_ERR KERN_ERR IBM_LOG #define IBM_ERR KERN_ERR IBM_LOG
...@@ -130,6 +133,11 @@ static int dispatch_procfs_write(struct file *file, ...@@ -130,6 +133,11 @@ static int dispatch_procfs_write(struct file *file,
unsigned long count, void *data); unsigned long count, void *data);
static char *next_cmd(char **cmds); static char *next_cmd(char **cmds);
/* Device model */
static struct platform_device *tpacpi_pdev;
static struct class_device *tpacpi_hwmon;
static struct platform_driver tpacpi_pdriver;
/* Module */ /* Module */
static int experimental; static int experimental;
static u32 dbg_level; static u32 dbg_level;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment