summaryrefslogtreecommitdiff
path: root/stub
diff options
context:
space:
mode:
authorkhali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0>2008-06-28 09:23:13 +0000
committerkhali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0>2008-06-28 09:23:13 +0000
commit53c778f477c5fd4301b6796a320494edbded4926 (patch)
tree5c8fee111041a7f675152d701b0876c823c62b49 /stub
parent490157c0fc7cc6476f133a6d6a6d9d3b707399ce (diff)
downloadi2c-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-xstub/i2c-stub-from-dump50
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