| From khali@linux-fr.org Thu Oct 16 16:11:40 2008 |
| From: Jean Delvare <khali@linux-fr.org> |
| Date: Fri, 10 Oct 2008 11:04:39 +0200 |
| Subject: hwmon: (it87) Prevent power-off on Shuttle SN68PT |
| To: stable@kernel.org |
| Message-ID: <20081010110439.0c508954@hyperion.delvare> |
| |
| From: Jean Delvare <khali@linux-fr.org> |
| |
| based on commit 98dd22c3e086d76058083432d4d8fb85f04bab90 upstream |
| |
| On the Shuttle SN68PT, FAN_CTL2 is apparently not connected to a fan, |
| but to something else. One user has reported instant system power-off |
| when changing the PWM2 duty cycle, so we disable it. |
| |
| I use the board name string as the trigger in case the same board is |
| ever used in other systems. |
| |
| This closes lm-sensors ticket #2349: |
| pwmconfig causes a hard poweroff |
| http://www.lm-sensors.org/ticket/2349 |
| |
| Signed-off-by: Jean Delvare <khali@linux-fr.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/hwmon/it87.c | 39 +++++++++++++++++++++++++++++++++------ |
| 1 file changed, 33 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/hwmon/it87.c |
| +++ b/drivers/hwmon/it87.c |
| @@ -46,6 +46,8 @@ |
| #include <linux/err.h> |
| #include <linux/mutex.h> |
| #include <linux/sysfs.h> |
| +#include <linux/string.h> |
| +#include <linux/dmi.h> |
| #include <asm/io.h> |
| |
| #define DRVNAME "it87" |
| @@ -235,6 +237,8 @@ struct it87_sio_data { |
| enum chips type; |
| /* Values read from Super-I/O config space */ |
| u8 vid_value; |
| + /* Values set based on DMI strings */ |
| + u8 skip_pwm; |
| }; |
| |
| /* For each registered chip, we need to keep some data in memory. |
| @@ -952,6 +956,7 @@ static int __init it87_find(unsigned sho |
| { |
| int err = -ENODEV; |
| u16 chip_type; |
| + const char *board_vendor, *board_name; |
| |
| superio_enter(); |
| chip_type = force_id ? force_id : superio_inw(DEVID); |
| @@ -1009,6 +1014,25 @@ static int __init it87_find(unsigned sho |
| pr_info("it87: in7 is VCCH (+5V Stand-By)\n"); |
| } |
| |
| + sio_data->skip_pwm = 0; |
| + /* Disable specific features based on DMI strings */ |
| + board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); |
| + board_name = dmi_get_system_info(DMI_BOARD_NAME); |
| + if (board_vendor && board_name) { |
| + if (strcmp(board_vendor, "nVIDIA") == 0 |
| + && strcmp(board_name, "FN68PT") == 0) { |
| + /* On the Shuttle SN68PT, FAN_CTL2 is apparently not |
| + connected to a fan, but to something else. One user |
| + has reported instant system power-off when changing |
| + the PWM2 duty cycle, so we disable it. |
| + I use the board name string as the trigger in case |
| + the same board is ever used in other systems. */ |
| + pr_info("it87: Disabling pwm2 due to " |
| + "hardware constraints\n"); |
| + sio_data->skip_pwm = (1 << 1); |
| + } |
| + } |
| + |
| exit: |
| superio_exit(); |
| return err; |
| @@ -1157,22 +1181,25 @@ static int __devinit it87_probe(struct p |
| if ((err = device_create_file(dev, |
| &sensor_dev_attr_pwm1_enable.dev_attr)) |
| || (err = device_create_file(dev, |
| - &sensor_dev_attr_pwm2_enable.dev_attr)) |
| - || (err = device_create_file(dev, |
| &sensor_dev_attr_pwm3_enable.dev_attr)) |
| || (err = device_create_file(dev, |
| &sensor_dev_attr_pwm1.dev_attr)) |
| || (err = device_create_file(dev, |
| - &sensor_dev_attr_pwm2.dev_attr)) |
| - || (err = device_create_file(dev, |
| &sensor_dev_attr_pwm3.dev_attr)) |
| || (err = device_create_file(dev, |
| &dev_attr_pwm1_freq)) |
| || (err = device_create_file(dev, |
| - &dev_attr_pwm2_freq)) |
| - || (err = device_create_file(dev, |
| &dev_attr_pwm3_freq))) |
| goto ERROR4; |
| + if (!(sio_data->skip_pwm & (1 << 1))) { |
| + if ((err = device_create_file(dev, |
| + &sensor_dev_attr_pwm2_enable.dev_attr)) |
| + || (err = device_create_file(dev, |
| + &sensor_dev_attr_pwm2.dev_attr)) |
| + || (err = device_create_file(dev, |
| + &dev_attr_pwm2_freq))) |
| + goto ERROR4; |
| + } |
| } |
| |
| if (data->type == it8712 || data->type == it8716 |