2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-08-31 06:15:15 +00:00

Group all ISA detection functions and harmonize their parameters.

git-svn-id: http://lm-sensors.org/svn/lm-sensors/branches/lm-sensors-3.0.0@5418 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Jean Delvare
2008-11-24 15:42:03 +00:00
parent 7a8669796e
commit 9f03b10a04

View File

@@ -535,7 +535,7 @@ use vars qw(@i2c_adapter_names);
i2c_addrs => [0x28..0x2f],
i2c_detect => sub { lm78_detect(0, @_); },
isa_addrs => [0x290],
isa_detect => sub { lm78_isa_detect(0, @_); },
isa_detect => sub { lm78_isa_detect(@_, 0); },
alias_detect => sub { winbond_alias_detect(@_, 0x2b, 0x3d); },
},
{
@@ -544,7 +544,7 @@ use vars qw(@i2c_adapter_names);
i2c_addrs => [0x28..0x2f],
i2c_detect => sub { lm78_detect(2, @_); },
isa_addrs => [0x290],
isa_detect => sub { lm78_isa_detect(2, @_); },
isa_detect => sub { lm78_isa_detect(@_, 2); },
alias_detect => sub { winbond_alias_detect(@_, 0x2b, 0x3d); },
},
{
@@ -703,7 +703,7 @@ use vars qw(@i2c_adapter_names);
i2c_detect => sub { w83781d_detect(0, @_); },
i2c_addrs => [0x28..0x2f],
isa_addrs => [0x290],
isa_detect => sub { w83781d_isa_detect(0, @_); },
isa_detect => sub { w83781d_isa_detect(@_, 0); },
alias_detect => sub { winbond_alias_detect(@_, 0x2b, 0x3d); },
},
{
@@ -712,7 +712,7 @@ use vars qw(@i2c_adapter_names);
i2c_addrs => [0x28..0x2f],
i2c_detect => sub { w83781d_detect(1, @_); },
isa_addrs => [0x290],
isa_detect => sub { w83781d_isa_detect(1, @_); },
isa_detect => sub { w83781d_isa_detect(@_, 1); },
alias_detect => sub { winbond_alias_detect(@_, 0x2b, 0x3d); },
},
{
@@ -3408,40 +3408,6 @@ sub lm78_detect
return (6);
}
# $_[0]: Chip to detect (0 = LM78, 2 = LM79)
# $_[1]: Address
# Returns: undef if not detected, 6 if detected.
# Note: Only address 0x290 is scanned at this moment.
sub lm78_isa_detect
{
my ($chip, $addr) = @_;
my $val = inb($addr + 1);
return if inb($addr + 2) != $val or inb($addr + 3) != $val or
inb($addr + 7) != $val;
$val = inb($addr + 5);
outb($addr + 5, ~$val & 0x7f);
if ((inb($addr+5) & 0x7f) != (~ $val & 0x7f)) {
outb($addr+5, $val);
return;
}
return unless (isa_read_i5d6($addr, 0x40) & 0x80) == 0x00;
my $reg = isa_read_i5d6($addr, 0x49);
return unless ($chip == 0 and ($reg == 0x00 or $reg == 0x20 or $reg == 0x40)) or
($chip == 2 and ($reg & 0xfe) == 0xc0);
# Explicitly prevent misdetection of Winbond chips
$reg = isa_read_i5d6($addr, 0x4f);
return if $reg == 0xa3 || $reg == 0x5c;
# Explicitly prevent misdetection of ITE chips
$reg = isa_read_i5d6($addr, 0x58);
return if $reg == 0x90;
return 6;
}
# $_[0]: Chip to detect (0 = LM75, 1 = DS75)
# $_[1]: A reference to the file descriptor to access this chip.
# $_[2]: Address (unused)
@@ -4507,36 +4473,6 @@ sub mozart_detect
return 5;
}
# $_[0]: Chip to detect (0 = W83781D, 1 = W83782D)
# $_[1]: Address
# Returns: undef if not detected, (8) if detected.
sub w83781d_isa_detect
{
my ($chip, $addr) = @_;
my ($reg1, $reg2);
my $val = inb($addr + 1);
return if inb($addr + 2) != $val or inb($addr + 3) != $val or
inb($addr + 7) != $val;
$val = inb($addr + 5);
outb($addr+5, ~$val & 0x7f);
if ((inb($addr+5) & 0x7f) != (~ $val & 0x7f)) {
outb($addr+5, $val);
return;
}
$reg1 = isa_read_i5d6($addr, 0x4e);
$reg2 = isa_read_i5d6($addr, 0x4f);
return unless (($reg1 & 0x80) == 0x00 and $reg2 == 0xa3) or
(($reg1 & 0x80) == 0x80 and $reg2 == 0x5c);
return unless ($reg1 & 0x07) == 0x00;
$reg1 = isa_read_i5d6($addr, 0x58);
return if $chip == 0 and ($reg1 & 0xfe) != 0x10;
return if $chip == 1 and ($reg1 & 0xfe) != 0x30;
return 8;
}
# $_[0]: Chip to detect (0 = Revision 0x00, 1 = Revision 0x80)
# $_[1]: A reference to the file descriptor to access this chip.
# $_[2]: Address
@@ -5091,22 +5027,6 @@ sub smartbatt_detect
return (5);
}
# Returns: 4
# These are simple detectors that only look for a register at the
# standard location. No writes are performed.
# For KCS, use the STATUS register. For SMIC, use the FLAGS register.
sub ipmi_kcs_detect
{
return if inb(0x0ca3) == 0xff;
return (4);
}
sub ipmi_smic_detect
{
return if inb(0x0cab) == 0xff;
return (4);
}
# $_[0]: Chip to detect (0 = W83L784R/AR/G, 1 = W83L785R/G,
# 2 = W83L786NR/NG/R/G)
# $_[1]: A reference to the file descriptor to access this chip.
@@ -5226,6 +5146,86 @@ sub vt1211_i2c_detect
return 2;
}
# All ISA detection functions below take at least 1 parameter:
# $_[0]: Address
# Some of these functions which can detect more than one type of device,
# take a second parameter:
# $_[1]: Chip to detect
# Chip to detect: 0 = LM78, 2 = LM79
sub lm78_isa_detect
{
my ($addr, $chip) = @_;
my $val = inb($addr + 1);
return if inb($addr + 2) != $val or inb($addr + 3) != $val or
inb($addr + 7) != $val;
$val = inb($addr + 5);
outb($addr + 5, ~$val & 0x7f);
if ((inb($addr+5) & 0x7f) != (~ $val & 0x7f)) {
outb($addr+5, $val);
return;
}
return unless (isa_read_i5d6($addr, 0x40) & 0x80) == 0x00;
my $reg = isa_read_i5d6($addr, 0x49);
return unless ($chip == 0 and ($reg == 0x00 or $reg == 0x20 or $reg == 0x40)) or
($chip == 2 and ($reg & 0xfe) == 0xc0);
# Explicitly prevent misdetection of Winbond chips
$reg = isa_read_i5d6($addr, 0x4f);
return if $reg == 0xa3 || $reg == 0x5c;
# Explicitly prevent misdetection of ITE chips
$reg = isa_read_i5d6($addr, 0x58);
return if $reg == 0x90;
return 6;
}
# Chip to detect: 0 = W83781D, 1 = W83782D
sub w83781d_isa_detect
{
my ($addr, $chip) = @_;
my ($reg1, $reg2);
my $val = inb($addr + 1);
return if inb($addr + 2) != $val or inb($addr + 3) != $val or
inb($addr + 7) != $val;
$val = inb($addr + 5);
outb($addr+5, ~$val & 0x7f);
if ((inb($addr+5) & 0x7f) != (~ $val & 0x7f)) {
outb($addr+5, $val);
return;
}
$reg1 = isa_read_i5d6($addr, 0x4e);
$reg2 = isa_read_i5d6($addr, 0x4f);
return unless (($reg1 & 0x80) == 0x00 and $reg2 == 0xa3) or
(($reg1 & 0x80) == 0x80 and $reg2 == 0x5c);
return unless ($reg1 & 0x07) == 0x00;
$reg1 = isa_read_i5d6($addr, 0x58);
return if $chip == 0 and ($reg1 & 0xfe) != 0x10;
return if $chip == 1 and ($reg1 & 0xfe) != 0x30;
return 8;
}
# These are simple detectors that only look for a register at the
# standard location.
# For KCS, use the STATUS register. For SMIC, use the FLAGS register.
sub ipmi_kcs_detect
{
return if inb(0x0ca3) == 0xff;
return 4;
}
sub ipmi_smic_detect
{
return if inb(0x0cab) == 0xff;
return 4;
}
###################
# ALIAS DETECTION #
###################