Changeset 5941 for lm-sensors/trunk/prog
- Timestamp:
- 03/13/11 14:25:51 (15 months ago)
- Files:
-
- 1 modified
-
lm-sensors/trunk/prog/detect/sensors-detect (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lm-sensors/trunk/prog/detect/sensors-detect
r5940 r5941 1403 1403 # devid: The device ID we have to match (base device) 1404 1404 # devid_mask (optional): Bitmask to apply before checking the device ID 1405 # regs (optional): Register definitions, where they differ from the standard. 1405 1406 # logdev: The logical device containing the sensors 1406 1407 # check (optional): A function to refine the detection. Will be passed … … 1762 1763 driver => "not-a-sensor", 1763 1764 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, 1764 1775 } 1765 1776 ); … … 2235 2246 } 2236 2247 return 0; 2248 } 2249 2250 # $_[0]: Reference to base hash 2251 # $_[1]: Reference to overlay hash 2252 # Result: Overlayed hash 2253 sub 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; 2237 2262 } 2238 2263 … … 3545 3570 } 3546 3571 3547 use vars qw(%s uperio);3572 use vars qw(%standard_superio); 3548 3573 3549 3574 # The following are taken from the PNP ISA spec (so it's supposed … … 3553 3578 # actreg: The activation register within the logical device 3554 3579 # actmask: The activation bit in the activation register 3555 # basereg : The I/O base registerwithin the logical device3556 %s uperio = (3580 # basereg_*: The I/O base registers within the logical device 3581 %standard_superio = ( 3557 3582 devidreg => 0x20, 3558 3583 logdevreg => 0x07, 3559 3584 actreg => 0x30, 3560 3585 actmask => 0x01, 3561 basereg => 0x60, 3586 basereg_msb => 0x60, 3587 basereg_lsb => 0x61, 3562 3588 ); 3563 3589 … … 3581 3607 3582 3608 # Save logical device number 3583 outb($addrreg, $s uperio{logdevreg});3609 outb($addrreg, $standard_superio{logdevreg}); 3584 3610 $oldldn = inb($datareg); 3585 3611 3586 3612 for ($ldn = 0; $ldn < 16; $ldn++) { 3587 3613 # Select logical device 3588 outb($addrreg, $s uperio{logdevreg});3614 outb($addrreg, $standard_superio{logdevreg}); 3589 3615 outb($datareg, $ldn); 3590 3616 3591 3617 # Read base I/O address 3592 outb($addrreg, $s uperio{basereg});3618 outb($addrreg, $standard_superio{basereg_msb}); 3593 3619 $addr = inb($datareg) << 8; 3594 outb($addrreg, $s uperio{basereg} + 1);3620 outb($addrreg, $standard_superio{basereg_lsb}); 3595 3621 $addr |= inb($datareg); 3596 3622 next unless ($addr & 0xfff8) == $typical_addr; … … 3602 3628 3603 3629 # Be nice, restore original logical device 3604 outb($addrreg, $s uperio{logdevreg});3630 outb($addrreg, $standard_superio{logdevreg}); 3605 3631 outb($datareg, $oldldn); 3606 3632 } … … 3611 3637 my ($addrreg, $datareg, $chip) = @_; 3612 3638 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 } 3613 3647 3614 3648 if (exists $chip->{check}) { … … 3637 3671 3638 3672 # Get the IO base address 3639 outb($addrreg, $superio{basereg });3673 outb($addrreg, $superio{basereg_msb}); 3640 3674 $addr = inb($datareg); 3641 outb($addrreg, $superio{basereg } + 1);3675 outb($addrreg, $superio{basereg_lsb}); 3642 3676 $addr = ($addr << 8) | inb($datareg); 3643 3677 … … 3722 3756 3723 3757 # did it work? 3724 outb($addrreg, $s uperio{devidreg});3758 outb($addrreg, $standard_superio{devidreg}); 3725 3759 $val = inb($datareg); 3726 outb($addrreg, $s uperio{devidreg} + 1);3760 outb($addrreg, $standard_superio{devidreg} + 1); 3727 3761 $val = ($val << 8) | inb($datareg); 3728 3762 if ($val == 0x0000 || $val == 0xffff) {
