diff options
author | khali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2010-03-08 13:59:20 +0000 |
---|---|---|
committer | khali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2010-03-08 13:59:20 +0000 |
commit | dec94883f8f6a319a6fdfcbca52f965b0ce0d8f8 (patch) | |
tree | 84cfd806566e8a17f3edf2f509aca387468fcff4 /stub | |
parent | 38314440936926b04b706d9709830b2d27a06411 (diff) | |
download | i2c-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-x | stub/i2c-stub-from-dump | 39 |
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)) { |