[PATCH] config: search for PnPID on all parents (#75513)
Benjamin Tissoires
benjamin.tissoires at gmail.com
Tue Mar 11 09:43:42 PDT 2014
On Tue, Feb 25, 2014 at 8:20 PM, Peter Hutterer
<peter.hutterer at 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.hutterer at 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.tissoires at 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
>
More information about the xorg-devel
mailing list