On Tue, May 01, 2007 at 10:54:19AM +0200, Julien BLACHE wrote:
> Gaudenz Steinlin <[EMAIL PROTECTED]> wrote:
> 
> Hi,
> 
> > On my powerbook 5,8 pommed does not work at all. It correctly detects
> > the powerbook model, but doing an ioctl on /dev/i2c-7 (probably in
> > pmac/kbd_backlight.c) fails. The keyboard and lcd backlight keys do not
> > work, but pommed keeps running. Below is the output of pommed -d on
> > startup.
> 
> Could you please try out the attached patch, on top of the current
> SVN ? It'll enumerate the i2c adapters to find the one we should use.

The patch does not quite work, because kbd_get_lmuaddr() at line 383 of 
kbd_backlight.c returns -1. So the i2c enumeration is never called. Commenting 
out lines 383 to 389 yelds the following output with pommed -d:

Found i2c adapter [monid]
Found i2c adapter [dvi]
Found i2c adapter [vga]
Found i2c adapter [crt2]
Found i2c adapter [pmu 2]
Found i2c adapter [pmu 1]
Found i2c adapter [mac-io 0]
Found i2c adapter [uni-n 0]
I: Found uni-n 0 i2c adapter at i2c-7
W: Probing failed on /dev/i2c-7: Kein passendes Gerät bzw. keine passende 
Adresse gefunden

i2c-7 seems to be the "uni-n 0" device. But this was also the 
hardcoded device used before. So the error has to be somewhere else.

> 
> Also, please check that you have i2c-dev loaded.

I just checked and noticed, that it was not automatically loaded by udev. 
So it's possible that I ran some of the previous checks without it. I remember
loading it before sending the initial bug report.

> 
> In case it doesn't work, please send me the content of
> /sys/class/i2c-dev/*/name.

# for i in  /sys/class/i2c-dev/*/name ; do echo -n "$i: "; cat $i ; done
/sys/class/i2c-dev/i2c-0/name: monid
/sys/class/i2c-dev/i2c-1/name: dvi
/sys/class/i2c-dev/i2c-2/name: vga
/sys/class/i2c-dev/i2c-3/name: crt2
/sys/class/i2c-dev/i2c-4/name: pmu 2
/sys/class/i2c-dev/i2c-5/name: pmu 1
/sys/class/i2c-dev/i2c-6/name: mac-io 0
/sys/class/i2c-dev/i2c-7/name: uni-n 0


Thanks for your efforts

Gaudenz

> 
> Thanks,
> 
> JB.
> 
> -- 
>  Julien BLACHE - Debian & GNU/Linux Developer - <[EMAIL PROTECTED]> 
>  
>  Public key available on <http://www.jblache.org> - KeyID: F5D6 5169 
>  GPG Fingerprint : 935A 79F1 C8B3 3521 FD62 7CC7 CD61 4FD7 F5D6 5169 
> 

Content-Description: pommed SVN i2c adapter enumeration patch v2
> Index: pmac/kbd_backlight.c
> ===================================================================
> --- pmac/kbd_backlight.c      (revision 318)
> +++ pmac/kbd_backlight.c      (working copy)
> @@ -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, &reg, 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;
>  }
> Index: kbd_backlight.h
> ===================================================================
> --- kbd_backlight.h   (revision 318)
> +++ kbd_backlight.h   (working copy)
> @@ -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


-- 
Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better.
~ Samuel Beckett ~

Reply via email to