Changeset 27

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

Some lm78 updates

* LM78, LM78-J and LM79 now all supported
* Chip type reflected in /proc/bus/i2c-?, /proc/.../sensors/* and

/proc/ioports.

* VID initialises IN0 and IN1, except if it is 3.50 V (then it falls back to

2.80 V)

* Slightly better ISA detection (but still not good enough)
* Temperature now in tenth of degrees, instead of whole degrees (for better

compatibility)

Location:
lm-sensors/trunk
Files:
4 modified

Legend:

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

    r20 r27  
    6161 
    6262#define LM78_REG_CONFIG 0x40 
     63#define LM78_REG_CHIPID 0x49 
    6364 
    6465 
     
    6667static int lm78_in_conv[7] = {10000, 10000, 10000, 16892, 38000,  
    6768                              -34768, -15050 }; 
    68 #define IN_TO_REG(val,nr) ((((val) * 100000 / lm78_in_conv[nr]) + 8) / 16) 
     69#define IN_TO_REG(val,nr) (((((val) * 100000 / lm78_in_conv[nr]) + 8) / 16) \ 
     70                           & 0xff) 
    6971#define IN_FROM_REG(val,nr) (((val) *  16 * lm78_in_conv[nr]) / 100000) 
    7072 
    71 #define FAN_TO_REG(val) (((val)==0)?255:((1350000+(val))/((val)*2))) 
     73#define FAN_TO_REG(val) ((((val)==0)?255:((1350000+(val))/((val)*2))) & 0xff) 
    7274#define FAN_FROM_REG(val) (((val)==0)?-1:\ 
    7375                           ((val)==255)?0:(1350000 + (val))/((val)*2)) 
    7476 
    75 #define TEMP_TO_REG(val) ((val)<0?(val)&0xff:(val)) 
    76 #define TEMP_FROM_REG(val) ((val)>0x80?(val)-0x100:(val)); 
    77  
    78 #define VID_FROM_REG(val) ((val) == 0x0f?0:350-(val)*10) 
    79  
     77#define TEMP_TO_REG(val) (((val)<0?(val/10)&0xff:(val/10)) & 0xff) 
     78#define TEMP_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*10) 
     79 
     80#define VID_FROM_REG(val) ((val)==0x1f?0:(val)>=0x10?510-(val)*10:\ 
     81                           (val)>=0x06?0:205-(val)*5) 
    8082#define ALARMS_FROM_REG(val) (val) 
    8183 
    8284#define DIV_FROM_REG(val) (1 >> (val)) 
    83 #define DIV_TO_REG(val) ((val)==8?3:(val)==4?2:(val)==1?1:2) 
     85#define DIV_TO_REG(val) ((val)==8?3:(val)==4?2:(val)==1?0:1) 
    8486 
    8587/* Initial limits */ 
    86 #define LM78_INIT_IN_0 280 
    87 #define LM78_INIT_IN_1 280 
     88#define LM78_INIT_IN_0 (vid==350?280:vid) 
     89#define LM78_INIT_IN_1 (vid==350?280:vid) 
    8890#define LM78_INIT_IN_2 330 
    8991#define LM78_INIT_IN_3 500 
     
    127129#define LM78_INIT_FAN_MIN_3 3000 
    128130 
    129 #define LM78_INIT_TEMP_OVER 60 
    130 #define LM78_INIT_TEMP_HYST 50 
     131#define LM78_INIT_TEMP_OVER 600 
     132#define LM78_INIT_TEMP_HYST 500 
    131133 
    132134#ifdef MODULE 
     
    150152   some corners. */ 
    151153 
     154/* Types of chips supported */ 
     155enum lm78_type { lm78, lm78j, lm79 }; 
     156 
    152157/* For each registered LM78, we need to keep some data in memory. That 
    153158   data is pointed to by lm78_list[NR]->data. The structure itself is 
     
    157162         struct semaphore lock; 
    158163         int sysctl_id; 
     164         enum lm78_type type; 
    159165 
    160166         struct semaphore update_lock; 
     
    297303  int address,err; 
    298304  struct isa_client *new_client; 
     305  enum lm78_type type; 
     306  const char *type_name; 
     307  const char *client_name; 
    299308 
    300309  /* OK, this is no detection. I know. It will do for now, though.  */ 
     
    303312  for (address = 0x290; (! err) && (address <= 0x290); address += 0x08) { 
    304313    if (check_region(address, LM78_EXTENT)) 
     314      continue; 
     315 
     316    /* Awful, but true: unused port addresses should return 0xff */ 
     317    if ((inb_p(address + 1) != 0xff) || (inb_p(address + 2) != 0xff) || 
     318       (inb_p(address + 3) != 0xff) || (inb_p(address + 7) != 0xff)) 
    305319      continue; 
    306320     
     
    312326     
    313327    /* Real detection code goes here */ 
    314     
    315     request_region(address, LM78_EXTENT, "lm78"); 
     328 
     329    /* Determine exact type */ 
     330    outb_p(LM78_REG_CHIPID,address + LM78_ADDR_REG_OFFSET); 
     331    err = inb_p(address + LM78_DATA_REG_OFFSET); 
     332    if (err == 0x00) { 
     333      type = lm78; 
     334      type_name = "lm78"; 
     335      client_name = "LM78 chip"; 
     336    } else if (err == 0x40) { 
     337      type = lm78j; 
     338      type_name = "lm78-j"; 
     339      client_name = "LM78-J chip"; 
     340    } else if (err == 0x80) { 
     341      type = lm79; 
     342      type_name = "lm79"; 
     343      client_name = "LM79 chip"; 
     344    } 
     345    else 
     346      continue; 
     347       
     348 
     349    request_region(address, LM78_EXTENT, type_name); 
    316350 
    317351    /* Allocate space for a new client structure */ 
     
    327361    new_client->data = (struct lm78_data *) (new_client + 1); 
    328362    new_client->addr = 0; 
     363    strcpy(new_client->name,client_name); 
     364    ((struct lm78_data *) (new_client->data))->type = type; 
    329365    new_client->isa_addr = address; 
    330366    if ((err = lm78_new_client((struct i2c_adapter *) adapter, 
     
    337373     
    338374    /* Register a new directory entry with module sensors */ 
    339     if ((err = sensors_register_entry((struct i2c_client *) new_client,"lm78", 
     375    if ((err = sensors_register_entry((struct i2c_client *) new_client, 
     376                                      type_name, 
    340377                                      lm78_dir_table_template)) < 0) 
    341378      goto ERROR4; 
     
    390427  int address,err; 
    391428  struct i2c_client *new_client; 
     429  enum lm78_type type; 
     430  const char *type_name,*client_name; 
    392431 
    393432  /* OK, this is no detection. I know. It will do for now, though.  */ 
     
    402441 
    403442    /* Real detection code goes here */ 
     443 
     444    /* Determine exact type */ 
     445    err = smbus_read_byte_data(adapter,address,LM78_REG_CHIPID); 
     446    if (err == 0x00) { 
     447      type = lm78; 
     448      type_name = "lm78"; 
     449      client_name = "LM78 chip"; 
     450    } else if (err == 0x40) { 
     451      type = lm78j; 
     452      type_name = "lm78-j"; 
     453      client_name = "LM78-J chip"; 
     454    } else if (err == 0x80) { 
     455      type = lm79; 
     456      type_name = "lm79"; 
     457      client_name = "LM79 chip"; 
     458    } else 
     459      continue; 
     460 
    404461 
    405462    /* Allocate space for a new client structure */ 
     
    414471    new_client->data = (struct lm78_data *) (new_client + 1); 
    415472    new_client->addr = address; 
     473    strcpy(new_client->name,client_name); 
     474    ((struct lm78_data *) (new_client->data))->type = type; 
    416475    if ((err = lm78_new_client(adapter,new_client))) 
    417476      goto ERROR2; 
     
    422481 
    423482    /* Register a new directory entry with module sensors */ 
    424     if ((err = sensors_register_entry(new_client,"lm78", 
     483    if ((err = sensors_register_entry(new_client,type_name, 
    425484                                      lm78_dir_table_template)) < 0) 
    426485      goto ERROR4; 
     
    484543   
    485544  lm78_list[i] = new_client; 
    486   strcpy(new_client->name,"LM78 chip"); 
    487545  new_client->id = i; 
    488546  new_client->adapter = adapter; 
     
    561619void lm78_init_client(struct i2c_client *client) 
    562620{ 
     621  int vid; 
     622 
    563623  /* Reset all except Watchdog values and last conversion values 
    564624     This sets fan-divs to 2, among others */ 
    565625  lm78_write_value(client,LM78_REG_CONFIG,0x80); 
     626 
     627  vid = lm78_read_value(client,LM78_REG_VID_FANDIV) & 0x0f; 
     628  if (((struct lm78_data *) (client->data))->type == lm79) 
     629    vid |= (lm78_read_value(client,LM78_REG_CHIPID) & 0x01) >> 4; 
     630  else 
     631    vid |= 0x10; 
     632  vid = VID_FROM_REG(vid); 
    566633 
    567634  lm78_write_value(client,LM78_REG_IN_MIN(0),IN_TO_REG(LM78_INIT_IN_MIN_0,0)); 
     
    618685    i = lm78_read_value(client,LM78_REG_VID_FANDIV); 
    619686    data->vid = i & 0x0f; 
     687    if (data->type == lm79) 
     688      data->vid |= (lm78_read_value(client,LM78_REG_CHIPID) & 0x01) >> 4; 
     689    else 
     690      data->vid |= 0x10; 
    620691    data->fan_div[0] = (i >> 4) & 0x03; 
    621692    data->fan_div[1] = i >> 6; 
     
    656727    case LM78_SYSCTL_TEMP: 
    657728      nrels=3; 
     729      mag=1; 
     730      break; 
     731    case LM78_SYSCTL_FAN_DIV: 
     732      nrels=3; 
    658733      mag=0; 
    659734      break; 
    660735    case LM78_SYSCTL_FAN1: case LM78_SYSCTL_FAN2: case LM78_SYSCTL_FAN3: 
    661     case LM78_SYSCTL_FAN_DIV: 
    662736      nrels=2; 
    663737      mag=0; 
     
    742816    case LM78_SYSCTL_IN3: case LM78_SYSCTL_IN4: case LM78_SYSCTL_IN5:  
    743817    case LM78_SYSCTL_IN6: case LM78_SYSCTL_TEMP:  
     818    case LM78_SYSCTL_FAN_DIV: 
    744819      nrels=3; 
    745820      break; 
    746821    case LM78_SYSCTL_FAN1: case LM78_SYSCTL_FAN2: case LM78_SYSCTL_FAN3: 
    747     case LM78_SYSCTL_FAN_DIV: 
    748822      nrels=2; 
    749823      break; 
     
    859933  } 
    860934  if (nrels >= 2) { 
    861     data->temp_hyst = TEMP_TO_REG(results[0]); 
     935    data->temp_hyst = TEMP_TO_REG(results[1]); 
    862936    lm78_write_value(client,LM78_REG_TEMP_HYST,data->temp_hyst); 
    863937  } 
     
    889963  results[0] = DIV_FROM_REG(data->fan_div[0]); 
    890964  results[1] = DIV_FROM_REG(data->fan_div[1]); 
     965  results[2] = 2; 
    891966} 
    892967  
  • lm-sensors/trunk/kernel/include/sensors.h

    r19 r27  
    4747#endif /* def DEV_HWMON */ 
    4848 
    49 #define LM78_SYSCTL_IN0 1000 
     49#define LM78_SYSCTL_IN0 1000  /* Volts * 100 */ 
    5050#define LM78_SYSCTL_IN1 1001 
    5151#define LM78_SYSCTL_IN2 1002 
     
    5454#define LM78_SYSCTL_IN5 1005 
    5555#define LM78_SYSCTL_IN6 1006 
    56 #define LM78_SYSCTL_FAN1 1101 
     56#define LM78_SYSCTL_FAN1 1101 /* Rotations/min */ 
    5757#define LM78_SYSCTL_FAN2 1102 
    5858#define LM78_SYSCTL_FAN3 1103 
    59 #define LM78_SYSCTL_TEMP 1200 
    60 #define LM78_SYSCTL_VID 1300 
    61 #define LM78_SYSCTL_FAN_DIV 2000 
    62 #define LM78_SYSCTL_ALARMS 2001 
     59#define LM78_SYSCTL_TEMP 1200 /* Degrees Celcius * 10 */ 
     60#define LM78_SYSCTL_VID 1300 /* Volts * 100 */ 
     61#define LM78_SYSCTL_FAN_DIV 2000 /* 1, 2, 4 or 8 */ 
     62#define LM78_SYSCTL_ALARMS 2001 /* bitvector */ 
    6363 
    6464#endif /* def SENSORS_SENSORS_H */ 
  • lm-sensors/trunk/src/lm78.c

    r20 r27  
    6161 
    6262#define LM78_REG_CONFIG 0x40 
     63#define LM78_REG_CHIPID 0x49 
    6364 
    6465 
     
    6667static int lm78_in_conv[7] = {10000, 10000, 10000, 16892, 38000,  
    6768                              -34768, -15050 }; 
    68 #define IN_TO_REG(val,nr) ((((val) * 100000 / lm78_in_conv[nr]) + 8) / 16) 
     69#define IN_TO_REG(val,nr) (((((val) * 100000 / lm78_in_conv[nr]) + 8) / 16) \ 
     70                           & 0xff) 
    6971#define IN_FROM_REG(val,nr) (((val) *  16 * lm78_in_conv[nr]) / 100000) 
    7072 
    71 #define FAN_TO_REG(val) (((val)==0)?255:((1350000+(val))/((val)*2))) 
     73#define FAN_TO_REG(val) ((((val)==0)?255:((1350000+(val))/((val)*2))) & 0xff) 
    7274#define FAN_FROM_REG(val) (((val)==0)?-1:\ 
    7375                           ((val)==255)?0:(1350000 + (val))/((val)*2)) 
    7476 
    75 #define TEMP_TO_REG(val) ((val)<0?(val)&0xff:(val)) 
    76 #define TEMP_FROM_REG(val) ((val)>0x80?(val)-0x100:(val)); 
    77  
    78 #define VID_FROM_REG(val) ((val) == 0x0f?0:350-(val)*10) 
    79  
     77#define TEMP_TO_REG(val) (((val)<0?(val/10)&0xff:(val/10)) & 0xff) 
     78#define TEMP_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*10) 
     79 
     80#define VID_FROM_REG(val) ((val)==0x1f?0:(val)>=0x10?510-(val)*10:\ 
     81                           (val)>=0x06?0:205-(val)*5) 
    8082#define ALARMS_FROM_REG(val) (val) 
    8183 
    8284#define DIV_FROM_REG(val) (1 >> (val)) 
    83 #define DIV_TO_REG(val) ((val)==8?3:(val)==4?2:(val)==1?1:2) 
     85#define DIV_TO_REG(val) ((val)==8?3:(val)==4?2:(val)==1?0:1) 
    8486 
    8587/* Initial limits */ 
    86 #define LM78_INIT_IN_0 280 
    87 #define LM78_INIT_IN_1 280 
     88#define LM78_INIT_IN_0 (vid==350?280:vid) 
     89#define LM78_INIT_IN_1 (vid==350?280:vid) 
    8890#define LM78_INIT_IN_2 330 
    8991#define LM78_INIT_IN_3 500 
     
    127129#define LM78_INIT_FAN_MIN_3 3000 
    128130 
    129 #define LM78_INIT_TEMP_OVER 60 
    130 #define LM78_INIT_TEMP_HYST 50 
     131#define LM78_INIT_TEMP_OVER 600 
     132#define LM78_INIT_TEMP_HYST 500 
    131133 
    132134#ifdef MODULE 
     
    150152   some corners. */ 
    151153 
     154/* Types of chips supported */ 
     155enum lm78_type { lm78, lm78j, lm79 }; 
     156 
    152157/* For each registered LM78, we need to keep some data in memory. That 
    153158   data is pointed to by lm78_list[NR]->data. The structure itself is 
     
    157162         struct semaphore lock; 
    158163         int sysctl_id; 
     164         enum lm78_type type; 
    159165 
    160166         struct semaphore update_lock; 
     
    297303  int address,err; 
    298304  struct isa_client *new_client; 
     305  enum lm78_type type; 
     306  const char *type_name; 
     307  const char *client_name; 
    299308 
    300309  /* OK, this is no detection. I know. It will do for now, though.  */ 
     
    303312  for (address = 0x290; (! err) && (address <= 0x290); address += 0x08) { 
    304313    if (check_region(address, LM78_EXTENT)) 
     314      continue; 
     315 
     316    /* Awful, but true: unused port addresses should return 0xff */ 
     317    if ((inb_p(address + 1) != 0xff) || (inb_p(address + 2) != 0xff) || 
     318       (inb_p(address + 3) != 0xff) || (inb_p(address + 7) != 0xff)) 
    305319      continue; 
    306320     
     
    312326     
    313327    /* Real detection code goes here */ 
    314     
    315     request_region(address, LM78_EXTENT, "lm78"); 
     328 
     329    /* Determine exact type */ 
     330    outb_p(LM78_REG_CHIPID,address + LM78_ADDR_REG_OFFSET); 
     331    err = inb_p(address + LM78_DATA_REG_OFFSET); 
     332    if (err == 0x00) { 
     333      type = lm78; 
     334      type_name = "lm78"; 
     335      client_name = "LM78 chip"; 
     336    } else if (err == 0x40) { 
     337      type = lm78j; 
     338      type_name = "lm78-j"; 
     339      client_name = "LM78-J chip"; 
     340    } else if (err == 0x80) { 
     341      type = lm79; 
     342      type_name = "lm79"; 
     343      client_name = "LM79 chip"; 
     344    } 
     345    else 
     346      continue; 
     347       
     348 
     349    request_region(address, LM78_EXTENT, type_name); 
    316350 
    317351    /* Allocate space for a new client structure */ 
     
    327361    new_client->data = (struct lm78_data *) (new_client + 1); 
    328362    new_client->addr = 0; 
     363    strcpy(new_client->name,client_name); 
     364    ((struct lm78_data *) (new_client->data))->type = type; 
    329365    new_client->isa_addr = address; 
    330366    if ((err = lm78_new_client((struct i2c_adapter *) adapter, 
     
    337373     
    338374    /* Register a new directory entry with module sensors */ 
    339     if ((err = sensors_register_entry((struct i2c_client *) new_client,"lm78", 
     375    if ((err = sensors_register_entry((struct i2c_client *) new_client, 
     376                                      type_name, 
    340377                                      lm78_dir_table_template)) < 0) 
    341378      goto ERROR4; 
     
    390427  int address,err; 
    391428  struct i2c_client *new_client; 
     429  enum lm78_type type; 
     430  const char *type_name,*client_name; 
    392431 
    393432  /* OK, this is no detection. I know. It will do for now, though.  */ 
     
    402441 
    403442    /* Real detection code goes here */ 
     443 
     444    /* Determine exact type */ 
     445    err = smbus_read_byte_data(adapter,address,LM78_REG_CHIPID); 
     446    if (err == 0x00) { 
     447      type = lm78; 
     448      type_name = "lm78"; 
     449      client_name = "LM78 chip"; 
     450    } else if (err == 0x40) { 
     451      type = lm78j; 
     452      type_name = "lm78-j"; 
     453      client_name = "LM78-J chip"; 
     454    } else if (err == 0x80) { 
     455      type = lm79; 
     456      type_name = "lm79"; 
     457      client_name = "LM79 chip"; 
     458    } else 
     459      continue; 
     460 
    404461 
    405462    /* Allocate space for a new client structure */ 
     
    414471    new_client->data = (struct lm78_data *) (new_client + 1); 
    415472    new_client->addr = address; 
     473    strcpy(new_client->name,client_name); 
     474    ((struct lm78_data *) (new_client->data))->type = type; 
    416475    if ((err = lm78_new_client(adapter,new_client))) 
    417476      goto ERROR2; 
     
    422481 
    423482    /* Register a new directory entry with module sensors */ 
    424     if ((err = sensors_register_entry(new_client,"lm78", 
     483    if ((err = sensors_register_entry(new_client,type_name, 
    425484                                      lm78_dir_table_template)) < 0) 
    426485      goto ERROR4; 
     
    484543   
    485544  lm78_list[i] = new_client; 
    486   strcpy(new_client->name,"LM78 chip"); 
    487545  new_client->id = i; 
    488546  new_client->adapter = adapter; 
     
    561619void lm78_init_client(struct i2c_client *client) 
    562620{ 
     621  int vid; 
     622 
    563623  /* Reset all except Watchdog values and last conversion values 
    564624     This sets fan-divs to 2, among others */ 
    565625  lm78_write_value(client,LM78_REG_CONFIG,0x80); 
     626 
     627  vid = lm78_read_value(client,LM78_REG_VID_FANDIV) & 0x0f; 
     628  if (((struct lm78_data *) (client->data))->type == lm79) 
     629    vid |= (lm78_read_value(client,LM78_REG_CHIPID) & 0x01) >> 4; 
     630  else 
     631    vid |= 0x10; 
     632  vid = VID_FROM_REG(vid); 
    566633 
    567634  lm78_write_value(client,LM78_REG_IN_MIN(0),IN_TO_REG(LM78_INIT_IN_MIN_0,0)); 
     
    618685    i = lm78_read_value(client,LM78_REG_VID_FANDIV); 
    619686    data->vid = i & 0x0f; 
     687    if (data->type == lm79) 
     688      data->vid |= (lm78_read_value(client,LM78_REG_CHIPID) & 0x01) >> 4; 
     689    else 
     690      data->vid |= 0x10; 
    620691    data->fan_div[0] = (i >> 4) & 0x03; 
    621692    data->fan_div[1] = i >> 6; 
     
    656727    case LM78_SYSCTL_TEMP: 
    657728      nrels=3; 
     729      mag=1; 
     730      break; 
     731    case LM78_SYSCTL_FAN_DIV: 
     732      nrels=3; 
    658733      mag=0; 
    659734      break; 
    660735    case LM78_SYSCTL_FAN1: case LM78_SYSCTL_FAN2: case LM78_SYSCTL_FAN3: 
    661     case LM78_SYSCTL_FAN_DIV: 
    662736      nrels=2; 
    663737      mag=0; 
     
    742816    case LM78_SYSCTL_IN3: case LM78_SYSCTL_IN4: case LM78_SYSCTL_IN5:  
    743817    case LM78_SYSCTL_IN6: case LM78_SYSCTL_TEMP:  
     818    case LM78_SYSCTL_FAN_DIV: 
    744819      nrels=3; 
    745820      break; 
    746821    case LM78_SYSCTL_FAN1: case LM78_SYSCTL_FAN2: case LM78_SYSCTL_FAN3: 
    747     case LM78_SYSCTL_FAN_DIV: 
    748822      nrels=2; 
    749823      break; 
     
    859933  } 
    860934  if (nrels >= 2) { 
    861     data->temp_hyst = TEMP_TO_REG(results[0]); 
     935    data->temp_hyst = TEMP_TO_REG(results[1]); 
    862936    lm78_write_value(client,LM78_REG_TEMP_HYST,data->temp_hyst); 
    863937  } 
     
    889963  results[0] = DIV_FROM_REG(data->fan_div[0]); 
    890964  results[1] = DIV_FROM_REG(data->fan_div[1]); 
     965  results[2] = 2; 
    891966} 
    892967  
  • lm-sensors/trunk/src/sensors.h

    r19 r27  
    4747#endif /* def DEV_HWMON */ 
    4848 
    49 #define LM78_SYSCTL_IN0 1000 
     49#define LM78_SYSCTL_IN0 1000  /* Volts * 100 */ 
    5050#define LM78_SYSCTL_IN1 1001 
    5151#define LM78_SYSCTL_IN2 1002 
     
    5454#define LM78_SYSCTL_IN5 1005 
    5555#define LM78_SYSCTL_IN6 1006 
    56 #define LM78_SYSCTL_FAN1 1101 
     56#define LM78_SYSCTL_FAN1 1101 /* Rotations/min */ 
    5757#define LM78_SYSCTL_FAN2 1102 
    5858#define LM78_SYSCTL_FAN3 1103 
    59 #define LM78_SYSCTL_TEMP 1200 
    60 #define LM78_SYSCTL_VID 1300 
    61 #define LM78_SYSCTL_FAN_DIV 2000 
    62 #define LM78_SYSCTL_ALARMS 2001 
     59#define LM78_SYSCTL_TEMP 1200 /* Degrees Celcius * 10 */ 
     60#define LM78_SYSCTL_VID 1300 /* Volts * 100 */ 
     61#define LM78_SYSCTL_FAN_DIV 2000 /* 1, 2, 4 or 8 */ 
     62#define LM78_SYSCTL_ALARMS 2001 /* bitvector */ 
    6363 
    6464#endif /* def SENSORS_SENSORS_H */