From: Len Brown <lenb@kernel.org>
To: linux-acpi@vger.kernel.org
Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br>,
Jean Delvare <khali@linux-fr.org>,
Len Brown <len.brown@intel.com>
Subject: [PATCH 17/37] ACPI: thinkpad-acpi: use a separate platform device for hwmon and name it (v2)
Date: Wed, 10 Oct 2007 01:06:24 -0400 [thread overview]
Message-ID: <1191992804-14965-18-git-send-email-lenb@kernel.org> (raw)
Message-ID: <7fd400297978a2cf7a74344fb22020e9479b4f69.1191992584.git.len.brown@intel.com> (raw)
In-Reply-To: <1191992804-14965-1-git-send-email-lenb@kernel.org>
In-Reply-To: <fd1caaed466de2ee100e250b6c755376eda7ba3b.1191992584.git.len.brown@intel.com>
From: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Use a separate platform device and driver ("thinkpad_hwmon") to attach
hwmon attributes and class, and add a name attribute of "thinkpad" to
it, which defines the hwmon device name for libsensors4.
This makes thinkpad-acpi compatible with libsensors4 from lm-sensors, and
the platform driver and device split will make it much easier to separate
hwmon functionality into its own module later on.
Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Cc: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Len Brown <len.brown@intel.com>
---
Documentation/thinkpad-acpi.txt | 25 +++++++++---
drivers/misc/thinkpad_acpi.c | 79 +++++++++++++++++++++++++++++++++------
drivers/misc/thinkpad_acpi.h | 6 ++-
3 files changed, 91 insertions(+), 19 deletions(-)
diff --git a/Documentation/thinkpad-acpi.txt b/Documentation/thinkpad-acpi.txt
index 60953d6..3b95bba 100644
--- a/Documentation/thinkpad-acpi.txt
+++ b/Documentation/thinkpad-acpi.txt
@@ -105,10 +105,15 @@ 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/.
+for 2.6.23 this is /sys/bus/platform/drivers/thinkpad_acpi/ and
+/sys/bus/platform/drivers/thinkpad_hwmon/
-Sysfs device attributes are on the driver's sysfs attribute space,
-for 2.6.20 this is /sys/devices/platform/thinkpad_acpi/.
+Sysfs device attributes are on the thinkpad_acpi device sysfs attribute
+space, for 2.6.23 this is /sys/devices/platform/thinkpad_acpi/.
+
+Sysfs device attributes for the sensors and fan are on the
+thinkpad_hwmon device's sysfs attribute space, but you should locate it
+looking for a hwmon device with the name attribute of "thinkpad".
Driver version
--------------
@@ -766,7 +771,7 @@ Temperature sensors
-------------------
procfs: /proc/acpi/ibm/thermal
-sysfs device attributes: (hwmon) temp*_input
+sysfs device attributes: (hwmon "thinkpad") temp*_input
Most ThinkPads include six or more separate temperature sensors but only
expose the CPU temperature through the standard ACPI methods. This
@@ -989,7 +994,9 @@ Fan control and monitoring: fan speed, fan enable/disable
---------------------------------------------------------
procfs: /proc/acpi/ibm/fan
-sysfs device attributes: (hwmon) fan_input, pwm1, pwm1_enable
+sysfs device attributes: (hwmon "thinkpad") fan1_input, pwm1,
+ pwm1_enable
+sysfs hwmon driver attributes: fan_watchdog
NOTE NOTE NOTE: fan control operations are disabled by default for
safety reasons. To enable them, the module parameter "fan_control=1"
@@ -1131,7 +1138,7 @@ hwmon device attribute fan1_input:
which can take up to two minutes. May return rubbish on older
ThinkPads.
-driver attribute fan_watchdog:
+hwmon driver attribute fan_watchdog:
Fan safety watchdog timer interval, in seconds. Minimum is
1 second, maximum is 120 seconds. 0 disables the watchdog.
@@ -1233,3 +1240,9 @@ Sysfs interface changelog:
layer, the radio switch generates input event EV_RADIO,
and the driver enables hot key handling by default in
the firmware.
+
+0x020000: ABI fix: added a separate hwmon platform device and
+ driver, which must be located by name (thinkpad)
+ and the hwmon class for libsensors4 (lm-sensors 3)
+ compatibility. Moved all hwmon attributes to this
+ new platform device.
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
index 0a33c6e..d5fb93e 100644
--- a/drivers/misc/thinkpad_acpi.c
+++ b/drivers/misc/thinkpad_acpi.c
@@ -22,7 +22,7 @@
*/
#define IBM_VERSION "0.16"
-#define TPACPI_SYSFS_VERSION 0x010000
+#define TPACPI_SYSFS_VERSION 0x020000
/*
* Changelog:
@@ -526,6 +526,7 @@ static char *next_cmd(char **cmds)
****************************************************************************/
static struct platform_device *tpacpi_pdev;
+static struct platform_device *tpacpi_sensors_pdev;
static struct class_device *tpacpi_hwmon;
static struct input_dev *tpacpi_inputdev;
static struct mutex tpacpi_inputdev_send_mutex;
@@ -553,6 +554,12 @@ static struct platform_driver tpacpi_pdriver = {
.resume = tpacpi_resume_handler,
};
+static struct platform_driver tpacpi_hwmon_pdriver = {
+ .driver = {
+ .name = IBM_HWMON_DRVR_NAME,
+ .owner = THIS_MODULE,
+ },
+};
/*************************************************************************
* thinkpad-acpi driver attributes
@@ -2872,7 +2879,7 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
switch(thermal_read_mode) {
case TPACPI_THERMAL_TPEC_16:
- res = sysfs_create_group(&tpacpi_pdev->dev.kobj,
+ res = sysfs_create_group(&tpacpi_sensors_pdev->dev.kobj,
&thermal_temp_input16_group);
if (res)
return res;
@@ -2880,7 +2887,7 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
case TPACPI_THERMAL_TPEC_8:
case TPACPI_THERMAL_ACPI_TMP07:
case TPACPI_THERMAL_ACPI_UPDT:
- res = sysfs_create_group(&tpacpi_pdev->dev.kobj,
+ res = sysfs_create_group(&tpacpi_sensors_pdev->dev.kobj,
&thermal_temp_input8_group);
if (res)
return res;
@@ -2897,13 +2904,13 @@ static void thermal_exit(void)
{
switch(thermal_read_mode) {
case TPACPI_THERMAL_TPEC_16:
- sysfs_remove_group(&tpacpi_pdev->dev.kobj,
+ sysfs_remove_group(&tpacpi_sensors_pdev->dev.kobj,
&thermal_temp_input16_group);
break;
case TPACPI_THERMAL_TPEC_8:
case TPACPI_THERMAL_ACPI_TMP07:
case TPACPI_THERMAL_ACPI_UPDT:
- sysfs_remove_group(&tpacpi_pdev->dev.kobj,
+ sysfs_remove_group(&tpacpi_sensors_pdev->dev.kobj,
&thermal_temp_input16_group);
break;
case TPACPI_THERMAL_NONE:
@@ -3686,7 +3693,7 @@ static struct device_attribute dev_attr_fan_fan1_input =
__ATTR(fan1_input, S_IRUGO,
fan_fan1_input_show, NULL);
-/* sysfs fan fan_watchdog (driver) ------------------------------------- */
+/* sysfs fan fan_watchdog (hwmon driver) ------------------------------- */
static ssize_t fan_fan_watchdog_show(struct device_driver *drv,
char *buf)
{
@@ -3828,10 +3835,10 @@ static int __init fan_init(struct ibm_init_struct *iibm)
if (fan_status_access_mode != TPACPI_FAN_NONE ||
fan_control_access_mode != TPACPI_FAN_WR_NONE) {
- rc = sysfs_create_group(&tpacpi_pdev->dev.kobj,
+ rc = sysfs_create_group(&tpacpi_sensors_pdev->dev.kobj,
&fan_attr_group);
if (!(rc < 0))
- rc = driver_create_file(&tpacpi_pdriver.driver,
+ rc = driver_create_file(&tpacpi_hwmon_pdriver.driver,
&driver_attr_fan_watchdog);
if (rc < 0)
return rc;
@@ -3914,8 +3921,8 @@ static void fan_exit(void)
vdbg_printk(TPACPI_DBG_EXIT, "cancelling any pending fan watchdog tasks\n");
/* FIXME: can we really do this unconditionally? */
- sysfs_remove_group(&tpacpi_pdev->dev.kobj, &fan_attr_group);
- driver_remove_file(&tpacpi_pdriver.driver, &driver_attr_fan_watchdog);
+ sysfs_remove_group(&tpacpi_sensors_pdev->dev.kobj, &fan_attr_group);
+ driver_remove_file(&tpacpi_hwmon_pdriver.driver, &driver_attr_fan_watchdog);
cancel_delayed_work(&fan_watchdog_task);
flush_scheduled_work();
@@ -4366,6 +4373,19 @@ static struct ibm_struct fan_driver_data = {
****************************************************************************
****************************************************************************/
+/* sysfs name ---------------------------------------------------------- */
+static ssize_t thinkpad_acpi_pdev_name_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%s\n", IBM_NAME);
+}
+
+static struct device_attribute dev_attr_thinkpad_acpi_pdev_name =
+ __ATTR(name, S_IRUGO, thinkpad_acpi_pdev_name_show, NULL);
+
+/* --------------------------------------------------------------------- */
+
/* /proc support */
static struct proc_dir_entry *proc_dir;
@@ -4768,12 +4788,20 @@ static int __init thinkpad_acpi_module_init(void)
ret = platform_driver_register(&tpacpi_pdriver);
if (ret) {
- printk(IBM_ERR "unable to register platform driver\n");
+ printk(IBM_ERR "unable to register main platform driver\n");
thinkpad_acpi_module_exit();
return ret;
}
tp_features.platform_drv_registered = 1;
+ ret = platform_driver_register(&tpacpi_hwmon_pdriver);
+ if (ret) {
+ printk(IBM_ERR "unable to register hwmon platform driver\n");
+ thinkpad_acpi_module_exit();
+ return ret;
+ }
+ tp_features.sensors_pdrv_registered = 1;
+
ret = tpacpi_create_driver_attributes(&tpacpi_pdriver.driver);
if (ret) {
printk(IBM_ERR "unable to create sysfs driver attributes\n");
@@ -4793,7 +4821,26 @@ static int __init thinkpad_acpi_module_init(void)
thinkpad_acpi_module_exit();
return ret;
}
- tpacpi_hwmon = hwmon_device_register(&tpacpi_pdev->dev);
+ tpacpi_sensors_pdev = platform_device_register_simple(
+ IBM_HWMON_DRVR_NAME,
+ -1, NULL, 0);
+ if (IS_ERR(tpacpi_sensors_pdev)) {
+ ret = PTR_ERR(tpacpi_sensors_pdev);
+ tpacpi_sensors_pdev = NULL;
+ printk(IBM_ERR "unable to register hwmon platform device\n");
+ thinkpad_acpi_module_exit();
+ return ret;
+ }
+ ret = device_create_file(&tpacpi_sensors_pdev->dev,
+ &dev_attr_thinkpad_acpi_pdev_name);
+ if (ret) {
+ printk(IBM_ERR
+ "unable to create sysfs hwmon device attributes\n");
+ thinkpad_acpi_module_exit();
+ return ret;
+ }
+ tp_features.sensors_pdev_attrs_registered = 1;
+ tpacpi_hwmon = hwmon_device_register(&tpacpi_sensors_pdev->dev);
if (IS_ERR(tpacpi_hwmon)) {
ret = PTR_ERR(tpacpi_hwmon);
tpacpi_hwmon = NULL;
@@ -4864,12 +4911,20 @@ static void thinkpad_acpi_module_exit(void)
if (tpacpi_hwmon)
hwmon_device_unregister(tpacpi_hwmon);
+ if (tp_features.sensors_pdev_attrs_registered)
+ device_remove_file(&tpacpi_sensors_pdev->dev,
+ &dev_attr_thinkpad_acpi_pdev_name);
+ if (tpacpi_sensors_pdev)
+ platform_device_unregister(tpacpi_sensors_pdev);
if (tpacpi_pdev)
platform_device_unregister(tpacpi_pdev);
if (tp_features.platform_drv_attrs_registered)
tpacpi_remove_driver_attributes(&tpacpi_pdriver.driver);
+ if (tp_features.sensors_pdrv_registered)
+ platform_driver_unregister(&tpacpi_hwmon_pdriver);
+
if (tp_features.platform_drv_registered)
platform_driver_unregister(&tpacpi_pdriver);
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h
index fa64ded..791b8ca 100644
--- a/drivers/misc/thinkpad_acpi.h
+++ b/drivers/misc/thinkpad_acpi.h
@@ -58,13 +58,14 @@
#define IBM_NAME "thinkpad"
#define IBM_DESC "ThinkPad ACPI Extras"
-#define IBM_FILE "thinkpad_acpi"
+#define IBM_FILE IBM_NAME "_acpi"
#define IBM_URL "http://ibm-acpi.sf.net/"
#define IBM_MAIL "ibm-acpi-devel@lists.sourceforge.net"
#define IBM_PROC_DIR "ibm"
#define IBM_ACPI_EVENT_PREFIX "ibm"
#define IBM_DRVR_NAME IBM_FILE
+#define IBM_HWMON_DRVR_NAME IBM_NAME "_hwmon"
#define IBM_LOG IBM_FILE ": "
#define IBM_ERR KERN_ERR IBM_LOG
@@ -171,6 +172,7 @@ static int parse_strtoul(const char *buf, unsigned long max,
/* Device model */
static struct platform_device *tpacpi_pdev;
+static struct platform_device *tpacpi_sensors_pdev;
static struct class_device *tpacpi_hwmon;
static struct platform_driver tpacpi_pdriver;
static struct input_dev *tpacpi_inputdev;
@@ -249,6 +251,8 @@ static struct {
u32 input_device_registered:1;
u32 platform_drv_registered:1;
u32 platform_drv_attrs_registered:1;
+ u32 sensors_pdrv_registered:1;
+ u32 sensors_pdev_attrs_registered:1;
} tp_features;
struct thinkpad_id_data {
--
1.5.3.4.206.g58ba4
next prev parent reply other threads:[~2007-10-10 5:06 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-10 5:06 ACPI patch candidates for 2.6.24 merge window Len Brown
2007-10-10 5:06 ` [PATCH 01/37] sony-laptop: old Vaio models contain 2 IO port entries Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 02/37] fujitsu-laptop: create Fujitsu laptop platform specific driver Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 03/37] ACPI: thermal: use round_jiffies when thermal zone polling is enabled Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 04/37] ACPI: Thermal: Drop concurrent thermal checks Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 05/37] ACPI: video: Don't call absent methods Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 06/37] ACPI: VIDEO: Adjust current level to closest available one Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 07/37] ACPI: EC: Drop ECDT-based boot_ec as soon as we find DSDT-based one Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 08/37] sony-laptop/thinkpad-acpi: fix INPUT=n build Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 09/37] acpi_video: kernel build error if !INPUT Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 10/37] ACPI: thinkpad-acpi: make room for more features in tp_features bitfield Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 11/37] ACPI: thinkpad-acpi: issue EV_SYNC after EV_SWITCH Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 12/37] ACPI: thinkpad-acpi: add mutex-based locking to input device event send path Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 13/37] ACPI: thinkpad-acpi: keep track of module state Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 14/37] ACPI: thinkpad-acpi: check version of hot key firmware Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 15/37] ACPI: thinkpad-acpi: dequeue all pending hot key events at once (v2.2) Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 16/37] ACPI: thinkpad-acpi: fix regression on HKEY LID event handling Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` Len Brown [this message]
2007-10-10 5:06 ` [PATCH 17/37] ACPI: thinkpad-acpi: use a separate platform device for hwmon and name it (v2) Len Brown
2007-10-10 5:06 ` [PATCH 18/37] ACPI: thinkpad-acpi: duplicate driver attributes to new hwmon pdrv Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 19/37] ACPI: Hibernate erroneously disabled Suspend wakeup devices Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-11 10:12 ` Rafael J. Wysocki
2007-10-10 5:06 ` [PATCH 20/37] ACPI: Battery: don't use acpi_extract_package() Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 21/37] ACPI: Battery: simplify update scheme Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 22/37] ACPI: Battery: Misc clean-ups, no functional changes Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 23/37] ACPI: Battery: Add sysfs support Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 24/37] ACPI: Battery: add sysfs alarm Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 25/37] ACPI: Add acpi_bus_generate_event4() function Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 26/37] ACPI: EC: Add new query handler to list head Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 27/37] ACPI: SBS: Split host controller (ACPI0001) from SBS driver (ACPI0002) Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 28/37] ACPI: SBS: Simplify data structures in SBS Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 29/37] ACPI: SBS: Make SBS reads table-driven Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 30/37] ACPI: SBS: Add support for power_supply class (and sysfs) Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 31/37] ACPI: SBS: Add ACPI_PROCFS around procfs handling code Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 32/37] ACPI: SBS: Add sysfs alarm Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 33/37] ACPI: AC: Add sysfs interface Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 34/37] ACPI: thinkpad-acpi: skip blanks before the data when parsing sysfs Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 35/37] ACPI: suppress uninitialized var warning Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 36/37] Hibernation: Make sure that ACPI is enabled in acpi_hibernation_finish Len Brown
2007-10-10 5:06 ` Len Brown
2007-10-10 5:06 ` [PATCH 37/37] ACPI: clean up acpi_enter_sleep_state_prep Len Brown
2007-10-10 5:06 ` Len Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1191992804-14965-18-git-send-email-lenb@kernel.org \
--to=lenb@kernel.org \
--cc=hmh@hmh.eng.br \
--cc=khali@linux-fr.org \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.