coresight: Expose device connections via sysfs
[linux-2.6-microblaze.git] / drivers / hwtracing / coresight / coresight.c
index 07f66a3..4f10cfa 100644 (file)
@@ -1031,7 +1031,7 @@ static void coresight_device_release(struct device *dev)
 
 static int coresight_orphan_match(struct device *dev, void *data)
 {
-       int i;
+       int i, ret = 0;
        bool still_orphan = false;
        struct coresight_device *csdev, *i_csdev;
        struct coresight_connection *conn;
@@ -1056,19 +1056,23 @@ static int coresight_orphan_match(struct device *dev, void *data)
                /* We have found at least one orphan connection */
                if (conn->child_dev == NULL) {
                        /* Does it match this newly added device? */
-                       if (conn->child_fwnode == csdev->dev.fwnode)
-                               conn->child_dev = csdev;
-                       else
+                       if (conn->child_fwnode == csdev->dev.fwnode) {
+                               ret = coresight_make_links(i_csdev,
+                                                          conn, csdev);
+                               if (ret)
+                                       return ret;
+                       } else {
                                /* This component still has an orphan */
                                still_orphan = true;
+                       }
                }
        }
 
        i_csdev->orphan = still_orphan;
 
        /*
-        * Returning '0' ensures that all known component on the
-        * bus will be checked.
+        * Returning '0' in case we didn't encounter any error,
+        * ensures that all known component on the bus will be checked.
         */
        return 0;
 }
@@ -1082,15 +1086,21 @@ static int coresight_fixup_orphan_conns(struct coresight_device *csdev)
 
 static int coresight_fixup_device_conns(struct coresight_device *csdev)
 {
-       int i;
+       int i, ret = 0;
 
        for (i = 0; i < csdev->pdata->nr_outport; i++) {
                struct coresight_connection *conn = &csdev->pdata->conns[i];
 
                conn->child_dev =
                        coresight_find_csdev_by_fwnode(conn->child_fwnode);
-               if (!conn->child_dev)
+               if (conn->child_dev) {
+                       ret = coresight_make_links(csdev, conn,
+                                                  conn->child_dev);
+                       if (ret)
+                               break;
+               } else {
                        csdev->orphan = true;
+               }
        }
 
        return 0;
@@ -1121,7 +1131,7 @@ static int coresight_remove_match(struct device *dev, void *data)
 
                if (csdev->dev.fwnode == conn->child_fwnode) {
                        iterator->orphan = true;
-                       conn->child_dev = NULL;
+                       coresight_remove_links(iterator, conn);
                        /*
                         * Drop the reference to the handle for the remote
                         * device acquired in parsing the connections from
@@ -1215,13 +1225,23 @@ void coresight_release_platform_data(struct coresight_device *csdev,
                                     struct coresight_platform_data *pdata)
 {
        int i;
+       struct coresight_connection *conns = pdata->conns;
 
        for (i = 0; i < pdata->nr_outport; i++) {
-               if (pdata->conns[i].child_fwnode) {
-                       fwnode_handle_put(pdata->conns[i].child_fwnode);
+               /* If we have made the links, remove them now */
+               if (csdev && conns[i].child_dev)
+                       coresight_remove_links(csdev, &conns[i]);
+               /*
+                * Drop the refcount and clear the handle as this device
+                * is going away
+                */
+               if (conns[i].child_fwnode) {
+                       fwnode_handle_put(conns[i].child_fwnode);
                        pdata->conns[i].child_fwnode = NULL;
                }
        }
+       if (csdev)
+               coresight_remove_conns_sysfs_group(csdev);
 }
 
 struct coresight_device *coresight_register(struct coresight_desc *desc)
@@ -1303,7 +1323,9 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
 
        mutex_lock(&coresight_mutex);
 
-       ret = coresight_fixup_device_conns(csdev);
+       ret = coresight_create_conns_sysfs_group(csdev);
+       if (!ret)
+               ret = coresight_fixup_device_conns(csdev);
        if (!ret)
                ret = coresight_fixup_orphan_conns(csdev);
        if (!ret)