Ticket #2349: hwmon-it87-prevent-poweroff-on-Shuttle-SN68PT.patch

File hwmon-it87-prevent-poweroff-on-Shuttle-SN68PT.patch, 4.2 KB (added by khali, 3 years ago)

Proposed workaround

  • drivers/hwmon/it87.c

    From: Jean Delvare <khali@linux-fr.org>
    Subject: hwmon: (it87) Prevent power-off on Shuttle SN68PT
    
    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.
    
    Signed-off-by: Jean Delvare <khali@linux-fr.org>
    ---
     drivers/hwmon/it87.c |   70 ++++++++++++++++++++++++++++++++++++--------------
     1 file changed, 51 insertions(+), 19 deletions(-)
    
    old new  
    4646#include <linux/err.h> 
    4747#include <linux/mutex.h> 
    4848#include <linux/sysfs.h> 
     49#include <linux/string.h> 
     50#include <linux/dmi.h> 
    4951#include <asm/io.h> 
    5052 
    5153#define DRVNAME "it87" 
     
    236238        /* Values read from Super-I/O config space */ 
    237239        u8 revision; 
    238240        u8 vid_value; 
     241        /* Values set based on DMI strings */ 
     242        u8 skip_pwm; 
    239243}; 
    240244 
    241245/* For each registered chip, we need to keep some data in memory. 
     
    964968{ 
    965969        int err = -ENODEV; 
    966970        u16 chip_type; 
     971        const char *board_vendor, *board_name; 
    967972 
    968973        superio_enter(); 
    969974        chip_type = force_id ? force_id : superio_inw(DEVID); 
     
    10221027                        pr_info("it87: in7 is VCCH (+5V Stand-By)\n"); 
    10231028        } 
    10241029 
     1030        /* Disable specific features based on DMI strings */ 
     1031        board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); 
     1032        board_name = dmi_get_system_info(DMI_BOARD_NAME); 
     1033        if (board_vendor && board_name) { 
     1034                if (strcmp(board_vendor, "nVIDIA") == 0 
     1035                 && strcmp(board_name, "FN68PT") == 0) { 
     1036                        /* On the Shuttle SN68PT, FAN_CTL2 is apparently not 
     1037                           connected to a fan, but to something else. One user 
     1038                           has reported instant system power-off when changing 
     1039                           the PWM2 duty cycle, so we disable it. 
     1040                           I use the board name string as the trigger in case 
     1041                           the same board is ever used in other systems. */ 
     1042                        pr_info("it87: Disabling pwm2 due to " 
     1043                                "hardware constraints\n"); 
     1044                        sio_data->skip_pwm = (1 << 1); 
     1045                } 
     1046        } 
     1047 
    10251048exit: 
    10261049        superio_exit(); 
    10271050        return err; 
     
    11681191        } 
    11691192 
    11701193        if (enable_pwm_interface) { 
    1171                 if ((err = device_create_file(dev, 
    1172                      &sensor_dev_attr_pwm1_enable.dev_attr)) 
    1173                  || (err = device_create_file(dev, 
    1174                      &sensor_dev_attr_pwm2_enable.dev_attr)) 
    1175                  || (err = device_create_file(dev, 
    1176                      &sensor_dev_attr_pwm3_enable.dev_attr)) 
    1177                  || (err = device_create_file(dev, 
    1178                      &sensor_dev_attr_pwm1.dev_attr)) 
    1179                  || (err = device_create_file(dev, 
    1180                      &sensor_dev_attr_pwm2.dev_attr)) 
    1181                  || (err = device_create_file(dev, 
    1182                      &sensor_dev_attr_pwm3.dev_attr)) 
    1183                  || (err = device_create_file(dev, 
    1184                      &dev_attr_pwm1_freq)) 
    1185                  || (err = device_create_file(dev, 
    1186                      &dev_attr_pwm2_freq)) 
    1187                  || (err = device_create_file(dev, 
    1188                      &dev_attr_pwm3_freq))) 
    1189                         goto ERROR4; 
     1194                if (!(sio_data->skip_pwm & (1 << 0))) { 
     1195                        if ((err = device_create_file(dev, 
     1196                             &sensor_dev_attr_pwm1_enable.dev_attr)) 
     1197                         || (err = device_create_file(dev, 
     1198                             &sensor_dev_attr_pwm1.dev_attr)) 
     1199                         || (err = device_create_file(dev, 
     1200                             &dev_attr_pwm1_freq))) 
     1201                                goto ERROR4; 
     1202                } 
     1203                if (!(sio_data->skip_pwm & (1 << 1))) { 
     1204                        if ((err = device_create_file(dev, 
     1205                             &sensor_dev_attr_pwm2_enable.dev_attr)) 
     1206                         || (err = device_create_file(dev, 
     1207                             &sensor_dev_attr_pwm2.dev_attr)) 
     1208                         || (err = device_create_file(dev, 
     1209                             &dev_attr_pwm2_freq))) 
     1210                                goto ERROR4; 
     1211                } 
     1212                if (!(sio_data->skip_pwm & (1 << 2))) { 
     1213                        if ((err = device_create_file(dev, 
     1214                             &sensor_dev_attr_pwm3_enable.dev_attr)) 
     1215                         || (err = device_create_file(dev, 
     1216                             &sensor_dev_attr_pwm3.dev_attr)) 
     1217                         || (err = device_create_file(dev, 
     1218                             &dev_attr_pwm3_freq))) 
     1219                                goto ERROR4; 
     1220                } 
    11901221        } 
    11911222 
    11921223        if (data->type == it8712 || data->type == it8716 
     
    15461577        unsigned short isa_address=0; 
    15471578        struct it87_sio_data sio_data; 
    15481579 
     1580        memset(&sio_data, 0, sizeof(struct it87_sio_data)); 
    15491581        err = it87_find(&isa_address, &sio_data); 
    15501582        if (err) 
    15511583                return err;