diff --git a/stub/i2c-stub-from-dump b/stub/i2c-stub-from-dump index 4c14faf..1d76b43 100755 --- a/stub/i2c-stub-from-dump +++ b/stub/i2c-stub-from-dump @@ -24,6 +24,27 @@ use strict; use vars qw($bus_nr $addr $count); +# Kernel version detection code by Mark M. Hoffman, +# copied from sensors-detect. +use vars qw(@kernel_version); + +sub initialize_kernel_version +{ + `uname -r` =~ /(\d+)\.(\d+)\.(\d+)(.*)/; + @kernel_version = ($1, $2, $3, $4); +} + +sub kernel_version_at_least +{ + my ($vers, $plvl, $slvl) = @_; + return 1 if ($kernel_version[0] > $vers || + ($kernel_version[0] == $vers && + ($kernel_version[1] > $plvl || + ($kernel_version[1] == $plvl && + ($kernel_version[2] >= $slvl))))); + return 0; +} + # Find out the i2c bus number of i2c-stub sub get_i2c_stub_bus_number { @@ -62,9 +83,15 @@ if ($addr !~ m/^0x[0-7][0-9a-f]$/i) { exit 1; } +initialize_kernel_version(); + # Load the required kernel drivers if needed system("/sbin/modprobe", "i2c-dev") == 0 || exit 1; -system("/sbin/modprobe", "i2c-stub", "chip_addr=$addr") == 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();