[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Keyboard backlight support in the near future?



Hi

On Sa, Jan 17, 2004 at 12:56:41 +1100, Benjamin Herrenschmidt wrote:
> On Sat, 2004-01-17 at 00:22, Alexander Clausen wrote:
> > On Fr, Jan 16, 2004 at 05:39:48 +1100, Benjamin Herrenschmidt wrote:
> > > 
> > > It seem to be fairly easy to drive over i2c, somebody is already hacking
> > > something afaik. 
> > >
> > 
> > Yes, that somebody is me ;)
> > I've got the i2c read/write parts ready, it's only lacking automatic
> > detection of the i2c bus number (and eventually address?), I don't have
> > an idea how to do that exactly...
> 
> sysfs ?
> 
> Ben.
> 

Attached is a patch to lmu.c to do automatic detection on Linux 2.6 via
sysfs. Please report if it works.

Alex
--- lmu.c.old	2004-01-18 16:38:35.000000000 +0100
+++ lmu.c		2004-01-21 17:17:14.358397224 +0100
@@ -37,45 +37,87 @@
 
 /* #define DEBUG */
 
-#define ADDR 0x42
-
 int
-open_bus ( ) {
-	char filename[20], buf[4];
-	int num = 0, file;
+probe_adapter (int *lmu_addr, int *device_num) {
+	int file;
+	int bytes;
+	char adapter[1024];
+	char filename[100];
+	__u32 raw_reg;
+	int lmu_bus;
+	int i;
+	int bus_num;
+	
+	file = open ( "/proc/device-tree/uni-n/i2c/lmu-controller/reg", O_RDONLY );
+	if ( file == -1 ) {
+		perror ("open failed");
+		printf ("no lmu device found\n");
+		return -1;
+	}
+
+	bytes = read ( file, &raw_reg, 4 );
+	if ( bytes == -1 ) {
+		perror ("read failed");
+		printf ("no lmu device found\n");
+		close ( file );
+		return -1;
+	}
 
-	/* try eacch bus */
-	while ( num <= 16 ) {
-		snprintf( filename, 19, "/dev/i2c-%d", num );
+	close ( file );
+	
+	lmu_bus = ( raw_reg & 0x000000001 );
+	*lmu_addr = ( raw_reg & 0xFE ) >> 1;
+
+	for (i = 0; i <= 16; i++) {
+		sprintf( filename, "/sys/class/i2c-adapter/i2c-%d/device/name", i );
 		
-		if ( (file = open (filename, O_RDWR) ) < 0 ) {
-			if ( errno == ENODEV ) {
-				close ( file );
-				return -1; /* last bus */
-			} else if ( errno == EACCES ) {
-				return -2; /* not root? */
-			} else {
-				num++; /* couldn't open file, try next bus */
-				close ( file );
-				continue;
-			}
+		file = open( filename, O_RDONLY );
+		if ( file < 0 ) {
+			if (errno == ENOENT)
+				break;
 		}
 
-		if ( ioctl ( file, I2C_SLAVE, ADDR) < 0 ) {
-			num++; /* ioctl failed, try next bus */
+		bytes = read ( file, &adapter, 1023 );
+		adapter[bytes] = '\0';
+		
+		if(bytes <= 0) {
+			perror("read() failed");
 			close ( file );
 			continue;
 		}
-	
 		
-		if ( read ( file, buf, 4 ) == 4 ) {
-			printf( "bus found: %s\n", filename );
-			break; /* bus found */
-		} {
-			close ( file );
+		if ( sscanf ( adapter, "uni-n %d", &bus_num ) == 1 ) {
+			if ( bus_num == lmu_bus ) {
+				printf ( "lmu device found: /dev/i2c-%d\n", i );
+				*device_num = i;
+				close ( file );
+				return 1;
+			}
 		}
 		
-		num++;
+		close ( file );
+	}
+	
+	return 0;
+}
+
+int
+open_bus ( ) {
+	char filename[20];
+	int num, addr, file, ret, err;
+
+	ret = probe_adapter (&addr, &num);
+	
+	snprintf( filename, 19, "/dev/i2c-%d", num );
+	
+	if ( (file = open (filename, O_RDWR) ) < 0 ) {
+		return errno;
+	}
+
+	if ( ioctl ( file, I2C_SLAVE, addr) < 0 ) {
+		err = errno;
+		close ( file );
+		return err;
 	}
 
 	return ( file != -1 ) ? file : -1;
--- lmu.h.old	2004-01-18 16:32:36.000000000 +0100
+++ lmu.h		2004-01-19 15:12:34.000000000 +0100
@@ -24,4 +24,6 @@
 extern int get_env_light_level ( int dev, int *left, int *right );
 
 
+extern int probe_adapter ( int *addr, int *adapter );
+
 #endif /* __LMU_H__ */

Reply to: