Changeset 114

Show
Ignore:
Timestamp:
12/25/98 19:36:03 (14 years ago)
Author:
frodo
Message:

Two bug fixed in the LM78/79 driver

* fan_div should now be handled correctly (please, could anybody play with

this? My fan is on FAN3, the one whose fan_div can't be changed...)

* IN_{TO,FROM}_REG no longer needs the additional in parameter, since we

eliminated scaling in the module.

Location:
lm-sensors/trunk
Files:
2 modified

Legend:

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

    r113 r114  
    6666 
    6767/* Conversions. Rounding is only done on the TO_REG variants. */ 
    68 #define IN_TO_REG(val,nr)  (((val) * 10 + 8)/16) 
    69 #define IN_FROM_REG(val,nr) (((val) *  16) / 10) 
    70  
    71 #define FAN_TO_REG(val) ((val)==0?255:((1350000+(val))/((val)*2)) & 0xff) 
    72 #define FAN_FROM_REG(val) ((val)==0?-1:(val)==255?0:1350000/((val)*2)) 
     68#define IN_TO_REG(val)  (((val) * 10 + 8)/16) 
     69#define IN_FROM_REG(val) (((val) *  16) / 10) 
     70 
     71#define FAN_TO_REG(val,div) ((val)==0?255:((1350000+(val))/\ 
     72                            ((val)*2*(div))) & 0xff) 
     73#define FAN_FROM_REG(val,div) ((val)==0?-1:(val)==255?0:1350000/((val)*2*(div))) 
    7374 
    7475#define TEMP_TO_REG(val) (((val)<0?(((val)-5)/10)&0xff:((val)+5)/10) & 0xff) 
     
    661662  vid = VID_FROM_REG(vid); 
    662663 
    663   lm78_write_value(client,LM78_REG_IN_MIN(0),IN_TO_REG(LM78_INIT_IN_MIN_0,0)); 
    664   lm78_write_value(client,LM78_REG_IN_MAX(0),IN_TO_REG(LM78_INIT_IN_MAX_0,0)); 
    665   lm78_write_value(client,LM78_REG_IN_MIN(1),IN_TO_REG(LM78_INIT_IN_MIN_1,1)); 
    666   lm78_write_value(client,LM78_REG_IN_MAX(1),IN_TO_REG(LM78_INIT_IN_MAX_1,1)); 
    667   lm78_write_value(client,LM78_REG_IN_MIN(2),IN_TO_REG(LM78_INIT_IN_MIN_2,2)); 
    668   lm78_write_value(client,LM78_REG_IN_MAX(2),IN_TO_REG(LM78_INIT_IN_MAX_2,2)); 
    669   lm78_write_value(client,LM78_REG_IN_MIN(3),IN_TO_REG(LM78_INIT_IN_MIN_3,3)); 
    670   lm78_write_value(client,LM78_REG_IN_MAX(3),IN_TO_REG(LM78_INIT_IN_MAX_3,3)); 
    671   lm78_write_value(client,LM78_REG_IN_MIN(4),IN_TO_REG(LM78_INIT_IN_MIN_4,4)); 
    672   lm78_write_value(client,LM78_REG_IN_MAX(4),IN_TO_REG(LM78_INIT_IN_MAX_4,4)); 
    673   lm78_write_value(client,LM78_REG_IN_MIN(5),IN_TO_REG(LM78_INIT_IN_MIN_5,5)); 
    674   lm78_write_value(client,LM78_REG_IN_MAX(5),IN_TO_REG(LM78_INIT_IN_MAX_5,5)); 
    675   lm78_write_value(client,LM78_REG_IN_MIN(6),IN_TO_REG(LM78_INIT_IN_MIN_6,6)); 
    676   lm78_write_value(client,LM78_REG_IN_MAX(6),IN_TO_REG(LM78_INIT_IN_MAX_6,6)); 
    677   lm78_write_value(client,LM78_REG_FAN_MIN(1),FAN_TO_REG(LM78_INIT_FAN_MIN_1)); 
    678   lm78_write_value(client,LM78_REG_FAN_MIN(2),FAN_TO_REG(LM78_INIT_FAN_MIN_2)); 
    679   lm78_write_value(client,LM78_REG_FAN_MIN(3),FAN_TO_REG(LM78_INIT_FAN_MIN_3)); 
     664  lm78_write_value(client,LM78_REG_IN_MIN(0),IN_TO_REG(LM78_INIT_IN_MIN_0)); 
     665  lm78_write_value(client,LM78_REG_IN_MAX(0),IN_TO_REG(LM78_INIT_IN_MAX_0)); 
     666  lm78_write_value(client,LM78_REG_IN_MIN(1),IN_TO_REG(LM78_INIT_IN_MIN_1)); 
     667  lm78_write_value(client,LM78_REG_IN_MAX(1),IN_TO_REG(LM78_INIT_IN_MAX_1)); 
     668  lm78_write_value(client,LM78_REG_IN_MIN(2),IN_TO_REG(LM78_INIT_IN_MIN_2)); 
     669  lm78_write_value(client,LM78_REG_IN_MAX(2),IN_TO_REG(LM78_INIT_IN_MAX_2)); 
     670  lm78_write_value(client,LM78_REG_IN_MIN(3),IN_TO_REG(LM78_INIT_IN_MIN_3)); 
     671  lm78_write_value(client,LM78_REG_IN_MAX(3),IN_TO_REG(LM78_INIT_IN_MAX_3)); 
     672  lm78_write_value(client,LM78_REG_IN_MIN(4),IN_TO_REG(LM78_INIT_IN_MIN_4)); 
     673  lm78_write_value(client,LM78_REG_IN_MAX(4),IN_TO_REG(LM78_INIT_IN_MAX_4)); 
     674  lm78_write_value(client,LM78_REG_IN_MIN(5),IN_TO_REG(LM78_INIT_IN_MIN_5)); 
     675  lm78_write_value(client,LM78_REG_IN_MAX(5),IN_TO_REG(LM78_INIT_IN_MAX_5)); 
     676  lm78_write_value(client,LM78_REG_IN_MIN(6),IN_TO_REG(LM78_INIT_IN_MIN_6)); 
     677  lm78_write_value(client,LM78_REG_IN_MAX(6),IN_TO_REG(LM78_INIT_IN_MAX_6)); 
     678  lm78_write_value(client,LM78_REG_FAN_MIN(1), 
     679                   FAN_TO_REG(LM78_INIT_FAN_MIN_1,2)); 
     680  lm78_write_value(client,LM78_REG_FAN_MIN(2), 
     681                   FAN_TO_REG(LM78_INIT_FAN_MIN_2,2)); 
     682  lm78_write_value(client,LM78_REG_FAN_MIN(3), 
     683                   FAN_TO_REG(LM78_INIT_FAN_MIN_3,2)); 
    680684  lm78_write_value(client,LM78_REG_TEMP_OVER,TEMP_TO_REG(LM78_INIT_TEMP_OVER)); 
    681685  lm78_write_value(client,LM78_REG_TEMP_HYST,TEMP_TO_REG(LM78_INIT_TEMP_HYST)); 
     
    753757  else if (operation == SENSORS_PROC_REAL_READ) { 
    754758    lm78_update_client(client); 
    755     results[0] = IN_FROM_REG(data->in_min[nr],nr); 
    756     results[1] = IN_FROM_REG(data->in_max[nr],nr); 
    757     results[2] = IN_FROM_REG(data->in[nr],nr); 
     759    results[0] = IN_FROM_REG(data->in_min[nr]); 
     760    results[1] = IN_FROM_REG(data->in_max[nr]); 
     761    results[2] = IN_FROM_REG(data->in[nr]); 
    758762    *nrels_mag = 3; 
    759763  } else if (operation == SENSORS_PROC_REAL_WRITE) { 
    760764      if (*nrels_mag >= 1) { 
    761         data->in_min[nr] = IN_TO_REG(results[0],nr); 
     765        data->in_min[nr] = IN_TO_REG(results[0]); 
    762766        lm78_write_value(client,LM78_REG_IN_MIN(nr),data->in_min[nr]); 
    763767      } 
    764768      if (*nrels_mag >= 2) { 
    765         data->in_max[nr] = IN_TO_REG(results[1],nr); 
     769        data->in_max[nr] = IN_TO_REG(results[1]); 
    766770        lm78_write_value(client,LM78_REG_IN_MAX(nr),data->in_max[nr]); 
    767771      } 
     
    779783  else if (operation == SENSORS_PROC_REAL_READ) { 
    780784    lm78_update_client(client); 
    781     results[0] = FAN_FROM_REG(data->fan_min[nr-1]); 
    782     results[1] = FAN_FROM_REG(data->fan[nr-1]); 
     785    results[0] = FAN_FROM_REG(data->fan_min[nr-1], 
     786                 DIV_FROM_REG(data->fan_min[nr-1])); 
     787    results[1] = FAN_FROM_REG(data->fan[nr-1], 
     788                 DIV_FROM_REG(data->fan_min[nr-1])); 
    783789    *nrels_mag = 2; 
    784790  } else if (operation == SENSORS_PROC_REAL_WRITE) { 
    785791    if (*nrels_mag >= 1) { 
    786       data->fan_min[nr-1] = FAN_TO_REG(results[0]); 
     792      data->fan_min[nr-1] = FAN_TO_REG(results[0], 
     793                            DIV_FROM_REG(data->fan_div[nr-1])); 
    787794      lm78_write_value(client,LM78_REG_FAN_MIN(nr),data->fan_min[nr-1]); 
    788795    } 
  • lm-sensors/trunk/src/lm78.c

    r113 r114  
    6666 
    6767/* Conversions. Rounding is only done on the TO_REG variants. */ 
    68 #define IN_TO_REG(val,nr)  (((val) * 10 + 8)/16) 
    69 #define IN_FROM_REG(val,nr) (((val) *  16) / 10) 
    70  
    71 #define FAN_TO_REG(val) ((val)==0?255:((1350000+(val))/((val)*2)) & 0xff) 
    72 #define FAN_FROM_REG(val) ((val)==0?-1:(val)==255?0:1350000/((val)*2)) 
     68#define IN_TO_REG(val)  (((val) * 10 + 8)/16) 
     69#define IN_FROM_REG(val) (((val) *  16) / 10) 
     70 
     71#define FAN_TO_REG(val,div) ((val)==0?255:((1350000+(val))/\ 
     72                            ((val)*2*(div))) & 0xff) 
     73#define FAN_FROM_REG(val,div) ((val)==0?-1:(val)==255?0:1350000/((val)*2*(div))) 
    7374 
    7475#define TEMP_TO_REG(val) (((val)<0?(((val)-5)/10)&0xff:((val)+5)/10) & 0xff) 
     
    661662  vid = VID_FROM_REG(vid); 
    662663 
    663   lm78_write_value(client,LM78_REG_IN_MIN(0),IN_TO_REG(LM78_INIT_IN_MIN_0,0)); 
    664   lm78_write_value(client,LM78_REG_IN_MAX(0),IN_TO_REG(LM78_INIT_IN_MAX_0,0)); 
    665   lm78_write_value(client,LM78_REG_IN_MIN(1),IN_TO_REG(LM78_INIT_IN_MIN_1,1)); 
    666   lm78_write_value(client,LM78_REG_IN_MAX(1),IN_TO_REG(LM78_INIT_IN_MAX_1,1)); 
    667   lm78_write_value(client,LM78_REG_IN_MIN(2),IN_TO_REG(LM78_INIT_IN_MIN_2,2)); 
    668   lm78_write_value(client,LM78_REG_IN_MAX(2),IN_TO_REG(LM78_INIT_IN_MAX_2,2)); 
    669   lm78_write_value(client,LM78_REG_IN_MIN(3),IN_TO_REG(LM78_INIT_IN_MIN_3,3)); 
    670   lm78_write_value(client,LM78_REG_IN_MAX(3),IN_TO_REG(LM78_INIT_IN_MAX_3,3)); 
    671   lm78_write_value(client,LM78_REG_IN_MIN(4),IN_TO_REG(LM78_INIT_IN_MIN_4,4)); 
    672   lm78_write_value(client,LM78_REG_IN_MAX(4),IN_TO_REG(LM78_INIT_IN_MAX_4,4)); 
    673   lm78_write_value(client,LM78_REG_IN_MIN(5),IN_TO_REG(LM78_INIT_IN_MIN_5,5)); 
    674   lm78_write_value(client,LM78_REG_IN_MAX(5),IN_TO_REG(LM78_INIT_IN_MAX_5,5)); 
    675   lm78_write_value(client,LM78_REG_IN_MIN(6),IN_TO_REG(LM78_INIT_IN_MIN_6,6)); 
    676   lm78_write_value(client,LM78_REG_IN_MAX(6),IN_TO_REG(LM78_INIT_IN_MAX_6,6)); 
    677   lm78_write_value(client,LM78_REG_FAN_MIN(1),FAN_TO_REG(LM78_INIT_FAN_MIN_1)); 
    678   lm78_write_value(client,LM78_REG_FAN_MIN(2),FAN_TO_REG(LM78_INIT_FAN_MIN_2)); 
    679   lm78_write_value(client,LM78_REG_FAN_MIN(3),FAN_TO_REG(LM78_INIT_FAN_MIN_3)); 
     664  lm78_write_value(client,LM78_REG_IN_MIN(0),IN_TO_REG(LM78_INIT_IN_MIN_0)); 
     665  lm78_write_value(client,LM78_REG_IN_MAX(0),IN_TO_REG(LM78_INIT_IN_MAX_0)); 
     666  lm78_write_value(client,LM78_REG_IN_MIN(1),IN_TO_REG(LM78_INIT_IN_MIN_1)); 
     667  lm78_write_value(client,LM78_REG_IN_MAX(1),IN_TO_REG(LM78_INIT_IN_MAX_1)); 
     668  lm78_write_value(client,LM78_REG_IN_MIN(2),IN_TO_REG(LM78_INIT_IN_MIN_2)); 
     669  lm78_write_value(client,LM78_REG_IN_MAX(2),IN_TO_REG(LM78_INIT_IN_MAX_2)); 
     670  lm78_write_value(client,LM78_REG_IN_MIN(3),IN_TO_REG(LM78_INIT_IN_MIN_3)); 
     671  lm78_write_value(client,LM78_REG_IN_MAX(3),IN_TO_REG(LM78_INIT_IN_MAX_3)); 
     672  lm78_write_value(client,LM78_REG_IN_MIN(4),IN_TO_REG(LM78_INIT_IN_MIN_4)); 
     673  lm78_write_value(client,LM78_REG_IN_MAX(4),IN_TO_REG(LM78_INIT_IN_MAX_4)); 
     674  lm78_write_value(client,LM78_REG_IN_MIN(5),IN_TO_REG(LM78_INIT_IN_MIN_5)); 
     675  lm78_write_value(client,LM78_REG_IN_MAX(5),IN_TO_REG(LM78_INIT_IN_MAX_5)); 
     676  lm78_write_value(client,LM78_REG_IN_MIN(6),IN_TO_REG(LM78_INIT_IN_MIN_6)); 
     677  lm78_write_value(client,LM78_REG_IN_MAX(6),IN_TO_REG(LM78_INIT_IN_MAX_6)); 
     678  lm78_write_value(client,LM78_REG_FAN_MIN(1), 
     679                   FAN_TO_REG(LM78_INIT_FAN_MIN_1,2)); 
     680  lm78_write_value(client,LM78_REG_FAN_MIN(2), 
     681                   FAN_TO_REG(LM78_INIT_FAN_MIN_2,2)); 
     682  lm78_write_value(client,LM78_REG_FAN_MIN(3), 
     683                   FAN_TO_REG(LM78_INIT_FAN_MIN_3,2)); 
    680684  lm78_write_value(client,LM78_REG_TEMP_OVER,TEMP_TO_REG(LM78_INIT_TEMP_OVER)); 
    681685  lm78_write_value(client,LM78_REG_TEMP_HYST,TEMP_TO_REG(LM78_INIT_TEMP_HYST)); 
     
    753757  else if (operation == SENSORS_PROC_REAL_READ) { 
    754758    lm78_update_client(client); 
    755     results[0] = IN_FROM_REG(data->in_min[nr],nr); 
    756     results[1] = IN_FROM_REG(data->in_max[nr],nr); 
    757     results[2] = IN_FROM_REG(data->in[nr],nr); 
     759    results[0] = IN_FROM_REG(data->in_min[nr]); 
     760    results[1] = IN_FROM_REG(data->in_max[nr]); 
     761    results[2] = IN_FROM_REG(data->in[nr]); 
    758762    *nrels_mag = 3; 
    759763  } else if (operation == SENSORS_PROC_REAL_WRITE) { 
    760764      if (*nrels_mag >= 1) { 
    761         data->in_min[nr] = IN_TO_REG(results[0],nr); 
     765        data->in_min[nr] = IN_TO_REG(results[0]); 
    762766        lm78_write_value(client,LM78_REG_IN_MIN(nr),data->in_min[nr]); 
    763767      } 
    764768      if (*nrels_mag >= 2) { 
    765         data->in_max[nr] = IN_TO_REG(results[1],nr); 
     769        data->in_max[nr] = IN_TO_REG(results[1]); 
    766770        lm78_write_value(client,LM78_REG_IN_MAX(nr),data->in_max[nr]); 
    767771      } 
     
    779783  else if (operation == SENSORS_PROC_REAL_READ) { 
    780784    lm78_update_client(client); 
    781     results[0] = FAN_FROM_REG(data->fan_min[nr-1]); 
    782     results[1] = FAN_FROM_REG(data->fan[nr-1]); 
     785    results[0] = FAN_FROM_REG(data->fan_min[nr-1], 
     786                 DIV_FROM_REG(data->fan_min[nr-1])); 
     787    results[1] = FAN_FROM_REG(data->fan[nr-1], 
     788                 DIV_FROM_REG(data->fan_min[nr-1])); 
    783789    *nrels_mag = 2; 
    784790  } else if (operation == SENSORS_PROC_REAL_WRITE) { 
    785791    if (*nrels_mag >= 1) { 
    786       data->fan_min[nr-1] = FAN_TO_REG(results[0]); 
     792      data->fan_min[nr-1] = FAN_TO_REG(results[0], 
     793                            DIV_FROM_REG(data->fan_div[nr-1])); 
    787794      lm78_write_value(client,LM78_REG_FAN_MIN(nr),data->fan_min[nr-1]); 
    788795    }