temp revert rk change
[firefly-linux-kernel-4.4.55.git] / drivers / video / tegra / host / nvhost_intr.c
index 6b662049056dbcdc603564185cc38c4b92492d09..007aaed9909fd5e93aae119478802be83cd5af0f 100644 (file)
@@ -178,8 +178,7 @@ static void run_handlers(struct list_head completed[NVHOST_INTR_ACTION_COUNT])
                list_for_each_entry_safe(waiter, next, head, list) {
                        list_del(&waiter->list);
                        handler(waiter);
-                       atomic_set(&waiter->state, WLS_HANDLED);
-                       smp_wmb();
+                       WARN_ON(atomic_xchg(&waiter->state, WLS_HANDLED) != WLS_REMOVED);
                        kref_put(&waiter->refcount, waiter_release);
                }
        }
@@ -400,8 +399,8 @@ int nvhost_intr_init(struct nvhost_intr *intr, u32 irq_gen, u32 irq_sync)
                spin_lock_init(&syncpt->lock);
                INIT_LIST_HEAD(&syncpt->wait_head);
                snprintf(syncpt->thresh_irq_name,
-                       sizeof(syncpt->thresh_irq_name),
-                       "host_sp_%02d", id);
+                        sizeof(syncpt->thresh_irq_name),
+                        "%s", nvhost_syncpt_name(id));
        }
 
        return 0;
@@ -418,9 +417,24 @@ void nvhost_intr_deinit(struct nvhost_intr *intr)
 
        for (id = 0, syncpt = intr->syncpt;
             id < NV_HOST1X_SYNCPT_NB_PTS;
-            ++id, ++syncpt)
+            ++id, ++syncpt) {
+               struct nvhost_waitlist *waiter, *next;
+               list_for_each_entry_safe(waiter, next, &syncpt->wait_head, list) {
+                       if (atomic_cmpxchg(&waiter->state, WLS_CANCELLED, WLS_HANDLED)
+                               == WLS_CANCELLED) {
+                               list_del(&waiter->list);
+                               kref_put(&waiter->refcount, waiter_release);
+                       }
+               }
+
+               if(!list_empty(&syncpt->wait_head)) {  // output diagnostics
+                       printk("%s id=%d\n",__func__,id);
+                       BUG_ON(1);
+               }
+
                if (syncpt->irq_requested)
                        free_irq(syncpt->irq, syncpt);
+       }
 
        if (intr->host1x_isr_started) {
                free_irq(intr->host1x_irq, intr);