struct ir_raw_handler *handler;
        u32 timeout = 0;
 
+       mutex_lock(&ir_raw_handler_lock);
+       list_for_each_entry(handler, &ir_raw_handler_list, list) {
+               if (!(dev->enabled_protocols & handler->protocols) &&
+                   (*rc_proto & handler->protocols) && handler->raw_register)
+                       handler->raw_register(dev);
+
+               if ((dev->enabled_protocols & handler->protocols) &&
+                   !(*rc_proto & handler->protocols) &&
+                   handler->raw_unregister)
+                       handler->raw_unregister(dev);
+       }
+       mutex_unlock(&ir_raw_handler_lock);
+
        if (!dev->max_timeout)
                return 0;
 
 
 int ir_raw_event_register(struct rc_dev *dev)
 {
-       struct ir_raw_handler *handler;
        struct task_struct *thread;
 
        thread = kthread_run(ir_raw_event_thread, dev->raw, "rc%u", dev->minor);
 
        mutex_lock(&ir_raw_handler_lock);
        list_add_tail(&dev->raw->list, &ir_raw_client_list);
-       list_for_each_entry(handler, &ir_raw_handler_list, list)
-               if (handler->raw_register)
-                       handler->raw_register(dev);
        mutex_unlock(&ir_raw_handler_lock);
 
        return 0;
        mutex_lock(&ir_raw_handler_lock);
        list_del(&dev->raw->list);
        list_for_each_entry(handler, &ir_raw_handler_list, list)
-               if (handler->raw_unregister)
+               if (handler->raw_unregister &&
+                   (handler->protocols & dev->enabled_protocols))
                        handler->raw_unregister(dev);
        mutex_unlock(&ir_raw_handler_lock);
 
 
 int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler)
 {
-       struct ir_raw_event_ctrl *raw;
-
        mutex_lock(&ir_raw_handler_lock);
        list_add_tail(&ir_raw_handler->list, &ir_raw_handler_list);
-       if (ir_raw_handler->raw_register)
-               list_for_each_entry(raw, &ir_raw_client_list, list)
-                       ir_raw_handler->raw_register(raw->dev);
        atomic64_or(ir_raw_handler->protocols, &available_protocols);
        mutex_unlock(&ir_raw_handler_lock);
 
        mutex_lock(&ir_raw_handler_lock);
        list_del(&ir_raw_handler->list);
        list_for_each_entry(raw, &ir_raw_client_list, list) {
-               ir_raw_disable_protocols(raw->dev, protocols);
-               if (ir_raw_handler->raw_unregister)
+               if (ir_raw_handler->raw_unregister &&
+                   (raw->dev->enabled_protocols & protocols))
                        ir_raw_handler->raw_unregister(raw->dev);
+               ir_raw_disable_protocols(raw->dev, protocols);
        }
        atomic64_andnot(protocols, &available_protocols);
        mutex_unlock(&ir_raw_handler_lock);