diff options
author | khali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2008-06-28 09:23:13 +0000 |
---|---|---|
committer | khali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2008-06-28 09:23:13 +0000 |
commit | 53c778f477c5fd4301b6796a320494edbded4926 (patch) | |
tree | 5c8fee111041a7f675152d701b0876c823c62b49 /stub | |
parent | 490157c0fc7cc6476f133a6d6a6d9d3b707399ce (diff) | |
download | i2c-tools-53c778f477c5fd4301b6796a320494edbded4926.tar.gz |
Behave properly when i2c-stub is already loaded.
git-svn-id: http://lm-sensors.org/svn/i2c-tools/trunk@5292 7894878c-1315-0410-8ee3-d5d059ff63e0
Diffstat (limited to 'stub')
-rwxr-xr-x | stub/i2c-stub-from-dump | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/stub/i2c-stub-from-dump b/stub/i2c-stub-from-dump index 96045a2..64d0177 100755 --- a/stub/i2c-stub-from-dump +++ b/stub/i2c-stub-from-dump @@ -58,6 +58,45 @@ sub get_i2c_stub_bus_number } close(FH); + return $nr; +} + +# Load the required kernel drivers if needed +sub load_kernel_drivers +{ + local $_; + my $addr = oct shift; + my $nr; + + # 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; + } + + system("/sbin/modprobe", "i2c-dev") == 0 || exit 1; + if (kernel_version_at_least(2, 6, 19)) { + system("/sbin/modprobe", "i2c-stub", "chip_addr=$addr") == 0 || exit 1; + } else { + system("/sbin/modprobe", "i2c-stub") == 0 || exit 1; + } + sleep(1); # udev may take some time to create the device node + + $nr = get_i2c_stub_bus_number(); if (!defined($nr)) { print STDERR "Please load i2c-stub first\n"; exit 2; @@ -123,16 +162,7 @@ if ($addr !~ m/^0x[0-7][0-9a-f]$/i) { initialize_kernel_version(); -# Load the required kernel drivers if needed -system("/sbin/modprobe", "i2c-dev") == 0 || exit 1; -if (kernel_version_at_least(2, 6, 19)) { - system("/sbin/modprobe", "i2c-stub", "chip_addr=$addr") == 0 || exit 1; -} else { - system("/sbin/modprobe", "i2c-stub") == 0 || exit 1; -} -sleep(1); # udev may take some time to create the device node - -$bus_nr = get_i2c_stub_bus_number(); +$bus_nr = load_kernel_drivers($addr); $bytes = $words = 0; # We don't want to see the output of 256 i2cset |