Changeset 2481

Show
Ignore:
Timestamp:
04/26/04 19:53:43 (9 years ago)
Author:
khali
Message:

Be concurrent-access safe (i.e. ensure than no bank change occurs

in our back).
Fix compilation without DEBUG.
Do not read in and temp alarms more than needed.

Files:
1 modified

Legend:

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

    r2479 r2481  
    8585} 
    8686 
     87/* 
     88 * Logical devices 
     89 */ 
     90 
    8791#define PC87360_EXTENT          0x10 
     92#define PC87365_REG_BANK        0x09 
     93#define NO_BANK                 0xff 
    8894 
    8995/* 
     
    120126 */ 
    121127 
    122 #define PC87365_REG_IN_BANK             0x09 
    123  
    124128/* nr has to be 0 to 11 (PC87365/87366) */ 
    125129#define PC87365_REG_IN                  0x0B 
     
    139143 */ 
    140144 
    141 #define PC87365_REG_TEMP_BANK           0x09 
    142  
    143145/* nr has to be 0 to 1 (PC87365) or 2 (PC87366) */ 
    144146#define PC87365_REG_TEMP                0x0B 
     
    192194static int pc87360_detach_client(struct i2c_client *client); 
    193195 
    194 static int pc87360_read_value(struct pc87360_data *data, int ldi, u8 reg); 
    195 static int pc87360_write_value(struct pc87360_data *data, int ldi, u8 reg, 
    196                                u8 value); 
     196static int pc87360_read_value(struct pc87360_data *data, u8 ldi, u8 bank, 
     197                              u8 reg); 
     198static void pc87360_write_value(struct pc87360_data *data, u8 ldi, u8 bank, 
     199                                u8 reg, u8 value); 
    197200static void pc87360_update_client(struct i2c_client *client); 
    198201static int pc87360_find(u8 *devid, int *address); 
     
    463466                               "ctrl=%d inv=%d\n", (fanconf[0]>>8)&1, 
    464467                               (fanconf[0]>>9)&1, (fanconf[0]>>10)&1); 
    465                 } 
    466468#endif 
     469                } 
    467470        } 
    468471 
     
    598601} 
    599602 
     603#define LD_FAN          0 
     604#define LD_IN           1 
     605#define LD_TEMP         2 
     606 
    600607/* ldi is the logical device index: 
    601    0: fans 
    602    1: voltages 
    603    2: temperatures */ 
    604 static int pc87360_read_value(struct pc87360_data *data, int ldi, u8 reg) 
     608   bank is for voltages and temperatures only. */ 
     609static int pc87360_read_value(struct pc87360_data *data, u8 ldi, u8 bank, 
     610                              u8 reg) 
    605611{ 
    606612        int res; 
    607613 
    608614        down(&(data->lock)); 
     615        if (bank != NO_BANK) { 
     616                outb_p(bank, data->address[ldi] + PC87365_REG_BANK); 
     617        } 
    609618        res = inb_p(data->address[ldi] + reg); 
    610619        up(&(data->lock)); 
     
    612621} 
    613622 
    614 static int pc87360_write_value(struct pc87360_data *data, int ldi, u8 reg, 
    615                               u8 value) 
     623static void pc87360_write_value(struct pc87360_data *data, u8 ldi, u8 bank, 
     624                                u8 reg, u8 value) 
    616625{ 
    617626        down(&(data->lock)); 
     627        if (bank != NO_BANK) { 
     628                outb_p(bank, data->address[ldi] + PC87365_REG_BANK); 
     629        } 
    618630        outb_p(value, data->address[ldi] + reg); 
    619631        up(&(data->lock)); 
    620         return 0; 
    621632} 
    622633 
     
    624635{ 
    625636        struct pc87360_data *data = client->data; 
    626         int i; 
     637        u8 i; 
    627638 
    628639        down(&data->update_lock); 
     
    636647                /* Fans */ 
    637648                for (i = 0; i < data->fannr; i++) { 
    638                         data->fan[i] = pc87360_read_value(data, 0, 
    639                                        PC87360_REG_FAN(i)); 
    640                         data->fan_min[i] = pc87360_read_value(data, 0, 
    641                                            PC87360_REG_FAN_MIN(i)); 
    642                         data->fan_status[i] = pc87360_read_value(data, 0, 
     649                        data->fan[i] = pc87360_read_value(data, LD_FAN, 
     650                                       NO_BANK, PC87360_REG_FAN(i)); 
     651                        data->fan_min[i] = pc87360_read_value(data, LD_FAN, 
     652                                           NO_BANK, PC87360_REG_FAN_MIN(i)); 
     653                        data->fan_status[i] = pc87360_read_value(data, LD_FAN, 
     654                                              NO_BANK, 
    643655                                              PC87360_REG_FAN_STATUS(i)); 
    644                         data->pwm[i] = pc87360_read_value(data, 0, 
    645                                        PC87360_REG_PWM(i)); 
     656                        data->pwm[i] = pc87360_read_value(data, LD_FAN, 
     657                                       NO_BANK, PC87360_REG_PWM(i)); 
    646658                } 
    647659 
    648660                /* Voltages */ 
    649661                for (i = 0; i < data->innr; i++) { 
    650                         pc87360_write_value(data, 1, PC87365_REG_IN_BANK, i); 
    651                         data->in_status[i] = pc87360_read_value(data, 1, 
     662                        data->in_status[i] = pc87360_read_value(data, LD_IN, i, 
    652663                                             PC87365_REG_IN_STATUS); 
    653664                        /* Clear bits */ 
    654                         pc87360_write_value(data, 1, PC87365_REG_IN_STATUS, 
     665                        pc87360_write_value(data, LD_IN, i, 
     666                                            PC87365_REG_IN_STATUS, 
    655667                                            data->in_status[i] | 0x86); 
    656668                        if (data->in_status[i] & 0x01) { 
    657                                 data->in[i] = pc87360_read_value(data, 1, 
    658                                               PC87365_REG_IN); 
    659                                 data->in_min[i] = pc87360_read_value(data, 1, 
     669                                data->in[i] = pc87360_read_value(data, LD_IN, 
     670                                              i, PC87365_REG_IN); 
     671                                data->in_min[i] = pc87360_read_value(data, 
     672                                                  LD_IN, i, 
    660673                                                  PC87365_REG_IN_MIN); 
    661                                 data->in_max[i] = pc87360_read_value(data, 1, 
     674                                data->in_max[i] = pc87360_read_value(data, 
     675                                                  LD_IN, i, 
    662676                                                  PC87365_REG_IN_MAX); 
    663677                        } 
    664                         data->in_alarms = pc87360_read_value(data, 1, 
    665                                           PC87365_REG_IN_ALARMS1) 
    666                                         | (pc87360_read_value(data, 1, 
    667                                            PC87365_REG_IN_ALARMS2) << 8); 
    668                 } 
     678                } 
     679                data->in_alarms = pc87360_read_value(data, LD_IN, NO_BANK, 
     680                                  PC87365_REG_IN_ALARMS1) 
     681                                | (pc87360_read_value(data, LD_IN, NO_BANK, 
     682                                   PC87365_REG_IN_ALARMS2) << 8); 
    669683 
    670684                /* Temperatures */ 
    671685                for (i = 0; i < data->tempnr; i++) { 
    672                         pc87360_write_value(data, 2, PC87365_REG_TEMP_BANK, i); 
    673                         data->temp_status[i] = pc87360_read_value(data, 2, 
     686                        data->temp_status[i] = pc87360_read_value(data, 
     687                                               LD_TEMP, i, 
    674688                                               PC87365_REG_TEMP_STATUS); 
    675689                        /* Clear bits */ 
    676                         pc87360_write_value(data, 2, PC87365_REG_TEMP_STATUS, 
     690                        pc87360_write_value(data, LD_TEMP, i, 
     691                                            PC87365_REG_TEMP_STATUS, 
    677692                                            data->temp_status[i] | 0xCE); 
    678693                        if (data->temp_status[i] & 0x01) { 
    679                                 data->temp[i] = pc87360_read_value(data, 2, 
     694                                data->temp[i] = pc87360_read_value(data, 
     695                                                LD_TEMP, i, 
    680696                                                PC87365_REG_TEMP); 
    681                                 data->temp_min[i] = pc87360_read_value(data, 2, 
     697                                data->temp_min[i] = pc87360_read_value(data, 
     698                                                    LD_TEMP, i, 
    682699                                                    PC87365_REG_TEMP_MIN); 
    683                                 data->temp_max[i] = pc87360_read_value(data, 2, 
     700                                data->temp_max[i] = pc87360_read_value(data, 
     701                                                    LD_TEMP, i, 
    684702                                                    PC87365_REG_TEMP_MAX); 
    685                                 data->temp_crit[i] = pc87360_read_value(data, 2, 
     703                                data->temp_crit[i] = pc87360_read_value(data, 
     704                                                     LD_TEMP, i, 
    686705                                                     PC87365_REG_TEMP_CRIT); 
    687706                        } 
    688                         data->temp_alarms = pc87360_read_value(data, 2, 
    689                                             PC87365_REG_TEMP_ALARMS); 
    690                 } 
     707                } 
     708                data->temp_alarms = pc87360_read_value(data, LD_TEMP, NO_BANK, 
     709                                    PC87365_REG_TEMP_ALARMS); 
    691710 
    692711                data->last_updated = jiffies; 
     
    736755                        data->fan_min[nr] = FAN_TO_REG(results[0], 
    737756                                            FAN_DIV_FROM_REG(data->fan_status[nr])); 
    738                         pc87360_write_value(data, 0, PC87360_REG_FAN_MIN(nr), 
     757                        pc87360_write_value(data, LD_FAN, NO_BANK, 
     758                                            PC87360_REG_FAN_MIN(nr), 
    739759                                            data->fan_min[nr]); 
    740760                } 
     
    765785                        data->fan_status[i] = (data->fan_status[i] & 0x9F) 
    766786                                            | FAN_DIV_TO_REG(results[i]); 
    767                         pc87360_write_value(data, 0, PC87360_REG_FAN_STATUS(i), 
     787                        pc87360_write_value(data, LD_FAN, NO_BANK, 
     788                                            PC87360_REG_FAN_STATUS(i), 
    768789                                            data->fan_status[i]); 
    769790                        data->fan_min[i] = FAN_TO_REG(fan_min, 
    770791                                           FAN_DIV_FROM_REG(data->fan_status[i])); 
    771                         pc87360_write_value(data, 0, PC87360_REG_FAN_MIN(i), 
     792                        pc87360_write_value(data, LD_FAN, NO_BANK, 
     793                                            PC87360_REG_FAN_MIN(i), 
    772794                                            data->fan_min[i]); 
    773795                } 
     
    795817                        data->pwm[nr] = PWM_TO_REG(results[0], 
    796818                                        FAN_CONFIG_INVERT(data->fan_conf[0], nr)); 
    797                         pc87360_write_value(data, 0, PC87360_REG_PWM(nr), 
     819                        pc87360_write_value(data, LD_FAN, NO_BANK, 
     820                                            PC87360_REG_PWM(nr), 
    798821                                            data->pwm[nr]); 
    799822                } 
     
    834857                if (*nrels_mag >= 1) { 
    835858                        data->in_min[nr] = IN_TO_REG(results[0]); 
    836                         pc87360_write_value(data, 1, PC87365_REG_IN_BANK, nr); 
    837                         pc87360_write_value(data, 1, PC87365_REG_IN_MIN, 
     859                        pc87360_write_value(data, LD_IN, nr, 
     860                                            PC87365_REG_IN_MIN, 
    838861                                            data->in_min[nr]); 
    839862                } 
    840863                if (*nrels_mag >= 2) { 
    841864                        data->in_max[nr] = IN_TO_REG(results[1]); 
    842                         pc87360_write_value(data, 1, PC87365_REG_IN_MAX, 
     865                        pc87360_write_value(data, LD_IN, nr, 
     866                                            PC87365_REG_IN_MAX, 
    843867                                            data->in_max[nr]); 
    844868                } 
     
    881905                        return; 
    882906                if (*nrels_mag >= 1) { 
    883                         pc87360_write_value(data, 2, PC87365_REG_TEMP_BANK, nr); 
    884907                        data->temp_max[nr] = TEMP_TO_REG(results[0]); 
    885                         pc87360_write_value(data, 2, PC87365_REG_TEMP_MAX, 
     908                        pc87360_write_value(data, LD_TEMP, nr, 
     909                                            PC87365_REG_TEMP_MAX, 
    886910                                            data->temp_max[nr]); 
    887911                } 
    888912                if (*nrels_mag >= 2) { 
    889913                        data->temp_min[nr] = TEMP_TO_REG(results[1]); 
    890                         pc87360_write_value(data, 2, PC87365_REG_TEMP_MIN, 
     914                        pc87360_write_value(data, LD_TEMP, nr, 
     915                                            PC87365_REG_TEMP_MIN, 
    891916                                            data->temp_min[nr]); 
    892917                } 
    893918                if (*nrels_mag >= 3) { 
    894919                        data->temp_crit[nr] = TEMP_TO_REG(results[2]); 
    895                         pc87360_write_value(data, 2, PC87365_REG_TEMP_CRIT, 
     920                        pc87360_write_value(data, LD_TEMP, nr, 
     921                                            PC87365_REG_TEMP_CRIT, 
    896922                                            data->temp_crit[nr]); 
    897923                }