From 5bfcb08e1855e6628abaa64011bf470323ce98dd Mon Sep 17 00:00:00 2001 From: "Mark D. Studebaker" Date: Thu, 27 Nov 2003 23:53:10 +0000 Subject: [PATCH] report i2c-dev bus numbers rather than i2c-adapter numbers, which may be different. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2097 7894878c-1315-0410-8ee3-d5d059ff63e0 --- prog/dump/i2cbusses.c | 54 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/prog/dump/i2cbusses.c b/prog/dump/i2cbusses.c index 62219649..c888d1bd 100644 --- a/prog/dump/i2cbusses.c +++ b/prog/dump/i2cbusses.c @@ -33,8 +33,8 @@ void print_i2c_busses() { FILE *fptr; char s[100]; - struct dirent *de; - DIR *dir; + struct dirent *de, *dde, *ddde; + DIR *dir, *ddir, *dddir; FILE *f; char *border; char dev[NAME_MAX], fstype[NAME_MAX], sysfs[NAME_MAX], n[NAME_MAX]; @@ -70,19 +70,57 @@ void print_i2c_busses() if (! foundsysfs) { goto done; } - strcat(sysfs, "/class/i2c-adapter"); - dir = opendir(sysfs); - if (! dir) + + /* Bus numbers in i2c-adapter don't necessarily match those in + i2c-dev and what we really care about are the i2c-dev numbers. + Unfortunately the names are harder to get in i2c-dev */ + strcat(sysfs, "/class/i2c-dev"); + if(!(dir = opendir(sysfs))) goto done; + /* go through the busses */ while ((de = readdir(dir)) != NULL) { if (!strcmp(de->d_name, ".")) continue; if (!strcmp(de->d_name, "..")) continue; + /* this seems to work for ISA */ sprintf(n, "%s/%s/device/name", sysfs, de->d_name); + f = fopen(n, "r"); + if(f == NULL) { + /* non-ISA is much harder */ + sprintf(n, "%s/%s/driver", sysfs, de->d_name); + if(!(ddir = opendir(n))) + continue; + while ((dde = readdir(ddir)) != NULL) { + if (!strcmp(dde->d_name, ".")) + continue; + if (!strcmp(dde->d_name, "..")) + continue; + /* hope it's a link to a PCI device */ + if(index(dde->d_name, ':')) { + sprintf(n, "%s/%s/driver/%s", + sysfs, de->d_name, dde->d_name); + if(!(dddir = opendir(n))) + continue; + while ((ddde = readdir(dddir)) != NULL) { + if (!strcmp(ddde->d_name, ".")) + continue; + if (!strcmp(ddde->d_name, "..")) + continue; + if ((!strncmp(ddde->d_name, "i2c-", 4))) { + sprintf(n, "%s/%s/driver/%s/%s/name", + sysfs, de->d_name, dde->d_name, ddde->d_name); + if((f = fopen(n, "r"))) + goto found; + } + } + } + } + } - if ((f = fopen(n, "r")) != NULL) { +found: + if (f != NULL) { char x[120]; fgets(x, 120, f); @@ -107,5 +145,7 @@ void print_i2c_busses() done: if(count == 0) - fprintf(stderr,"Error: No I2C busses found!\n"); + fprintf(stderr,"Error: No I2C busses found!\n" + "Be sure you have done 'modprobe i2c-dev'\n" + "and also modprobed your i2c bus drivers\n"); }