Zbigniew Jędrzejewski-Szmek 62fe94
From a3eabec96b872bbf581c9bfa81ecc9c2819b8de8 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: David Herrmann <dh.herrmann@gmail.com>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Sat, 20 Sep 2014 09:48:22 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] terminal: grdev: treat udev-devices without devnum as hotplug
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
If we get udev-device events via sysview, but they lack devnum
Zbigniew Jędrzejewski-Szmek 62fe94
annotations, we know it cannot be a DRM card. Look through it's parents
Zbigniew Jędrzejewski-Szmek 62fe94
and treat it as hotplug event in case we find such a card.
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
This will treat any new/removed connectors as sub-devices of the real
Zbigniew Jędrzejewski-Szmek 62fe94
card, instead of as devices on its own.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/grdev.c | 20 +++++++++++++-------
Zbigniew Jędrzejewski-Szmek 62fe94
 1 file changed, 13 insertions(+), 7 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/libsystemd-terminal/grdev.c b/src/libsystemd-terminal/grdev.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 1e02a6799c..bb89ee7170 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/libsystemd-terminal/grdev.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/libsystemd-terminal/grdev.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1095,7 +1095,7 @@ void grdev_session_add_drm(grdev_session *session, struct udev_device *ud) {
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         devnum = udev_device_get_devnum(ud);
Zbigniew Jędrzejewski-Szmek 62fe94
         if (devnum == 0)
Zbigniew Jędrzejewski-Szmek 62fe94
-                return;
Zbigniew Jędrzejewski-Szmek 62fe94
+                return grdev_session_hotplug_drm(session, ud);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         card = grdev_find_drm_card(session, devnum);
Zbigniew Jędrzejewski-Szmek 62fe94
         if (card)
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1120,7 +1120,7 @@ void grdev_session_remove_drm(grdev_session *session, struct udev_device *ud) {
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         devnum = udev_device_get_devnum(ud);
Zbigniew Jędrzejewski-Szmek 62fe94
         if (devnum == 0)
Zbigniew Jędrzejewski-Szmek 62fe94
-                return;
Zbigniew Jędrzejewski-Szmek 62fe94
+                return grdev_session_hotplug_drm(session, ud);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         card = grdev_find_drm_card(session, devnum);
Zbigniew Jędrzejewski-Szmek 62fe94
         if (!card)
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1130,17 +1130,23 @@ void grdev_session_remove_drm(grdev_session *session, struct udev_device *ud) {
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 void grdev_session_hotplug_drm(grdev_session *session, struct udev_device *ud) {
Zbigniew Jędrzejewski-Szmek 62fe94
-        grdev_card *card;
Zbigniew Jędrzejewski-Szmek 62fe94
+        grdev_card *card = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
+        struct udev_device *p;
Zbigniew Jędrzejewski-Szmek 62fe94
         dev_t devnum;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(session);
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(ud);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        devnum = udev_device_get_devnum(ud);
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (devnum == 0)
Zbigniew Jędrzejewski-Szmek 62fe94
-                return;
Zbigniew Jędrzejewski-Szmek 62fe94
+        for (p = ud; p; p = udev_device_get_parent_with_subsystem_devtype(p, "drm", NULL)) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                devnum = udev_device_get_devnum(ud);
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (devnum == 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        continue;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                card = grdev_find_drm_card(session, devnum);
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (card)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        card = grdev_find_drm_card(session, devnum);
Zbigniew Jędrzejewski-Szmek 62fe94
         if (!card)
Zbigniew Jędrzejewski-Szmek 62fe94
                 return;
Zbigniew Jędrzejewski-Szmek 62fe94