[Pommed-commits] r319 - in trunk: . pommed pommed/pmac
Julien Blache
jblache at alioth.debian.org
Thu May 3 08:28:45 UTC 2007
Author: jblache
Date: 2007-05-03 08:28:44 +0000 (Thu, 03 May 2007)
New Revision: 319
Modified:
trunk/ChangeLog
trunk/pommed/kbd_backlight.h
trunk/pommed/pmac/kbd_backlight.c
Log:
Enumerate i2c adapters instead of hardcoding the adapter.
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-04-30 19:54:04 UTC (rev 318)
+++ trunk/ChangeLog 2007-05-03 08:28:44 UTC (rev 319)
@@ -6,6 +6,7 @@
least) and later.
- pommed: added a simple backlight toggle mode, used when the
automatic backlight is disabled in the configuration file.
+ - pommed: enumerate i2c adapters.
version 1.3:
- gpomme: added configuration GUI, courtesy of Daniel G. SIEGEL.
Modified: trunk/pommed/kbd_backlight.h
===================================================================
--- trunk/pommed/kbd_backlight.h 2007-04-30 19:54:04 UTC (rev 318)
+++ trunk/pommed/kbd_backlight.h 2007-05-03 08:28:44 UTC (rev 319)
@@ -5,19 +5,9 @@
#ifndef __KBD_BACKLIGHT_H__
#define __KBD_BACKLIGHT_H__
-#ifdef __powerpc__
-int
-kbd_get_lmuaddr(void);
-
-char*
-kbd_get_i2cdev(int addr);
-
-int
-kbd_probe_lmu(int addr, char* i2cdev);
-
-#else
+#ifndef __powerpc__
#define KBD_BACKLIGHT "/sys/class/leds/smc:kbd_backlight/brightness"
-#endif /* __powerpc__ */
+#endif /* !__powerpc__ */
#define KBD_BACKLIGHT_OFF 0
Modified: trunk/pommed/pmac/kbd_backlight.c
===================================================================
--- trunk/pommed/pmac/kbd_backlight.c 2007-04-30 19:54:04 UTC (rev 318)
+++ trunk/pommed/pmac/kbd_backlight.c 2007-05-03 08:28:44 UTC (rev 319)
@@ -45,15 +45,18 @@
#include "../dbus.h"
-#define I2C_DEV "/dev/i2c-7"
-#define I2C_SLAVE 0x0703
+/* I2C ioctl */
+#define I2C_SLAVE 0x0703
+#define SYSFS_I2C_BASE "/sys/class/i2c-dev"
+#define I2C_ADAPTER_NAME "uni-n 0"
+
struct _kbd_bck_info kbd_bck_info;
-static int lmuaddr; /* i2c bus address */
-static char *i2cdev; /* i2c bus device */
+static unsigned int lmuaddr; /* i2c bus address */
+static char i2cdev[16]; /* i2c bus device */
int
@@ -107,10 +110,10 @@
if (lmuaddr == 0)
return;
- fd = open (i2cdev, O_RDWR);
+ fd = open(i2cdev, O_RDWR);
if (fd < 0)
{
- logmsg(LOG_ERR, "Could not open %s: %s\n", I2C_DEV, strerror(errno));
+ logmsg(LOG_ERR, "Could not open %s: %s\n", i2cdev, strerror(errno));
return;
}
@@ -222,6 +225,9 @@
#include "../kbd_auto.c"
+static int
+kbd_probe_lmu(void);
+
void
kbd_backlight_init(void)
{
@@ -238,15 +244,11 @@
kbd_bck_info.auto_on = 0;
- lmuaddr = kbd_get_lmuaddr();
- i2cdev = "/dev/i2c-7";
+ ret = kbd_probe_lmu();
- ret = kbd_probe_lmu(lmuaddr, i2cdev);
-
if ((!has_kbd_backlight()) || (ret < 0))
{
lmuaddr = 0;
- i2cdev = NULL;
kbd_bck_info.r_sens = 0;
kbd_bck_info.l_sens = 0;
@@ -284,12 +286,75 @@
kbd_cfg.step = KBD_BACKLIGHT_MAX / 2;
}
+
+static int
+kbd_get_i2cdev(void)
+{
+ char buf[PATH_MAX];
+ int i2c_bus;
+ int ret;
+
+ FILE *fp;
+
+ /* All the 256 minors (major 89) are reserved for i2c adapters */
+ for (i2c_bus = 0; i2c_bus < 256; i2c_bus++)
+ {
+ ret = snprintf(buf, PATH_MAX - 1, "%s/i2c-%d/name", SYSFS_I2C_BASE, i2c_bus);
+ if ((ret < 0) || (ret >= (PATH_MAX - 1)))
+ {
+ logmsg(LOG_WARNING, "Error: i2c device probe: device path too long");
+
+ i2c_bus = 256;
+ break;
+ }
+
+ fp = fopen(buf, "r");
+ if ((fp == NULL) && (errno != ENOENT))
+ {
+ logmsg(LOG_ERR, "Error: i2c device probe: cannot open %s: %s", buf, strerror(errno));
+ continue;
+ }
+
+ ret = fread(buf, 1, PATH_MAX - 1, fp);
+ fclose(fp);
+
+ if (ret < 1)
+ continue;
+
+ buf[ret - 1] = '\0';
+
+ logdebug("Found i2c adapter [%s]\n", buf);
+
+ if (ret < strlen(I2C_ADAPTER_NAME))
+ continue;
+
+ if (strncmp(buf, I2C_ADAPTER_NAME, strlen(I2C_ADAPTER_NAME)) == 0)
+ {
+ logmsg(LOG_INFO, "Found %s i2c adapter at i2c-%d", I2C_ADAPTER_NAME, i2c_bus);
+ break;
+ }
+ }
+
+ if (i2c_bus > 255)
+ return -1;
+
+ ret = snprintf(i2cdev, sizeof(i2cdev) - 1, "/dev/i2c-%d", i2c_bus);
+ if ((ret < 0) || (ret >= (sizeof(i2cdev) - 1)))
+ {
+ logmsg(LOG_WARNING, "Error: i2c device path too long");
+
+ return -1;
+ }
+
+ return 0;
+}
+
int
kbd_get_lmuaddr(void)
{
struct device_node *node;
- int plen, lmuaddr = -1;
- long *reg = NULL;
+ int plen;
+ unsigned long *reg = NULL;
of_init();
@@ -298,72 +363,51 @@
return -1;
reg = of_find_property(node, "reg", &plen);
- lmuaddr = (int) (*reg >> 1);
+ lmuaddr = (unsigned int) (*reg >> 1);
free(reg);
of_free_node(node);
- return lmuaddr;
+ logdebug("Found LMU controller at address 0x%x\n", lmuaddr);
+
+ return 0;
}
-#if 0 /* Old code */
-int
-kbd_get_lmuaddr2(void)
+static int
+kbd_probe_lmu(void)
{
int fd;
int ret;
- long reg;
+ char buffer[4];
- fd = open(LMU_REG, O_RDONLY);
- if (fd < 0)
+ ret = kbd_get_lmuaddr();
+ if (ret < 0)
{
- logmsg(LOG_ERR, "Could not open lmu %s: %s\n", LMU_REG, strerror(errno));
+ lmuaddr = 0;
- fd = open(LMU_REG_55, O_RDONLY);
- if (fd < 0)
- {
- logmsg(LOG_ERR, "Could not open lmu %s: %s\n", LMU_REG_55, strerror(errno));
-
- return -1;
- }
+ return -1;
}
- ret = read(fd, ®, sizeof(long));
- close(fd);
+ ret = kbd_get_i2cdev();
+ if (ret < 0)
+ {
+ lmuaddr = 0;
- if (ret == sizeof(long))
- return (int)(reg >> 1);
+ return -1;
+ }
- return 0;
-}
-#endif /* 0 */
-
-
-char *
-kbd_get_i2cdev(int addr)
-{
- return I2C_DEV;
-}
-
-int
-kbd_probe_lmu(int addr, char *dev)
-{
- int fd;
- int ret;
- char buffer[4];
-
- fd = open(dev, O_RDWR);
+ fd = open(i2cdev, O_RDWR);
if (fd < 0)
{
- logmsg(LOG_WARNING, "Could not open device %s: %s\n", dev, strerror(errno));
+ logmsg(LOG_WARNING, "Could not open device %s: %s\n", i2cdev, strerror(errno));
return -1;
}
- ret = ioctl(fd, I2C_SLAVE, addr);
+ ret = ioctl(fd, I2C_SLAVE, lmuaddr);
if (ret < 0)
{
- logmsg(LOG_ERR, "ioctl failed on %s: %s\n", dev, strerror(errno));
+ logmsg(LOG_ERR, "ioctl failed on %s: %s\n", i2cdev, strerror(errno));
close(fd);
return -1;
@@ -372,14 +416,14 @@
ret = read(fd, buffer, 4);
if (ret != 4)
{
- logmsg(LOG_WARNING, "Probing failed on %s: %s\n", dev, strerror(errno));
+ logmsg(LOG_WARNING, "Probing failed on %s: %s\n", i2cdev, strerror(errno));
close(fd);
return -1;
}
close(fd);
- logdebug("Probing successful on %s\n", dev);
+ logdebug("Probing successful on %s\n", i2cdev);
return 0;
}
More information about the Pommed-commits
mailing list