Changeset 5941 for lm-sensors/trunk/prog

Show
Ignore:
Timestamp:
03/13/11 14:25:51 (15 months ago)
Author:
khali
Message:

Add detection of SMSC SCH5627.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/prog/detect/sensors-detect

    r5940 r5941  
    14031403#  devid: The device ID we have to match (base device) 
    14041404#  devid_mask (optional): Bitmask to apply before checking the device ID 
     1405#  regs (optional): Register definitions, where they differ from the standard. 
    14051406#  logdev: The logical device containing the sensors 
    14061407#  check (optional): A function to refine the detection. Will be passed 
     
    17621763                driver => "not-a-sensor", 
    17631764                devid => 0x83, 
     1765        }, { 
     1766                name => "SMSC SCH5627 Super IO", 
     1767                driver => "sch5627", 
     1768                devid => 0xc6, 
     1769                regs => { 
     1770                        basereg_lsb => 0x66, 
     1771                        basereg_msb => 0x67, 
     1772                }, 
     1773                logdev => 0x0c, 
     1774                features => FEAT_IN | FEAT_FAN | FEAT_TEMP, 
    17641775        } 
    17651776); 
     
    22352246        } 
    22362247        return 0; 
     2248} 
     2249 
     2250# $_[0]: Reference to base hash 
     2251# $_[1]: Reference to overlay hash 
     2252# Result: Overlayed hash 
     2253sub overlay_hash 
     2254{ 
     2255        my ($base, $overlay) = @_; 
     2256        my %result = %{$base}; 
     2257 
     2258        foreach my $key (keys %{$overlay}) { 
     2259                $result{$key} = $overlay->{$key}; 
     2260        } 
     2261        return %result; 
    22372262} 
    22382263 
     
    35453570} 
    35463571 
    3547 use vars qw(%superio); 
     3572use vars qw(%standard_superio); 
    35483573 
    35493574# The following are taken from the PNP ISA spec (so it's supposed 
     
    35533578#  actreg: The activation register within the logical device 
    35543579#  actmask: The activation bit in the activation register 
    3555 #  basereg: The I/O base register within the logical device 
    3556 %superio = ( 
     3580#  basereg_*: The I/O base registers within the logical device 
     3581%standard_superio = ( 
    35573582        devidreg => 0x20, 
    35583583        logdevreg => 0x07, 
    35593584        actreg => 0x30, 
    35603585        actmask => 0x01, 
    3561         basereg => 0x60, 
     3586        basereg_msb => 0x60, 
     3587        basereg_lsb => 0x61, 
    35623588); 
    35633589 
     
    35813607 
    35823608        # Save logical device number 
    3583         outb($addrreg, $superio{logdevreg}); 
     3609        outb($addrreg, $standard_superio{logdevreg}); 
    35843610        $oldldn = inb($datareg); 
    35853611 
    35863612        for ($ldn = 0; $ldn < 16; $ldn++) { 
    35873613                # Select logical device 
    3588                 outb($addrreg, $superio{logdevreg}); 
     3614                outb($addrreg, $standard_superio{logdevreg}); 
    35893615                outb($datareg, $ldn); 
    35903616 
    35913617                # Read base I/O address 
    3592                 outb($addrreg, $superio{basereg}); 
     3618                outb($addrreg, $standard_superio{basereg_msb}); 
    35933619                $addr = inb($datareg) << 8; 
    3594                 outb($addrreg, $superio{basereg} + 1); 
     3620                outb($addrreg, $standard_superio{basereg_lsb}); 
    35953621                $addr |= inb($datareg); 
    35963622                next unless ($addr & 0xfff8) == $typical_addr; 
     
    36023628 
    36033629        # Be nice, restore original logical device 
    3604         outb($addrreg, $superio{logdevreg}); 
     3630        outb($addrreg, $standard_superio{logdevreg}); 
    36053631        outb($datareg, $oldldn); 
    36063632} 
     
    36113637        my ($addrreg, $datareg, $chip) = @_; 
    36123638        my ($val, $addr); 
     3639        my %superio; 
     3640 
     3641        # Use chip-specific registers if provided 
     3642        if (exists $chip->{regs}) { 
     3643                %superio = overlay_hash(\%standard_superio, $chip->{regs}); 
     3644        } else { 
     3645                %superio = %standard_superio; 
     3646        } 
    36133647 
    36143648        if (exists $chip->{check}) { 
     
    36373671 
    36383672        # Get the IO base address 
    3639         outb($addrreg, $superio{basereg}); 
     3673        outb($addrreg, $superio{basereg_msb}); 
    36403674        $addr = inb($datareg); 
    3641         outb($addrreg, $superio{basereg} + 1); 
     3675        outb($addrreg, $superio{basereg_lsb}); 
    36423676        $addr = ($addr << 8) | inb($datareg); 
    36433677 
     
    37223756 
    37233757                # did it work? 
    3724                 outb($addrreg, $superio{devidreg}); 
     3758                outb($addrreg, $standard_superio{devidreg}); 
    37253759                $val = inb($datareg); 
    3726                 outb($addrreg, $superio{devidreg} + 1); 
     3760                outb($addrreg, $standard_superio{devidreg} + 1); 
    37273761                $val = ($val << 8) | inb($datareg); 
    37283762                if ($val == 0x0000 || $val == 0xffff) {