|
@@ -26,8 +26,7 @@ static LIST_HEAD(ir_raw_client_list);
|
|
|
/* 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)
|
|
|
{
|
|
@@ -234,11 +233,7 @@ EXPORT_SYMBOL_GPL(ir_raw_event_handle);
|
|
|
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)
|
|
@@ -331,9 +326,7 @@ int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler)
|
|
|
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;
|
|
@@ -352,9 +345,7 @@ void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler)
|
|
|
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);
|