/* Used to handle IR raw handler extensions */
 static DEFINE_MUTEX(ir_raw_handler_lock);
 static LIST_HEAD(ir_raw_handler_list);
-static DEFINE_MUTEX(available_protocols_lock);
-static u64 available_protocols;
+static atomic64_t available_protocols = ATOMIC64_INIT(0);
 
 static int ir_raw_event_thread(void *data)
 {
 u64
 ir_raw_get_allowed_protocols(void)
 {
-       u64 protocols;
-       mutex_lock(&available_protocols_lock);
-       protocols = available_protocols;
-       mutex_unlock(&available_protocols_lock);
-       return protocols;
+       return atomic64_read(&available_protocols);
 }
 
 static int change_protocol(struct rc_dev *dev, u64 *rc_type)
        if (ir_raw_handler->raw_register)
                list_for_each_entry(raw, &ir_raw_client_list, list)
                        ir_raw_handler->raw_register(raw->dev);
-       mutex_lock(&available_protocols_lock);
-       available_protocols |= ir_raw_handler->protocols;
-       mutex_unlock(&available_protocols_lock);
+       atomic64_or(ir_raw_handler->protocols, &available_protocols);
        mutex_unlock(&ir_raw_handler_lock);
 
        return 0;
                if (ir_raw_handler->raw_unregister)
                        ir_raw_handler->raw_unregister(raw->dev);
        }
-       mutex_lock(&available_protocols_lock);
-       available_protocols &= ~protocols;
-       mutex_unlock(&available_protocols_lock);
+       atomic64_andnot(protocols, &available_protocols);
        mutex_unlock(&ir_raw_handler_lock);
 }
 EXPORT_SYMBOL(ir_raw_handler_unregister);