if (!test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
                              &fence->flags) &&
-           !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
+           !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags) &&
+           fence->ops->enable_signaling) {
                trace_dma_fence_enable_signal(fence);
 
                spin_lock_irqsave(fence->lock, flags);
 
        if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
                ret = -ENOENT;
-       else if (!was_set) {
+       else if (!was_set && fence->ops->enable_signaling) {
                trace_dma_fence_enable_signal(fence);
 
                if (!fence->ops->enable_signaling(fence)) {
        if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
                goto out;
 
-       if (!was_set) {
+       if (!was_set && fence->ops->enable_signaling) {
                trace_dma_fence_enable_signal(fence);
 
                if (!fence->ops->enable_signaling(fence)) {
               spinlock_t *lock, u64 context, unsigned seqno)
 {
        BUG_ON(!lock);
-       BUG_ON(!ops || !ops->wait || !ops->enable_signaling ||
+       BUG_ON(!ops || !ops->wait ||
               !ops->get_driver_name || !ops->get_timeline_name);
 
        kref_init(&fence->refcount);
 
         * released when the fence is signalled (through e.g. the interrupt
         * handler).
         *
-        * This callback is mandatory.
+        * This callback is optional. If this callback is not present, then the
+        * driver must always have signaling enabled.
         */
        bool (*enable_signaling)(struct dma_fence *fence);