On Tue, Feb 25, 2014 at 8:20 PM, Peter Hutterer <peter.hutte...@who-t.net> wrote: > The PnPID for a device may not be on the immediate parent, so search up the > device tree until we find one. > > X.Org Bug 75513 <http://bugs.freedesktop.org/show_bug.cgi?id=75513> > > Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> > --- > Another fix for the T440 and associated laptops. With Matthew's kernel patch > https://lkml.org/lkml/2014/2/23/63 the PNPID is available in the tree, but > a few parents up from our device. > > I'll need a tested-by for the HAL code though, I've only startup-tested it > so far but not triggered the actual code.
Here you go: Tested-by: Benjamin Tissoires <benjamin.tissoi...@gmail.com> tested under udev and hal backends. Cheers, Benjamin > > config/hal.c | 16 +++++++++++++--- > config/udev.c | 15 +++++++++++---- > 2 files changed, 24 insertions(+), 7 deletions(-) > > diff --git a/config/hal.c b/config/hal.c > index 94cb6e7..ea574ca 100644 > --- a/config/hal.c > +++ b/config/hal.c > @@ -185,8 +185,7 @@ device_added(LibHalContext * hal_ctx, const char *udi) > parent = get_prop_string(hal_ctx, udi, "info.parent"); > if (parent) { > int usb_vendor, usb_product; > - > - attrs.pnp_id = get_prop_string(hal_ctx, parent, "pnp.id"); > + char *old_parent; > > /* construct USB ID in lowercase - "0000:ffff" */ > usb_vendor = libhal_device_get_property_int(hal_ctx, parent, > @@ -204,7 +203,18 @@ device_added(LibHalContext * hal_ctx, const char *udi) > == -1) > attrs.usb_id = NULL; > > - free(parent); > + attrs.pnp_id = get_prop_string(hal_ctx, parent, "pnp.id"); > + old_parent = parent; > + > + while (!attrs.pnp_id && > + (parent = get_prop_string(hal_ctx, parent, "info.parent"))) { > + attrs.pnp_id = get_prop_string(hal_ctx, parent, "pnp.id"); > + > + free(old_parent); > + old_parent = parent; > + } > + > + free(old_parent); > } > > input_options = input_option_new(NULL, "_source", "server/hal"); > diff --git a/config/udev.c b/config/udev.c > index 68ed348..2a5d40a 100644 > --- a/config/udev.c > +++ b/config/udev.c > @@ -130,10 +130,6 @@ device_added(struct udev_device *udev_device) > LOG_PROPERTY(ppath, "NAME", name); > } > > - if (pnp_id) > - attrs.pnp_id = strdup(pnp_id); > - LOG_SYSATTR(ppath, "id", pnp_id); > - > /* construct USB ID in lowercase hex - "0000:ffff" */ > if (product && > sscanf(product, "%*x/%4x/%4x/%*x", &usb_vendor, &usb_model) == > 2) { > @@ -145,6 +141,17 @@ device_added(struct udev_device *udev_device) > LOG_PROPERTY(ppath, "PRODUCT", product); > attrs.usb_id = usb_id; > } > + > + while (!pnp_id && (parent = udev_device_get_parent(parent))) { > + pnp_id = udev_device_get_sysattr_value(parent, "id"); > + if (!pnp_id) > + continue; > + > + attrs.pnp_id = strdup(pnp_id); > + ppath = udev_device_get_devnode(parent); > + LOG_SYSATTR(ppath, "id", pnp_id); > + } > + > } > if (!name) > name = "(unnamed)"; > -- > 1.8.4.2 > _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel