Changeset 2534

Show
Ignore:
Timestamp:
05/15/04 15:37:48 (9 years ago)
Author:
khali
Message:

Move auto clock divider change to separate function.

Also change divider on fan_min setting.

Files:
1 modified

Legend:

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

    r2532 r2534  
    131131#define FAN_FROM_REG(val,div)           ((val)==0?0: \ 
    132132                                         480000/((val)*(div))) 
    133 #define FAN_TO_REG(val,div)             ((val)*(div)<=1875?255: \ 
     133#define FAN_TO_REG(val,div)             ((val)<=100?0: \ 
    134134                                         480000/((val)*(div))) 
    135135#define FAN_DIV_FROM_REG(val)           (1 << ((val >> 5) & 0x03)) 
     
    762762} 
    763763 
     764static void pc87360_autodiv(struct pc87360_data *data, int nr) 
     765{ 
     766        /* Increase clock divider if needed and possible */ 
     767        if ((data->fan_status[nr] & 0x04) /* overflow flag */ 
     768         || (data->fan[nr] >= 224)) { /* next to overflow */ 
     769                if ((data->fan_status[nr] & 0x60) != 0x60) { 
     770                        data->fan_status[nr] += 0x20; 
     771                        data->fan_min[nr] >>= 1; 
     772                        data->fan[nr] >>= 1; 
     773                        pc87360_write_value(data, LD_FAN, NO_BANK, 
     774                                            PC87360_REG_FAN_MIN(nr), 
     775                                            data->fan_min[nr]); 
     776#ifdef DEBUG 
     777                        printk(KERN_DEBUG "pc87360.o: Increasing " 
     778                               "clock divider to %d for fan %d\n", 
     779                               FAN_DIV_FROM_REG(data->fan_status[nr]), 
     780                               nr+1); 
     781#endif 
     782                } 
     783        } else 
     784        /* Decrease clock divider if needed and possible */ 
     785        if (data->fan[nr] < 85 /* bad accuracy */ 
     786         && !(data->fan_min[nr] & 0x80)) { 
     787                if ((data->fan_status[nr] & 0x60) != 0x00) { 
     788                        data->fan_status[nr] -= 0x20; 
     789                        data->fan_min[nr] <<= 1; 
     790                        data->fan[nr] <<= 1; 
     791                        pc87360_write_value(data, LD_FAN, NO_BANK, 
     792                                            PC87360_REG_FAN_MIN(nr), 
     793                                            data->fan_min[nr]); 
     794#ifdef DEBUG 
     795                        printk(KERN_DEBUG "pc87360.o: Decreasing " 
     796                               "clock divider to %d for fan %d\n", 
     797                               FAN_DIV_FROM_REG(data->fan_status[nr]), 
     798                               nr+1); 
     799#endif 
     800                } 
     801        } 
     802} 
     803 
    764804static void pc87360_update_client(struct i2c_client *client) 
    765805{ 
     
    786826                                                   LD_FAN, NO_BANK, 
    787827                                                   PC87360_REG_FAN_MIN(i)); 
    788                                 /* Increase clock divider if needed */ 
    789                                 if ((data->fan_status[i] & 0x60) != 0x60 
    790                                  && ((data->fan_status[i] & 0x04) 
    791                                   || (data->fan[i] & 0xE0) == 0xE0)) { 
    792                                         data->fan_status[i] += 0x20; 
    793                                         data->fan_min[i] >>= 1; 
    794                                         data->fan[i] >>= 1; 
    795                                         pc87360_write_value(data, LD_FAN, NO_BANK, 
    796                                                             PC87360_REG_FAN_MIN(i), 
    797                                                             data->fan_min[i]); 
    798 #ifdef DEBUG 
    799                                         printk(KERN_DEBUG "pc87360.o: Increasing " 
    800                                                "clock divider to %d for fan %d\n", 
    801                                                FAN_DIV_FROM_REG(data->fan_status[i]), 
    802                                                i+1); 
    803 #endif 
    804                                 } else 
    805                                 /* Decrease clock divider if possible */ 
    806                                 if ((data->fan_status[i] & 0x60) != 0x00 
    807                                  && !(data->fan_status[i] & 0x04) 
    808                                  && data->fan[i] <= 0x50) { 
    809                                         data->fan_status[i] -= 0x20; 
    810                                         data->fan_min[i] = (data->fan_min[i] & 0x80) 
    811                                                            ? 255 : 
    812                                                            (data->fan_min[i] << 1); 
    813                                         data->fan[i] <<= 1; 
    814                                         pc87360_write_value(data, LD_FAN, NO_BANK, 
    815                                                             PC87360_REG_FAN_MIN(i), 
    816                                                             data->fan_min[i]); 
    817 #ifdef DEBUG 
    818                                         printk(KERN_DEBUG "pc87360.o: Decreasing " 
    819                                                "clock divider to %d for fan %d\n", 
    820                                                FAN_DIV_FROM_REG(data->fan_status[i]), 
    821                                                i+1); 
    822 #endif 
    823                                 } 
     828                                /* Change clock divider if needed */ 
     829                                pc87360_autodiv(data, i); 
    824830                                /* Clear bits and write new divider */ 
    825831                                pc87360_write_value(data, LD_FAN, NO_BANK, 
     
    932938                        return; 
    933939                if (*nrels_mag >= 1) { 
    934                         data->fan_min[nr] = FAN_TO_REG(results[0], 
    935                                             FAN_DIV_FROM_REG(data->fan_status[nr])); 
     940                        int fan_min = FAN_TO_REG(results[0], 
     941                                      FAN_DIV_FROM_REG(data->fan_status[nr])); 
     942                        /* If it wouldn't fit, change clock divisor */ 
     943                        while (fan_min > 255 
     944                            && (data->fan_status[nr] & 0x60) != 0x60) { 
     945                                fan_min >>= 1; 
     946                                data->fan[nr] >>= 1; 
     947                                data->fan_status[nr] += 0x20; 
     948                        } 
     949                        data->fan_min[nr] = fan_min > 255 ? 255 : fan_min; 
    936950                        pc87360_write_value(data, LD_FAN, NO_BANK, 
    937951                                            PC87360_REG_FAN_MIN(nr), 
    938952                                            data->fan_min[nr]); 
     953                        /* Write new divider, preserve alarm bits */ 
     954                        pc87360_write_value(data, LD_FAN, NO_BANK, 
     955                                            PC87360_REG_FAN_STATUS(nr), 
     956                                            data->fan_status[nr] & 0xF9); 
    939957                } 
    940958        }