From add2bce315bdb5e99850d39513952cf5aa8ad2bb Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Wed, 16 Feb 2011 13:58:38 +0000 Subject: [PATCH] Add support for the at24 kernel driver. git-svn-id: http://lm-sensors.org/svn/i2c-tools/trunk@5929 7894878c-1315-0410-8ee3-d5d059ff63e0 --- CHANGES | 1 + eeprom/decode-dimms | 45 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 1f7e767..4a7a6d2 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ i2c-tools CHANGES SVN decode-dimms: Decode module configuration type of DDR SDRAM Decode refresh rate of DDR SDRAM + Add support for the at24 kernel driver i2c-dev.h: Make value arrays const for block write functions i2cset: Add support for SMBus and I2C block writes Removed obsolete method to specify value mask diff --git a/eeprom/decode-dimms b/eeprom/decode-dimms index 2ba393a..d996a7b 100755 --- a/eeprom/decode-dimms +++ b/eeprom/decode-dimms @@ -5,7 +5,7 @@ # Copyright 1998, 1999 Philip Edelbrock # modified by Christian Zuckschwerdt # modified by Burkart Lingner -# Copyright (C) 2005-2009 Jean Delvare +# Copyright (C) 2005-2011 Jean Delvare # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -1710,24 +1710,55 @@ printh('Memory Serial Presence Detect Decoder', Jean Delvare, Trent Piepho and others'); +# From a sysfs device path and an attribute name, return the attribute +# value, or undef (stolen from sensors-detect) +sub sysfs_device_attribute +{ + my ($device, $attr) = @_; + my $value; + + open(local *FILE, "$device/$attr") or return ""; + $value = ; + close(FILE); + return unless defined $value; + + chomp($value); + return $value; +} + sub get_dimm_list { - my ($dir, $file, @files); + my (@dirs, $dir, $file, @files); if ($use_sysfs) { - $dir = '/sys/bus/i2c/drivers/eeprom'; + @dirs = ('/sys/bus/i2c/drivers/eeprom', '/sys/bus/i2c/drivers/at24'); } else { - $dir = '/proc/sys/dev/sensors'; + @dirs = ('/proc/sys/dev/sensors'); } - if (opendir(local *DIR, $dir)) { + foreach $dir (@dirs) { + next unless opendir(local *DIR, $dir); while (defined($file = readdir(DIR))) { - next if $use_sysfs && $file !~ /^\d+-[\da-f]+$/i; - next if !$use_sysfs && $file !~ /^eeprom-/; + if ($use_sysfs) { + # We look for I2C devices like 0-0050 or 2-0051 + next unless $file =~ /^\d+-[\da-f]+$/i; + next unless -d "$dir/$file"; + + # Device name must be eeprom (driver eeprom) + # or spd (driver at24) + my $attr = sysfs_device_attribute("$dir/$file", "name"); + next unless defined $attr && + ($attr eq "eeprom" || $attr eq "spd"); + } else { + next unless $file =~ /^eeprom-/; + } push @files, { eeprom => "$file", file => "$dir/$file" }; } close(DIR); + } + + if (@files) { return sort { $a->{file} cmp $b->{file} } @files; } elsif (! -d '/sys/module/eeprom') { print "No EEPROM found, are you sure the eeprom module is loaded?\n";