Show
Ignore:
Timestamp:
12/12/01 17:56:37 (12 years ago)
Author:
knobi
Message:

(MKN) Implement min/max for voltages and fan-speeds.
(MKN) Some minor cleanups.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/kernel/chips/fscscy.c

    r1227 r1264  
    22    fscscy.c - Part of lm_sensors, Linux kernel modules for hardware 
    33             monitoring 
    4     Copyright (c) 2001 Hermann Jung <hej@odn.de> 
     4    Copyright (c) 2001 Martin Knoblauch <mkn@teraport.de, knobi@knobisoft.de> 
    55 
    66    This program is free software; you can redistribute it and/or modify 
     
    8585#define FSCSCY_REG_WDOG_CONTROL     0x21 
    8686 
     87/* 
     88** Fan definitions 
     89** 
     90** _RPMMIN: Minimum speed. Can be set via interface, but only for three of the fans 
     91**          FAN1_RPMMIN is wired to Fan 0 (CPU Fans) 
     92**          FAN4_RPMMIN is wired to Fan 2 (PS Fans ??) 
     93**          FAN5_RPMMIN is wired to Fan 3 (AUX Fans ??) 
     94** _ACT:    Actual Fan Speed 
     95** _STATE:  Fan status register 
     96** _RIPPLE: Fan speed multiplier 
     97*/ 
     98 
    8799/* fan 0  */ 
    88 #define FSCSCY_REG_FAN0_MIN     0x65 
     100#define FSCSCY_REG_FAN0_RPMMIN  0x65 
    89101#define FSCSCY_REG_FAN0_ACT     0x6b 
    90102#define FSCSCY_REG_FAN0_STATE   0x62 
     
    92104 
    93105/* fan 1  */ 
    94 #define FSCSCY_REG_FAN1_MIN     FSCSCY_REG_FAN0_MIN 
     106#define FSCSCY_REG_FAN1_RPMMIN     FSCSCY_REG_FAN0_RPMMIN 
    95107#define FSCSCY_REG_FAN1_ACT     0x6c 
    96108#define FSCSCY_REG_FAN1_STATE   0x61 
     
    98110 
    99111/* fan 2  */ 
    100 #define FSCSCY_REG_FAN2_MIN     0x55 
     112#define FSCSCY_REG_FAN2_RPMMIN     0x55 
    101113#define FSCSCY_REG_FAN2_ACT     0x0e 
    102114#define FSCSCY_REG_FAN2_STATE   0x0d 
     
    104116 
    105117/* fan 3  */ 
    106 #define FSCSCY_REG_FAN3_MIN     0xa5 
     118#define FSCSCY_REG_FAN3_RPMMIN     0xa5 
    107119#define FSCSCY_REG_FAN3_ACT     0xab 
    108120#define FSCSCY_REG_FAN3_STATE   0xa2 
     
    110122 
    111123/* fan 4  */ 
    112 #define FSCSCY_REG_FAN4_MIN     FSCSCY_REG_FAN2_MIN 
     124#define FSCSCY_REG_FAN4_RPMMIN     FSCSCY_REG_FAN2_RPMMIN 
    113125#define FSCSCY_REG_FAN4_ACT     0x5c 
    114126#define FSCSCY_REG_FAN4_STATE   0x52 
     
    116128 
    117129/* fan 5  */ 
    118 #define FSCSCY_REG_FAN5_MIN     FSCSCY_REG_FAN3_MIN 
     130#define FSCSCY_REG_FAN5_RPMMIN     FSCSCY_REG_FAN3_RPMMIN 
    119131#define FSCSCY_REG_FAN5_ACT     0xbb 
    120132#define FSCSCY_REG_FAN5_STATE   0xb2 
     
    185197        u8  watchdog[3];     /* watchdog */ 
    186198        u8  volt[3];         /* 12, 5, battery current */  
     199        u8  volt_min[3];     /* minimum voltages over module "lifetime" */ 
     200        u8  volt_max[3];     /* maximum voltages over module "lifetime" */ 
    187201        u8  temp_act[4];     /* temperature */ 
    188202        u8  temp_status[4];  /* status of temp. sensor */ 
     
    192206        u8  fan_act[6];      /* fans revolutions per second */ 
    193207        u8  fan_status[6];   /* fan status */ 
    194         u8  fan_min[6];      /* fan min value for rps */ 
     208        u8  fan_rpmmin[6];   /* fan min value for rps */ 
    195209        u8  fan_ripple[6];   /* divider for rps */ 
     210        u8  fan_min[6];      /* minimum RPM over module "lifetime" */ 
     211        u8  fan_max[6];      /* maximum RPM over module "lifetime" */ 
    196212        u8  pciload;         /* PCILoad value */ 
    197213        u8  intr_status;     /* Intrusion Status */ 
     
    461477        /* read revision from chip */ 
    462478        data->revision =  fscscy_read_value(client,FSCSCY_REG_REVISION); 
    463         /* setup missing fan2_min value */ 
    464         /* data->fan_min[2] = 0xff; */ 
    465479 
    466480        /* Initialize min/max values from chip */ 
     481        data->fan_min[0]  = data->fan_max[0]  = fscscy_read_value(client, FSCSCY_REG_FAN0_ACT); 
     482        data->fan_min[1]  = data->fan_max[1]  = fscscy_read_value(client, FSCSCY_REG_FAN1_ACT); 
     483        data->fan_min[2]  = data->fan_max[2]  = fscscy_read_value(client, FSCSCY_REG_FAN2_ACT); 
     484        data->fan_min[3]  = data->fan_max[3]  = fscscy_read_value(client, FSCSCY_REG_FAN3_ACT); 
     485        data->fan_min[4]  = data->fan_max[4]  = fscscy_read_value(client, FSCSCY_REG_FAN4_ACT); 
     486        data->fan_min[4]  = data->fan_max[5]  = fscscy_read_value(client, FSCSCY_REG_FAN5_ACT); 
    467487        data->temp_min[0] = data->temp_max[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_ACT); 
    468488        data->temp_min[1] = data->temp_max[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_ACT); 
    469489        data->temp_min[2] = data->temp_max[2] = fscscy_read_value(client, FSCSCY_REG_TEMP2_ACT); 
    470490        data->temp_min[3] = data->temp_max[3] = fscscy_read_value(client, FSCSCY_REG_TEMP3_ACT); 
     491        data->volt_min[0] = data->volt_max[0] = fscscy_read_value(client, FSCSCY_REG_VOLT_12); 
     492        data->volt_min[1] = data->volt_max[1] = fscscy_read_value(client, FSCSCY_REG_VOLT_5); 
     493        data->volt_min[2] = data->volt_max[2] = fscscy_read_value(client, FSCSCY_REG_VOLT_BATT); 
    471494} 
    472495 
     
    495518                  if (data->temp_min[3] > data->temp_act[3]) data->temp_min[3] = data->temp_act[3]; 
    496519                  if (data->temp_max[3] < data->temp_act[3]) data->temp_max[3] = data->temp_act[3]; 
    497  
    498520                data->temp_status[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_STATE); 
    499521                data->temp_status[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_STATE); 
     
    506528 
    507529                data->volt[0] = fscscy_read_value(client, FSCSCY_REG_VOLT_12); 
     530                  if (data->volt_min[0] > data->volt[0]) data->volt_min[0] = data->volt[0]; 
     531                  if (data->volt_max[0] < data->volt[0]) data->volt_max[0] = data->volt[0]; 
    508532                data->volt[1] = fscscy_read_value(client, FSCSCY_REG_VOLT_5); 
     533                  if (data->volt_min[1] > data->volt[1]) data->volt_min[1] = data->volt[1]; 
     534                  if (data->volt_max[1] < data->volt[1]) data->volt_max[1] = data->volt[1]; 
    509535                data->volt[2] = fscscy_read_value(client, FSCSCY_REG_VOLT_BATT); 
     536                  if (data->volt_min[2] > data->volt[2]) data->volt_min[2] = data->volt[2]; 
     537                  if (data->volt_max[2] < data->volt[2]) data->volt_max[2] = data->volt[2]; 
    510538 
    511539                data->fan_act[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_ACT); 
     540                  if (data->fan_min[0] > data->fan_act[0]) data->fan_min[0] = data->fan_act[0]; 
     541                  if (data->fan_max[0] < data->fan_act[0]) data->fan_max[0] = data->fan_act[0]; 
    512542                data->fan_act[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_ACT); 
     543                  if (data->fan_min[1] > data->fan_act[1]) data->fan_min[1] = data->fan_act[1]; 
     544                  if (data->fan_max[1] < data->fan_act[1]) data->fan_max[1] = data->fan_act[1]; 
    513545                data->fan_act[2] = fscscy_read_value(client, FSCSCY_REG_FAN2_ACT); 
     546                  if (data->fan_min[2] > data->fan_act[2]) data->fan_min[2] = data->fan_act[2]; 
     547                  if (data->fan_max[2] < data->fan_act[2]) data->fan_max[2] = data->fan_act[2]; 
    514548                data->fan_act[3] = fscscy_read_value(client, FSCSCY_REG_FAN3_ACT); 
     549                  if (data->fan_min[3] > data->fan_act[3]) data->fan_min[3] = data->fan_act[3]; 
     550                  if (data->fan_max[3] < data->fan_act[3]) data->fan_max[3] = data->fan_act[3]; 
    515551                data->fan_act[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_ACT); 
     552                  if (data->fan_min[4] > data->fan_act[4]) data->fan_min[4] = data->fan_act[4]; 
     553                  if (data->fan_max[4] < data->fan_act[4]) data->fan_max[4] = data->fan_act[4]; 
    516554                data->fan_act[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_ACT); 
     555                  if (data->fan_min[5] > data->fan_act[5]) data->fan_min[5] = data->fan_act[5]; 
     556                  if (data->fan_max[5] < data->fan_act[5]) data->fan_max[5] = data->fan_act[5]; 
    517557                data->fan_status[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_STATE); 
    518558                data->fan_status[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_STATE); 
     
    521561                data->fan_status[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_STATE); 
    522562                data->fan_status[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_STATE); 
    523                 data->fan_min[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_MIN); 
    524                 data->fan_min[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_MIN); 
    525                 data->fan_min[2] = fscscy_read_value(client, FSCSCY_REG_FAN2_MIN); 
    526                 data->fan_min[3] = fscscy_read_value(client, FSCSCY_REG_FAN3_MIN); 
    527                 data->fan_min[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_MIN); 
    528                 data->fan_min[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_MIN); 
     563                data->fan_rpmmin[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_RPMMIN); 
     564                data->fan_rpmmin[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_RPMMIN); 
     565                data->fan_rpmmin[2] = fscscy_read_value(client, FSCSCY_REG_FAN2_RPMMIN); 
     566                data->fan_rpmmin[3] = fscscy_read_value(client, FSCSCY_REG_FAN3_RPMMIN); 
     567                data->fan_rpmmin[4] = fscscy_read_value(client, FSCSCY_REG_FAN4_RPMMIN); 
     568                data->fan_rpmmin[5] = fscscy_read_value(client, FSCSCY_REG_FAN5_RPMMIN); 
    529569                data->fan_ripple[0] = fscscy_read_value(client, FSCSCY_REG_FAN0_RIPPLE); 
    530570                data->fan_ripple[1] = fscscy_read_value(client, FSCSCY_REG_FAN1_RIPPLE); 
     
    706746                        case FSCSCY_SYSCTL_VOLT0: 
    707747                                results[0] = VOLT_FROM_REG(data->volt[0],1420); 
     748                                results[1] = VOLT_FROM_REG(data->volt_min[0],1420); 
     749                                results[2] = VOLT_FROM_REG(data->volt_max[0],1420); 
    708750                                break; 
    709751                        case FSCSCY_SYSCTL_VOLT1: 
    710752                                results[0] = VOLT_FROM_REG(data->volt[1],660); 
     753                                results[1] = VOLT_FROM_REG(data->volt_min[1],660); 
     754                                results[2] = VOLT_FROM_REG(data->volt_max[1],660); 
    711755                                break; 
    712756                        case FSCSCY_SYSCTL_VOLT2: 
    713757                                results[0] = VOLT_FROM_REG(data->volt[2],330); 
     758                                results[1] = VOLT_FROM_REG(data->volt_min[2],330); 
     759                                results[2] = VOLT_FROM_REG(data->volt_max[2],330); 
    714760                                break; 
    715761                        default: 
     
    719765                                return; 
    720766                } 
    721                 *nrels_mag = 1; 
     767                *nrels_mag = 3; 
    722768        } else if (operation == SENSORS_PROC_REAL_WRITE) { 
    723769                        printk("fscscy: writing to chip not supported\n"); 
     
    732778                case FSCSCY_SYSCTL_FAN0: 
    733779                        fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 
    734                                 0,FSCSCY_REG_FAN0_STATE,FSCSCY_REG_FAN0_MIN, 
     780                                0,FSCSCY_REG_FAN0_STATE,FSCSCY_REG_FAN0_RPMMIN, 
    735781                                FSCSCY_REG_FAN0_RIPPLE); 
    736782                        break; 
    737783                case FSCSCY_SYSCTL_FAN1: 
    738784                        fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 
    739                                 1,FSCSCY_REG_FAN1_STATE,FSCSCY_REG_FAN1_MIN, 
     785                                1,FSCSCY_REG_FAN1_STATE,FSCSCY_REG_FAN1_RPMMIN, 
    740786                                FSCSCY_REG_FAN1_RIPPLE); 
    741787                        break; 
    742788                case FSCSCY_SYSCTL_FAN2: 
    743789                        fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 
    744                                 2,FSCSCY_REG_FAN2_STATE,FSCSCY_REG_FAN2_MIN, 
     790                                2,FSCSCY_REG_FAN2_STATE,FSCSCY_REG_FAN2_RPMMIN, 
    745791                                FSCSCY_REG_FAN2_RIPPLE); 
    746792                        break; 
    747793                case FSCSCY_SYSCTL_FAN3: 
    748794                        fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 
    749                                 3,FSCSCY_REG_FAN3_STATE,FSCSCY_REG_FAN3_MIN, 
     795                                3,FSCSCY_REG_FAN3_STATE,FSCSCY_REG_FAN3_RPMMIN, 
    750796                                FSCSCY_REG_FAN3_RIPPLE); 
    751797                        break; 
    752798                case FSCSCY_SYSCTL_FAN4: 
    753799                        fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 
    754                                 4,FSCSCY_REG_FAN4_STATE,FSCSCY_REG_FAN4_MIN, 
     800                                4,FSCSCY_REG_FAN4_STATE,FSCSCY_REG_FAN4_RPMMIN, 
    755801                                FSCSCY_REG_FAN4_RIPPLE); 
    756802                        break; 
    757803                case FSCSCY_SYSCTL_FAN5: 
    758804                        fscscy_fan_internal(client,operation,ctl_name,nrels_mag,results, 
    759                                 5,FSCSCY_REG_FAN5_STATE,FSCSCY_REG_FAN5_MIN, 
     805                                5,FSCSCY_REG_FAN5_STATE,FSCSCY_REG_FAN5_RPMMIN, 
    760806                                FSCSCY_REG_FAN5_RIPPLE); 
    761807                        break; 
     
    778824                fscscy_update_client(client); 
    779825                results[0] = data->fan_status[nr] & 0x0f; /* MKN */ 
    780                 results[1] = data->fan_min[nr]; 
     826                results[1] = data->fan_rpmmin[nr]; 
    781827                results[2] = data->fan_ripple[nr] & 0x03; 
    782828                results[3] = RPM_FROM_REG(data->fan_act[nr]); 
    783                 *nrels_mag = 4; 
     829                results[4] = RPM_FROM_REG(data->fan_min[nr]); 
     830                results[5] = RPM_FROM_REG(data->fan_max[nr]); 
     831                *nrels_mag = 6; 
    784832        } else if (operation == SENSORS_PROC_REAL_WRITE) { 
    785833                if(*nrels_mag >= 1) { 
    786                         data->fan_status[nr] = (data->fan_status[nr] & 0x0b) | results[0] & 0x04; /* MKN */ 
     834                        data->fan_status[nr] = (data->fan_status[nr] & 0x0b) | (results[0] & 0x04); /* MKN */ 
    787835                        printk("fscscy: writing value 0x%02x to fan%d_status\n", 
    788836                                data->fan_status[nr],nr); 
     
    790838                                data->fan_status[nr]); 
    791839                } 
    792                 if((*nrels_mag >= 2) && (nr != 2) && (nr != 4)) { /* MIN Speed for Fan 2/4 is not supported */ 
    793                         data->fan_min[nr] = results[1]; 
     840                if(*nrels_mag >= 2)  { 
     841                        if((results[1] & 0xff) == 0) { 
     842                                 printk("fscscy: fan%d rpmmin 0 not allowed for safety reasons\n",nr); 
     843                                 return; 
     844                        } 
     845                        data->fan_rpmmin[nr] = results[1]; 
    794846                        printk("fscscy: writing value 0x%02x to fan%d_min\n", 
    795                                 data->fan_min[nr],nr); 
     847                                data->fan_rpmmin[nr],nr); 
    796848                        fscscy_write_value(client,reg_min, 
    797                                 data->fan_min[nr]); 
     849                                data->fan_rpmmin[nr]); 
    798850                } 
    799851                if(*nrels_mag >= 3) { 
    800852                        if((results[2] & 0x03) == 0) { 
    801                                 printk("fscscy: fan%d ripple 0 not allowed\n",nr); 
     853                                printk("fscscy: fan%d ripple 0 is nonsense/not allowed\n",nr); 
    802854                                return; 
    803855                        } 
     
    860912                *nrels_mag = 1; 
    861913        } else if (operation == SENSORS_PROC_REAL_WRITE) { 
    862                         printk("fscscy: writing to chip not supported\n"); 
     914                        printk("fscscy: writing PCILOAD to chip not supported\n"); 
    863915        } 
    864916} 
     
    924976 
    925977MODULE_AUTHOR 
    926     ("Hermann Jung <hej@odn.de> based on work from Frodo Looijaard <frodol@dds.nl> and Philip Edelbrock <phil@netroedge.com>"); 
     978    ("Martin Knoblauch <mkn@teraport.de> based on work (fscpos) from  Hermann Jung <hej@odn.de>"); 
    927979MODULE_DESCRIPTION("fujitsu siemens scylla chip driver"); 
    928980