aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/thinkpad_acpi.c30
-rw-r--r--drivers/misc/thinkpad_acpi.h2
2 files changed, 31 insertions, 1 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
index c0a023c..7dc3a22 100644
--- a/drivers/misc/thinkpad_acpi.c
+++ b/drivers/misc/thinkpad_acpi.c
@@ -2935,6 +2935,9 @@ static ssize_t fan_fan_watchdog_store(struct device_driver *drv,
if (parse_strtoul(buf, 120, &t))
return -EINVAL;
+ if (!fan_control_allowed)
+ return -EPERM;
+
fan_watchdog_maxinterval = t;
fan_watchdog_reset();
@@ -3046,6 +3049,14 @@ static int __init fan_init(struct ibm_init_struct *iibm)
fan_control_access_mode != TPACPI_FAN_WR_NONE),
fan_status_access_mode, fan_control_access_mode);
+ /* fan control master switch */
+ if (!fan_control_allowed) {
+ fan_control_access_mode = TPACPI_FAN_WR_NONE;
+ fan_control_commands = 0;
+ dbg_printk(TPACPI_DBG_INIT,
+ "fan control features disabled by parameter\n");
+ }
+
/* update fan_control_desired_level */
if (fan_status_access_mode != TPACPI_FAN_NONE)
fan_get_status_safe(NULL);
@@ -3203,6 +3214,9 @@ static void fan_watchdog_reset(void)
static int fan_set_level(int level)
{
+ if (!fan_control_allowed)
+ return -EPERM;
+
switch (fan_control_access_mode) {
case TPACPI_FAN_WR_ACPI_SFAN:
if (level >= 0 && level <= 7) {
@@ -3242,6 +3256,9 @@ static int fan_set_level_safe(int level)
{
int rc;
+ if (!fan_control_allowed)
+ return -EPERM;
+
rc = mutex_lock_interruptible(&fan_mutex);
if (rc < 0)
return rc;
@@ -3262,6 +3279,9 @@ static int fan_set_enable(void)
u8 s;
int rc;
+ if (!fan_control_allowed)
+ return -EPERM;
+
rc = mutex_lock_interruptible(&fan_mutex);
if (rc < 0)
return rc;
@@ -3315,6 +3335,9 @@ static int fan_set_disable(void)
{
int rc;
+ if (!fan_control_allowed)
+ return -EPERM;
+
rc = mutex_lock_interruptible(&fan_mutex);
if (rc < 0)
return rc;
@@ -3351,6 +3374,9 @@ static int fan_set_speed(int speed)
{
int rc;
+ if (!fan_control_allowed)
+ return -EPERM;
+
rc = mutex_lock_interruptible(&fan_mutex);
if (rc < 0)
return rc;
@@ -3558,7 +3584,6 @@ static struct ibm_struct fan_driver_data = {
.read = fan_read,
.write = fan_write,
.exit = fan_exit,
- .flags.experimental = 1,
};
/****************************************************************************
@@ -3879,6 +3904,9 @@ module_param_named(debug, dbg_level, uint, 0);
static int force_load;
module_param(force_load, int, 0);
+static int fan_control_allowed;
+module_param_named(fan_control, fan_control_allowed, int, 0);
+
#define IBM_PARAM(feature) \
module_param_call(feature, set_ibm_param, NULL, NULL, 0)
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h
index 8348fc6..a9e7093 100644
--- a/drivers/misc/thinkpad_acpi.h
+++ b/drivers/misc/thinkpad_acpi.h
@@ -375,6 +375,8 @@ enum fan_control_commands {
* and also watchdog cmd */
};
+static int fan_control_allowed;
+
static enum fan_status_access_mode fan_status_access_mode;
static enum fan_control_access_mode fan_control_access_mode;
static enum fan_control_commands fan_control_commands;