summaryrefslogtreecommitdiff
path: root/stub
diff options
context:
space:
mode:
authorkhali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0>2010-03-08 13:59:20 +0000
committerkhali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0>2010-03-08 13:59:20 +0000
commitdec94883f8f6a319a6fdfcbca52f965b0ce0d8f8 (patch)
tree84cfd806566e8a17f3edf2f509aca387468fcff4 /stub
parent38314440936926b04b706d9709830b2d27a06411 (diff)
downloadi2c-tools-dec94883f8f6a319a6fdfcbca52f965b0ce0d8f8.tar.gz
Unload i2c-stub automatically if needed.
git-svn-id: http://lm-sensors.org/svn/i2c-tools/trunk@5828 7894878c-1315-0410-8ee3-d5d059ff63e0
Diffstat (limited to 'stub')
-rwxr-xr-xstub/i2c-stub-from-dump39
1 files changed, 22 insertions, 17 deletions
diff --git a/stub/i2c-stub-from-dump b/stub/i2c-stub-from-dump
index 1b7c3af..5b15496 100755
--- a/stub/i2c-stub-from-dump
+++ b/stub/i2c-stub-from-dump
@@ -61,6 +61,24 @@ sub get_i2c_stub_bus_number
return $nr;
}
+# Unload i2c-stub if we need an address it doesn't offer
+sub check_chip_addr {
+ my $chip_addr_file = shift;
+ my $addr = shift;
+ local $_;
+
+ open(CHIP_ADDR, $chip_addr_file) || return;
+ $_ = <CHIP_ADDR>;
+ chomp;
+ my %stub_addr = map { $_ => 1 } split ',';
+ close(CHIP_ADDR);
+
+ unless (exists $stub_addr{$addr}) {
+ print STDERR "Cycling i2c-stub to get the address we need\n";
+ system("/sbin/rmmod", "i2c-stub");
+ }
+}
+
# Load the required kernel drivers if needed
sub load_kernel_drivers
{
@@ -68,25 +86,12 @@ sub load_kernel_drivers
my $addr = oct shift;
my $nr;
+ # i2c-stub may be loaded without the address we want
+ check_chip_addr("/sys/module/i2c_stub/parameters/chip_addr", $addr);
+
# Maybe everything is already loaded
$nr = get_i2c_stub_bus_number();
- if (defined $nr) {
- if (kernel_version_at_least(2, 6, 19)) {
- # Check if the chip address we need is there
- open(CHIP_ADDR, "/sys/module/i2c_stub/parameters/chip_addr");
- $_ = <CHIP_ADDR>;
- chomp;
- my @stub_addr = split ',';
- close(CHIP_ADDR);
-
- foreach (@stub_addr) {
- return $nr if $addr == $_;
- }
- printf STDERR "i2c-stub already loaded without support for address 0x%02x\n", $addr;
- exit 2;
- }
- return $nr;
- }
+ return $nr if defined $nr;
system("/sbin/modprobe", "i2c-dev") == 0 || exit 1;
if (kernel_version_at_least(2, 6, 19)) {