]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/staging/android/sw_sync.c
Merge branch 'for-4.8/core' of git://git.kernel.dk/linux-block
[karo-tx-linux.git] / drivers / staging / android / sw_sync.c
index c149ac90f0407a47aaa4b5b675e7abda0aeee68f..115c9174705f1b1bd2fe34dac727df54c1b9b75b 100644 (file)
 #include <linux/slab.h>
 #include <linux/sync_file.h>
 
-#include "uapi/sw_sync.h"
-#include "sync.h"
+#include "sync_debug.h"
 
 #define CREATE_TRACE_POINTS
 #include "trace/sync.h"
 
+struct sw_sync_create_fence_data {
+       __u32   value;
+       char    name[32];
+       __s32   fence; /* fd of new fence */
+};
+
+#define SW_SYNC_IOC_MAGIC      'W'
+
+#define SW_SYNC_IOC_CREATE_FENCE       _IOWR(SW_SYNC_IOC_MAGIC, 0,\
+               struct sw_sync_create_fence_data)
+#define SW_SYNC_IOC_INC                        _IOW(SW_SYNC_IOC_MAGIC, 1, __u32)
+
 static const struct fence_ops timeline_fence_ops;
 
 static inline struct sync_pt *fence_to_sync_pt(struct fence *fence)
@@ -37,14 +48,12 @@ static inline struct sync_pt *fence_to_sync_pt(struct fence *fence)
 
 /**
  * sync_timeline_create() - creates a sync object
- * @drv_name:  sync_timeline driver name
  * @name:      sync_timeline name
  *
  * Creates a new sync_timeline. Returns the sync_timeline object or NULL in
  * case of error.
  */
-struct sync_timeline *sync_timeline_create(const char *drv_name,
-                                          const char *name)
+struct sync_timeline *sync_timeline_create(const char *name)
 {
        struct sync_timeline *obj;
 
@@ -55,7 +64,6 @@ struct sync_timeline *sync_timeline_create(const char *drv_name,
        kref_init(&obj->kref);
        obj->context = fence_context_alloc(1);
        strlcpy(obj->name, name, sizeof(obj->name));
-       strlcpy(obj->drv_name, drv_name, sizeof(obj->drv_name));
 
        INIT_LIST_HEAD(&obj->child_list_head);
        INIT_LIST_HEAD(&obj->active_list_head);
@@ -86,26 +94,6 @@ static void sync_timeline_put(struct sync_timeline *obj)
        kref_put(&obj->kref, sync_timeline_free);
 }
 
-/**
- * sync_timeline_destroy() - destroys a sync object
- * @obj:       sync_timeline to destroy
- *
- * A sync implementation should call this when the @obj is going away
- * (i.e. module unload.)  @obj won't actually be freed until all its children
- * fences are freed.
- */
-static void sync_timeline_destroy(struct sync_timeline *obj)
-{
-       obj->destroyed = true;
-       /*
-        * Ensure timeline is marked as destroyed before
-        * changing timeline's fences status.
-        */
-       smp_wmb();
-
-       sync_timeline_put(obj);
-}
-
 /**
  * sync_timeline_signal() - signal a status change on a sync_timeline
  * @obj:       sync_timeline to signal
@@ -170,9 +158,7 @@ static struct sync_pt *sync_pt_create(struct sync_timeline *obj, int size,
 
 static const char *timeline_fence_get_driver_name(struct fence *fence)
 {
-       struct sync_timeline *parent = fence_parent(fence);
-
-       return parent->drv_name;
+       return "sw_sync";
 }
 
 static const char *timeline_fence_get_timeline_name(struct fence *fence)
@@ -256,7 +242,7 @@ static int sw_sync_debugfs_open(struct inode *inode, struct file *file)
 
        get_task_comm(task_comm, current);
 
-       obj = sync_timeline_create("sw_sync", task_comm);
+       obj = sync_timeline_create(task_comm);
        if (!obj)
                return -ENOMEM;
 
@@ -269,7 +255,9 @@ static int sw_sync_debugfs_release(struct inode *inode, struct file *file)
 {
        struct sync_timeline *obj = file->private_data;
 
-       sync_timeline_destroy(obj);
+       smp_wmb();
+
+       sync_timeline_put(obj);
        return 0;
 }