aboutsummaryrefslogtreecommitdiff
path: root/src/mm-manager.c
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-04-29 12:17:56 -0700
committerDan Williams <dcbw@redhat.com>2010-04-29 12:17:56 -0700
commit1864d8da0766e615c37a13f30bcacb72d381aa69 (patch)
tree2497a446adab5b9488d789934514a3f433fcc8d9 /src/mm-manager.c
parent921048b12e1e8203cbff6dfbe43e833ea6bb8232 (diff)
core: add platform device support and whitelist
Diffstat (limited to 'src/mm-manager.c')
-rw-r--r--src/mm-manager.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/mm-manager.c b/src/mm-manager.c
index 287c1ab7..fc3a1281 100644
--- a/src/mm-manager.c
+++ b/src/mm-manager.c
@@ -636,7 +636,7 @@ find_physical_device (GUdevDevice *child)
GUdevDevice *physdev = NULL;
const char *subsys, *type;
guint32 i = 0;
- gboolean is_usb = FALSE, is_pci = FALSE, is_pcmcia = FALSE;
+ gboolean is_usb = FALSE, is_pci = FALSE, is_pcmcia = FALSE, is_platform = FALSE;
g_return_val_if_fail (child != NULL, NULL);
@@ -671,6 +671,11 @@ find_physical_device (GUdevDevice *child)
if (physdev)
break;
}
+ } else if (is_platform || !strcmp (subsys, "platform")) {
+ /* Take the first platform parent as the physical device */
+ is_platform = TRUE;
+ physdev = iter;
+ break;
} else if (is_pci || !strcmp (subsys, "pci")) {
is_pci = TRUE;
physdev = iter;
@@ -690,7 +695,7 @@ static void
device_added (MMManager *manager, GUdevDevice *device)
{
MMManagerPrivate *priv = MM_MANAGER_GET_PRIVATE (manager);
- const char *subsys, *name, *physdev_path;
+ const char *subsys, *name, *physdev_path, *physdev_subsys;
SupportsInfo *info;
char *key;
gboolean found;
@@ -743,6 +748,15 @@ device_added (MMManager *manager, GUdevDevice *device)
goto out;
}
+ /* If the physdev is a 'platform' device that's not whitelisted, ignore it */
+ physdev_subsys = g_udev_device_get_subsystem (physdev);
+ if ( physdev_subsys
+ && !strcmp (physdev_subsys, "platform")
+ && !g_udev_device_get_property_as_boolean (physdev, "ID_MM_PLATFORM_DRIVER_PROBE")) {
+ g_debug ("(%s/%s): port's parent platform driver is not whitelisted", subsys, name);
+ goto out;
+ }
+
physdev_path = g_udev_device_get_sysfs_path (physdev);
if (!physdev_path) {
g_debug ("(%s/%s): could not get port's parent device sysfs path", subsys, name);