Show
Ignore:
Timestamp:
06/25/07 21:02:25 (7 years ago)
Author:
khali
Message:

Add detection for non-standard SMSC Super-I/Os. Patch from Juerg Haefliger.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/branches/lm-sensors-3.0.0/prog/detect/sensors-detect

    r4467 r4469  
    18331833      }, 
    18341834    ], 
     1835    # Non-standard SMSC detection callback and chip list. These chips differ 
     1836    # from the standard ones listed above in that the device ID register  
     1837    # address is 0x0d instead of 0x20 (as specified by the ISA PNP spec). 
     1838    ns_detect => \&smsc_ns_detect_superio, 
     1839    ns_chips => 
     1840    [ 
     1841      { 
     1842        name => "SMSC FDC37C665 Super IO", 
     1843        driver => "not-a-sensor", 
     1844        devid => 0x65, 
     1845      }, 
     1846      { 
     1847        name => "SMSC FDC37C666 Super IO", 
     1848        driver => "not-a-sensor", 
     1849        devid => 0x66, 
     1850      }, 
     1851      { 
     1852        name => "SMSC FDC37C669 Super IO", 
     1853        driver => "not-a-sensor", 
     1854        devid => 0x03, 
     1855      }, 
     1856      { 
     1857        name => "SMSC FDC37N769 Super IO", 
     1858        driver => "not-a-sensor", 
     1859        devid => 0x28, 
     1860      }, 
     1861      { 
     1862        name => "SMSC LPC47N227 Super IO", 
     1863        driver => "not-a-sensor", 
     1864        devid => 0x5a, 
     1865      }, 
     1866    ], 
    18351867  }, 
    18361868  { 
     
    31913223} 
    31923224 
     3225# Detection routine for non-standard SMSC Super I/O chips 
     3226# $_[0]: Super I/O LPC config/index port 
     3227# $_[1]: Super I/O LPC data port 
     3228# $_[2]: Reference to array of non-standard chips 
     3229# Return values: 1 if non-standard chip found, 0 otherwise 
     3230sub smsc_ns_detect_superio 
     3231{ 
     3232    my ($addrreg, $datareg, $ns_chips) = @_; 
     3233    my ($val, $chip); 
     3234 
     3235    # read alternate device ID register 
     3236    outb($addrreg, 0x0d); 
     3237    $val = inb($datareg); 
     3238    if ($val == 0x00 || $val == 0xff) { 
     3239        return 0; 
     3240    } 
     3241 
     3242    print "Yes\n"; 
     3243 
     3244    foreach $chip (@{$ns_chips}) { 
     3245        if ($chip->{devid} == $val) { 
     3246            probe_superio($addrreg, $datareg, $chip); 
     3247            return 1; 
     3248        } 
     3249    } 
     3250 
     3251    printf("Found unknown non-standard chip with ID 0x%02x\n", $val); 
     3252    return 1; 
     3253} 
     3254 
    31933255sub scan_superio 
    31943256{ 
     
    32073269    foreach $val (@{$family->{enter}->{$addrreg}}) { 
    32083270      outb($addrreg, $val); 
     3271    } 
     3272# call the non-standard detection routine first if it exists 
     3273    if (defined($family->{ns_detect}) &&  
     3274        &{$family->{ns_detect}}($addrreg, $datareg, $family->{ns_chips})) { 
     3275      exit_superio($addrreg, $datareg); 
     3276      last FAMILY; 
    32093277    } 
    32103278# did it work?