2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-09-01 14:55:27 +00:00

sensors-detect: Get driver information for busy addresses from

sysfs (2.6 only).


git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@4077 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Jean Delvare
2006-07-29 15:58:26 +00:00
parent ff013b4ffd
commit 22e6b03e94
2 changed files with 86 additions and 5 deletions

View File

@@ -31,6 +31,7 @@ require 5.004;
use strict;
use Fcntl;
use POSIX;
use File::Basename;
# Just in case a root user doesn't have /sbin in his/her path for some reason
# (was seen once)
@@ -2175,7 +2176,7 @@ sub isa_write_byte
# AUTODETECTION #
#################
use vars qw($modules_conf $dev_i2c);
use vars qw($modules_conf $dev_i2c $sysfs_root);
sub initialize_conf
{
@@ -2186,7 +2187,9 @@ sub initialize_conf
if (m@^\w+ /dev devfs @) {
$use_devfs = 1;
$dev_i2c = '/dev/i2c/';
last;
}
if (m@^\S+ (/\w+) sysfs @) {
$sysfs_root = $1;
}
}
close INPUTFILE;
@@ -2260,7 +2263,7 @@ sub kernel_version_at_least
# MODULES #
###########
use vars qw(%modules_list);
use vars qw(%modules_list %modules_supported);
sub initialize_modules_list
{
@@ -2272,6 +2275,42 @@ sub initialize_modules_list
}
}
sub initialize_modules_supported
{
foreach my $chip (@chip_ids) {
$modules_supported{$chip->{driver}}++;
}
}
#################
# SYSFS HELPERS #
#################
# From a sysfs device path, return the driver name, or undef
sub sysfs_device_driver($)
{
my $device = shift;
my $link = readlink("$device/driver");
return unless defined $link;
return basename($link);
}
# From a sysfs device path and an attribute name, return the attribute
# value, or undef
sub sysfs_device_attribute($$)
{
my ($device, $attr) = @_;
my $value;
open(local *FILE, "$device/$attr") or return;
return unless defined($value = <FILE>);
close(FILE);
chomp($value);
return $value;
}
##############
# PCI ACCESS #
##############
@@ -2798,8 +2837,47 @@ sub scan_adapter
next;
}
i2c_set_slave_addr(\*FILE,$addr) or
printf("Client at address 0x%02x can not be probed - unload all client drivers first!\n",$addr), next;
if (!i2c_set_slave_addr(\*FILE, $addr)) {
# If the address is busy, in Linux 2.6 we can find out which driver
# is using it, and we assume it is the right one. In Linux 2.4 we
# just give up and warn the user.
my ($device, $driver);
if (defined($sysfs_root)) {
$device = sprintf("/sys/bus/i2c/devices/\%d-\%04x",
$adapter_nr, $addr);
$driver = sysfs_device_driver($device);
}
if (defined($driver)) {
$new_hash = {
conf => 6, # Arbitrary confidence
i2c_addr => $addr,
chipname => sysfs_device_attribute($device, "name") || "unknown",
i2c_adap => $adapter_name,
i2c_driver => $adapter_driver,
i2c_devnr => $adapter_nr,
};
$new_hash->{i2c_extra} = 0
if exists $chip->{i2c_driver_addrs} and
not contains($addr, @{$chip->{i2c_driver_addrs}});
printf "Client found at address 0x\%02x\n", $addr;
printf "Handled by driver `\%s' (already loaded), chip type `\%s'\n",
$driver, $new_hash->{chipname};
# Only add it to the list if this is something we would have
# detected, else we end up with random i2c chip drivers listed
# (for example media/video drivers.)
if (exists $modules_supported{$driver}) {
add_i2c_to_chips_detected($driver, $new_hash);
} else {
print " (note: this is NOT a sensor chip!)\n";
}
} else {
printf("Client at address 0x%02x can not be probed - ".
"unload all client drivers first!\n", $addr);
}
next;
}
next unless i2c_probe(\*FILE, $addr);
printf "Client found at address 0x%02x\n",$addr;
@@ -5284,6 +5362,7 @@ sub main
initialize_conf;
initialize_proc_pci;
initialize_modules_list;
initialize_modules_supported;
initialize_kernel_version;
print "# sensors-detect revision $revision\n";