aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kerneldevice/mm-kernel-device-generic.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/kerneldevice/mm-kernel-device-generic.c b/src/kerneldevice/mm-kernel-device-generic.c
index 34285633..62bf9cf2 100644
--- a/src/kerneldevice/mm-kernel-device-generic.c
+++ b/src/kerneldevice/mm-kernel-device-generic.c
@@ -26,6 +26,7 @@
#include "mm-kernel-device-generic.h"
#include "mm-kernel-device-generic-rules.h"
+#include "mm-kernel-device-helpers.h"
#include "mm-log-object.h"
#include "mm-utils.h"
@@ -242,8 +243,9 @@ ptr_array_add_sysfs_attribute_link_basename (GPtrArray *array,
static void
preload_contents_other (MMKernelDeviceGeneric *self)
{
- GPtrArray *drivers;
- GPtrArray *subsystems;
+ g_autofree gchar *lower_device_name = NULL;
+ GPtrArray *drivers;
+ GPtrArray *subsystems;
/* For any other kind of bus (or the absence of one, as in virtual devices),
* assume this is a single port device and don't try to match multiple ports
@@ -258,6 +260,31 @@ preload_contents_other (MMKernelDeviceGeneric *self)
ptr_array_add_sysfs_attribute_link_basename (subsystems, self->priv->sysfs_path, "subsystem", NULL);
g_ptr_array_add (subsystems, NULL);
self->priv->subsystems = (gchar **) g_ptr_array_free (subsystems, FALSE);
+
+ /* But look for a lower real physical device, as we may have one */
+ lower_device_name = mm_kernel_device_get_lower_device_name (self->priv->sysfs_path);
+ if (lower_device_name) {
+ g_autoptr(MMKernelDevice) lower_kernel_device = NULL;
+ g_autoptr(MMKernelEventProperties) props = NULL;
+ g_autoptr(GError) error = NULL;
+ const gchar *subsystem;
+
+ subsystem = mm_kernel_device_get_subsystem (MM_KERNEL_DEVICE (self));
+
+ props = mm_kernel_event_properties_new ();
+ mm_kernel_event_properties_set_subsystem (props, subsystem);
+ mm_kernel_event_properties_set_name (props, lower_device_name);
+
+ lower_kernel_device = mm_kernel_device_generic_new (props, &error);
+ if (!lower_kernel_device) {
+ mm_obj_dbg (self, "couldn't find lower device: %s/%s", subsystem, lower_device_name);
+ } else {
+ mm_obj_dbg (self, "setting up lower device: %s/%s", subsystem, lower_device_name);
+ g_object_set (self,
+ "lower-device", lower_kernel_device,
+ NULL);
+ }
+ }
}
static void