Hi
On Thu, May 03, 2007 at 10:17:42PM +0200, Julien BLACHE wrote: > Gaudenz Steinlin <[EMAIL PROTECTED]> wrote: > > Hi, > > >> Can you please send me a (bzip2'ed) tarball of /proc/device-tree ? > > > > OK, It's attached. > > Can you please try the attached patch, on top of the current SVN ? The patch works if I set "kbd.auto = no" and comment out the check for a valid lmuaddr in kbd_backlight_step. I think this check is not needed, because kbd_lmu_backlight_set checks for a valid lmuaddr again. The automatic backlight adjustment does not work. Also if I enable this, the keyboard backlight keys do not produce any results anymore (Don't know if this is how it should be or not). I suspect that also the ambient light sensor in my Powerbook is not detected correctly. Let me know if I can be of any further help on this. 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 pmac PMU05 support patch > Index: pmac/kbd_backlight.c > =================================================================== > --- pmac/kbd_backlight.c (revision 319) > +++ pmac/kbd_backlight.c (working copy) > @@ -36,6 +36,8 @@ > #include <sys/ioctl.h> > #include <linux/i2c.h> > > +#include <linux/adb.h> > + > #include <ofapi/of_api.h> > > #include "../pommed.h" > @@ -51,7 +53,10 @@ > #define SYSFS_I2C_BASE "/sys/class/i2c-dev" > #define I2C_ADAPTER_NAME "uni-n 0" > > +#define ADB_DEVICE "/dev/adb" > +#define ADB_BUFFER_SIZE 32 > > + > struct _kbd_bck_info kbd_bck_info; > > > @@ -76,14 +81,12 @@ > static int > kbd_backlight_get(void) > { > - if (lmuaddr == 0) > - return 0; > - > return kbd_bck_info.level; > } > > + > static void > -kbd_backlight_set(int val, int who) > +kbd_lmu_backlight_set(int val, int who) > { > int curval; > > @@ -147,7 +150,7 @@ > > if (write (fd, buf, 3) < 0) > { > - logmsg(LOG_ERR, "Could not set kbd brightness: %s\n", > strerror(errno)); > + logmsg(LOG_ERR, "Could not set LMU kbd brightness: %s\n", > strerror(errno)); > > continue; > } > @@ -170,7 +173,7 @@ > buf[2] = (unsigned char) val << 4; > > if (write (fd, buf, 3) < 0) > - logmsg(LOG_ERR, "Could not set kbd brightness: %s\n", strerror(errno)); > + logmsg(LOG_ERR, "Could not set LMU kbd brightness: %s\n", > strerror(errno)); > > close(fd); > > @@ -179,6 +182,119 @@ > kbd_bck_info.level = val; > } > > +static void > +kbd_pmu_backlight_set(int val, int who) > +{ > + int curval; > + > + int i; > + float fadeval; > + float step; > + struct timespec fade_step; > + > + int fd; > + int ret; > + unsigned char buf[ADB_BUFFER_SIZE]; > + > + if (kbd_bck_info.inhibit ^ KBD_INHIBIT_CFG) > + return; > + > + curval = kbd_backlight_get(); > + > + if (val == curval) > + return; > + > + if ((val < KBD_BACKLIGHT_OFF) || (val > KBD_BACKLIGHT_MAX)) > + return; > + > + fd = open(ADB_DEVICE, O_RDWR); > + if (fd < 0) > + { > + logmsg(LOG_ERR, "Could not open %s: %s\n", ADB_DEVICE, > strerror(errno)); > + > + return; > + } > + > + if (who == KBD_AUTO) > + { > + fade_step.tv_sec = 0; > + fade_step.tv_nsec = (KBD_BACKLIGHT_FADE_LENGTH / > KBD_BACKLIGHT_FADE_STEPS) * 1000000; > + > + fadeval = (float)curval; > + step = (float)(val - curval) / (float)KBD_BACKLIGHT_FADE_STEPS; > + > + for (i = 0; i < KBD_BACKLIGHT_FADE_STEPS; i++) > + { > + fadeval += step; > + > + buf[0] = PMU_PACKET; > + buf[1] = 0x4f; /* PMU command */ > + buf[2] = 0; > + buf[3] = 0; > + buf[4] = (unsigned char)fadeval; > + > + ret = write(fd, buf, 5); > + if (ret != 5) > + { > + logmsg(LOG_ERR, "Could not set PMU kbd brightness: %s\n", > strerror(errno)); > + > + continue; > + } > + > + ret = read(fd, buf, ADB_BUFFER_SIZE); > + if (ret < 0) > + { > + logmsg(LOG_ERR, "Could not read PMU reply: %s\n", > strerror(errno)); > + > + continue; > + } > + > + logdebug("KBD backlight value faded to %d\n", (int)fadeval); > + > + nanosleep(&fade_step, NULL); > + } > + } > + > + buf[0] = PMU_PACKET; > + buf[1] = 0x4f; /* PMU command */ > + buf[2] = 0; > + buf[3] = 0; > + buf[4] = val; > + > + ret = write(fd, buf, 5); > + if (ret != 5) > + { > + logmsg(LOG_ERR, "Could not set PMU kbd brightness: %s\n", > strerror(errno)); > + } > + else > + { > + ret = read(fd, buf, ADB_BUFFER_SIZE); > + if (ret < 0) > + logmsg(LOG_ERR, "Could not read PMU reply: %s\n", strerror(errno)); > + } > + > + close(fd); > + > + mbpdbus_send_kbd_backlight(val, kbd_bck_info.level, who); > + > + kbd_bck_info.level = val; > +} > + > +static void > +kbd_backlight_set(int val, int who) > +{ > + if ((mops->type == MACHINE_POWERBOOK_58) > + || (mops->type == MACHINE_POWERBOOK_59)) > + { > + kbd_pmu_backlight_set(val, who); > + } > + else > + { > + kbd_lmu_backlight_set(val, who); > + } > +} > + > + > void > kbd_backlight_step(int dir) > { > @@ -244,7 +360,14 @@ > > kbd_bck_info.auto_on = 0; > > - ret = kbd_probe_lmu(); > + if ((mops->type == MACHINE_POWERBOOK_58) > + || (mops->type == MACHINE_POWERBOOK_59)) > + { > + /* Nothing to probe for the PMU05 machines */ > + ret = 0; > + } > + else > + ret = kbd_probe_lmu(); > > if ((!has_kbd_backlight()) || (ret < 0)) > { > @@ -360,8 +483,12 @@ > > node = of_find_node_by_type("lmu-controller", 0); > if (node == NULL) > - return -1; > + { > + logmsg(LOG_ERR, "Error: no lmu-controller found in device-tree"); > > + return -1; > + } > + > reg = of_find_property(node, "reg", &plen); > lmuaddr = (unsigned int) (*reg >> 1); > -- Ever tried. Ever failed. No matter. Try again. Fail again. Fail better. ~ Samuel Beckett ~ -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]